Begin 'n VPN-bediener agter 'n verskaffer se NAT

'n Artikel oor hoe ek dit reggekry het om 'n VPN-bediener agter die NAT van 'n tuisverskaffer te bestuur (sonder 'n wit IP-adres). Laat ek jou dadelik vertel: die prestasie van hierdie implementering hang direk af van die tipe NAT wat deur jou verskaffer gebruik word, sowel as die roeteerder.
So, ek het 'n behoefte gehad om van my Android-slimfoon na my tuisrekenaar te koppel, beide toestelle is aan die internet gekoppel deur verskaffer NAT's, plus die rekenaar is gekoppel deur 'n tuisroeteerder, wat ook NAT's verbind.
Die klassieke skema wat 'n gehuurde VPS / VDS met 'n wit IP-adres gebruik, sowel as die huur van 'n wit IP-adres van die verskaffer, is om verskeie redes nie oorweeg nie.
Neem in ag ervaring van vorige artikels, nadat hy verskeie eksperimente met STUN's en NAT's van verskaffers deurgebring het. Ek het op 'n klein eksperiment besluit deur die opdrag uit te voer op 'n tuisrouter wat OpenWRT-firmware uitvoer:

$ stun stun.sipnet.ru

het die resultaat gekry:

STUN kliënt weergawe 0.97
Primêr: Onafhanklike kartering, onafhanklike filter, ewekansige poort, sal haarspeld
terugkeer waarde is 0x000002

Letterlike vertaling:
Onafhanklike kartering - onafhanklike vertoning
Onafhanklike filter - onafhanklike filter
ewekansige poort - ewekansige poort
sal haarspeld - daar sal 'n haarnaald wees
Nadat ek 'n soortgelyke opdrag op my rekenaar uitgevoer het, het ek:

STUN kliënt weergawe 0.97
Primêr: Onafhanklike kartering, poortafhanklike filter, ewekansige poort, sal haarspeld
terugkeer waarde is 0x000006

Poortafhanklike filter - poortafhanklike filter
Die verskil in die resultate van die uitvoer van die opdragte het aangedui dat die tuisroeteerder "sy bydrae" gemaak het tot die proses om pakkies vanaf die internet uit te saai, dit het gemanifesteer in die feit dat wanneer die opdrag op die rekenaar uitgevoer is:

stun stun.sipnet.ru -p 11111 -v

ek het die resultaat gekry:

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

op daardie oomblik is 'n UDP-sessie vir 'n rukkie oopgemaak, as op daardie oomblik 'n UDP-versoek gestuur is (byvoorbeeld: netcat XX.1XX.1X4.2XX 4398 -u), dan het die versoek na die tuisroeteerder gekom, wat was bevestig deur TCPDump wat daarop loop, maar die versoek het nie die rekenaar bereik nie - IPtables as 'n NAT-vertaler op die router het dit laat val.
Begin 'n VPN-bediener agter 'n verskaffer se NAT
Maar die feit om 'n UDP-versoek deur die verskaffer se NAT te stuur, het hoop op sukses gegee. Aangesien die router in my jurisdiksie is, het ek die probleem opgelos deur die UDP / 11111-poort na die rekenaar te herlei:

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

Ek het dus die geleentheid gekry om 'n UDP-sessie te begin en versoeke vanaf die internet vanaf enige IP-adres te ontvang. Op hierdie oomblik het ek OpenVPN-bediener geloods (nadat ek dit gekonfigureer het) terwyl ek na UDP/11111-poort luister, die eksterne IP-adres en poort (XX.1XX.1X4.2XX:4398) op die slimfoon aangedui en suksesvol van die slimfoon aan die rekenaar. Maar in hierdie implementering het 'n probleem ontstaan, dit was nodig om die UDP-sessie op een of ander manier te onderhou totdat die OpenVPN-kliënt aan die bediener gekoppel is, ek het nie gehou van die opsie om die STUN-kliënt periodiek te begin nie - ek wou nie STUN-bedieners laai nie verniet.
Het ook die aandag gevestig op die inskrywing "sal haarspeld - daar sal 'n haarnaald wees", hierdie modus

Haarspeld laat een masjien op 'n plaaslike netwerk agter NAT toegang tot 'n ander masjien op dieselfde netwerk by die router se eksterne adres.

Begin 'n VPN-bediener agter 'n verskaffer se NAT
Gevolglik het ek die probleem opgelos om 'n UDP-sessie te onderhou eenvoudig - ek het die kliënt op dieselfde rekenaar met die bediener geloods.
Dit het so gewerk:

  • STUN-kliënt met plaaslike poort 11111 bekendgestel
  • antwoord ontvang met eksterne IP-adres en poort XX.1XX.1X4.2XX:4398
  • het data gestuur met 'n eksterne IP-adres en poort na die pos (enige ander diens is moontlik) wat op die slimfoon gekonfigureer is
  • het 'n OpenVPN-bediener op 'n rekenaar geloods wat op UDP/11111-poort luister
  • het 'n OpenVPN-kliënt op 'n rekenaar bekendgestel wat XX.1XX.1X4.2XX:4398 spesifiseer om aan te sluit
  • te eniger tyd die OpenVPN-kliënt op die slimfoon bekendgestel, met die spesifiseer van die IP-adres en poort (in my geval het die IP-adres nie verander nie) om aan te sluit

Begin 'n VPN-bediener agter 'n verskaffer se NAT
Ek het dus die geleentheid gekry om vanaf 'n slimfoon aan my rekenaar te koppel. Met hierdie implementering kan u enige OpenVPN-kliënt koppel.

Praktyk

Dit sal neem:

# apt install openvpn stun-client sendemail

Nadat ons 'n paar skrifte, 'n paar konfigurasielêers geskryf het, en die nodige sertifikate gegenereer het (aangesien die kliënt op die slimfoon net met sertifikate werk), het ons die gewone implementering van die OpenVPN-bediener gekry.

Hoofskrif op rekenaar

# 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-pos stuur skrip:

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

Bediener konfigurasie lêer:

# 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

Kliënt konfigurasie lêer:

# 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

Sertifikate is gegenereer volgens Hierdie artikel.
Begin die skrip:

# ./vpn11.sh

Maak dit eers uitvoerbaar

# chmod +x vpn11.sh

Aan die slimfoonkant

Deur die toepassing te installeer Maak VPN vir Android oop, deur die konfigurasielêer, sertifikate te kopieer en dit op te stel, het dit soos volg uitgedraai:
Gaan e-pos op my slimfoon naBegin 'n VPN-bediener agter 'n verskaffer se NAT
Ek wysig die poortnommer in die instellingsBegin 'n VPN-bediener agter 'n verskaffer se NAT
Ek begin die kliënt en verbindBegin 'n VPN-bediener agter 'n verskaffer se NAT

In die proses om die artikel te skryf, het ek die konfigurasie van die rekenaar na die Raspberry Pi 3 oorgedra en probeer om die hele ding op 'n LTE-modem te laat loop, maar dit het nie gewerk nie! opdrag resultaat

# stun stun.ekiga.net -p 11111

STUN kliënt weergawe 0.97
Primêr: Onafhanklike kartering, poortafhanklike filter, ewekansige poort, sal haarspeld
terugkeer waarde is 0x000006

waarde Poortafhanklike filter verhoed dat die stelsel begin.
Maar die tuisverskaffer het die stelsel sonder enige probleme op die Raspberry Pi 3 laat loop.
In samewerking met 'n webkamera, met VLC vir
skep 'n RTSP-stroom vanaf 'n webkamera

$ 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

en VLC op 'n slimfoon vir besigtiging (stroom rtsp://10.2.0.1:8554/), dit blyk nie 'n slegte videobewakingstelsel op 'n afstand nie, jy kan ook Samba opstel, verkeer deur VPN stuur, 'n rekenaar op afstand beheer en baie meer ...

Output

Soos die praktyk getoon het, om 'n VPN-bediener te organiseer, kan jy klaarkom sonder 'n eksterne IP-adres waarvoor jy moet betaal, sowel as vir 'n gehuurde VPS / VDS. Maar dit hang alles af van die verskaffer. Natuurlik wou ek meer inligting kry oor die verskillende verskaffers en tipes NAT's wat gebruik word, maar dit is net die begin ...
Skep 'n nuwe weergawe!

Bron: will.com

Voeg 'n opmerking