
وكيل عكسي خفيف الوزن وعالي الأداء لعبور NAT، مكتوب بلغة Rust. بديل لـ frp و ngrok.

وكيل عكسي آمن وثابت وعالي الأداء لاختراق NAT، مكتوب بلغة Rust
rathole، مثل frp وngrok، يمكن أن يساعد في عرض الخدمة على الجهاز الموجود خلف NAT على الإنترنت، عبر خادم بعنوان IP عام.
يمكن الحصول على rathole كامل الإمكانيات من صفحة الإصدارات. أو البناء من المصدر للمنصات الأخرى ولتقليل حجم الملف الثنائي. تتوفر أيضًا صورة Docker.
استخدام rathole مشابه جدًا لـ frp. إذا كانت لديك خبرة مع الأخير، فإن الإعدادات ستكون سهلة جدًا بالنسبة لك. الاختلاف الوحيد هو أن إعدادات الخدمة مقسمة إلى جانب العميل وجانب الخادم، وأن الرمز المميز إلزامي.
لاستخدام rathole، تحتاج إلى خادم بعنوان IP عام، وجهاز خلف NAT، حيث توجد بعض الخدمات التي تحتاج إلى عرضها على الإنترنت.
افترض أن لديك NAS في المنزل خلف NAT، وتريد عرض خدمة ssh الخاصة به على الإنترنت:
أنشئ ملف server.toml بالمحتوى التالي وقم بتعديله حسب احتياجاتك.
# server.toml
[server]
bind_addr = "0.0.0.0:2333" # `2333` تحدد المنفذ الذي يستمع إليه rathole للعملاء
[server.services.my_nas_ssh]
token = "use_a_secret_that_only_you_know" # الرمز المستخدم لمصادقة العميل للخدمة. قم بتغييره إلى قيمة عشوائية.
bind_addr = "0.0.0.0:5202" # `5202` تحدد المنفذ الذي يعرض `my_nas_ssh` على الإنترنت
ثم قم بتشغيل:
./rathole server.toml
أنشئ ملف client.toml بالمحتوى التالي وقم بتعديله حسب احتياجاتك.
# client.toml
[client]
remote_addr = "myserver.com:2333" # عنوان الخادم. يجب أن يكون المنفذ مماثلاً للمنفذ الموجود في `server.bind_addr`
[client.services.my_nas_ssh]
token = "use_a_secret_that_only_you_know" # يجب أن يكون مماثلاً للخادم لتجاوز المصادقة
local_addr = "127.0.0.1:22" # عنوان الخدمة التي تحتاج إلى إعادة التوجيه
ثم قم بتشغيل:
./rathole client.toml
myserver.com على المنفذ 2333، وسيتم إعادة توجيه أي حركة مرور إلى myserver.com:5202 إلى منفذ العميل 22.وبالتالي يمكنك استخدام ssh myserver.com:5202 للاتصال بـ NAS الخاص بك.
لتشغيل rathole كخدمة خلفية على Linux، راجع أمثلة systemd.
يمكن لـ rathole أن يحدد تلقائيًا ما إذا كان سيعمل في وضع الخادم أو وضع العميل، وفقًا لمحتوى ملف الإعدادات، إذا كان هناك كتلة واحدة فقط من [server] أو [client]، كما في المثال في بداية سريعة.
ولكن يمكن أيضًا وضع كتلتي [client] و [server] في ملف واحد. ثم على جانب الخادم، قم بتشغيل rathole --server config.toml وعلى جانب العميل، قم بتشغيل rathole --client config.toml لتحديد وضع التشغيل لـ rathole بشكل صريح.
قبل الانتقال إلى مواصفات الإعدادات الكاملة، يُنصح بإلقاء نظرة سريعة على أمثلة الإعدادات للحصول على فكرة عن تنسيق الإعدادات.
انظر النقل لمزيد من التفاصيل حول التشفير وكتلة transport.
فيما يلي مواصفات الإعدادات الكاملة:
[client]
remote_addr = "example.com:2333" # ضروري. عنوان الخادم
default_token = "default_token_if_not_specify" # اختياري. الرمز الافتراضي للخدمات، إذا لم تحدد كل خدمة رمزها الخاص
heartbeat_timeout = 40 # اختياري. اضبط على 0 لتعطيل اختبار نبضات القلب على طبقة التطبيق. يجب أن تكون القيمة أكبر من `server.heartbeat_interval`. الافتراضي: 40 ثانية
retry_interval = 1 # اختياري. الفاصل الزمني بين محاولات إعادة الاتصال بالخادم. الافتراضي: 1 ثانية
[client.transport] # الكتلة بأكملها اختيارية. حدد وسيلة النقل المستخدمة
type = "tcp" # اختياري. القيم الممكنة: ["tcp", "tls", "noise"]. الافتراضي: "tcp"
[client.transport.tcp] # اختياري. يؤثر أيضًا على `noise` و `tls`
proxy = "socks5://user:[email protected]:1080" # اختياري. الوكيل المستخدم للاتصال بالخادم. `http` و `socks5` مدعومان.
nodelay = true # اختياري. يحدد ما إذا كان سيتم تمكين TCP_NODELAY، إذا كان ذلك مناسبًا، لتحسين زمن الوصول ولكن تقليل عرض النطاق الترددي. الافتراضي: true
keepalive_secs = 20 # اختياري. يحدد `tcp_keepalive_time` في `tcp(7)`، إذا كان ذلك مناسبًا. الافتراضي: 20 ثانية
keepalive_interval = 8 # اختياري. يحدد `tcp_keepalive_intvl` في `tcp(7)`، إذا كان ذلك مناسبًا. الافتراضي: 8 ثوان
[client.transport.tls] # ضروري إذا كان `type` هو "tls"
trusted_root = "ca.pem" # ضروري. شهادة المصادقة (CA) التي وقعت شهادة الخادم
hostname = "example.com" # اختياري. اسم المضيف الذي يستخدمه العميل للتحقق من الشهادة. إذا لم يتم تعيينه، يتم الرجوع إلى `client.remote_addr`
[client.transport.noise] # بروتوكول Noise. راجع `docs/transport.md` لمزيد من الشرح
pattern = "Noise_NK_25519_ChaChaPoly_BLAKE2s" # اختياري. القيمة الافتراضية كما هو موضح
local_private_key = "key_encoded_in_base64" # اختياري
remote_public_key = "key_encoded_in_base64" # اختياري
[client.transport.websocket] # ضروري إذا كان `type` هو "websocket"
tls = true # إذا كان `true` فسيستخدم الإعدادات في `client.transport.tls`
[client.services.service1] # خدمة تحتاج إلى إعادة التوجيه. يمكن تغيير الاسم `service1` بشكل عشوائي، طالما أنه مماثل للاسم في إعدادات الخادم
type = "tcp" # اختياري. البروتوكول الذي يحتاج إلى إعادة التوجيه. القيم الممكنة: ["tcp", "udp"]. الافتراضي: "tcp"
token = "whatever" # ضروري إذا لم يتم تعيين `client.default_token`
local_addr = "127.0.0.1:1081" # ضروري. عنوان الخدمة التي تحتاج إلى إعادة التوجيه
nodelay = true # اختياري. تجاوز `client.transport.nodelay` لكل خدمة
retry_interval = 1 # اختياري. الفاصل الزمني بين محاولات إعادة الاتصال بالخادم. الافتراضي: يرث الإعدادات العامة
[client.services.service2] # يمكن تعريف خدمات متعددة
local_addr = "127.0.0.1:1082"
[server]
bind_addr = "0.0.0.0:2333" # ضروري. العنوان الذي يستمع إليه الخادم للعملاء. بشكل عام، يحتاج المنفذ فقط إلى التغيير.
default_token = "default_token_if_not_specify" # اختياري
heartbeat_interval = 30 # اختياري. الفاصل الزمني بين نبضات القلب على طبقة التطبيق. اضبط على 0 لتعطيل إرسال نبضات القلب. الافتراضي: 30 ثانية
[server.transport] # نفس `[client.transport]`
type = "tcp"
[server.transport.tcp] # نفس العميل
nodelay = true
keepalive_secs = 20
keepalive_interval = 8
[server.transport.tls] # ضروري إذا كان `type` هو "tls"
pkcs12 = "identify.pfx" # ضروري. ملف pkcs12 لشهادة الخادم والمفتاح الخاص
pkcs12_password = "password" # ضروري. كلمة مرور ملف pkcs12
[server.transport.noise] # نفس `[client.transport.noise]`
pattern = "Noise_NK_25519_ChaChaPoly_BLAKE2s"
local_private_key = "key_encoded_in_base64"
remote_public_key = "key_encoded_in_base64"
[server.transport.websocket] # ضروري إذا كان `type` هو "websocket"
tls = true # إذا كان `true` فسيستخدم الإعدادات في `server.transport.tls`
[server.services.service1] # يجب أن يكون اسم الخدمة مماثلاً لجانب العميل
type = "tcp" # اختياري. نفس `[client.services.X.type]`
token = "whatever" # ضروري إذا لم يتم تعيين `server.default_token`
bind_addr = "0.0.0.0:8081" # ضروري. العنوان الذي يتم عرض الخدمة عليه. بشكل عام، يحتاج المنفذ فقط إلى التغيير.
nodelay = true # اختياري. نفس العميل
[server.services.service2]
bind_addr = "0.0.0.1:8082"
يستخدم rathole، مثل العديد من برامج Rust الأخرى، متغيرات البيئة للتحكم في مستوى التسجيل. تتوفر المستويات info، warn، error، debug، trace.
RUST_LOG=error ./rathole config.toml
سيؤدي ذلك إلى تشغيل rathole مع تسجيل مستوى الأخطاء فقط.
إذا لم يكن RUST_LOG موجودًا، فإن مستوى التسجيل الافتراضي هو info.
منذ الإصدار v0.4.7، يقوم rathole بتمكين TCP_NODELAY افتراضيًا، مما يفيد زمن الوصول والتطبيقات التفاعلية مثل rdp وخوادم Minecraft. ومع ذلك، فإنه يقلل قليلاً من عرض النطاق الترددي.
إذا كان عرض النطاق الترددي أكثر أهمية، فيمكن تعطيل TCP_NODELAY باستخدام nodelay = false.
لدى rathole زمن وصول مشابه لـ frp، ولكن يمكنه التعامل مع عدد أكبر من الاتصالات، وتوفير عرض نطاق ترددي أكبر، مع استخدام ذاكرة أقل.
لمزيد من التفاصيل، راجع الصفحة المنفصلة القياس.
ومع ذلك، لا تستنتج من هنا أن rathole يمكنه جعل خدمتك المعاد توجيهها أسرع عدة مرات من ذي قبل بطريقة سحرية. تم إجراء القياس على الحلقة المحلية (loopback)، مما يشير إلى الأداء عندما تكون المهمة مقيدة بوحدة المعالجة المركزية. يمكن للمرء أن يحصل على تحسن كبير إذا لم تكن الشبكة هي عنق الزجاجة. لسوء الحظ، هذا ليس صحيحًا للعديد من المستخدمين. في هذه الحالة، الفائدة الرئيسية هي استهلاك أقل للموارد، بينما قد لا يتحسن عرض النطاق الترددي وزمن الوصول بشكل كبير.

خارج النطاق يسرد الميزات التي لا يُخطط لتنفيذها ولماذا.