เอกสารประกอบของ Shadowsocks
การเดินเรือ
รูปแบบการกำหนดค่า Shadowsocks
ไฟล์กำหนดค่า
Shadowsocks ใช้การกำหนดค่ารูปแบบ JSON:
{
“เซิร์ฟเวอร์”:”my_server_ip”,
"เซิร์ฟเวอร์_พอร์ต":8388,
“local_port”:1080,
“รหัสผ่าน”:”บาร์ฟู!”,
“วิธีการ”:”chacha20-ietf-poly1305″
}
รูปแบบ JSON
- เซิร์ฟเวอร์ : ชื่อโฮสต์หรือเซิร์ฟเวอร์ IP ของคุณ (IPv4/IPv6)
- server_port: หมายเลขพอร์ตเซิร์ฟเวอร์
- local_port: หมายเลขพอร์ตในเครื่อง
- รหัสผ่าน: รหัสผ่านที่ใช้เข้ารหัสการถ่ายโอน
- วิธีการ: วิธีการเข้ารหัส
วิธีการเข้ารหัส
เรากำหนดค่าเซิร์ฟเวอร์ของเราและแนะนำให้คุณใช้รหัส AEAD chacha20-ietf-poly1305 เนื่องจากเป็นวิธีการเข้ารหัสที่แข็งแกร่งที่สุด
หากกำหนดค่าเซิร์ฟเวอร์ shadowsocks ของคุณเอง คุณสามารถเลือกจาก “chacha20-ietf-poly1305” หรือ “aes-256-gcm”
URI และคิวอาร์โค้ด
Shadowsocks สำหรับ Android / IOS ยังใช้การกำหนดค่ารูปแบบ URI ที่เข้ารหัส BASE64:
ss://BASE64-ENCODED-STRING-ไม่มีช่องว่างภายใน#TAG
URI ธรรมดาควรเป็น: ss://method:password@hostname:port
URI ข้างต้นไม่เป็นไปตาม RFC3986 รหัสผ่านในกรณีนี้ควรเป็นข้อความล้วน ไม่ใช่เข้ารหัสแบบเปอร์เซ็นต์
ตัวอย่าง: เรากำลังใช้เซิร์ฟเวอร์ที่ 192.168.100.1:8888 การใช้ bf-cfb วิธีการเข้ารหัสและรหัสผ่าน ทดสอบ/!@#:.
จากนั้นใช้ URI ธรรมดา เอสเอส://bf-cfb:test/!@#:@192.168.100.1:8888เราสามารถสร้าง URI ที่เข้ารหัส BASE64 ได้:
> console.log( “ss://” + btoa(“bf-cfb:test/!@#:@192.168.100.1:8888”) )
ss://YmYtY2ZiOnRlc3QvIUAjOkAxOTIuMTY4LjEwMC4xOjg4ODg
เพื่อช่วยจัดระเบียบและระบุ URI เหล่านี้ คุณสามารถต่อท้ายแท็กต่อท้ายสตริงที่เข้ารหัส BASE64:
ss://YmYtY2ZiOnRlc3QvIUAjOkAxOTIuMTY4LjEwMC4xOjg4ODg#example-server
ที่อยู่
Shadowsocks ใช้ที่อยู่ที่พบในรูปแบบที่อยู่ SOCKS5:
[ประเภท 1 ไบต์][โฮสต์ความยาวตัวแปร][พอร์ต 2 ไบต์]
นี่คือประเภทที่อยู่ที่กำหนดไว้:
- 0x01 : โฮสต์คือที่อยู่ IPv4 ขนาด 4 ไบต์
- 0x03 : host เป็นสตริงที่มีความยาวผันแปรได้ โดยเริ่มจากความยาว 1 ไบต์ ตามด้วยชื่อโดเมนสูงสุด 255 ไบต์
- 0x04 : โฮสต์คือที่อยู่ IPv16 ขนาด 6 ไบต์
หมายเลขพอร์ตเป็นจำนวนเต็มที่ไม่ได้ลงนามขนาดใหญ่ 2 ไบต์
TCP
ไคลเอนต์ ss-local เริ่มต้นการเชื่อมต่อกับ ss-remote โดยส่งข้อมูลที่เข้ารหัสโดยเริ่มจากที่อยู่เป้าหมายตามด้วยข้อมูลเพย์โหลด การเข้ารหัสจะแตกต่างกันไปตามรหัสที่ใช้
[ที่อยู่เป้าหมาย][เพย์โหลด]
ss-remote ได้รับข้อมูลที่เข้ารหัส จากนั้นถอดรหัสและแยกวิเคราะห์ที่อยู่เป้าหมาย จากนั้นจะสร้างการเชื่อมต่อ TCP ใหม่ไปยังเป้าหมายและส่งต่อข้อมูล payload ไปยังเป้าหมาย ss-remote ได้รับการตอบกลับจากเป้าหมาย จากนั้นเข้ารหัสข้อมูลและส่งต่อกลับไปยัง ss-local จนกว่าจะยกเลิกการเชื่อมต่อ
เพื่อจุดประสงค์ในการทำให้งงงวย โลคัลและรีโมตควรส่งข้อมูลการจับมือพร้อมกับเพย์โหลดบางส่วนในแพ็กเก็ตแรก
UDP
ss-local ส่งแพ็คเก็ตข้อมูลที่เข้ารหัสซึ่งมีที่อยู่เป้าหมายและเพย์โหลดไปยัง ss-remote
[ที่อยู่เป้าหมาย][เพย์โหลด]
เมื่อได้รับแพ็กเก็ตที่เข้ารหัสแล้ว ss-remote จะถอดรหัสและแยกวิเคราะห์ที่อยู่เป้าหมาย จากนั้นจะส่งแพ็กเก็ตข้อมูลใหม่พร้อมเพย์โหลดไปยังเป้าหมาย ss-remote รับแพ็คเก็ตข้อมูลจากเป้าหมายและเพิ่มที่อยู่เป้าหมายไปยัง payload ในแต่ละแพ็กเก็ต สำเนาที่เข้ารหัสจะถูกส่งกลับไปที่ ss-local
[ที่อยู่เป้าหมาย][เพย์โหลด]
กระบวนการนี้สามารถสรุปเป็น ss-remote เพื่อทำการแปลที่อยู่เครือข่ายสำหรับ ss-local