مقال حول كيف تمكنت من تشغيل خادم VPN خلف NAT لمزود منزلي (بدون عنوان IP أبيض). دعني أخبرك على الفور: يعتمد أداء هذا التنفيذ بشكل مباشر على نوع NAT الذي يستخدمه مزودك ، وكذلك جهاز التوجيه.
لذلك ، كنت بحاجة إلى الاتصال من هاتفي الذكي الذي يعمل بنظام Android بجهاز الكمبيوتر المنزلي الخاص بي ، وكلا الجهازين متصلان بالإنترنت من خلال مزود NATs ، بالإضافة إلى أن الكمبيوتر متصل من خلال جهاز توجيه منزلي ، وهو أيضًا اتصالات NATs.
لم يتم النظر في المخطط الكلاسيكي الذي يستخدم VPS / VDS مؤجرًا بعنوان IP أبيض ، بالإضافة إلى استئجار عنوان IP أبيض من الموفر ، لعدة أسباب.
أخذا بالإعتبار
$ 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 على جهاز التوجيه بإسقاطه.
لكن حقيقة تمرير طلب 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 بالوصول إلى جهاز آخر على نفس الشبكة على العنوان الخارجي لجهاز التوجيه.
نتيجة لذلك ، قمت بحل مشكلة الحفاظ على جلسة UDP ببساطة - قمت بتشغيل العميل على نفس الكمبيوتر مع الخادم.
عملت مثل هذا:
- أطلق عميل STUN مع المنفذ المحلي 11111
- تلقي استجابة بعنوان IP الخارجي والمنفذ XX.1XX.1X4.2XX: 4398
- إرسال البيانات بعنوان IP خارجي ومنفذ إلى البريد (أي خدمة أخرى ممكنة) تم تكوينها على الهاتف الذكي
- أطلق خادم OpenVPN على جهاز كمبيوتر يستمع على منفذ UDP / 11111
- أطلق عميل OpenVPN على جهاز كمبيوتر يحدد XX.1XX.1X4.2XX: 4398 للاتصال
- في أي وقت أطلق عميل OpenVPN على الهاتف الذكي ، مع تحديد عنوان IP والمنفذ (في حالتي ، لم يتغير عنوان IP) للاتصال
وبالتالي ، أتيحت لي الفرصة للاتصال بجهاز الكمبيوتر الخاص بي من هاتف ذكي. يتيح لك هذا التطبيق توصيل أي عميل 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، نسخ ملف التكوين والشهادات وتكوينه ، اتضح كما يلي:
التحقق من البريد الإلكتروني على هاتفي الذكي
أقوم بتحرير رقم المنفذ في الإعدادات
أبدأ العميل وأتصل
أثناء عملية كتابة المقال ، قمت بنقل التكوين من الكمبيوتر إلى 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