Eine vielseitige und effiziente Proxy-Plattform für sichere Kommunikation.
splice(2)
.recvmmsg(2)
und sendmmsg(2)
. Release- und VCS-Pakete sind im AUR verfügbar:
Von Veröffentlichungen herunterladen.
Erstellen und installieren Sie die neueste Version mit Go:
go install github.com/database64128/shadowsocks-go/cmd/shadowsocks-go@latest
go install github.com/database64128/shadowsocks-go/cmd/shadowsocks-go-domain-set-converter@latest
Oder klonen Sie das Repository und erstellen Sie es manuell:
go build -trimpath -ldflags ' -s -w ' ./cmd/shadowsocks-go
go build -trimpath -ldflags ' -s -w ' ./cmd/shadowsocks-go-domain-set-converter
Alle Konfigurationsbeispiele und Systemd-Unit-Dateien finden Sie im Verzeichnis docs.
Das Feld clients
kann weggelassen oder leer gelassen werden. Ein standardmäßiger „direkter“ Client wird automatisch hinzugefügt.
Auf Produktionsservern möchten Sie möglicherweise udpRelayBatchSize
auf einen niedrigeren Wert wie 8 setzen, um die Speichernutzung zu reduzieren und dennoch von recvmmsg(2)
und sendmmsg(2)
zu profitieren.
UDP-Pakete können bis zur aus mtu
berechneten maximalen Paketgröße aufgefüllt werden. Wenn der Server über eine PPPoE-Verbindung verwendet werden kann, sollte mtu
auf 1492 reduziert werden. Wenn die Client-zu-Server-PMTU unbekannt ist, kann das Auffüllen vollständig deaktiviert werden, indem paddingPolicy
auf NoPadding
gesetzt wird.
Bei Servern ohne Benutzer-PSKs (Einzelbenutzermodus) gibt das psk
Feld den PSK an und das Feld uPSKStorePath
kann weggelassen oder leer gelassen werden. Wenn ein oder mehrere Benutzer-PSKs in der uPSK-Speicherdatei angegeben sind, gibt das psk
Feld den Identitäts-PSK an.
Um Benutzer hinzuzufügen/zu aktualisieren/zu entfernen, ohne den Server neu zu starten, ändern Sie die uPSK-Speicherdatei und senden Sie ein SIGUSR1
Signal an den Serverprozess oder verwenden Sie die RESTful-API. Aktualisierungen von der RESTful-API werden automatisch in der uPSK-Store-Datei gespeichert.
/etc/shadowsocks-go/config.json
{
"servers" : [
{
"name" : " ss-2022 " ,
"listen" : " :20220 " ,
"protocol" : " 2022-blake3-aes-128-gcm " ,
"enableTCP" : true ,
"listenerTFO" : true ,
"enableUDP" : true ,
"mtu" : 1500 ,
"psk" : " qQln3GlVCZi5iJUObJVNCw== " ,
"uPSKStorePath" : " /etc/shadowsocks-go/upsks.json "
}
]
}
/etc/shadowsocks-go/upsks.json
{
"Steve" : " oE/s2z9Q8EWORAB8B3UCxw== " ,
"Alex" : " hWXLOSW/r/LtNKynrA3S8Q== "
}
Standardmäßig verwendet der Router den konfigurierten DNS-Server, um Domänennamen aufzulösen und IP-Regeln abzugleichen. Die aufgelösten IP-Adressen werden nur für übereinstimmende IP-Regeln verwendet. Anfragen werden unter Verwendung des ursprünglichen Domainnamens gestellt. Um den IP-Regelabgleich für Domänennamen zu deaktivieren, legen Sie disableNameResolutionForIPRules
auf „true“ fest.
{
"servers" : [
{
"name" : " socks5 " ,
"listen" : " :1080 " ,
"protocol" : " socks5 " ,
"enableTCP" : true ,
"listenerTFO" : true ,
"enableUDP" : true ,
"mtu" : 1500
},
{
"name" : " http " ,
"listen" : " :8080 " ,
"protocol" : " http " ,
"enableTCP" : true ,
"listenerTFO" : true
}
],
"clients" : [
{
"name" : " ss-2022 " ,
"protocol" : " 2022-blake3-aes-128-gcm " ,
"endpoint" : " [2001:db8:bd63:362c:2071:a0f6:827:ab6a]:20220 " ,
"enableTCP" : true ,
"dialerTFO" : true ,
"enableUDP" : true ,
"mtu" : 1500 ,
"psk" : " oE/s2z9Q8EWORAB8B3UCxw== " ,
"iPSKs" : [
" qQln3GlVCZi5iJUObJVNCw== "
]
},
{
"name" : " direct " ,
"protocol" : " direct " ,
"enableTCP" : true ,
"dialerTFO" : true ,
"enableUDP" : true ,
"mtu" : 1500
}
],
"dns" : [
{
"name" : " cf-v6 " ,
"addrPort" : " [2606:4700:4700::1111]:53 " ,
"tcpClientName" : " ss-2022 " ,
"udpClientName" : " ss-2022 "
},
{
"name" : " system " ,
"type" : " system "
}
],
"router" : {
"defaultTCPClientName" : " ss-2022 " ,
"defaultUDPClientName" : " ss-2022 " ,
"geoLite2CountryDbPath" : " /usr/share/shadowsocks-go/Country.mmdb " ,
"domainSets" : [
{
"name" : " category-ads-all " ,
"type" : " gob " ,
"path" : " /usr/share/shadowsocks-go/ss-go-gob-category-ads-all "
},
{
"name" : " private " ,
"type" : " gob " ,
"path" : " /usr/share/shadowsocks-go/ss-go-gob-private "
},
{
"name" : " cn " ,
"type" : " gob " ,
"path" : " /usr/share/shadowsocks-go/ss-go-gob-cn "
},
{
"name" : " geolocation-!cn@cn " ,
"type" : " gob " ,
"path" : " /usr/share/shadowsocks-go/ss-go-gob-geolocation-!cn@cn "
}
],
"routes" : [
{
"name" : " ads " ,
"client" : " reject " ,
"toDomainSets" : [
" category-ads-all "
]
},
{
"name" : " direct " ,
"client" : " direct " ,
"resolver" : " cf-v6 " ,
"toDomainSets" : [
" private " ,
" cn "
],
"toPrefixes" : [
" 0.0.0.0/8 " ,
" 10.0.0.0/8 " ,
" 100.64.0.0/10 " ,
" 127.0.0.0/8 " ,
" 169.254.0.0/16 " ,
" 172.16.0.0/12 " ,
" 192.0.0.0/24 " ,
" 192.0.2.0/24 " ,
" 192.88.99.0/24 " ,
" 192.168.0.0/16 " ,
" 198.18.0.0/15 " ,
" 198.51.100.0/24 " ,
" 203.0.113.0/24 " ,
" 224.0.0.0/3 " ,
" ::1/128 " ,
" fc00::/7 " ,
" fe80::/10 " ,
" ff00::/8 "
],
"toGeoIPCountries" : [
" CN "
]
},
{
"name" : " cn-verify-ip " ,
"client" : " direct " ,
"resolver" : " system " ,
"toDomainSets" : [
" geolocation-!cn@cn "
],
"toMatchedDomainExpectedGeoIPCountries" : [
" CN "
]
}
]
}
}
Siehe docs/config.json.
Shadowsocks-go hat ein eigenes Domain-Set-Dateiformat, weil andere Formate, die ich gesehen habe, alle schrecklich sind!
Und keine Sorge, wir haben ein einfaches Konvertierungstool zum Konvertieren zwischen verschiedenen Formaten: Shadowsocks-go-domain-set-converter
Eine Domänensatz-Textdatei beginnt optional mit einem Kapazitätshinweiskommentar. Das Konvertierungstool kann automatisch einen Kapazitätshinweis für Sie generieren. Es gibt vier Arten von Domain-Matching-Regeln:
domain:
Entspricht der Domäne.suffix:
Passen Sie die Domain und ihre Subdomains an.keyword:
Übereinstimmung, wenn die Domain das Schlüsselwort enthält.regexp:
Übereinstimmung, wenn die Domäne mit dem regulären Ausdruck übereinstimmt.Beispiel einer Domänensatz-Textdatei:
# shadowsocks-go domain set capacity hint 1 6 1 1 DSKR
domain:www.example.net
suffix:example.com
suffix:github.com
suffix:cube64128.xyz
suffix:api.ipify.org
suffix:api6.ipify.org
suffix:archlinux.org
keyword:dev
regexp:^adservice.google.([a-z]{2}|com?)(.[a-z]{2})?$
Beim Laden einer Domänensatz-Textdatei lädt Shadowsocks-go alle Suffixe unverändert in eine einzige Karte. Dadurch wird das beste Gleichgewicht zwischen Startgeschwindigkeit, Speichernutzung und Match-Geschwindigkeit erreicht. Wenn Sie eine bessere Leistung wünschen, können Sie die Textdatei mit dem Konvertierungstool in das gob-Format konvertieren.
Das gob-Format ist im Grunde dasselbe, enthält jedoch alles binär serialisiert und verwendet einen Versuch, um Suffixe zu speichern und abzugleichen. Das Konvertierungstool lädt die Suffixe, um einen Suffix-Trie zu erstellen, und serialisiert dann den Trie und die anderen Regeln in einer Gob-Datei. Ziemlich ordentlich, nicht wahr?
Natürlich bin ich kein Algorithmus-Guru, daher weist der gesamte Prozess immer noch viele Ineffizienzen auf. Aber es ist gut genug für mich. Wenn Sie brillante neue Ideen haben, lassen Sie es mich bitte wissen!
Eine Reihe häufig verwendeter Domänensätze wird wöchentlich unter Shadowsocks-go-domain-sets im Release-Zweig aktualisiert. Benutzer von Arch Linux können das Paket „shadowsocks-go-domain-sets-git“ über die AUR installieren.
Um Domänensätze mit https://github.com/v2fly/domain-list-community als Quelle zu generieren, klonen Sie das Repository, erstellen Sie den Generator und generieren Sie dann Klartextlisten:
./domain-list-community -exportlists ' google,netflix '
Verwenden Sie shadowsocks-go-domain-set-converter
um die Klartextlisten in Domänensatzdateien zu konvertieren:
shadowsocks-go-domain-set-converter -inDlc google.txt -outGob ss-go-gob-google
shadowsocks-go-domain-set-converter -inDlc netflix.txt -outGob ss-go-gob-netflix
shadowsocks-go nutzt die MaxMind GeoLite2 Country-Datenbank für die IP-Geolokalisierung. Die Datenbank kann unter https://github.com/Dreamacro/maxmind-geoip heruntergeladen werden. Benutzer von Arch Linux können das Paket „shadowsocks-go-geolite2-country-git“ über die AUR installieren.
Für das Shadowsocks 2022-Protokoll sind Paketauffüllrichtlinien implementiert. Eine Paketauffüllrichtlinie steuert, ob ausgehenden Paketen Auffüllung hinzugefügt wird.
Beim Hinzufügen von Padding wird die MTU berücksichtigt, sodass die Größe des Padding-Pakets die MTU nicht überschreitet. Daher ist es wichtig, die MTU richtig einzustellen.
Die Padding-Richtlinie kann für jeden Shadowsocks 2022-Client und -Server individuell konfiguriert werden.
PadPlainDNS
: Auffüllen hinzufügen, wenn der Zielport 53 ist. (Standard)PadAll
: Alle Pakete auffüllen.NoPadding
: Keine Polsterung.Ablehnungsrichtlinien werden für alle TCP-Server implementiert. Die Ablehnungsrichtlinie eines TCP-Servers wird aufgerufen, wenn eine akzeptierte Verbindung den Handshake-Prozess des Protokolls fehlschlägt. Jedes Protokoll verfügt über seine eigene Standard-Ablehnungsrichtlinie. Benutzerdefinierte Ablehnungsrichtlinien können für Zensurumgehungsserver nützlich sein, um aktive Untersuchungen zu umgehen.
JustClose
: Schließen Sie einfach die Verbindung. (Standard für Klartextprotokolle)ForceReset
: Verbindung zwangsweise zurücksetzen. Viele Protokolle verhalten sich so, wenn ungültige Daten empfangen werden. (Standard für Shadowsocks 2022)CloseWriteDrain
: FIN senden und weiterlesen bis EOF. Dies ist normalerweise die Art und Weise, wie ältere Shadowsocks-Server die Wiedergabe handhaben.ReplyWithGibberish
: Lesen Sie weiter und senden Sie zufälligen Müll, nachdem jeder Lesevorgang zurückgegeben wurde. Dies emuliert das Verhalten eines älteren Shadowsocks-Servers ohne Wiedergabeschutz, mit der Ausnahme, dass er die wiedergegebene Nutzlast nicht tatsächlich weiterleitet. Ein Shadowsocks 2022-Server kann so konfiguriert werden, dass er TCP-Verbindungen an eine Fallback-Adresse weiterleitet, wenn der Handshake fehlschlägt. Fügen Sie das Feld unsafeFallbackAddress
zum Serverblock hinzu, um die Fallback-Adresse anzugeben. Beim Start wird eine Warnmeldung ausgegeben, die Sie darüber informiert, dass die Verwendung dieser Funktion den Server „verunreinigt“. Unsicherer Fallback funktioniert nur für TCP-Verbindungen.
Diese Funktion kann nützlich sein, wenn Ihr Bedrohungsmodell nur Off-Path-Angreifer umfasst und Sie den Port wiederverwenden oder Sonden dazu verleiten möchten, zu glauben, der Server sei etwas anderes. Ein On-Path-Angreifer (z. B. ein typischer Zensor) kann leicht erkennen, dass der reguläre Datenverkehr nicht mit dem Fallback-Datenverkehr übereinstimmt.
Mit der Funktion „Unsichere Stream-Präfixe“ können Sie ein Paar vorab freigegebener Klartext-Präfixe für Shadowsocks 2022-Streams konfigurieren. Die Präfixe werden den Anfrage- und Antwortströmen vorangestellt, um einfache Firewalls auszutricksen.
Um diese Funktion zu verwenden, fügen Sie den Client- und Serverblöcken unsafeRequestStreamPrefix
und unsafeResponseStreamPrefix
hinzu und geben Sie die Präfixe in Base64-Codierung an. Client und Server müssen sich auf dasselbe Präfixpaar einigen. Beim Start wird eine Warnmeldung ausgegeben, die Sie darüber informiert, dass die Verwendung dieser Funktion den Client und den Server „schädigt“.
AGPL-3.0 oder höher