用於安全通訊的多功能且高效的代理平台。
splice(2)
的 TCP 中繼快速路徑。recvmmsg(2)
和sendmmsg(2)
。 AUR 中提供了發布和 VCS 套件:
從發行版下載。
使用 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
或者克隆存儲庫並手動構建它:
go build -trimpath -ldflags ' -s -w ' ./cmd/shadowsocks-go
go build -trimpath -ldflags ' -s -w ' ./cmd/shadowsocks-go-domain-set-converter
所有設定範例和 systemd 單元檔案都可以在 docs 目錄中找到。
clients
欄位可以省略或留空。將自動新增預設的“直接”客戶端。
在生產伺服器上,您可能想要將udpRelayBatchSize
設定為較低的值(例如 8)以減少記憶體使用量,同時仍受益於recvmmsg(2)
和sendmmsg(2)
。
UDP 封包可以填入根據mtu
計算得出的最大資料包大小。如果可以透過NoPadding
連線使用paddingPolicy
,則mtu
應減少至 1492。
對於沒有任何使用者 PSK 的伺服器(單一使用者模式), psk
欄位指定 PSK, uPSKStorePath
欄位可以省略或留空。當在 uPSK 儲存檔案中指定一個或多個使用者 PSK 時, psk
欄位指定身分 PSK。
若要在不重新啟動伺服器的情況下新增/更新/刪除用戶,請修改 uPSK 儲存檔案並向伺服器進程發送SIGUSR1
訊號,或使用 RESTful API。來自 RESTful API 的更新將自動儲存到 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== "
}
預設情況下,路由器使用配置的DNS伺服器來解析網域名稱並匹配IP規則。解析後的IP位址僅用於匹配IP規則。使用原始網域發出請求。若要停用網域名稱的 IP 規則匹配,請將disableNameResolutionForIPRules
設為 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 "
]
}
]
}
}
請參閱文件/config.json。
Shadowsocks-go 有自己的網域集檔案格式,因為我見過的其他格式都很糟糕!
別擔心,我們有一個簡單的轉換工具可以在不同格式之間轉換:shadowsocks-go-domain-set-converter
域集文字檔案可以選擇以容量提示註釋開始。轉換工具可以自動為您產生容量提示。網域匹配規則有4種類型:
domain:
匹配域。suffix:
匹配域名及其子域名。keyword:
如果網域包含關鍵字則符合。regexp:
如果網域與正規表示式符合則符合。域集文字檔案範例:
# 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})?$
載入域集文字檔案時,shadowsocks-go 會將所有後綴原樣載入到單一映射中。這樣就達到了啟動速度、記憶體佔用和匹配速度之間的最佳平衡。如果想要更好的效能,可以使用轉換工具將文字檔案轉換為gob格式。
gob 格式基本上是相同的,但所有內容都是二進位序列化的,並使用 trie 來儲存和匹配後綴。轉換工具載入後綴以建立後綴特里樹,然後將該特里樹和其他規則序列化到 gob 檔案。非常整潔,不是嗎?
當然,我不是演算法大師,所以整個過程還是有很多低效率的地方。但這對我來說已經夠好了。如果您有絕妙的新想法,請告訴我!
發布分支中的 Shadowsocks-go-domain-sets 每週都會更新一組常用的域集。 Arch Linux 使用者可以從 AUR 安裝 Shadowsocks-go-domain-sets-git 軟體套件。
若要使用 https://github.com/v2fly/domain-list-community 作為來源生成域集,請複製儲存庫並建立生成器,然後產生純文字清單:
./domain-list-community -exportlists ' google,netflix '
使用shadowsocks-go-domain-set-converter
將明文清單轉換為域集檔案:
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 使用 MaxMind GeoLite2 Country 資料庫進行 IP 地理定位。資料庫可從 https://github.com/Dreamacro/maxmind-geoip 下載。 Arch Linux 用戶可以從 AUR 安裝 Shadowsocks-go-geolite2-country-git 軟體套件。
資料包填充策略是針對 Shadowsocks 2022 協定實現的。資料包填充策略控制是否會向傳出資料包新增填充。
新增填充時會考慮 MTU,因此填充後的資料包大小不會超過 MTU。因此,正確設定 MTU 非常重要。
可以為每個 Shadowsocks 2022 用戶端和伺服器單獨配置填充策略。
PadPlainDNS
:如果目標連接埠為 53,則新增填充。PadAll
:填入所有資料包。NoPadding
:無填充。所有 TCP 伺服器均實施拒絕策略。當接受的連線在協定的握手過程中失敗時,將呼叫 TCP 伺服器的拒絕策略。每個協議都有自己的預設拒絕策略。自訂拒絕策略對於審查規避伺服器來說非常有用,可以逃避主動探測。
JustClose
:僅關閉連線。 (明文協定的預設值)ForceReset
:強制重置連線。當收到無效資料時,許多協議都會這樣做。 (Shadowsocks 2022 的預設值)CloseWriteDrain
:發送 FIN 並繼續讀取直到 EOF。這通常是傳統 Shadowsocks 伺服器處理重播的方式。ReplyWithGibberish
:繼續讀取並在每次讀取返回後發送隨機垃圾。這模擬了沒有重播保護的傳統 Shadowsocks 伺服器的行為方式,只不過它實際上並不中繼重播的有效負載。Shadowsocks 2022 伺服器可以設定為在握手失敗時將 TCP 連線轉送到後備位址。將unsafeFallbackAddress
欄位新增至伺服器區塊以指定回退位址。啟動時,將列印警告訊息,告訴您使用此功能會「污染」伺服器。不安全回退僅適用於 TCP 連線。
當您的威脅模型僅包括偏離路徑的攻擊者,並且您希望重複使用連接埠或欺騙探針以認為伺服器是其他東西時,此功能可能很有用。路徑上的攻擊者(例如典型的審查者)可以輕鬆判斷常規流量與後備流量不符。
不安全串流前綴功能可讓您為 Shadowsocks 2022 串流配置一對預先共用的明文前綴。這些前綴被添加到請求和回應流之前以欺騙簡單的防火牆。
若要使用此功能,請將unsafeRequestStreamPrefix
和unsafeResponseStreamPrefix
新增至用戶端和伺服器區塊,並指定 base64 編碼的前綴。客戶端和伺服器必須同意同一對前綴。啟動時,將列印警告訊息,告訴您使用此功能會「污染」客戶端和伺服器。
AGPL-3.0-或更高版本