Platform proxy yang serbaguna dan efisien untuk komunikasi yang aman.
splice(2)
.recvmmsg(2)
dan sendmmsg(2)
. Paket rilis dan VCS tersedia di AUR:
Unduh dari rilis.
Bangun dan instal versi terbaru menggunakan 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
Atau kloning repositori dan buat secara manual:
go build -trimpath -ldflags ' -s -w ' ./cmd/shadowsocks-go
go build -trimpath -ldflags ' -s -w ' ./cmd/shadowsocks-go-domain-set-converter
Semua contoh konfigurasi dan file unit systemd dapat ditemukan di direktori docs.
Bidang clients
dapat dihilangkan atau dibiarkan kosong. Klien "langsung" default akan ditambahkan secara otomatis.
Di server produksi, Anda mungkin ingin menyetel udpRelayBatchSize
ke nilai yang lebih rendah seperti 8 untuk mengurangi penggunaan memori sambil tetap memanfaatkan recvmmsg(2)
dan sendmmsg(2)
.
Paket UDP dapat diisi hingga ukuran paket maksimum yang dihitung dari mtu
. Jika server dapat digunakan dari koneksi PPPoE, mtu
harus dikurangi menjadi 1492. Jika PMTU klien-ke-server tidak diketahui, padding dapat dinonaktifkan sepenuhnya dengan menyetel paddingPolicy
ke NoPadding
.
Untuk server tanpa PSK pengguna (mode pengguna tunggal), kolom psk
menentukan PSK, dan kolom uPSKStorePath
dapat dihilangkan atau dibiarkan kosong. Ketika satu atau lebih PSK pengguna ditentukan dalam file penyimpanan uPSK, bidang psk
menentukan identitas PSK.
Untuk menambah/memperbarui/menghapus pengguna tanpa memulai ulang server, ubah file penyimpanan uPSK dan kirim sinyal SIGUSR1
ke proses server, atau gunakan RESTful API. Pembaruan dari RESTful API akan disimpan ke file penyimpanan uPSK secara otomatis.
/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== "
}
Secara default, router menggunakan server DNS yang dikonfigurasi untuk menyelesaikan nama domain dan mencocokkan aturan IP. Alamat IP yang diselesaikan hanya digunakan untuk mencocokkan aturan IP. Permintaan dibuat menggunakan nama domain asli. Untuk menonaktifkan pencocokan aturan IP untuk nama domain, disableNameResolutionForIPRules
ke 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 "
]
}
]
}
}
Lihat dokumen/config.json.
shadowocks-go memiliki format file kumpulan domainnya sendiri, karena format lain yang pernah saya lihat semuanya buruk!
Dan jangan khawatir, kami memiliki alat konversi sederhana untuk mengonversi berbagai format: shadowocks-go-domain-set-converter
File teks kumpulan domain secara opsional dimulai dengan komentar petunjuk kapasitas. Alat konversi dapat secara otomatis menghasilkan petunjuk kapasitas untuk Anda. Ada 4 jenis aturan pencocokan domain:
domain:
Cocokkan dengan domain.suffix:
Cocokkan domain dan subdomainnya.keyword:
Cocok jika domain berisi kata kunci.regexp:
Cocok jika domain cocok dengan ekspresi reguler.Contoh file teks kumpulan domain:
# 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})?$
Saat memuat file teks kumpulan domain, shadowocks-go memuat semua sufiks apa adanya ke dalam satu peta. Ini mencapai keseimbangan terbaik antara kecepatan startup, penggunaan memori, dan kecepatan kecocokan. Jika Anda ingin kinerja yang lebih baik, Anda dapat menggunakan alat konversi untuk mengonversi file teks ke format gob.
Format gob pada dasarnya sama, tetapi semuanya berseri biner dan menggunakan trie untuk menyimpan dan mencocokkan sufiks. Alat konversi memuat sufiks untuk membuat sufiks trie, lalu membuat serial trie dan aturan lainnya ke file gob. Cukup rapi, bukan?
Tentu saja, saya bukan ahli algoritma, jadi keseluruhan prosesnya masih memiliki banyak ketidakefisienan. Tapi itu cukup baik bagiku. Jika Anda memiliki ide baru yang brilian, beri tahu saya!
Satu set set domain yang umum digunakan diperbarui setiap minggu di shadowocks-go-domain-sets di cabang rilis. Pengguna Arch Linux dapat menginstal paket shadowocks-go-domain-set-git dari AUR.
Untuk membuat kumpulan domain menggunakan https://github.com/v2fly/domain-list-community sebagai sumbernya, clone repositori dan buat generator, lalu buat daftar teks biasa:
./domain-list-community -exportlists ' google,netflix '
Gunakan shadowsocks-go-domain-set-converter
untuk mengonversi daftar teks biasa menjadi file kumpulan domain:
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 menggunakan database Negara MaxMind GeoLite2 untuk geolokasi IP. Basis data dapat diunduh dari https://github.com/Dreamacro/maxmind-geoip. Pengguna Arch Linux dapat menginstal paket shadowocks-go-geolite2-country-git dari AUR.
Kebijakan padding paket diterapkan untuk protokol Shadowsocks 2022. Kebijakan padding paket mengontrol apakah akan menambahkan padding ke paket keluar.
Saat menambahkan padding, MTU diperhitungkan, sehingga ukuran paket yang diberi padding tidak akan melebihi MTU. Oleh karena itu penting untuk mengatur MTU dengan benar.
Kebijakan padding dapat dikonfigurasi secara individual untuk setiap klien dan server Shadowsocks 2022.
PadPlainDNS
: Tambahkan padding jika port tujuan adalah 53. (Default)PadAll
: Pad semua paket.NoPadding
: Tanpa bantalan.Kebijakan penolakan diterapkan untuk semua server TCP. Kebijakan penolakan server TCP dijalankan ketika koneksi yang diterima gagal dalam proses jabat tangan protokol. Setiap protokol memiliki kebijakan penolakan defaultnya sendiri. Kebijakan penolakan khusus dapat berguna bagi server pengelakan sensor untuk menghindari pemeriksaan aktif.
JustClose
: Tutup saja koneksinya. (Default untuk protokol teks jelas)ForceReset
: Mereset koneksi secara paksa. Banyak protokol berperilaku seperti ini ketika data yang diterima tidak valid. (Default untuk Shadowsocks 2022)CloseWriteDrain
: Kirim FIN dan terus membaca sampai EOF. Ini biasanya cara server Shadowsocks lama menangani pemutaran ulang.ReplyWithGibberish
: Teruslah membaca dan kirim sampah acak setelah setiap pembacaan kembali. Ini mengemulasi perilaku server Shadowsocks lama tanpa perlindungan replay, kecuali server tersebut tidak benar-benar merelay payload yang diputar ulang. Server Shadowsocks 2022 dapat dikonfigurasi untuk meneruskan koneksi TCP ke alamat cadangan ketika jabat tangan gagal. Tambahkan bidang unsafeFallbackAddress
ke blok server untuk menentukan alamat cadangan. Saat startup, pesan peringatan akan dicetak untuk memberi tahu Anda bahwa penggunaan fitur ini "mencemari" server. Penggantian tidak aman hanya berfungsi untuk koneksi TCP.
Fitur ini mungkin berguna ketika model ancaman Anda hanya mencakup penyerang di luar jalur, dan Anda ingin menggunakan kembali port atau mengelabui probe agar menganggap server adalah sesuatu yang lain. Penyerang di jalur (misalnya sensor biasa) dapat dengan mudah mengetahui bahwa lalu lintas reguler tidak cocok dengan lalu lintas cadangan.
Fitur awalan streaming yang tidak aman memungkinkan Anda mengonfigurasi sepasang awalan teks jelas yang dibagikan sebelumnya untuk streaming Shadowsocks 2022. Awalannya ditambahkan ke aliran permintaan dan respons untuk mengelabui firewall sederhana.
Untuk menggunakan fitur ini, tambahkan unsafeRequestStreamPrefix
dan unsafeResponseStreamPrefix
ke blok klien dan server, dan tentukan awalan dalam pengkodean base64. Klien dan server harus menyetujui pasangan awalan yang sama. Saat startup, pesan peringatan akan dicetak untuk memberitahu Anda bahwa penggunaan fitur ini "mencemari" klien dan server.
AGPL-3.0-atau-lebih baru