
وكيل عكسي خفيف الوزن وعالي الأداء لعبور 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"