แพลตฟอร์มพร็อกซีอเนกประสงค์และมีประสิทธิภาพสำหรับการสื่อสารที่ปลอดภัย
splice(2)
recvmmsg(2)
และ sendmmsg(2)
แพ็คเกจ Release และ VCS มีอยู่ใน AUR:
ดาวน์โหลดจากรุ่นต่างๆ
สร้างและติดตั้งเวอร์ชันล่าสุดโดยใช้ 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
หากเซิร์ฟเวอร์อาจใช้จากการเชื่อมต่อ PPPoE mtu
ควรลดลงเหลือ 1492 หากไม่ทราบ PMTU ไคลเอ็นต์ถึงเซิร์ฟเวอร์ การแพ็ดสามารถปิดใช้งานได้อย่างสมบูรณ์โดยการตั้งค่า paddingPolicy
เป็น NoPadding
สำหรับเซิร์ฟเวอร์ที่ไม่มี PSK ของผู้ใช้ (โหมดผู้ใช้คนเดียว) ฟิลด์ psk
จะระบุ PSK และฟิลด์ uPSKStorePath
สามารถละเว้นหรือเว้นว่างไว้ได้ เมื่อมีการระบุ PSK ของผู้ใช้ตั้งแต่หนึ่งรายขึ้นไปในไฟล์ร้านค้า uPSK ฟิลด์ 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
เป็นจริง
{
"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 จากนั้นจึงจัดลำดับ trie และกฎอื่นๆ ลงในไฟล์ gob ค่อนข้างเรียบร้อยใช่มั้ย?
แน่นอนว่าฉันไม่ใช่กูรูด้านอัลกอริทึม ดังนั้นกระบวนการทั้งหมดจึงยังมีความไร้ประสิทธิภาพอยู่มาก แต่มันก็ดีพอสำหรับฉัน หากคุณมีไอเดียใหม่ๆ ที่ยอดเยี่ยม โปรดแจ้งให้เราทราบ!
ชุดของชุดโดเมนที่ใช้กันทั่วไปจะได้รับการอัปเดตทุกสัปดาห์ที่ shadowsocks-go-domain-set ในสาขาการเผยแพร่ ผู้ใช้ Arch Linux สามารถติดตั้งแพ็คเกจ shadowsocks-go-domain-sets-git จาก AUR
หากต้องการสร้างชุดโดเมนโดยใช้ 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 สำหรับการระบุตำแหน่งทางภูมิศาสตร์ IP สามารถดาวน์โหลดฐานข้อมูลได้จาก https://github.com/Dreamacro/maxmind-geoip ผู้ใช้ Arch Linux สามารถติดตั้งแพ็คเกจ shadowsocks-go-geolite2-country-git จาก AUR
มีการใช้นโยบายการแพ็กเก็ตแพ็กเก็ตสำหรับโปรโตคอล 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 หรือใหม่กว่า