يتم تنفيذ خادم وكيل SOCKS باستخدام إطار عمل التزامن التعاوني القوي لـ python asyncio .
قم بالتثبيت باستخدام النقطة إذا كان إصدار Python 3.8.0 أو أعلى متاحًا.
pip install asyncio-socks-server
أو اسحب صورة عامل الإرساء من سجل Docker Hub.
docker pull amaindex/asyncio-socks-server
عند التثبيت باستخدام النقطة، يمكنك استدعاء 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 بالطلبات ذات الإصدار X'05' في الوضع غير الصارم.
--strict
خيار صارم لتعطيل التسوية الموصوفة أعلاه، يمكنك تحديد الخيار --strict
:
asyncio_socks_server --strict