Una plataforma proxy versátil y eficiente para comunicaciones seguras.
splice(2)
.recvmmsg(2)
y sendmmsg(2)
. Los paquetes de lanzamiento y VCS están disponibles en AUR:
Descargar desde lanzamientos.
Compile e instale la última versión usando 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
O clonar el repositorio y compilarlo manualmente:
go build -trimpath -ldflags ' -s -w ' ./cmd/shadowsocks-go
go build -trimpath -ldflags ' -s -w ' ./cmd/shadowsocks-go-domain-set-converter
Todos los ejemplos de configuración y archivos de unidades systemd se pueden encontrar en el directorio de documentos.
El campo clients
se puede omitir o dejar vacío. Se agregará automáticamente un cliente "directo" predeterminado.
En servidores de producción, es posible que desee configurar udpRelayBatchSize
en un valor más bajo, como 8, para reducir el uso de memoria y al mismo tiempo beneficiarse de recvmmsg(2)
y sendmmsg(2)
.
Los paquetes UDP se pueden rellenar hasta el tamaño máximo de paquete calculado a partir de mtu
. Si el servidor se puede utilizar desde una conexión PPPoE, mtu
se debe reducir a 1492. Si se desconoce la PMTU de cliente a servidor, el relleno se puede desactivar completamente estableciendo paddingPolicy
en NoPadding
.
Para servidores sin ningún PSK de usuario (modo de usuario único), el campo psk
especifica el PSK y el campo uPSKStorePath
se puede omitir o dejar vacío. Cuando se especifican una o más PSK de usuario en el archivo de almacenamiento de uPSK, el campo psk
especifica la PSK de identidad.
Para agregar/actualizar/eliminar usuarios sin reiniciar el servidor, modifique el archivo de almacenamiento uPSK y envíe una señal SIGUSR1
al proceso del servidor, o use la API RESTful. Las actualizaciones de la API RESTful se guardarán automáticamente en el archivo de la tienda 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== "
}
De forma predeterminada, el enrutador utiliza el servidor DNS configurado para resolver nombres de dominio y hacer coincidir las reglas de IP. Las direcciones IP resueltas solo se utilizan para hacer coincidir las reglas de IP. Las solicitudes se realizan utilizando el nombre de dominio original. Para deshabilitar la coincidencia de reglas de IP para nombres de dominio, establezca disableNameResolutionForIPRules
en verdadero.
{
"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 "
]
}
]
}
}
Consulte documentos/config.json.
Shadowsocks-go tiene su propio formato de archivo de conjunto de dominios, ¡porque otros formatos que he visto son todos horribles!
Y no te preocupes, tenemos una sencilla herramienta de conversión para convertir entre diferentes formatos: Shadowsocks-go-domain-set-converter
Opcionalmente, un archivo de texto de conjunto de dominio comienza con un comentario de sugerencia de capacidad. La herramienta de conversión puede generar automáticamente una sugerencia de capacidad para usted. Hay 4 tipos de reglas de coincidencia de dominios:
domain:
Coincide con el dominio.suffix:
coincide con el dominio y sus subdominios.keyword:
Coincidencia si el dominio contiene la palabra clave.regexp:
Coincide si el dominio coincide con la expresión regular.Ejemplo de un archivo de texto de conjunto de dominio:
# 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})?$
Al cargar un archivo de texto de conjunto de dominio, Shadowsocks-go carga todos los sufijos tal como están en un solo mapa. Esto logra el mejor equilibrio entre la velocidad de inicio, el uso de la memoria y la velocidad del partido. Si desea un mejor rendimiento, puede utilizar la herramienta de conversión para convertir el archivo de texto al formato gob.
El formato gob es básicamente lo mismo, pero tiene todo binario serializado y usa un intento para almacenar y hacer coincidir sufijos. La herramienta de conversión carga los sufijos para crear un sufijo trie y luego serializa el trie y las demás reglas en un archivo gob. Bastante bueno, ¿no?
Por supuesto, no soy un gurú de los algoritmos, por lo que todo el proceso todavía tiene muchas ineficiencias. Pero es lo suficientemente bueno para mí. Si tienes nuevas ideas brillantes, ¡házmelo saber!
Un conjunto de conjuntos de dominios de uso común se actualiza semanalmente en Shadowsocks-go-domain-sets en la rama de lanzamiento. Los usuarios de Arch Linux pueden instalar el paquete shadowsocks-go-domain-sets-git desde AUR.
Para generar conjuntos de dominios usando https://github.com/v2fly/domain-list-community como fuente, clone el repositorio y cree el generador, luego genere listas de texto sin formato:
./domain-list-community -exportlists ' google,netflix '
Utilice shadowsocks-go-domain-set-converter
para convertir las listas de texto sin formato en archivos de conjuntos de dominios:
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 utiliza la base de datos de países MaxMind GeoLite2 para la geolocalización de IP. La base de datos se puede descargar desde https://github.com/Dreamacro/maxmind-geoip. Los usuarios de Arch Linux pueden instalar el paquete shadowsocks-go-geolite2-country-git desde AUR.
Se implementan políticas de relleno de paquetes para el protocolo Shadowsocks 2022. Una política de relleno de paquetes controla si se agrega relleno a los paquetes salientes.
Al agregar relleno, se tiene en cuenta la MTU, por lo que el tamaño del paquete acolchado no excederá la MTU. Por lo tanto, es importante configurar la MTU correctamente.
La política de relleno se puede configurar individualmente para cada cliente y servidor de Shadowsocks 2022.
PadPlainDNS
: agregue relleno si el puerto de destino es 53. (Predeterminado)PadAll
: Rellena todos los paquetes.NoPadding
: Sin relleno.Se implementan políticas de rechazo para todos los servidores TCP. La política de rechazo de un servidor TCP se invoca cuando una conexión aceptada falla en el proceso de protocolo de enlace del protocolo. Cada protocolo tiene su propia política de rechazo predeterminada. Las políticas de rechazo personalizadas pueden resultar útiles para que los servidores que eluden la censura evadan el sondeo activo.
JustClose
: Simplemente cierra la conexión. (Predeterminado para protocolos de texto sin cifrar)ForceReset
: Restablece la conexión a la fuerza. Muchos protocolos se comportan de esta manera cuando se reciben datos no válidos. (Predeterminado para Shadowsocks 2022)CloseWriteDrain
: envía FIN y sigue leyendo hasta el EOF. Normalmente, así es como los servidores Shadowsocks antiguos manejan la reproducción.ReplyWithGibberish
: sigue leyendo y envía basura aleatoria después de que regrese cada lectura. Esto emula cómo se comporta un servidor Shadowsocks heredado sin protección de reproducción, excepto que en realidad no transmite la carga útil reproducida. Se puede configurar un servidor Shadowsocks 2022 para reenviar conexiones TCP a una dirección alternativa cuando falla el protocolo de enlace. Agregue el campo unsafeFallbackAddress
al bloque del servidor para especificar la dirección alternativa. Al iniciar, se imprimirá un mensaje de advertencia para informarle que el uso de esta función "contamina" el servidor. El respaldo inseguro solo funciona para conexiones TCP.
Esta característica puede ser útil cuando su modelo de amenaza solo incluye atacantes fuera de ruta y desea reutilizar el puerto o engañar a las sondas para que piensen que el servidor es otra cosa. Un atacante en ruta (por ejemplo, un censor típico) puede darse cuenta fácilmente de que el tráfico normal no coincide con el tráfico de reserva.
La función de prefijo de transmisión insegura le permite configurar un par de prefijos de texto sin cifrar previamente compartidos para las transmisiones de Shadowsocks 2022. Los prefijos se anteponen a los flujos de solicitud y respuesta para engañar a los cortafuegos simples.
Para utilizar esta función, agregue unsafeRequestStreamPrefix
y unsafeResponseStreamPrefix
a los bloques del cliente y del servidor, y especifique los prefijos en codificación base64. El cliente y el servidor deben acordar el mismo par de prefijos. Al iniciar, se imprimirá un mensaje de advertencia para informarle que el uso de esta función "contamina" al cliente y al servidor.
AGPL-3.0 o posterior