راه اندازی سرور VPN پشت NAT ارائه دهنده

مقاله ای در مورد اینکه چگونه توانستم یک سرور VPN را در پشت NAT یک ارائه دهنده خانگی (بدون آدرس IP سفید) اجرا کنم. اجازه دهید فوراً به شما بگویم: عملکرد این پیاده سازی مستقیماً به نوع NAT استفاده شده توسط ارائه دهنده شما و همچنین روتر بستگی دارد.
بنابراین، من نیاز داشتم که از تلفن هوشمند اندرویدی خود به رایانه خانگی خود متصل شوم، هر دو دستگاه از طریق NAT های ارائه دهنده به اینترنت متصل می شوند، به علاوه رایانه از طریق یک روتر خانگی وصل می شود، که اتصالات NAT نیز دارد.
طرح کلاسیک با استفاده از VPS / VDS اجاره ای با آدرس IP سفید و همچنین اجاره یک آدرس IP سفید از ارائه دهنده، به چند دلیل در نظر گرفته نشد.
با در نظر گرفتن تجربه مقالات گذشته، پس از انجام چندین آزمایش با STUN و NAT های ارائه دهندگان. من تصمیم گرفتم یک آزمایش کوچک را با اجرای دستور روی یک روتر خانگی با سیستم عامل 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 را (پس از پیکربندی آن) با گوش دادن به پورت UDP/11111 راه اندازی کردم، آدرس IP خارجی و پورت (XX.1XX.1X4.2XX:4398) را روی گوشی هوشمند نشان دادم و با موفقیت از گوشی هوشمند به کامپیوتر. اما در این پیاده سازی، مشکلی پیش آمد، لازم بود تا زمانی که کلاینت OpenVPN به سرور متصل شود، جلسه UDP را به نحوی حفظ کنیم، گزینه راه اندازی دوره ای 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 را برای اندروید باز کنید، با کپی کردن فایل پیکربندی، گواهی ها و پیکربندی آن، به این صورت معلوم شد:
چک کردن ایمیل در گوشی هوشمندمراه اندازی سرور 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 در تلفن هوشمند برای مشاهده (stream rtsp://10.2.0.1:8554/)، معلوم شد که سیستم نظارت تصویری بدی نیست، همچنین می توانید Samba را راه اندازی کنید، ترافیک را از طریق VPN مسیریابی کنید، کامپیوتر را از راه دور کنترل کنید و خیلی بیشتر ...

نتیجه

همانطور که تمرین نشان داده است، برای سازماندهی سرور VPN، می توانید بدون یک آدرس IP خارجی که برای آن باید پرداخت کنید، و همچنین VPS / VDS اجاره ای انجام دهید. اما همه چیز به ارائه دهنده بستگی دارد. البته، من می خواستم اطلاعات بیشتری در مورد ارائه دهندگان مختلف و انواع NAT های مورد استفاده به دست بیاورم، اما این تنها شروع است ...
با تشکر از شما!

منبع: www.habr.com

اضافه کردن نظر