Une plateforme proxy polyvalente et efficace pour des communications sécurisées.
splice(2)
.recvmmsg(2)
et sendmmsg(2)
. Les packages Release et VCS sont disponibles dans l'AUR :
Téléchargez à partir des versions.
Créez et installez la dernière version à l'aide de 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
Ou clonez le référentiel et construisez-le manuellement :
go build -trimpath -ldflags ' -s -w ' ./cmd/shadowsocks-go
go build -trimpath -ldflags ' -s -w ' ./cmd/shadowsocks-go-domain-set-converter
Tous les exemples de configuration et les fichiers d'unité systemd se trouvent dans le répertoire docs.
Le champ clients
peut être omis ou laissé vide. Un client « direct » par défaut sera automatiquement ajouté.
Sur les serveurs de production, vous souhaiterez peut-être définir udpRelayBatchSize
sur une valeur inférieure comme 8 pour réduire l'utilisation de la mémoire tout en bénéficiant de recvmmsg(2)
et sendmmsg(2)
.
Les paquets UDP peuvent être complétés jusqu'à la taille maximale des paquets calculée à partir de mtu
. Si le serveur peut être utilisé à partir d'une connexion PPPoE, mtu
doit être réduit à 1492. Si le PMTU client à serveur est inconnu, le remplissage peut être complètement désactivé en définissant paddingPolicy
sur NoPadding
.
Pour les serveurs sans PSK utilisateur (mode mono-utilisateur), le champ psk
spécifie le PSK et le champ uPSKStorePath
peut être omis ou laissé vide. Lorsqu'un ou plusieurs PSK utilisateur sont spécifiés dans le fichier de magasin uPSK, le champ psk
spécifie le PSK d'identité.
Pour ajouter/mettre à jour/supprimer des utilisateurs sans redémarrer le serveur, modifiez le fichier de magasin uPSK et envoyez un signal SIGUSR1
au processus serveur, ou utilisez l'API RESTful. Les mises à jour de l'API RESTful seront automatiquement enregistrées dans le fichier du magasin uPSK.
/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== "
}
Par défaut, le routeur utilise le serveur DNS configuré pour résoudre les noms de domaine et faire correspondre les règles IP. Les adresses IP résolues ne sont utilisées que pour faire correspondre les règles IP. Les demandes sont effectuées en utilisant le nom de domaine d'origine. Pour désactiver la correspondance des règles IP pour les noms de domaine, définissez disableNameResolutionForIPRules
sur true.
{
"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 "
]
}
]
}
}
Voir docs/config.json.
shadowsocks-go a son propre format de fichier de domaine, car les autres formats que j'ai vus sont tous horribles !
Et ne vous inquiétez pas, nous avons un outil de conversion simple pour convertir entre différents formats : shadowsocks-go-domain-set-converter
Un fichier texte d'ensemble de domaine commence éventuellement par un commentaire d'indication de capacité. L'outil de conversion peut générer automatiquement un indice de capacité pour vous. Il existe 4 types de règles de correspondance de domaine :
domain:
correspond au domaine.suffix:
fait correspondre le domaine et ses sous-domaines.keyword:
correspond si le domaine contient le mot-clé.regexp:
correspond si le domaine correspond à l'expression régulière.Exemple de fichier texte d'ensemble de domaine :
# 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})?$
Lors du chargement d'un fichier texte d'ensemble de domaine, shadowsocks-go charge tous les suffixes tels quels dans une seule carte. Cela permet d'obtenir le meilleur équilibre entre la vitesse de démarrage, l'utilisation de la mémoire et la vitesse de correspondance. Si vous souhaitez de meilleures performances, vous pouvez utiliser l'outil de conversion pour convertir le fichier texte au format gob.
Le format gob est fondamentalement la même chose, mais tout est sérialisé en binaire et utilise un trie pour stocker et faire correspondre les suffixes. L'outil de conversion charge les suffixes pour créer un trie de suffixes, puis sérialise le trie et les autres règles dans un fichier gob. Plutôt sympa, n'est-ce pas ?
Bien sûr, je ne suis pas un gourou des algorithmes, donc l’ensemble du processus présente encore de nombreuses inefficacités. Mais c'est assez bien pour moi. Si vous avez de nouvelles idées géniales, faites-le-moi savoir !
Un ensemble d'ensembles de domaines couramment utilisés est mis à jour chaque semaine sur shadowsocks-go-domain-sets dans la branche de publication. Les utilisateurs d'Arch Linux peuvent installer le package shadowsocks-go-domain-sets-git à partir de l'AUR.
Pour générer des ensembles de domaines en utilisant https://github.com/v2fly/domain-list-community comme source, clonez le référentiel et créez le générateur, puis générez des listes en texte brut :
./domain-list-community -exportlists ' google,netflix '
Utilisez shadowsocks-go-domain-set-converter
pour convertir les listes de texte brut en fichiers d'ensemble de domaine :
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 utilise la base de données MaxMind GeoLite2 Country pour la géolocalisation IP. La base de données peut être téléchargée depuis https://github.com/Dreamacro/maxmind-geoip. Les utilisateurs d'Arch Linux peuvent installer le package shadowsocks-go-geolite2-country-git à partir de l'AUR.
Des politiques de remplissage des paquets sont implémentées pour le protocole Shadowsocks 2022. Une politique de remplissage des paquets contrôle s'il faut ajouter un remplissage aux paquets sortants.
Lors de l'ajout de remplissage, la MTU est prise en compte, de sorte que la taille du paquet rempli ne dépassera pas la MTU. Il est donc important de définir correctement le MTU.
La politique de remplissage peut être configurée individuellement pour chaque client et serveur Shadowsocks 2022.
PadPlainDNS
: Ajoutez un remplissage si le port de destination est 53. (Par défaut)PadAll
: remplit tous les paquets.NoPadding
: Pas de remplissage.Des politiques de rejet sont implémentées pour tous les serveurs TCP. La politique de rejet d'un serveur TCP est invoquée lorsqu'une connexion acceptée échoue au processus d'établissement de liaison du protocole. Chaque protocole possède sa propre politique de rejet par défaut. Les politiques de rejet personnalisées peuvent être utiles aux serveurs de contournement de la censure afin d'échapper aux sondages actifs.
JustClose
: fermez simplement la connexion. (Par défaut pour les protocoles en texte clair)ForceReset
: Réinitialisation forcée de la connexion. De nombreux protocoles se comportent de cette façon lorsque des données non valides sont reçues. (Par défaut pour Shadowsocks 2022)CloseWriteDrain
: envoyez FIN et continuez à lire jusqu'à EOF. C’est généralement ainsi que les anciens serveurs Shadowsocks gèrent la relecture.ReplyWithGibberish
: continuez à lire et envoyez des déchets aléatoires après le retour de chaque lecture. Cela émule le comportement d'un ancien serveur Shadowsocks sans protection contre la relecture, sauf qu'il ne relaie pas réellement la charge utile relue. Un serveur Shadowsocks 2022 peut être configuré pour transférer les connexions TCP vers une adresse de secours en cas d'échec de la négociation. Ajoutez le champ unsafeFallbackAddress
au bloc serveur pour spécifier l'adresse de secours. Au démarrage, un message d'avertissement sera imprimé pour vous indiquer que l'utilisation de cette fonctionnalité « entache » le serveur. La solution de secours non sécurisée ne fonctionne que pour les connexions TCP.
Cette fonctionnalité peut être utile lorsque votre modèle de menace inclut uniquement des attaquants hors chemin et que vous souhaitez réutiliser le port ou tromper les sondes en pensant que le serveur est autre chose. Un attaquant sur le chemin (par exemple un censeur classique) peut facilement déterminer que le trafic régulier ne correspond pas au trafic de secours.
La fonctionnalité de préfixe de flux non sécurisé vous permet de configurer une paire de préfixes en texte clair pré-partagés pour les flux Shadowsocks 2022. Les préfixes sont ajoutés aux flux de requêtes et de réponses pour tromper les pare-feu simples.
Pour utiliser cette fonctionnalité, ajoutez unsafeRequestStreamPrefix
et unsafeResponseStreamPrefix
aux blocs client et serveur, et spécifiez les préfixes dans le codage base64. Le client et le serveur doivent s'entendre sur la même paire de préfixes. Au démarrage, un message d'avertissement sera imprimé pour vous indiquer que l'utilisation de cette fonctionnalité « entache » le client et le serveur.
AGPL-3.0 ou version ultérieure