Provayderin NAT arxasında VPN serverinin işə salınması

Ev provayderimin NAT arxasında (ağ IP ünvanı olmadan) VPN serverini necə idarə etməyi bacardığım haqqında məqalə. İcazə verin, dərhal rezervasiya edim: bu bu tətbiqin performansı birbaşa provayderinizin, eləcə də marşrutlaşdırıcının istifadə etdiyi NAT növündən asılıdır.
Beləliklə, mən Android smartfonumdan ev kompüterimə qoşulmalı oldum, hər iki cihaz provayder NAT-ları vasitəsilə İnternetə qoşulub, üstəlik kompüter NAT-a qoşulan ev marşrutlaşdırıcısı vasitəsilə qoşulub.
Ağ IP ünvanı ilə icarəyə götürülmüş VPS/VDS-dən istifadə edən klassik sxem, eləcə də provayderdən ağ IP ünvanını icarəyə götürmək bir neçə səbəbə görə nəzərə alınmadı.
Nəzərə alaraq keçmiş məqalələrdən təcrübə, provayderlərin STUN-ları və NAT-ları ilə bir neçə təcrübə apararaq. OpenWRT proqram təminatı ilə işləyən ev marşrutlaşdırıcısında əmr işlətməklə kiçik bir təcrübə etmək qərarına gəldim:

$ stun stun.sipnet.ru

nəticə əldə etdi:

STUN müştəri versiyası 0.97
İbtidai: Müstəqil Xəritəçəkmə, Müstəqil Filtr, təsadüfi port, saç düzümü
Qaytarılan dəyərdir 0x000002

Hərfi tərcümə:
Müstəqil Xəritəçəkmə - müstəqil xəritəçəkmə
Müstəqil Filtr - müstəqil filtr
təsadüfi port - təsadüfi port
saç sancısı olacaq - saç sancısı olacaq
Bənzər bir əmri kompüterimdə işlətməklə mən əldə etdim:

STUN müştəri versiyası 0.97
İlkin: Müstəqil Xəritəçəkmə, Portdan Asılı Filtr, təsadüfi port, saç tıxacları
Qaytarılan dəyərdir 0x000006

Port Dependent Filter - portdan asılı filtr
Komanda çıxışının nəticələrindəki fərq, ev marşrutlaşdırıcısının İnternetdən paketlərin ötürülməsi prosesinə "töhfəsini" etdiyini göstərdi; bu, kompüterdə əmri yerinə yetirərkən özünü göstərdi:

stun stun.sipnet.ru -p 11111 -v

Nəticəni alırdım:

...
Xəritəli Ünvan = XX.1XX.1X4.2XX:4398
...

bu anda bir müddət UDP sessiyası açıldı, əgər bu anda bir UDP sorğusu göndərsəniz (məsələn: netcat XX.1XX.1X4.2XX 4398 -u), o zaman sorğu ev marşrutlaşdırıcısına gəldi. üzərində işləyən TCPDump tərəfindən təsdiqləndi, lakin sorğu kompüterə çatmadı - IPtables, marşrutlaşdırıcıda NAT tərcüməçisi olaraq onu atdı.
Provayderin NAT-ının arxasında VPN serverinin işlədilməsi
Ancaq UDP sorğusunun provayderin NAT-dan keçməsi uğura ümid verdi. Router mənim yurisdiksiyamda yerləşdiyi üçün problemi UDP/11111 portunu kompüterə yönləndirməklə həll etdim:

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

Beləliklə, mən UDP sessiyasına başlaya bildim və istənilən IP ünvanından İnternetdən sorğular ala bildim. Bu anda mən UDP/11111 portunu dinləyən OpenVPN-serverini işə saldım (əvvəllər onu konfiqurasiya etmişəm), smartfonda xarici IP ünvanını və portunu (XX.1XX.1X4.2XX:4398) göstərdim və smartfondan uğurla qoşuldum. Kompüter. Ancaq bu tətbiqdə bir problem yarandı: OpenVPN müştəri serverə qoşulana qədər UDP sessiyasını birtəhər saxlamaq lazım idi; STUN müştərisini vaxtaşırı işə salmaq seçimini bəyənmədim - yükü sərf etmək istəmədim. STUN serverləri.
Mən də qeyd etdim "saç sancısı olacaq - saç sancısı olacaq", bu rejim

Saç kəsmə NAT-ın arxasındakı yerli şəbəkədə bir maşına marşrutlaşdırıcının xarici ünvanında eyni şəbəkədəki digər maşına daxil olmaq imkanı verir.

Provayderin NAT-ının arxasında VPN serverinin işlədilməsi
Nəticədə, mən sadəcə olaraq UDP sessiyasını saxlamaq problemini həll etdim - müştərini serverlə eyni kompüterdə işə saldım.
Bu belə işlədi:

  • yerli port 11111-də STUN müştərisini işə saldı
  • xarici IP ünvanı və XX.1XX.1X4.2XX:4398 portu ilə cavab aldı
  • smartfonda konfiqurasiya edilmiş xarici IP ünvanı və portu olan məlumatları e-poçta göndərmək (hər hansı digər xidmət mümkündür).
  • UDP/11111 portunu dinləyən kompüterdə OpenVPN serverini işə saldı
  • qoşulma üçün XX.1XX.1X4.2XX:4398 göstərərək kompüterdə OpenVPN müştərisini işə saldı
  • istənilən vaxt qoşulmaq üçün IP ünvanını və portunu (mənim vəziyyətimdə IP ünvanı dəyişməyib) göstərən OpenVPN müştərisini smartfonda işə saldı.

Provayderin NAT-ının arxasında VPN serverinin işlədilməsi
Bu yolla mən smartfondan kompüterimə qoşula bildim. Bu proqram istənilən OpenVPN müştərisini birləşdirməyə imkan verir.

Praktika

Alacaq:

# apt install openvpn stun-client sendemail

Bir neçə skript, bir neçə konfiqurasiya faylı yazdıqdan və lazımi sertifikatları yaratdıqdan sonra (smartfondakı müştəri yalnız sertifikatlarla işlədiyi üçün) biz OpenVPN serverinin adi tətbiqini əldə etdik.

Kompüterdə əsas 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

E-poçt vasitəsilə məlumat göndərmək üçün 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 konfiqurasiya faylı:

# 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

Müştəri konfiqurasiya faylı:

# 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 istifadə edərək yaradıldı Bu məqalə.
Skriptin icrası:

# ./vpn11.sh

Əvvəlcə onu icra edilə bilən hala gətirməklə

# chmod +x vpn11.sh

Smartfon tərəfində

Proqramı quraşdıraraq Android üçün OpenVPN, konfiqurasiya faylını, sertifikatları kopyalayıb konfiqurasiya etdikdən sonra belə oldu:
Smartfonumda e-poçtumu yoxlayıramProvayderin NAT-ının arxasında VPN serverinin işlədilməsi
Parametrlərdə port nömrəsini redaktə edirəmProvayderin NAT-ının arxasında VPN serverinin işlədilməsi
Mən müştərini işə salıram və qoşuluramProvayderin NAT-ının arxasında VPN serverinin işlədilməsi

Bu məqaləni yazarkən mən konfiqurasiyanı kompüterimdən Raspberry Pi 3-ə köçürdüm və hər şeyi LTE modemində işlətməyə çalışdım, amma alınmadı! Komanda Nəticəsi

# stun stun.ekiga.net -p 11111

STUN müştəri versiyası 0.97
İlkin: Müstəqil Xəritəçəkmə, Portdan Asılı Filtr, təsadüfi port, saç tıxacları
Qaytarılan dəyərdir 0x000006

dəyər Portdan asılı filtr sistemin işə salınmasına imkan vermədi.
Ancaq ev provayderi sistemin Raspberry Pi 3-də heç bir problem olmadan işə salınmasına icazə verdi.
Veb kamera ilə birlikdə VLC üçün
veb kameradan RTSP axını yaratmaq

$ 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

və baxmaq üçün bir smartfonda VLC (stream rtsp://10.2.0.1:8554/), yaxşı uzaqdan video nəzarət sistemi olduğu ortaya çıxdı, siz həmçinin Samba quraşdıra, VPN vasitəsilə trafik yönləndirə, kompüterinizi uzaqdan idarə edə və daha çox şey edə bilərsiniz. daha çox...

Buraxılış

Təcrübə göstərdiyi kimi, VPN serverini təşkil etmək üçün icarəyə götürülmüş VPS/VDS kimi, ödəniş etməli olduğunuz xarici IP ünvanı olmadan edə bilərsiniz. Ancaq hamısı provayderdən asılıdır. Əlbəttə ki, müxtəlif provayderlər və istifadə olunan NAT növləri haqqında daha çox məlumat almaq istəyirdim, lakin bu, yalnız başlanğıcdır...
Diqqətiniz üçün təşəkkür edirik!

Mənbə: www.habr.com

Добавить комментарий