يحتوي هذا الريبو على العميل والخادم الذي يسمح لك بتمرير حركة مرور TCP وUDP عبر بروتوكولات الشبكة الأخرى.
الأنفاق المدعومة حاليًا هي:
الأداة الرئيسية مكتوبة بلغة Rust والاختبارات الشاملة مكتوبة بلغة Python.
docker pull ghcr.io/dlemel8/tunneler-server:latest
docker pull ghcr.io/dlemel8/tunneler-client:latest
cargo --version || curl --proto ' =https ' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo build --release
يوجد أيضًا ملف عامل إرساء إذا كنت تفضل إنشاء صورة عامل إرساء محلي
docker run -e LOCAL_PORT=45301
-e REMOTE_PORT=5201
-e REMOTE_ADDRESS=localhost
-e TUNNELED_TYPE=udp
--rm -p 45301:45301 ghcr.io/dlemel8/tunneler-server:latest tcp
./target/release/client
--tunneled-type tcp
--remote-address 1.1.1.1
--remote-port 53
--log-level debug
dns
--read-timeout-in-milliseconds 100
--idle-client-timeout-in-milliseconds 30000
قم بتشغيل صورة عامل الإرساء أو الملف الثنائي المترجم باستخدام --help
لمزيد من المعلومات
cargo test --all-targets
python3 -m pip install -r e2e_tests/requirements.txt
PYTHONPATH=. python3 -m pytest -v
يحتوي هذا الريبو على بعض أمثلة نشر الخادم باستخدام Docker Compose:
يمكنك تشغيل كل مثال محليًا أو نشره باستخدام Terraform وAnsible. رؤية المزيد من المعلومات هنا.
يحتوي كل ملف قابل للتنفيذ على مكونين يتواصلان عبر قناة تدفقات العميل (مجموعة من وحدات البايت للقارئ والكاتب):
يتم تحويل حركة المرور المستندة إلى TCP بشكل تافه إلى دفق. يعتمد تحويل حركة المرور المستند إلى UDP على بروتوكول النفق.
تحتاج حركة المرور المستندة إلى UDP أيضًا إلى طريقة لتحديد العملاء الحاليين لمواصلة جلساتهم. الحل هو ذاكرة التخزين المؤقت للعملاء في الذاكرة والتي تقوم بتعيين معرف العميل إلى الدفق الخاص به.
من أجل تحويل حركة مرور UDP إلى دفق، يسبق رأس بحجم 2 بايت (في النهاية الكبيرة) كل حمولة حزمة.
يستخدم مستمع UDP عنوان نظير الحزمة الواردة كمفتاح لذاكرة التخزين المؤقت للعملاء.
لدينا بعض التحديات هنا:
لحل هذه التحديات، تبدأ كل جلسة عميل بإنشاء معرف عميل عشوائي (4 أحرف أبجدية رقمية). يقرأ العميل البيانات إلى النفق ويقوم بتشغيلها عبر سلسلة من أجهزة التشفير:
يتم بعد ذلك استخدام البيانات المشفرة كاسم لاستعلام DNS TXT.
إذا كنت تمتلك خادم DNS موثوقًا، فيمكن للعميل إرسال الطلب إلى محلل DNS المتكرر. سيحصل Resolver على عنوان IP الخاص بك من مسجل اسم النطاق الخاص بك ويعيد توجيه الطلب إلى عنوان IP الخاص بك. هناك خيار آخر (أسرع ولكن أكثر وضوحًا لأي محلل لحركة المرور) وهو تكوين العميل لإرسال الطلب مباشرة إلى IP الخاص بك (على المنفذ UDP/53 أو أي خادم منفذ آخر يستمع إليه).
يقوم الخادم بفك تشفير البيانات (متجاهلاً أي حركة مرور غير خاصة بالعميل) ويستخدم معرف العميل كمفتاح لذاكرة التخزين المؤقت للعملاء.
من أجل التعامل مع استجابات الخادم الكبيرة وإقرارات TCP الفارغة، يتم استخدام مهلة القراءة في كل من العميل والخادم. إذا انتهت مهلة القراءة، سيتم إرسال رسالة فارغة. يستخدم كل من العميل والخادم مهلة الخمول لإيقاف إعادة توجيه الموارد المحلية وتنظيفها.
لتنفيذ المصادقة المتبادلة، نستخدم مرجعًا مصدقًا خاصًا:
تم تكوين كل من العميل والخادم لاستخدام المفتاح والشهادة في مصافحة TLS. يتم استخدام شهادة CA كشهادة جذر.
نظرًا لاستخدام ملحق إشارة اسم الخادم، يطلب العميل اسم خادم محددًا ويقدم الخادم شهادته فقط إذا تم طلب هذا الاسم. يجب أن يكون اسم الخادم أيضًا جزءًا من الشهادة، على سبيل المثال كاسم بديل للموضوع.