
نفق TCP بسيط في لغة Rust يعرض المنافذ المحلية إلى خادم بعيد، متجاوزًا جدران الحماية NAT. خفيف الوزن، قابل للاستضافة الذاتية، وسهل التثبيت.
نفق TCP حديث وبسيط بلغة Rust يكشف المنافذ المحلية لخادم بعيد، متجاوزًا جدران الحماية القياسية لاتصالات NAT. هذا كل ما يفعله: لا أكثر ولا أقل.

# التثبيت (يتطلب Rust، انظر البدائل أدناه)
cargo install bore-cli
# على جهازك المحلي
bore local 8000 --to bore.pub
سيؤدي هذا إلى كشف منفذك المحلي في localhost:8000 للإنترنت العام في bore.pub:<PORT>، حيث يتم تعيين رقم المنفذ عشوائيًا.
مشابه لـ localtunnel و ngrok، لكن bore يهدف إلى أن يكون أداة عالية الكفاءة وغير متحيزة لتوجيه حركة مرور TCP، سهلة التثبيت وسهلة الاستضافة الذاتية، بدون أي زوائد.
(bore يبلغ إجمالي حوالي 400 سطر من كود Rust الآمن وغير المتزامن، وإعداده تافه – فقط قم بتشغيل ملف ثنائي واحد للعميل والخادم.)
bore مُعبأ كصيغة أساسية لـ Homebrew.
brew install bore-cli
bore متاح في AUR باسم bore.
yay -S bore # أو مساعد AUR المفضل لديك
bore متاح في طبقة gentoo-zh.
sudo eselect repository enable gentoo-zh
sudo emerge --sync gentoo-zh
sudo emerge net-proxy/bore
خلاف ذلك، أسهل طريقة لتثبيت bore هي من خلال الملفات الثنائية المجمعة مسبقًا. هذه متوفرة في صفحة الإصدارات لأنظمة macOS وWindows وLinux. فقط قم بفك ضغط الملف المناسب لمنصتك وانقل الملف التنفيذي bore إلى مجلد موجود في PATH الخاص بك.
يمكنك أيضًا بناء bore من المصدر باستخدام Cargo، مدير حزم Rust. هذا الأمر يُثبت الملف الثنائي bore في مسار يمكن الوصول إليه من قبل المستخدم.
cargo install bore-cli
نقوم أيضًا بنشر صور Docker ذات إصدارات لكل إصدار. الصورة مبنية لمعمارية AMD 64-bit. وهي مُوسومة بالإصدار المحدد وتسمح لك بتشغيل الملف الثنائي bore المرتبط بشكل ثابت من حاوية "scratch" صغيرة.
docker run -it --init --rm --network host ekzhang/bore <ARGS>
يصف هذا القسم الاستخدام المفصل لأمر bore CLI.
يمكنك توجيه منفذ على جهازك المحلي باستخدام الأمر bore local. يأخذ هذا وسيطًا موضعيًا، وهو المنفذ المحلي المراد توجيهه، بالإضافة إلى خيار إلزامي --to يحدد عنوان الخادم البعيد.
bore local 5000 --to bore.pub
يمكنك اختياريًا تمرير خيار --port لاختيار منفذ محدد على الخادم البعيد لكشفه، لكن الأمر سيفشل إذا كان هذا المنفذ غير متاح. أيضًا، تمرير --local-host يسمح لك بكشف مضيف مختلف على شبكتك المحلية بدلاً من عنوان الاسترجاع localhost.
الخيارات الكاملة موضحة أدناه.
يبدأ وكيلًا محليًا للخادم البعيد
الاستخدام: bore local [OPTIONS] --to <TO> <LOCAL_PORT>
الوسائط:
<LOCAL_PORT> المنفذ المحلي المراد كشفه [env: BORE_LOCAL_PORT=]
الخيارات:
-l, --local-host <HOST> المضيف المحلي المراد كشفه [default: localhost]
-t, --to <TO> عنوان الخادم البعيد لكشف المنافذ المحلية إليه [env: BORE_SERVER=]
-p, --port <PORT> منفذ اختياري على الخادم البعيد للاختيار [default: 0]
-s, --secret <SECRET> سر اختياري للمصادقة [env: BORE_SECRET]
-h, --help طباعة المساعدة
كما ذُكر في تعليمات البدء، هناك نسخة عامة من خادم bore تعمل في bore.pub. لكن، إذا كنت ترغب في استضافة bore ذاتيًا على شبكتك الخاصة، يمكنك فعل ذلك بالأمر التالي:
bore server
هذا كل ما في الأمر! بعد بدء تشغيل الخادم على عنوان معين، يمكنك تحديث أمر bore local بالخيار --to <ADDRESS> لتوجيه منفذ محلي إلى هذا الخادم البعيد.
من الممكن تحديد عناوين IP مختلفة لخادم التحكم وللأنفاق. هذا الإعداد مفيد للحالات التي قد ترغب فيها أن يكون خادم التحكم على شبكة خاصة مع السماح باتصالات النفق عبر واجهة عامة، أو العكس.
الخيارات الكاملة لأمر bore server موضحة أدناه.
يشغل خادم الوكيل البعيد
الاستخدام: bore server [OPTIONS]
الخيارات:
--min-port <MIN_PORT> الحد الأدنى المقبول لرقم منفذ TCP [env: BORE_MIN_PORT=] [default: 1024]
--max-port <MAX_PORT> الحد الأقصى المقبول لرقم منفذ TCP [env: BORE_MAX_PORT=] [default: 65535]
-s, --secret <SECRET> سر اختياري للمصادقة [env: BORE_SECRET]
--bind-addr <BIND_ADDR> عنوان IP للربط به، يجب أن يتمكن العملاء من الوصول إليه [default: 0.0.0.0]
--bind-tunnels <BIND_TUNNELS> عنوان IP حيث ستصغي الأنفاق، الافتراضي هو --bind-addr
-h, --help طباعة المساعدة
يوجد منفذ تحكم ضمني في 7835، يُستخدم لإنشاء اتصالات جديدة عند الحاجة. في التهيئة، يرسل العميل رسالة "Hello" إلى الخادم عبر منفذ تحكم TCP، طالبًا توجيه منفذ بعيد محدد. ثم يرد الخادم بإقرار ويبدأ في الاستماع لاتصالات TCP الخارجية.
عندما يحصل الخادم على اتصال على المنفذ البعيد، فإنه يُنشئ UUID آمنًا لهذا الاتصال ويرسله إلى العميل. ثم يفتح العميل تدفق TCP منفصل إلى الخادم ويرسل رسالة "Accept" تحتوي على UUID على هذا التدفق. ثم يقوم الخادم بتوجيه الاتصالين بين بعضهما البعض.
لأسباب تتعلق بالصحة وتجنب تسرب الذاكرة، يتم تخزين الاتصالات الواردة فقط لمدة تصل إلى 10 ثوانٍ قبل التخلص منها إذا لم يقبلها العميل.
في نشر مخصص لـ bore server، يمكنك اختياريًا طلب سر لمنع استخدام الخادم من قبل الآخرين. يتطلب البروتوكول من العملاء التحقق من حيازة السر على كل اتصال TCP من خلال الإجابة على تحديات عشوائية في شكل رموز HMAC. (يُستخدم هذا السر فقط للمصافحة الأولية، ولا يتم تشفير أي حركة مرور أخرى افتراضيًا.)
# على الخادم
bore server --secret my_secret_string
# على العميل
bore local <LOCAL_PORT> --to <TO> --secret my_secret_string
إذا لم يكن السر موجودًا في الوسائط، فسيحاول bore أيضًا القراءة من متغير البيئة BORE_SECRET.
أنشأه Eric Zhang (@ekzhang1). مرخص بموجب رخصة MIT.
يود المؤلف أن يشكر المساهمين والمشرفين على مشروع Tokio لجعل كتابة خدمات شبكة مريحة وفعالة في Rust ممكنة.