معيد توجيه منفذ TCP/UDP آمن ومتعدد الإرسال باستخدام خادم الأنابيب بواسطة @nwtgck كمرحل. تم تصميمه بشكل أساسي لاتصالات p2p بين الأقران خلف (متعددة) NAT/جدران الحماية.
بالنسبة للحالة الخاصة لـ IPFS ، راجع #الأمثلة أدناه.
المعرف: يتم منح كل عقدة معرفًا فريدًا (base64) -
tunnel -i
يرتبط المعرف بالأجهزة (عنوان MAC) ومتغيرات البيئة USER وHOME وHOSTNAME. شاركها مع زملائك مرة واحدة وإلى الأبد. ملاحظة: يتم منح اثنين من المستخدمين على نفس الجهاز معرفات عقدة منفصلة لأن متغيرات المستخدم والمنزل الخاصة بهما تختلف.
وضع الخادم: كشف المنفذ المحلي الخاص بك للأقران الذين تشارك معهم أي سلسلة سرية -
tunnel [options] [-u] [-k < shared-secret > ] < local-port >
وضع العميل: قم بإعادة توجيه المنفذ المحلي الخاص بك إلى المنفذ المحلي المكشوف الخاص بالنظير -
tunnel [options] [-u] [-k < shared-secret > ] [-b < local-port > ] [-I < IP > ] < peer-ID:peer-port >
إذا لم يتم توفير منفذ محلي باستخدام الخيار -b
، فسيستخدم tunnel
منفذًا عشوائيًا غير مستخدم. يتم دائمًا الإبلاغ عن المنفذ المستخدم في stdout.
يكون الخيار -I
مفيدًا عند تشغيل العميل على جهاز كمبيوتر محمول يتصل أحيانًا بشبكة LAN التي يعمل بها الخادم. عندما يمكن العثور على الخادم على شبكة LAN باستخدام عنوان IP الخاص = <IP>
، يتصل tunnel
عبر شبكة LAN.
يجب أن يستخدم العميل والخادم نفس السر ليتمكنوا من الاتصال ببعضهم البعض. يمكن أيضًا تمرير السلسلة السرية باستخدام متغير البيئة TUNNEL_KEY
. السر الذي تم تمريره بـ -k
له الأسبقية.
تشير العلامة -u
إلى استخدام UDP بدلاً من TCP الافتراضي. إذا تم استخدامه، يجب استخدامه من قبل كلا الزملاء.
جميع السجلات موجودة في stderr بشكل افتراضي. ومع ذلك، باستخدام الخيار -l <logfile>
، يمكن تشغيل tunnel
في الخلفية ( وضع البرنامج الخفي ) مع حفظ السجلات في <logfile>
. يتم عرض معرف عملية البرنامج الخفي للمستخدم أثناء التشغيل حتى يتمكن من قتل البرنامج الخفي في أي وقت
tunnel -K < procID >
خيارات:
للحصول على قائمة كاملة بالخيارات، راجع: tunnel -h
تحميل مع:
curl -LO https://raw.githubusercontent.com/SomajitDey/tunnel/main/tunnel
اجعله قابلاً للتنفيذ:
chmod +rx ./tunnel
ثم قم بالتثبيت على مستوى النظام باستخدام:
./tunnel -c install
إذا لم يكن لديك امتياز sudo
، فيمكنك التثبيت محليًا بدلاً من ذلك:
./tunnel -c install -l
للتحديث في أي وقت بعد التثبيت:
tunnel -c update
هذا البرنامج هو ببساطة برنامج bash
قابل للتنفيذ يعتمد على أدوات GNU القياسية بما في ذلك socat
و openssl
و curl
و mktemp
و cut
و awk
و sed
و flock
و pkill
و dd
و xxd
و base64
وما إلى ذلك المتوفرة بسهولة على توزيعات Linux القياسية.
إذا كان نظامك يفتقر إلى أي من هذه الأدوات، ولم يكن لديك امتياز sudo
المطلوب لتثبيته من مستودع الحزمة الأصلي (على سبيل المثال sudo apt-get install <package>
)، فحاول تنزيل ملف ثنائي محمول وتثبيته محليًا على ${HOME}/.bin
.
سش :
يكشف النظير أ عن منفذ SSH المحلي -
tunnel -k " ${secret} " 22
يتصل النظير ب -
tunnel -b 67868 -k " ${secret} " -l /dev/null " ${peerA_ID} :22 " # Daemon due to -l
ssh -l " ${login_name} " -p 67868 localhost
إيبس :
دع النظير A لديه معرف IPFS-peer: 12orQmAlphanumeric
. يستمع برنامج IPFS الخاص بها إلى منفذ TCP الافتراضي رقم 4001. وتكشفه باستخدام -
tunnel -k " ${swarm_key} " ipfs
swarm_key
هو مجرد أي سلسلة سرية قد يستخدمها نظير "أ" للتحكم في من يمكنه الاتصال بها باستخدام tunnel
.
يتصل النظير B الآن مع النظير A لمشاركة الملفات أو pubsub أو p2p -
tunnel -k " ${swarm_key} " 12orQmAlphanumeric
يتصل سرب الأوامر الأخير هذا بالنظير "أ" من خلال مرحل خادم الأنابيب ويستمر في اتصال السرب كل بضع ثوانٍ في الخلفية للحفاظ على الاتصال حيًا.
يبدأ tunnel
برنامج IPFS في الخلفية إذا لم يكن نشطًا بالفعل.
يمكن تمرير المسار إلى IPFS repo باستخدام الخيار -r
. بخلاف ذلك، يتم استخدام متغير البيئة IPFS_PATH
أو المسار الافتراضي ~/.ipfs
كالمعتاد. مثال: tunnel -r ~/.ipfs -i
يعطي معرف نظير IPFS.
شل البعيد :
لنفترض أنك ستحتاج بانتظام إلى تشغيل الأوامر في صندوق Linux في مكان عملك من جهازك المنزلي. وأنت لا تريد/لا تستطيع استخدام SSH عبر tunnel
لسبب ما.
في كمبيوتر مكان العمل، قم بكشف بعض منافذ TCP المحلية العشوائية، على سبيل المثال 49090 وقم بتوصيل الصدفة بهذا المنفذ:
tunnel -l " /tmp/tunnel.log " -k " your secret " 49090 # Note the base64 node id emitted
socat TCP-LISTEN:49090,reuseaddr,fork SYSTEM: ' bash 2>&1 '
العودة إلى منزلك:
tunnel -l " /dev/null " -b 5000 -k " your secret " " node_id_of_workplace:49090 "
rlwrap nc localhost 5000
استخدام rlwrap ليس ضرورة. ولكنه بالتأكيد يجعل التجربة أفضل لأنه يستخدم GNU Readline ويتذكر سجل الإدخال (يمكن الوصول إليه باستخدام مفاتيح الأسهم لأعلى/لأسفل المشابهة لجلسات bash المحلية).
ريديس :
هل تحتاج إلى الاتصال بمثيل Redis البعيد الذي يستضيفه أحد الأقران أو تستضيفه بنفسك؟ في المضيف البعيد، اكشف عن منفذ TCP الذي يعمل عليه redis-server
(الافتراضي: 6379)، باستخدام tunnel
.
على جهازك المحلي، استخدم tunnel
لإعادة توجيه منفذ TCP إلى المنفذ البعيد. قم بتوجيه redis-cli
إلى المنفذ المحلي المُعاد توجيهه.
فيما يلي بعض حالات الاستخدام العشوائية التي يمكنني التفكير فيها tunnel
. بشكل عام، أي شيء يتضمن اجتياز NAT/جدار الحماية (على سبيل المثال WebRTC بدون TURN) أو الانضمام إلى شبكة LAN بعيدة، يجب أن يجد tunnel
مفيدًا. بعض الأفكار التالية غير واضحة إلى حد ما، ولم يتم اختبارها على الإطلاق، وربما لا تعمل، ولكن مع ذلك تم توثيقها هنا، على الأقل في الوقت الحالي، فقط من أجل الإلهام. إذا وجدت أيًا من هذه الأشياء مفيدة، أو غير مجدية، أو وجدت تطبيقات جديدة تمامًا tunnel
، فيرجى النشر في المناقشات. تم تصنيف الحالات التي قمت باختبارها على أنها "عاملة".
tunnel
.tunnel
في Heroku (مجانًا) وإعادة توجيه المنفذ المخزن في متغير البيئة PORT
إلى المنفذ المحلي الذي تريد كشفه. ولديك عنوان URL العام الخاص بك على النحو التالي: https://your-app-name.herokuapp.com.tunnel
. يقوم tunnel
بتشفير كل حركة المرور بين النظير والمرحل باستخدام TLS، إذا كان المرحل يستخدم https. لا يوجد تشفير شامل في حد ذاته بين الأقران أنفسهم. ومع ذلك، يُزعم أن مرحل خادم الأنابيب لا يمكن تخزينه .
يمكن لنظير العميل الاتصال بنظير يخدم فقط إذا كان يستخدم نفس المفتاح السري (TUNNEL_KEY). يُستخدم المفتاح بشكل أساسي لاكتشاف الأقران في مرحلة الترحيل. لكل اتصال جديد بالمنفذ المحلي المعاد توجيهه، يرسل العميل مفتاح جلسة عشوائي إلى النظير الذي يخدم. يقوم الأقران بعد ذلك بتكوين اتصال جديد عند نقطة ترحيل أخرى بناءً على هذا المفتاح العشوائي حتى يتم نقل البيانات الفعلي. الغرباء، أي. لا ينبغي للجهات الفاعلة السيئة التي لا تعرف TUNNEL_KEY أن تكون قادرة على تعطيل هذا التدفق.
ومع ذلك، يمكن للنظير الضار القيام بما يلي. نظرًا لأنه يعرف TUNNEL_KEY ومعرف العقدة للنظير الخادم، فيمكنه انتحال شخصية الأخير. وبالتالي، سيتم إرسال البيانات الواردة من نظير متصل غير متوقع إلى المنتحل، مما يؤدي إلى تجويع الخادم الأصلي. يجب أن تتعامل التحديثات/التطبيقات المستقبلية tunnel
مع هذا التهديد باستخدام تشفير المفتاح العام. [في هذه الحالة، سيكون مفتاح الجلسة العشوائي الذي يتم إنشاؤه لكل اتصال جديد تتم إعادة توجيهه قابلاً لفك التشفير بواسطة الخادم الأصلي وحده].
نظرًا لأن tunnel
هو في الأساس طبقة النقل، فلا ينبغي أن تكون النقاط المذكورة أعلاه محبطة، لأن معظم التطبيقات مثل SSH وIPFS تقوم بتشفير البيانات في طبقة التطبيق. إن تشفير tunnel
من طرف إلى طرف لجميع عمليات نقل البيانات لن يؤدي إلا إلى زيادة زمن الوصول. ومع ذلك، يمكنك دائمًا إنشاء نفق SSH بعد إنشاء النظير منخفض المستوى مع tunnel
، إذا اخترت ذلك.
المرحل الافتراضي الذي يستخدمه tunnel
هو https://ppng.io. يمكنك أيضًا استخدام بعض الترحيلات العامة الأخرى من هذه القائمة أو استضافة المثيل الخاص بك على الخدمات المجانية مثل تلك التي تقدمها Heroku. وغني عن القول أنه للاتصال، يجب على اثنين من أقرانهما استخدام نفس التتابع.
إذا اخترت ذلك، يمكنك أيضًا كتابة المرحل الخاص بك لاستخدامه في tunnel
باستخدام أدوات بسيطة مثل sertain. فقط تأكد من أن خدمة الترحيل الخاصة بك تحتوي على نفس واجهة برمجة التطبيقات مثل خادم الأنابيب. إذا كان رمز التتابع الخاص بك مفتوح المصدر، فنحن نرحب بك لتقديمه في المناقشات.
gsocket ; ipfs p2p مع تمكين مرحل الدائرة؛ الذهاب الأنابيب المزدوجة؛ Pipeto.me ; الوصلة الصاعدة ; localhost.run ; نجروك ; النفق المحلي sshreach.me ( نسخة تجريبية مجانية لفترة محدودة فقط ) ; أكثر
ملحوظات:
tunnel
والأنابيب، يمكنك ببساطة نشر مثيل الترحيل الخاص بك، ومشاركة عنوان URL العام الخاص به مع أقرانك مرة واحدة وإلى الأبد، export
نفس TUNNEL_RELAY
داخل .bashrc
، وستكون جاهزًا للبدء. كما تتوفر العديد من خوادم الأنابيب العامة للتكرار.IPFS (تم):
سيكون الاتصال بـ IPFS أسهل بكثير:
tunnel -k <secret> ipfs
للكشف tunnel -k <secret> <IPFS_peerID>
للاتصال.
سيؤدي ذلك إلى تشغيل البرنامج الخفي IPFS من تلقاء نفسه، في حالة عدم الاتصال بالإنترنت. سيتصل الأمر الأخير بشكل متكرر بالنظير المحدد على فترات زمنية مدتها 30 ثانية. سيتم استخدام معرف IPFS-peer-ID كمعرف العقدة، لذلك لن يحتاج النظراء بعد الآن إلى مشاركة معرفات العقد الخاصة بهم بشكل منفصل. قد يتم تمرير مسارات IPFS غير الافتراضية باستخدام الخيار -r
. أو IPFS_PATH
.
سش:
سيكون إنشاء نفق SSH بين المنفذ المحلي ومنفذ النظير أمرًا سهلاً كما يلي:
tunnel -k <secret> ssh
لكشف &
tunnel -sk <secret> -b <local-port> <peerID>:<peer-port>
للإنشاء.
لاحظ أنه أثناء الاتصال، لم يعد الشخص بحاجة إلى تقديم اسم تسجيل دخول. يتم أخذ ${USER}
الخاص بعقدة الخدمة كاسم تسجيل الدخول افتراضيًا. ومع ذلك، إذا لزم الأمر، يمكن دائمًا تمرير اسم تسجيل دخول غير افتراضي باستخدام متغير أو خيار البيئة.
جي بي جي:
لا تحتوي الأجهزة الافتراضية، مثل تلك التي تستخدمها السحابات السحابية والدينامو، على عناوين أجهزة ثابتة وفريدة من نوعها. وبالتالي يستمر معرف العقدة في التغير من جلسة إلى أخرى لمثل هذا الجهاز الافتراضي. سيكون tunnel
المستقبلي خيار -g
والذي من شأنه تمرير مفتاح GPG الخاص إلى tunnel
. سيتم إنشاء معرف العقدة من بصمة هذا المفتاح، على غرار ما يفعله IPFS. وهذا من شأنه أيضًا أن يجعل tunnel
أكثر أمانًا.
الأرجون 2:
الخيار [ -a
] لاستخدام argon2 لتجزئة TUNNEL_KEY قبل الاستخدام، بحيث لا يكون السر الأضعف عرضة للخطر.
يرجى الإبلاغ عن الأخطاء في القضايا. انشر أفكارك وتعليقاتك وأفكارك وحالات الاستخدام وطلبات الميزات في المناقشة. اسمحوا لي أن أعرف كيف ساعدك هذا، إذا كان قد حدث على الإطلاق.
لا تتردد أيضًا في الكتابة لي مباشرة حول أي شيء يتعلق بهذا المشروع.
إذا كان هذا السيناريو الصغير مفيدًا لك، فسيكون النجم مشجعًا للغاية بالنسبة لي.
شكرًا ! ؟