Pagpadagan sa usa ka VPN server luyo sa NAT sa provider

Usa ka artikulo bahin sa kung giunsa nako pagdumala ang usa ka VPN server sa luyo sa NAT sa akong taghatag sa balay (walay puti nga IP address). Tugoti ako nga magpareserba dayon: kana ang pasundayag niini nga pagpatuman direkta nagdepende sa matang sa NAT nga gigamit sa imong provider, ingon man sa router.
Mao nga, kinahanglan nako nga magkonektar gikan sa akong Android smartphone sa akong computer sa balay, ang duha nga mga aparato konektado sa Internet pinaagi sa mga NAT sa provider, ug ang kompyuter konektado pinaagi sa usa ka router sa balay, nga mao usab ang mga koneksyon sa NAT.
Ang klasiko nga laraw gamit ang usa ka giabangan nga VPS/VDS nga adunay puti nga IP address, ingon man ang pag-abang sa puti nga IP address gikan sa usa ka provider, wala gikonsiderar sa daghang mga hinungdan.
Gikonsiderar kasinatian gikan sa nangaging mga artikulo, nga nagpahigayon sa daghang mga eksperimento sa mga STUN ug NAT sa mga tighatag. Nakahukom ko nga maghimo usa ka gamay nga eksperimento pinaagi sa pagpadagan sa command sa usa ka home router nga nagpadagan sa OpenWRT firmware:

$ stun stun.sipnet.ru

nakuha ang resulta:

STUN nga bersyon sa kliyente 0.97
Primary: Independent Mapping, Independent Filter, random port, mag-hairpin
Ang bili sa pagbalik mao ang 0x000002

Literal nga paghubad:
Independent Mapping - independente nga pagmapa
Independent Filter - independente nga filter
random port - random port
will hairpin - adunay usa ka hairpin
Ang pagpadagan sa susama nga sugo sa akong PC, nakuha nako:

STUN nga bersyon sa kliyente 0.97
Primary: Independent Mapping, Port Dependent Filter, random port, mag-hairpin
Ang bili sa pagbalik mao ang 0x000006

Port Dependent Filter - filter nga nagsalig sa port
Ang kalainan sa mga resulta sa command output nagpakita nga ang home router naghimo sa "kontribusyon niini" sa proseso sa pagpadala sa mga packet gikan sa Internet; kini gipakita sa kamatuoran nga sa dihang gipatuman ang command sa computer:

stun stun.sipnet.ru -p 11111 -v

Nakuha nako ang resulta:

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

Niining higayona, usa ka sesyon sa UDP ang giablihan sulod sa pipila ka panahon, kung niining higayona nagpadala ka og hangyo sa UDP (pananglitan: netcat XX.1XX.1X4.2XX 4398 -u), unya ang hangyo miabut sa home router, nga mao gipamatud-an sa TCPDump nga nagdagan niini, apan ang hangyo wala makaabot sa kompyuter - IPtables, isip usa ka tighubad sa NAT sa router, naghulog niini.
Pagpadagan sa usa ka VPN server luyo sa NAT sa provider
Apan ang mismong kamatuoran nga ang hangyo sa UDP nga gipasa sa NAT sa provider naghatag paglaum alang sa kalampusan. Tungod kay ang router nahimutang sa akong hurisdiksyon, akong nasulbad ang problema pinaagi sa pag-redirect sa UDP/11111 port sa kompyuter:

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

Sa ingon, nakahimo ako sa pagsugod sa usa ka sesyon sa UDP ug nakadawat mga hangyo gikan sa Internet gikan sa bisan unsang IP address. Niining higayona, gilusad nako ang OpenVPN-server (nga na-configure na kini kaniadto) nga naminaw sa UDP/11111 port, nagpakita sa external IP address ug port (XX.1XX.1X4.2XX:4398) sa smartphone ug malampuson nga konektado gikan sa smartphone ngadto sa ang kompyuter. Apan sa kini nga pagpatuman usa ka problema ang mitungha: kinahanglan nga sa usa ka paagi mapadayon ang sesyon sa UDP hangtod ang kliyente sa OpenVPN nga konektado sa server; Dili ko gusto ang kapilian nga matag karon nga paglansad sa kliyente sa STUN - dili ko gusto nga usikan ang load sa ang mga server sa STUN.
Nakabantay pud ko sa entry"will hairpin - adunay usa ka hairpin", kini nga mode

Ang hairpinning nagtugot sa usa ka makina sa lokal nga network luyo sa NAT nga maka-access sa laing makina sa samang network sa eksternal nga adres sa router.

Pagpadagan sa usa ka VPN server luyo sa NAT sa provider
Ingon usa ka sangputanan, nasulbad ra nako ang problema sa pagpadayon sa usa ka sesyon sa UDP - gilusad nako ang kliyente sa parehas nga kompyuter nga adunay server.
Nagtrabaho kini sama niini:

  • gilansad ang kliyente sa STUN sa lokal nga pantalan 11111
  • nakadawat og tubag nga adunay external IP address ug port XX.1XX.1X4.2XX:4398
  • nagpadala og data nga adunay eksternal nga IP address ug port sa email (bisan unsa nga serbisyo posible) nga gi-configure sa smartphone
  • gilusad ang OpenVPN server sa usa ka kompyuter nga naminaw sa UDP/11111 port
  • gilusad ang OpenVPN nga kliyente sa kompyuter nga nagpiho sa XX.1XX.1X4.2XX:4398 alang sa koneksyon
  • bisan unsang orasa gilunsad ang OpenVPN nga kliyente sa smartphone nga nagpakita sa IP address ug port (sa akong kaso ang IP address wala mausab) aron makonektar

Pagpadagan sa usa ka VPN server luyo sa NAT sa provider
Niining paagiha nakakonektar ko sa akong computer gikan sa akong smartphone. Kini nga pagpatuman nagtugot kanimo sa pagkonektar sa bisan unsang OpenVPN nga kliyente.

Pagpraktis

Mahitabo kini:

# apt install openvpn stun-client sendemail

Ang pagsulat sa usa ka magtiayon nga mga script, usa ka pares nga mga file sa pag-configure, ug nakamugna sa kinahanglan nga mga sertipiko (tungod kay ang kliyente sa usa ka smartphone nagtrabaho lamang sa mga sertipiko), nakuha namon ang naandan nga pagpatuman sa usa ka OpenVPN server.

Panguna nga script sa kompyuter

# 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

Script alang sa pagpadala sa datos pinaagi sa email:

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

File sa pag-configure sa server:

# 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

Client configuration file:

# 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

Ang mga sertipiko gihimo gamit kini nga artikulo.
Pagpadagan sa script:

# ./vpn11.sh

Pinaagi sa una nga paghimo niini nga ma-executable

# chmod +x vpn11.sh

Sa kilid sa smartphone

Pinaagi sa pag-instalar sa aplikasyon OpenVPN alang sa Android, nga gikopya ang configuration file, mga sertipiko ug gi-configure kini, kini nahimong sama niini:
Gisusi nako ang akong email sa akong smartphonePagpadagan sa usa ka VPN server luyo sa NAT sa provider
Gi-edit nako ang numero sa port sa mga settingPagpadagan sa usa ka VPN server luyo sa NAT sa provider
Gilunsad nako ang kliyente ug nagkonektarPagpadagan sa usa ka VPN server luyo sa NAT sa provider

Samtang nagsulat niini nga artikulo, akong gibalhin ang configuration gikan sa akong computer ngadto sa Raspberry Pi 3 ug misulay sa pagpadagan sa tibuok butang sa usa ka LTE modem, apan wala kini molihok! Resulta sa Sugo

# stun stun.ekiga.net -p 11111

STUN nga bersyon sa kliyente 0.97
Primary: Independent Mapping, Port Dependent Filter, random port, mag-hairpin
Ang bili sa pagbalik mao ang 0x000006

kahulugan Filter nga Nagsalig sa Port wala motugot sa sistema sa pagsugod.
Apan gitugotan sa taghatag sa balay nga magsugod ang sistema sa Raspberry Pi 3 nga wala’y mga problema.
Inubanan sa usa ka webcam, uban sa VLC alang sa
paghimo og RTSP stream gikan sa webcam

$ 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

ug VLC sa usa ka smartphone alang sa pagtan-aw (stream rtsp://10.2.0.1:8554/), kini nahimo nga usa ka maayo nga hilit nga video surveillance system, mahimo usab nimo i-install ang Samba, ruta sa trapiko pinaagi sa VPN, layo nga pagkontrol sa imong kompyuter ug daghan dugang pa...

konklusyon

Sama sa gipakita sa praktis, aron maorganisar ang usa ka VPN server, mahimo nimo nga wala ang usa ka eksternal nga IP address nga kinahanglan nimo nga bayran, sama sa usa ka giabangan nga VPS/VDS. Apan kini tanan nagdepende sa tighatag. Siyempre, gusto ko nga makakuha og dugang nga impormasyon mahitungod sa lain-laing mga providers ug mga matang sa NATs nga gigamit, apan kini mao lamang ang sinugdanan...
Спасибо за внимание!

Source: www.habr.com

Idugang sa usa ka comment