Featured image of post اوصل لخادمك المنزلي من الانترنت دون الحاجة ل port forwarding مع Rathole

اوصل لخادمك المنزلي من الانترنت دون الحاجة ل port forwarding مع Rathole

اذا كنت تريد الوصول لخادمك المنزلي خارج الشبكة المنزلية دون عمل Port-forwarding, هناك عدة طرق.

بإمكانك استخدام Cloudflared, مجاني, وسهل التثبيت بالإضافة انك تحصل على حماية من الWAF الخاص بهم. لكن Cloudflare بالنهاية هو Reverse proxy, سيقوم بفك تشفير الاتصالات ثم اعادة تشفيرها لخادمك المنزلي. وأيضا هناك حدود على استخداماته بناءا على شروط الاستخدام الخاصة بهم.

لكن هناك حل, Rathole برمجية صغيرة مكتوبة بلغة Rust, نفق لاتصالات TCP, دون فك تشفير اي شيء. فقط تقوم بإعادة توجيه الاتصالات على منفذ معين على خادم الى خادمك المنزلي دون الحاجه لكشف خادمك مباشرة الى الإنترنت.

سوف استخدمه لعمل نفق لخادم Caddy, الذي استخدمه كreverse proxy في خادمي المنزلي.

تثبيت Rathole

Rathole هو عباره عن حزمة صغيرة, نزل الحزمة المناسبة لمنصتك من GitHub. بإمكانك أيضا تشغيلها داخل حاوية.

سوف نثبته على الخادم العام أولا, ثم على الخادم المنزلي.

docker-compose.yml على الخادم العام

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
services:
  rathole:
    image: rapiz1/rathole
    stdin_open: true
    tty: true
    ports:
      - 8080:8080 # api port
      - 443:443 # forwarded port
    volumes:
      - ./rathole/config.toml:/app/config.toml
    command: --server /app/config.toml

Rathole Config على الخادم العام

1
2
3
4
5
6
7
# server.toml
[server]
bind_addr = "0.0.0.0:8080" # `8080` هو المنفذ المستخدم للتواصل مع البرمجية

[server.services.home-proxy]
token = "your_very_secure_shared_token" # كلمة سر مشتركه بين خادمك المنزلي و خادم العام
bind_addr = "0.0.0.0:443" # المنفذ الموصل لخادمك المنزلي.

docker-compose.yml للخادم المنزلي

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# بافتراض ان خادم الويب يستخدم شبكة دوكر مشتركة اسمها Web
networks:
  web:
    external: true

services:
  rathole:
    stdin_open: true
    tty: true
    volumes:
      - /home/lammah/rathole/config.toml:/app/config.toml
    image: rapiz1/rathole
    command: --client /app/config.toml
    networks:
      - web

Rathole Config للخادم المنزلي

1
2
3
4
5
6
7
# client.toml
[client]
remote_addr = "yourservers-ip-or-domain:8080" # عنوان الخادم العام, المنفذ يجب ان يكون نفسه(8080)

[client.services.home-proxy]
token = "your_very_secure_shared_token" # كلمة السر المشتركة
local_addr = "caddy:443" # اسم الحاوية والمنفذ الذي سيستلم الاتصالات من الخادم العام.

فقط شغلهم الاثنين واذا تم اعداد كل شيء بشكل صحيح, سيتصلون ببعض وسيصبح بامكانك الوصول الى خادمك المنزلي عبر الخادم العام.

عنوان IP المتصل

لكن هناك مشكلة, برمجية Rathole لن تظهر عنوان IP المتصل للتطبيق على الخادم المنزلي. هذه سيسبب مشاكل اذا كنت تنوي حماية خادمك من محاولات تسجيل الدخول العشوائية او هجمات dos.

لكن لحسن الحظ هناك حل, بروتوكول PROXY.

توصيل عنوان IP المتصل عبر بروتوكول Proxy مع Rathole

بروتوكول PROXY هو بروتوكول حديث نسبيا, يسمح للبرمجيات بعمل PROXY لاتصالات TCP مع إرسال عنوان المتصل الاصلي, دون الحاجة لمعالجه كثيره تبطئ سرعة الاتصال.

برمجية بروكسي / نفق TCP والبرمجية المستلمة يجب ان يدعموا البروتوكول حتى تتمكن من الحصول على عنوان المتصل الاصلي.

خادم ويب Caddy يدعم PROXY protocol كمستلم و كبروكسي (مرسل).

هناك طلب دمج ل rathole ليضيف دعم PROXY protocol.

بامكانك استخدام صورة دوكر الخاصة بي لإستخدام النسخه التي تدعم PROXY protocol او بناء الحُزْمَة محليا بنفسك.

استخدم نفس الاعدادات السابقة مع اضافة enable_proxy_protocol = true اسفل قسم [server.services.home-proxy].

تأكد ان التطبيق المستلم يدعم بروتوكول PROXY وانه يستخدم الإعدادات المطلوبة لتفعيله, والآن من المفروض يظهر لك عنوان المتصل حتى بعد استخدام النفق او البروكسي.

FarisZR
مبني بستخدام Hugo
قالب Stack مصمم من Jimmy