พร็อกซีเซิร์ฟเวอร์ SOCKS ใช้งานกับ asyncio กรอบงานการทำงานพร้อมกันแบบร่วมมือของ Python อันทรงพลัง
ติดตั้งด้วย pip หากมี Python เวอร์ชัน 3.8.0 ขึ้นไป
pip install asyncio-socks-server
หรือดึงอิมเมจนักเทียบท่าจากรีจิสทรี Docker Hub
docker pull amaindex/asyncio-socks-server
เมื่อติดตั้งด้วย pip คุณสามารถเรียกใช้ asyncio-socks-server จากบรรทัดคำสั่ง:
asyncio_socks_server [-h] [-v]
[-H HOST] [-P PORT] [-A METHOD]
[--access-log] [--debug] [--strict]
[--env-prefix ENV_PREFIX]
[--config PATH]
ที่ไหน:
asyncio_socks_server
: คุณสามารถใช้ python -m asyncio_socks_server ในการพัฒนา-h
, --help
: แสดงข้อความช่วยเหลือและออก-v
, --version
: แสดงหมายเลขเวอร์ชันของโปรแกรมและออก-H HOST
, --host HOST
: ที่อยู่โฮสต์ที่จะฟัง (ค่าเริ่มต้น 0.0.0.0)-P PORT
, --port PORT
: พอร์ตที่จะฟัง (ค่าเริ่มต้น 1080)-A METHOD
, --auth METHOD
: วิธีการรับรองความถูกต้อง (ค่าเริ่มต้น 0) ค่าที่เป็นไปได้: 0 (ไม่มีการตรวจสอบสิทธิ์), 2 (ชื่อผู้ใช้/รหัสผ่านตรวจสอบสิทธิ์)--access-log
: แสดงบันทึกการเข้าถึง--debug
: ทำงานในโหมดแก้ไขข้อบกพร่อง--strict
: ทำงานโดยปฏิบัติตาม RFC1928 และ RFC1929 อย่างเคร่งครัด หากค่าของ METHOD
คือ 2 นั่นคือเมื่อมีการระบุการตรวจสอบสิทธิ์ชื่อผู้ใช้/รหัสผ่าน คุณจะต้องจัดเตรียมไฟล์กำหนดค่าที่มีชื่อผู้ใช้และรหัสผ่านในรูปแบบ json พร้อมด้วยตัวเลือก --config
คุณยังสามารถแสดงรายการตัวเลือกอื่นๆ ในไฟล์ปรับแต่งแทนคำสั่ง:
config.json
:
{
"LISTEN_HOST" : " 0.0.0.0 " ,
"LISTEN_PORT" : 1080 ,
"AUTH_METHOD" : 2 ,
"ACCESS_LOG" : true ,
"DEBUG" : true ,
"STRICT" : true ,
"USERS" : {
"username1" : " password1 " ,
"username2" : " password2 " ,
"username3" : " password3 "
}
}
asyncio_socks_server --config ${ENV} /config.json
นอกจากนี้ ตัวแปรสภาพแวดล้อมใดๆ ที่ชื่อขึ้นต้นด้วย AIOSS_
จะถูกนำไปใช้กับตัวเลือกด้วย คำนำหน้าสามารถเปลี่ยนแปลงได้โดยการระบุตัวเลือก --env-prefix
ตัวอย่างเช่น:
export MY_LISTEN_HOST=127.0.0.1
export MY_LISTEN_PORT=9999
asyncio_socks_server --env-prefix MY_
หมายเหตุ: ลำดับการโหลดตัวเลือกคือ: ไฟล์กำหนดค่า, ตัวแปรสภาพแวดล้อม, ตัวเลือกคำสั่ง อย่างหลังจะเขียนทับอันแรกหากมีการกำหนดตัวเลือกไว้หลายวิธี
หรือหากคุณใช้อิมเมจนักเทียบท่า คุณสามารถเปิด asyncio-socks-server ด้วยคำสั่งต่อไปนี้:
docker run amaindex/asyncio-socks-server [-h] [-v]
[-H HOST] [-P PORT] [-A METHOD]
[--access-log] [--debug] [--strict]
[--env-prefix ENV_PREFIX]
[--config PATH]
แนะนำให้ใช้ host
โหมดเครือข่ายเนื่องจาก asyncio-socks-server ใช้หลายพอร์ตแบบไดนามิก หากคุณต้องการจัดเตรียมไฟล์กำหนดค่าด้วย ควรติดตั้งด้วยตนเอง
docker run
--rm
--net=host
-v /host/path/config.json:/config.json
amaindex/asyncio-socks-server
--config /config.json
ด้วยเหตุผลหลายประการ asyncio-socks-server ได้ทำการประนีประนอมกับรายละเอียดการใช้งานของโปรโตคอล ดังนั้น ในฉากต่อไปนี้ พฤติกรรมของ asyncio-socks-server จะแตกต่างจากที่อธิบายไว้ใน RFC1928 และ RFC1929
ในการเจรจา SOCKS5 คำขอ UDP ASSOCIATE ที่เกิดขึ้นดังต่อไปนี้จะใช้เพื่อสร้างการเชื่อมโยงภายในกระบวนการถ่ายทอด UDP เพื่อจัดการดาตาแกรม UDP:
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
โดยปกติ ฟิลด์ DST.ADDR และ DST.PORT ประกอบด้วยที่อยู่และพอร์ตที่ไคลเอ็นต์คาดว่าจะใช้เพื่อส่งดาตาแกรม UDP สำหรับการเชื่อมโยง หรือใช้หมายเลขพอร์ตและที่อยู่ของศูนย์ทั้งหมดหากไคลเอ็นต์ไม่มีข้อมูลนี้ ดังนั้น เมื่อไคลเอนต์ทำงานในเครือข่ายที่ใช้ NAT ควรใช้ DST.ADDR ที่มีศูนย์ทั้งหมดเพื่อหลีกเลี่ยงข้อผิดพลาด แต่ในกรณีที่ไคลเอ็นต์บางรายไม่ปฏิบัติตามหลักการนี้อย่างถูกต้อง asyncio-socks-server จะถ่ายทอดดาตาแกรม UDP ทั้งหมดที่ได้รับตามค่าเริ่มต้น แทนที่จะใช้ DST.ADDR และ DST.PORT เพื่อจำกัดการเข้าถึง
เมื่อลูกค้าเลือกการรับรองความถูกต้องชื่อผู้ใช้/รหัสผ่านในระหว่างการเจรจา ลูกค้าจะดำเนินการเจรจาย่อยกับเซิร์ฟเวอร์ การเจรจาย่อยนี้เริ่มต้นด้วยการที่ลูกค้าส่งคำขอ:
+----+------+----------+------+----------+
|VER | ULEN | UNAME | PLEN | PASSWD |
+----+------+----------+------+----------+
| 1 | 1 | 1 to 255 | 1 | 1 to 255 |
+----+------+----------+------+----------+
ฟิลด์ VER มีเวอร์ชันปัจจุบันของการเจรจาย่อย ซึ่งก็คือ X'01' แต่มักถูกพิจารณาว่าเป็น X'05' เนื่องจากค่อนข้างขัดกับสัญชาตญาณเล็กน้อย ดังนั้น asyncio-socks-server อนุญาตให้ร้องขอด้วย VER X'05' ในโหมดที่ไม่เข้มงวด
--strict
ตัวเลือกที่เข้มงวด หากต้องการปิดใช้งานการประนีประนอมที่อธิบายไว้ข้างต้น คุณสามารถระบุตัวเลือก --strict
:
asyncio_socks_server --strict