Provayder NAT ortida VPN serverini ishga tushirish

Qanday qilib men uy provayderimning NAT orqasida (oq IP-manzilsiz) VPN serverini ishga tushirganim haqidagi maqola. Darhol band qilishimga ruxsat bering: bu ushbu dasturning ishlashi to'g'ridan-to'g'ri provayderingiz, shuningdek router tomonidan ishlatiladigan NAT turiga bog'liq.
Shunday qilib, men Android smartfonimdan uy kompyuterimga ulanishim kerak edi, ikkala qurilma ham NAT provayderlari orqali Internetga ulangan, shuningdek, kompyuter uy router orqali ulangan, u ham NATs ulanishlari.
Oq IP-manzilga ega ijaraga olingan VPS/VDS-dan foydalanadigan klassik sxema, shuningdek, provayderdan oq IP-manzilni ijaraga olish bir necha sabablarga ko'ra ko'rib chiqilmadi.
Hisobga olgan holda oldingi maqolalardagi tajriba, provayderlarning STUN va NATlari bilan bir nechta tajribalar o'tkazgan. Men OpenWRT mikrodasturini ishga tushiradigan uy routerida buyruqni ishga tushirish orqali kichik tajriba o'tkazishga qaror qildim:

$ stun stun.sipnet.ru

natija oldi:

STUN mijoz versiyasi 0.97
Birlamchi: Mustaqil xaritalash, Mustaqil filtr, tasodifiy port, soch turmagi
Qaytish qiymati 0x000002

So'zma-so'z tarjimasi:
Independent Mapping - mustaqil xaritalash
Mustaqil filtr - mustaqil filtr
tasodifiy port - tasodifiy port
soch turmagi bo'ladi - soch turmagi bo'ladi
Shaxsiy kompyuterimda shunga o'xshash buyruqni ishga tushirib, men oldim:

STUN mijoz versiyasi 0.97
Birlamchi: Mustaqil xaritalash, Portga bog'liq filtr, tasodifiy port, soch turmagi
Qaytish qiymati 0x000006

Portga bog'liq filtr - portga bog'liq filtr
Buyruqning chiqishi natijalaridagi farq uy routeri Internetdan paketlarni uzatish jarayoniga "o'z hissasini" qo'shayotganligini ko'rsatdi; bu kompyuterda buyruqni bajarishda namoyon bo'ldi:

stun stun.sipnet.ru -p 11111 -v

Men natijaga erishdim:

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

Ayni paytda UDP seansi biroz vaqt ochildi, agar siz hozirda UDP so'rovini yuborsangiz (masalan: netcat XX.1XX.1X4.2XX 4398 -u), so'rov uy routerga keldi. unda ishlaydigan TCPDump tomonidan tasdiqlangan, ammo so'rov kompyuterga etib bormadi - IPtables, routerda NAT tarjimoni sifatida uni tashlab yubordi.
Provayder NAT ortida VPN serverini ishga tushirish
Ammo UDP so'rovi provayderning NAT orqali o'tganligi muvaffaqiyatga umid qildi. Router mening yurisdiktsiyamda joylashganligi sababli, men UDP/11111 portini kompyuterga yo'naltirish orqali muammoni hal qildim:

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

Shunday qilib, men UDP seansini boshlashga va istalgan IP manzildan Internetdan so'rovlarni qabul qilishga muvaffaq bo'ldim. Ayni paytda men UDP/11111 portini tinglovchi OpenVPN-serverni ishga tushirdim (uni avvaldan sozlaganman), smartfonda tashqi IP-manzil va portni (XX.1XX.1X4.2XX:4398) ko'rsatdim va smartfondan muvaffaqiyatli ulandim. Kompyuter. Ammo bu amalga oshirishda muammo yuzaga keldi: OpenVPN mijozi serverga ulanmaguncha qandaydir tarzda UDP seansini saqlab turish kerak edi; Menga STUN mijozini vaqti-vaqti bilan ishga tushirish varianti yoqmadi - yukni behuda sarflashni xohlamadim. STUN serverlari.
Men ham yozuvga e'tibor qaratdim "soch turmagi bo'ladi - soch turmagi bo'ladi", bu rejim

Soch kesish NAT orqasidagi mahalliy tarmoqdagi bitta mashinaga routerning tashqi manzilidagi bir tarmoqdagi boshqa mashinaga kirish imkonini beradi.

Provayder NAT ortida VPN serverini ishga tushirish
Natijada, men shunchaki UDP seansini saqlash muammosini hal qildim - men mijozni server bilan bir xil kompyuterda ishga tushirdim.
Bu shunday ishladi:

  • 11111 mahalliy portida STUN mijozini ishga tushirdi
  • tashqi IP manzili va XX.1XX.1X4.2XX:4398 porti bilan javob oldi
  • smartfonda sozlangan tashqi IP-manzil va port bilan ma'lumotlarni elektron pochtaga yubordi (har qanday boshqa xizmat ham mumkin).
  • UDP/11111 portini tinglovchi kompyuterda OpenVPN serverini ishga tushirdi
  • ulanish uchun XX.1XX.1X4.2XX:4398 ko'rsatuvchi kompyuterda OpenVPN mijozini ishga tushirdi.
  • istalgan vaqtda ulanish uchun smartfonda IP-manzil va portni (mening holimda IP-manzil o'zgarmagan) ko'rsatuvchi OpenVPN mijozini ishga tushirdi.

Provayder NAT ortida VPN serverini ishga tushirish
Shu tarzda men smartfonimdan kompyuterimga ulanishga muvaffaq bo'ldim. Ushbu dastur har qanday OpenVPN mijozini ulash imkonini beradi.

Amaliyot

Siz kerak bo'ladi:

# apt install openvpn stun-client sendemail

Bir nechta skriptlarni, bir nechta konfiguratsiya fayllarini yozib, kerakli sertifikatlarni yaratgandan so'ng (chunki smartfondagi mijoz faqat sertifikatlar bilan ishlaydi), biz OpenVPN serverining odatiy amaliyotiga ega bo'ldik.

Kompyuterda asosiy skript

# 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

Elektron pochta orqali ma'lumotlarni yuborish uchun skript:

# 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"

Server konfiguratsiya fayli:

# 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

Mijoz konfiguratsiya fayli:

# 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

Sertifikatlar yordamida yaratilgan Ushbu maqola.
Skriptni ishga tushirish:

# ./vpn11.sh

Avval uni bajariladigan qilish orqali

# chmod +x vpn11.sh

Smartfon tomonida

Ilovani o'rnatish orqali Android uchun OpenVPN, konfiguratsiya faylini, sertifikatlarni nusxa ko'chirgan va uni sozlagandan so'ng, shunday bo'ldi:
Men elektron pochtamni smartfonimda tekshiramanProvayder NAT ortida VPN serverini ishga tushirish
Sozlamalarda port raqamini tahrir qilamanProvayder NAT ortida VPN serverini ishga tushirish
Men mijozni ishga tushiraman va ulanamanProvayder NAT ortida VPN serverini ishga tushirish

Ushbu maqolani yozish paytida men konfiguratsiyani kompyuterimdan Raspberry Pi 3 ga o'tkazdim va LTE modemida hamma narsani ishga tushirishga harakat qildim, lekin u ishlamadi! Buyruq natijasi

# stun stun.ekiga.net -p 11111

STUN mijoz versiyasi 0.97
Birlamchi: Mustaqil xaritalash, Portga bog'liq filtr, tasodifiy port, soch turmagi
Qaytish qiymati 0x000006

ma'no Portga bog'liq filtr tizimni ishga tushirishga ruxsat bermadi.
Ammo uy provayderi tizimni Raspberry Pi 3 da muammosiz ishga tushirishga ruxsat berdi.
VLC uchun veb-kamera bilan birgalikda
veb-kameradan RTSP oqimini yaratish

$ 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

va ko'rish uchun smartfonda VLC (stream rtsp://10.2.0.1:8554/), bu yaxshi masofaviy video kuzatuv tizimi bo'lib chiqdi, siz Samba-ni o'rnatishingiz, VPN orqali trafikni yo'naltirishingiz, kompyuteringizni masofadan boshqarishingiz va boshqalar. Ko'proq...

xulosa

Amaliyot shuni ko'rsatadiki, VPN serverini tashkil qilish uchun siz ijaraga olingan VPS/VDS kabi to'lashingiz kerak bo'lgan tashqi IP-manzilsiz ham qilishingiz mumkin. Ammo barchasi provayderga bog'liq. Albatta, men turli xil provayderlar va ishlatiladigan NAT turlari haqida ko'proq ma'lumot olishni xohlardim, ammo bu faqat boshlanishi...
E'tiboringiz uchun tashakkur!

Manba: www.habr.com

a Izoh qo'shish