VPN-serveri käivitamine Interneti-teenuse pakkuja NAT’i taga

Artikkel sellest, kuidas ma suutisin käivitada VPN-serveri NAT'i taga kodu pakkuja (ilma avaliku IP-aadressita). Juhin kohe tähelepanu: käesoleva lahenduse töökindlus sõltub otseselt teie pakkuja kasutatavast NAT tüübist ja ka ruuterist.
Seega tekkis mul vajadus ühendada oma Android-smartfon koduarvutiga, kusjuures mõlemad seadmed on ühendatud internetti läbi pakkuja NAT'ide, pluss arvuti on ühendatud kodu ruuteri kaudu, mis samuti NAT'ib ühendusi.
Klassikalist skeemi, kus kasutatakse renditud VPS/VDS-i koos avaliku IP-aadressiga, ja samas ka avaliku IP-aadressi rentimine pakkujalt, ei kaalutud mitmel põhjusel.
Arvestades eelnevaid artiklite kogemusi, tehes mitu katset STUNide ja pakkujate NAT’idega. Otsustasin väikese eksperimendi teha, käivitades käsku kodu ruuteris, mis töötab OpenWRT firmware'iga:

$ stun stun.sipnet.ru

sain tulemuse:

STUN kliendi versioon 0.97
Peamine: Iseseisev kaardistamine, iseseisev filter, juhuslik port, jätkab ühendust
Tagastatud väärtus on 0x000002

Sõnaline tõlge:
Iseseisev kaardistamine — iseseisev kaardistamine
Iseseisev filter — iseseisev filter
juhuslik port — juhuslik port
jätkab ühendust — toimub ümberjuhtimine
Tehesin sarnase käsu oma arvutis, sain:

STUN kliendi versioon 0.97
Põhi: Iseseisev kaardistus, pordist sõltuv filter, juhuslik port, juuksepin
Tagastatud väärtus on 0x000006

Pordist sõltuv filter
Käskude väljundi tulemuste erinevus näitas, et kodune ruuter andis oma panuse pakettide edastamise protsessis; seda väljendas see, et arvuti käsu täitmisel:

stun stun.sipnet.ru -p 11111 -v

sain tulemuse:


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

sel hetkel avanes hetkeks UDP-seanss; kui sel hetkel saata UDP-päring (näiteks: netcat XX.1XX.1X4.2XX 4398 -u), siis päring jõudis kodusele ruuterile, mida kinnitas TCPDump, mis seal töötas, kuid päring ei jõudnud arvutini — IPtables ruuteri NAT-tõlgina jättis selle kõrvale.
VPN-serveri käivitamine teenusepakkuja NAT-i taga
Kuid isegi UDP-päringu läbimine teenusepakkuja NAT-i kaudu andis lootust edule. Kuna ruuter on minu jurisdiktsioonis, lahendasin probleemi UDP/11111 pordi suunamisega arvutisse:

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

Sellega sain võimaluse alustada UDP-seanssi ja vastu võtta päringuid Internetist igast IP-aadressist. Sel ajal käivitasin OpenVPN-serveri (enne seadistamist), kuuldes UDP/11111 porti, märkisin oma nutitelefonis välise IP-aadressi ja porti (XX.1XX.1X4.2XX:4398) ning ühendasin edukalt nutitelefonist arvutiga. Kuid selle teostuse juures tekkis probleem, et kuidagi tuli toetada UDP-seanssi kuni OpenVPN-kliendi ühendamiseni serveriga, perioodilise STUN-kliendi käivitamise variant ei meeldinud mulle — ei tahtnud STUN-servereid asjata koormata.
Vaatasin ka tähelepanelikult üleskirjutust «jätkab ühendust — toimub ümberjuhtimine«, see režiim

Hairpinning võimaldab ühel seadmel lokaalses võrgus NAT-i kaudu pääseda teisele seadmele samas võrgus välise marsruuteri aadressi kaudu.

VPN-serveri käivitamine teenusepakkuja NAT-i taga
Lõpuks lahendasin UDP-seanssi toetamise probleem lihtsalt — käivitasin kliendi samal arvutil serveriga.
See toimis järgmiselt:

  • käivitasin STUN-kliendi lokaalse portiga 11111
  • sain vastuse välise IP-aadressiga ja portiga XX.1XX.1X4.2XX:4398
  • saatsin andmed välise IP-aadressi ja portiga emailile (võimalik on kasutada ka mõnda muud teenust), mis oli seadistatud nutitelefoni
  • käivitasin OpenVPN serveri arvutis, mis kuulab UDP/11111 porti
  • käivitasin OpenVPN kliendi arvutis, määrates XX.1XX.1X4.2XX:4398 ühendamiseks
  • igast ajast käivitasin OpenVPN kliendi nutitelefonis, määrates IP aadressi ja porti (minu puhul IP aadress ei muutunud) ühendamiseks

VPN-serveri käivitamine teenusepakkuja NAT-i taga
Nii sain võimaluse ühendada oma arvuti nutitelefoniga. See lahendus võimaldab ühendada mis tahes OpenVPN kliendi.

Praktika

Vajalikud asjad:

# apt install openvpn stun-client sendemail

Kirjutades paar skripti, paar konfiguratsioonifaili ja genereerides vajalikud sertifikaadid (sest nutitelefonis töötav klient töötab ainult sertifikaatidega) sain tavalise OpenVPN serveri rakenduse.

Peamine skript arvutis

# 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

Skript andmete saatmiseks e-postile:

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

Serveri konfiguratsioonifail:

# 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

Kliendi konfiguratsioonifail:

# 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

Sertifikaatide genereerimine toimus selles artiklis.
Skripti käivitamine:

# ./vpn11.sh

Eelnevalt tehes selle käivitatavaks

# chmod +x vpn11.sh

Nutitelefoni poolest

Paigaldades rakenduse OpenVPN Androidile, kopeerides konfiguratsioonifailid, sertifikaadid ja seadistades selle, sai selline tulemus:
Kontrollin e-kirju nutitelefonisVPN-serveri käivitamine teenusepakkuja NAT-i taga
Muudan sadama numbrit seadetesVPN-serveri käivitamine teenusepakkuja NAT-i taga
Käivitan kliendi ja ühendunVPN-serveri käivitamine teenusepakkuja NAT-i taga

Artikli kirjutamise ajal kandsin konfiguratsiooni arvutist Raspberry Pi 3 peale ja proovisin kõik see LTE modemiga käivitada, kuid ei saanud hakkama! Komandi tulemus

# stun stun.ekiga.net -p 11111

STUN kliendi versioon 0.97
Põhi: Iseseisev kaardistus, pordist sõltuv filter, juhuslik port, juuksepin
Tagastatud väärtus on 0x000006

väärtus Port Sõltuv Filter ei lubanud süsteemil töötada.
Kuid kodune teenusepakkuja lasi süsteemil Raspberry Pi 3 peal probleemideta töötada.
Koos veebikaameraga, VLC-ga
RTSP voogude loomine veebikaamerast

$ 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

ja VLC nutitelefoni kaudu vaatamiseks (voog rtsp://10.2.0.1:8554/), olen saanud korraliku kaugsalvestuse süsteemi, samuti saab üles tõsta Samba, suunata liiklust VPNi kaudu, hallata arvutit kaugelt ja veel palju muud…

Kokkuvõte

Kuidas praktika on näidanud, on VPN-serveri korraldamiseks võimalik ka ilma välise IP-aadressita, mille eest tuleb maksta, samuti nagu üüritava eest. VPS/VDS. Kuid kõik sõltub teenusepakkujast. Muidugi tahaksin saada rohkem teavet erinevate teenusepakkujate ja kasutatavate NAT-tüüpide kohta, kuid see on alles algus…
Aitäh tähelepanu eest!

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster