بدء تشغيل خادم VPN خلف NAT الخاص بالمزود

مقال حول كيف تمكنت من تشغيل خادم VPN خلف NAT لمزود منزلي (بدون عنوان IP أبيض). دعني أخبرك على الفور: يعتمد أداء هذا التنفيذ بشكل مباشر على نوع NAT الذي يستخدمه مزودك ، وكذلك جهاز التوجيه.
لذلك ، كنت بحاجة إلى الاتصال من هاتفي الذكي الذي يعمل بنظام Android بجهاز الكمبيوتر المنزلي الخاص بي ، وكلا الجهازين متصلان بالإنترنت من خلال مزود NATs ، بالإضافة إلى أن الكمبيوتر متصل من خلال جهاز توجيه منزلي ، وهو أيضًا اتصالات NATs.
لم يتم النظر في المخطط الكلاسيكي الذي يستخدم VPS / VDS مؤجرًا بعنوان IP أبيض ، بالإضافة إلى استئجار عنوان IP أبيض من الموفر ، لعدة أسباب.
أخذا بالإعتبار تجربة المقالات السابقة، بعد أن أمضيت عدة تجارب مع STUNs و NATs لمقدمي الخدمات. قررت إجراء تجربة صغيرة عن طريق تنفيذ الأمر على جهاز توجيه منزلي يقوم بتشغيل برنامج OpenWRT الثابت:

$ stun stun.sipnet.ru

حصلت على النتيجة:

إصدار عميل STUN 0.97
أساسي: رسم الخرائط المستقل ، الفلتر المستقل ، المنفذ العشوائي ، سوف ينكسر
القيمة المعادة هي 0x000002

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

إصدار عميل STUN 0.97
أساسي: رسم الخرائط المستقل ، المرشح المعتمد على المنفذ ، المنفذ العشوائي ، سوف ينكسر
القيمة المعادة هي 0x000006

مرشح يعتمد على المنفذ - مرشح يعتمد على المنفذ
يشير الاختلاف في نتائج إخراج الأوامر إلى أن جهاز التوجيه المنزلي قدم "مساهمته" في عملية بث الحزم من الإنترنت ، وقد تجلى ذلك في حقيقة أنه عند تنفيذ الأمر على الكمبيوتر:

stun stun.sipnet.ru -p 11111 -v

حصلت على النتيجة:

...
MappedAddress = XX.1XX.1X4.2XX: 4398
...

في تلك اللحظة ، تم فتح جلسة UDP لفترة من الوقت ، إذا تم إرسال طلب UDP في تلك اللحظة (على سبيل المثال: netcat XX.1XX.1X4.2XX 4398 -u) ، فحينئذٍ جاء الطلب إلى جهاز التوجيه المنزلي ، والذي كان أكده TCPDump قيد التشغيل عليه ، لكن الطلب لم يصل إلى الكمبيوتر - قام IPtables حيث قام مترجم NAT على جهاز التوجيه بإسقاطه.
بدء تشغيل خادم VPN خلف NAT الخاص بالمزود
لكن حقيقة تمرير طلب UDP من خلال NAT الخاص بالمزود أعطت الأمل في النجاح. نظرًا لأن جهاز التوجيه يقع في نطاق اختصاصي ، فقد قمت بحل المشكلة عن طريق إعادة توجيه منفذ UDP / 11111 إلى الكمبيوتر:

iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX

وبالتالي ، أتيحت لي الفرصة لبدء جلسة UDP وتلقي الطلبات من الإنترنت من أي عنوان IP. في هذه اللحظة ، أطلقت OpenVPN-server (بعد تكوينه) بالاستماع إلى منفذ UDP / 11111 ، وأشرت إلى عنوان IP الخارجي والمنفذ (XX.1XX.1X4.2XX: 4398) على الهاتف الذكي وتم الاتصال بنجاح من الهاتف الذكي إلى حاسوب. ولكن في هذا التطبيق ، نشأت مشكلة ، كان من الضروري الحفاظ على جلسة UDP بطريقة ما حتى يتصل عميل OpenVPN بالخادم ، ولم يعجبني خيار تشغيل عميل STUN بشكل دوري - لم أرغب في تحميل خوادم STUN بلا فائدة.
لفت الانتباه أيضًا إلى الإدخال "سوف ينحني - سيكون هناك دبوس شعر"، هذا الوضع

يسمح Hairpinning لجهاز واحد على شبكة محلية خلف NAT بالوصول إلى جهاز آخر على نفس الشبكة على العنوان الخارجي لجهاز التوجيه.

بدء تشغيل خادم VPN خلف NAT الخاص بالمزود
نتيجة لذلك ، قمت بحل مشكلة الحفاظ على جلسة UDP ببساطة - قمت بتشغيل العميل على نفس الكمبيوتر مع الخادم.
عملت مثل هذا:

  • أطلق عميل STUN مع المنفذ المحلي 11111
  • تلقي استجابة بعنوان IP الخارجي والمنفذ XX.1XX.1X4.2XX: 4398
  • إرسال البيانات بعنوان IP خارجي ومنفذ إلى البريد (أي خدمة أخرى ممكنة) تم تكوينها على الهاتف الذكي
  • أطلق خادم OpenVPN على جهاز كمبيوتر يستمع على منفذ UDP / 11111
  • أطلق عميل OpenVPN على جهاز كمبيوتر يحدد XX.1XX.1X4.2XX: 4398 للاتصال
  • في أي وقت أطلق عميل OpenVPN على الهاتف الذكي ، مع تحديد عنوان IP والمنفذ (في حالتي ، لم يتغير عنوان IP) للاتصال

بدء تشغيل خادم VPN خلف NAT الخاص بالمزود
وبالتالي ، أتيحت لي الفرصة للاتصال بجهاز الكمبيوتر الخاص بي من هاتف ذكي. يتيح لك هذا التطبيق توصيل أي عميل OpenVPN.

ممارسة

سوف تحتاج إلى:

# apt install openvpn stun-client sendemail

بعد كتابة نصين ، اثنين من ملفات التكوين ، وإنشاء الشهادات اللازمة (نظرًا لأن العميل على الهاتف الذكي يعمل فقط مع الشهادات) ، حصلنا على التطبيق المعتاد لخادم OpenVPN.

البرنامج النصي الرئيسي على الكمبيوتر

# cat vpn11.sh

#!/bin/bash
until [[ -n "$iftosrv" ]]; do echo "$(date) Определяю сетевой интерфейс"; iftosrv=`ip route get 8.8.8.8 | head -n 1 | sed 's|.*dev ||' | awk '{print $1}'`; sleep 5; done
ABSOLUTE_FILENAME=`readlink -f "$0"`
DIR=`dirname "$ABSOLUTE_FILENAME"`
localport=11111
until [[ $a ]]; do
	address=`stun stun.sipnet.ru -v -p $localport 2>&1 | grep "MappedAddress" | sort | uniq | head -n 1 | sed 's/:/ /g' | awk '{print $3" "$4}'`
        ip=`echo "$address" | awk {'print $1'}`
        port=`echo "$address" | awk {'print $2'}`
	srv="openvpn --config $DIR/server.conf --port $localport --daemon"
	$srv
	echo "$(date) Сервер запущен с внешним адресом $ip:$port"
	$DIR/sendemail.sh "OpenVPN-Server" "$ip:$port"
	sleep 1
	openvpn --config $DIR/client.conf --remote $ip --port $port
	echo "$(date) Cоединение клиента с сервером разорвано"
	for i in `ps xa | grep "$srv" | grep -v grep | awk '{print $1}'`; do
		kill $i && echo "$(date) Завершен процесс сервера $i ($srv)"
		done
	echo "Жду 15 сек"
	sleep 15
	done

البرنامج النصي لإرسال البريد الإلكتروني:

# cat sendemail.sh 

#!/bin/bash
from="От кого"
pass="Пароль"
to="Кому"
theme="$1"
message="$2"
server="smtp.yandex.ru:587"
sendEmail -o tls=yes -f "$from" -t "$to" -s "$server" -xu "$from" -xp "$pass" -u "$theme" -m "$message"

ملف تكوين الخادم:

# cat server.conf

proto udp
dev tun
ca      /home/vpn11-srv/ca.crt
cert    /home/vpn11-srv/server.crt
key     /home/vpn11-srv/server.key
dh      /home/vpn11-srv/dh2048.pem
server 10.2.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
tls-server
tls-auth /home/vpn11-srv/ta.key 0
tls-timeout 60
auth    SHA256
cipher  AES-256-CBC
client-to-client
keepalive 10 30
comp-lzo
max-clients 10
user nobody
group nogroup
persist-key
persist-tun
log /var/log/vpn11-server.log
verb 3
mute 20

ملف تكوين العميل:

# cat client.conf

client
dev tun
proto udp
ca      "/home/vpn11-srv/ca.crt"
cert    "/home/vpn11-srv/client1.crt"
key     "/home/vpn11-srv/client1.key"
tls-client
tls-auth "/home/vpn11-srv/ta.key" 1
auth SHA256
cipher AES-256-CBC
auth-nocache
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
log /var/log/vpn11-clent.log
verb 3
mute 20
ping 10
ping-exit 30

تم إنشاء الشهادات وفقًا لـ هذا المقال.
تشغيل البرنامج النصي:

# ./vpn11.sh

جعله قابلاً للتنفيذ أولاً

# chmod +x vpn11.sh

على جانب الهاتف الذكي

عن طريق تثبيت التطبيق افتح VPN لنظام Android، نسخ ملف التكوين والشهادات وتكوينه ، اتضح كما يلي:
التحقق من البريد الإلكتروني على هاتفي الذكيبدء تشغيل خادم VPN خلف NAT الخاص بالمزود
أقوم بتحرير رقم المنفذ في الإعداداتبدء تشغيل خادم VPN خلف NAT الخاص بالمزود
أبدأ العميل وأتصلبدء تشغيل خادم VPN خلف NAT الخاص بالمزود

أثناء عملية كتابة المقال ، قمت بنقل التكوين من الكمبيوتر إلى Raspberry Pi 3 وحاولت تشغيل كل شيء على مودم LTE ، لكنها لم تنجح! نتيجة الأمر

# stun stun.ekiga.net -p 11111

إصدار عميل STUN 0.97
أساسي: رسم الخرائط المستقل ، المرشح المعتمد على المنفذ ، المنفذ العشوائي ، سوف ينكسر
القيمة المعادة هي 0x000006

قيمة مرشح المنفذ المعتمد منع النظام من البدء.
لكن المزود المنزلي سمح بتشغيل النظام على Raspberry Pi 3 دون أي مشاكل.
بالتزامن مع كاميرا الويب ، مع VLC لـ
إنشاء دفق RTSP من كاميرا الويب

$ cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{vcodec=x264,venc=x264{preset=ultrafast,profile=baseline,level=31},vb=2048,fps=12,scale=1,acodec=mpga,ab=128,channels=2,samplerate=44100,scodec=none}:rtp{sdp=rtsp://10.2.0.1:8554/}' --no-sout-all --sout-keep

و VLC على هاتف ذكي للعرض (تدفق rtsp: //10.2.0.1: 8554 /) ، اتضح أنه ليس نظام مراقبة بالفيديو سيئًا عن بعد ، يمكنك أيضًا إعداد Samba ، وتوجيه حركة المرور عبر VPN ، والتحكم عن بعد في جهاز الكمبيوتر وأكثر بكثير ...

إنتاج

كما أوضحت الممارسة ، لتنظيم خادم VPN ، يمكنك الاستغناء عن عنوان IP خارجي تحتاج إلى الدفع مقابله ، وكذلك مقابل VPS / VDS مستأجر. لكن كل هذا يتوقف على المزود. بالطبع ، كنت أرغب في الحصول على مزيد من المعلومات حول مختلف موفري وأنواع NATs المستخدمة ، ولكن هذه ليست سوى البداية ...
شكرا لك!

المصدر: www.habr.com

إضافة تعليق