Uma plataforma proxy versátil e eficiente para comunicações seguras.
splice(2)
.recvmmsg(2)
e sendmmsg(2)
. Os pacotes Release e VCS estão disponíveis no AUR:
Baixe dos lançamentos.
Crie e instale a versão mais recente 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
Ou clone o repositório e construa-o manualmente:
go build -trimpath -ldflags ' -s -w ' ./cmd/shadowsocks-go
go build -trimpath -ldflags ' -s -w ' ./cmd/shadowsocks-go-domain-set-converter
Todos os exemplos de configuração e arquivos de unidade do systemd podem ser encontrados no diretório docs.
O campo clients
pode ser omitido ou deixado em branco. Um cliente "direto" padrão será adicionado automaticamente.
Em servidores de produção, você pode querer definir udpRelayBatchSize
para um valor mais baixo, como 8, para reduzir o uso de memória e ainda se beneficiar de recvmmsg(2)
e sendmmsg(2)
.
Os pacotes UDP podem ser preenchidos até o tamanho máximo do pacote calculado em mtu
. Se o servidor puder ser usado a partir de uma conexão PPPoE, mtu
deverá ser reduzido para 1492. Se o PMTU cliente-servidor for desconhecido, o preenchimento poderá ser completamente desativado configurando paddingPolicy
como NoPadding
.
Para servidores sem PSKs de usuário (modo de usuário único), o campo psk
especifica o PSK e o campo uPSKStorePath
pode ser omitido ou deixado em branco. Quando um ou mais PSKs de usuário são especificados no arquivo de armazenamento uPSK, o campo psk
especifica a identidade PSK.
Para adicionar/atualizar/remover usuários sem reiniciar o servidor, modifique o arquivo de armazenamento uPSK e envie um sinal SIGUSR1
ao processo do servidor ou use a API RESTful. As atualizações da API RESTful serão salvas automaticamente no arquivo de armazenamento 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== "
}
Por padrão, o roteador usa o servidor DNS configurado para resolver nomes de domínio e corresponder às regras de IP. Os endereços IP resolvidos são usados apenas para correspondência de regras de IP. As solicitações são feitas usando o nome de domínio original. Para desabilitar a correspondência de regras de IP para nomes de domínio, defina disableNameResolutionForIPRules
como 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 "
]
}
]
}
}
Consulte docs/config.json.
shadowocks-go tem seu próprio formato de arquivo definido por domínio, porque outros formatos que vi são horríveis!
E não se preocupe, temos uma ferramenta de conversão simples para converter entre diferentes formatos: shadowocks-go-domain-set-converter
Um arquivo de texto de conjunto de domínios começa opcionalmente com um comentário de dica de capacidade. A ferramenta de conversão pode gerar automaticamente uma dica de capacidade para você. Existem 4 tipos de regras de correspondência de domínio:
domain:
corresponde ao domínio.suffix:
corresponde ao domínio e seus subdomínios.keyword:
Corresponde se o domínio contém a palavra-chave.regexp:
Corresponde se o domínio corresponde à expressão regular.Exemplo de arquivo de texto de conjunto de domínio:
# 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})?$
Ao carregar um arquivo de texto de conjunto de domínio, shadowocks-go carrega todos os sufixos como estão em um único mapa. Isso alcança o melhor equilíbrio entre velocidade de inicialização, uso de memória e velocidade de correspondência. Se quiser um melhor desempenho, você pode usar a ferramenta de conversão para converter o arquivo de texto para o formato gob.
O formato gob é basicamente a mesma coisa, mas tem tudo serializado em binário e usa um try para armazenar e combinar sufixos. A ferramenta de conversão carrega os sufixos para construir uma tentativa de sufixo e, em seguida, serializa a tentativa e as outras regras em um arquivo gob. Muito legal, não é?
Claro, não sou um guru de algoritmos, então todo o processo ainda apresenta muitas ineficiências. Mas é bom o suficiente para mim. Se você tiver novas ideias brilhantes, por favor me avise!
Um conjunto de conjuntos de domínio comumente usados é atualizado semanalmente em shadowsocks-go-domain-sets no branch de lançamento. Os usuários do Arch Linux podem instalar o pacote shadowocks-go-domain-sets-git do AUR.
Para gerar conjuntos de domínios usando https://github.com/v2fly/domain-list-community como fonte, clone o repositório e construa o gerador e, em seguida, gere listas de texto simples:
./domain-list-community -exportlists ' google,netflix '
Use shadowsocks-go-domain-set-converter
para converter as listas de texto simples em arquivos de conjunto de domínios:
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
shadowocks-go usa o banco de dados MaxMind GeoLite2 Country para geolocalização de IP. O banco de dados pode ser baixado em https://github.com/Dreamacro/maxmind-geoip. Os usuários do Arch Linux podem instalar o pacote shadowocks-go-geolite2-country-git do AUR.
As políticas de preenchimento de pacotes são implementadas para o protocolo Shadowsocks 2022. Uma política de preenchimento de pacotes controla se deve ser adicionado preenchimento aos pacotes de saída.
Ao adicionar preenchimento, o MTU é levado em consideração, para que o tamanho do pacote preenchido não exceda o MTU. Portanto é importante definir o MTU corretamente.
A política de preenchimento pode ser configurada individualmente para cada cliente e servidor Shadowsocks 2022.
PadPlainDNS
: Adicione preenchimento se a porta de destino for 53. (Padrão)PadAll
: preenche todos os pacotes.NoPadding
: Sem preenchimento.As políticas de rejeição são implementadas para todos os servidores TCP. A política de rejeição de um servidor TCP é invocada quando uma conexão aceita falha no processo de handshake do protocolo. Cada protocolo tem sua própria política de rejeição padrão. Políticas de rejeição personalizadas podem ser úteis para servidores de evasão de censura para evitar sondagens ativas.
JustClose
: basta fechar a conexão. (Padrão para protocolos de texto não criptografado)ForceReset
: redefine a conexão à força. Muitos protocolos se comportam dessa maneira quando dados inválidos são recebidos. (Padrão para Shadowsocks 2022)CloseWriteDrain
: Envie FIN e continue lendo até EOF. Normalmente é assim que os servidores Shadowsocks legados lidam com a reprodução.ReplyWithGibberish
: Continue lendo e envie lixo aleatório após o retorno de cada leitura. Isso emula o comportamento de um servidor Shadowsocks legado sem proteção de reprodução, exceto que na verdade não retransmite a carga reproduzida. Um servidor Shadowsocks 2022 pode ser configurado para encaminhar conexões TCP para um endereço substituto quando o handshake falhar. Adicione o campo unsafeFallbackAddress
ao bloco do servidor para especificar o endereço substituto. Na inicialização, uma mensagem de aviso será impressa informando que o uso deste recurso "contamina" o servidor. O fallback inseguro funciona apenas para conexões TCP.
Esse recurso pode ser útil quando seu modelo de ameaça inclui apenas invasores fora do caminho e você deseja reutilizar a porta ou enganar as sondas fazendo-as pensar que o servidor é outra coisa. Um invasor no caminho (por exemplo, um censor típico) pode facilmente dizer que o tráfego regular não corresponde ao tráfego de fallback.
O recurso de prefixo de fluxo inseguro permite configurar um par de prefixos de texto não criptografado pré-compartilhados para fluxos Shadowsocks 2022. Os prefixos são acrescentados aos fluxos de solicitação e resposta para enganar firewalls simples.
Para usar esse recurso, adicione unsafeRequestStreamPrefix
e unsafeResponseStreamPrefix
aos blocos cliente e servidor e especifique os prefixos na codificação base64. O cliente e o servidor devem concordar com o mesmo par de prefixos. Na inicialização, uma mensagem de aviso será impressa informando que o uso desse recurso "contamina" o cliente e o servidor.
AGPL-3.0 ou posterior