VPN-serveri käivitamine pakkuja NAT'i taga

Artikkel sellest, kuidas ma suutsin käivitada VPN-serveri kodus oleva teenusepakkuja NATi kaudu (ilma avaliku IP-aadressita). Jätkan kohe: et antud rakenduse töökindlus sõltub otseselt teie teenusepakkuja kasutatavast NAT tüübist ning ka ruuterist.
Nii et mul tekkis vajadus ühenduda oma Android-smartfonist koduarvutiga, kus mõlemad seadmed on Internetti ühendatud teenusepakkuja NATide kaudu, lisaks on arvuti ühendatud koduse ruuteriga, mis ka NATib ühendusi.
Klassikaline skeem, kus kasutatakse rentimist VPS/VDS avaliku IP-aadressiga, samuti rentimine avaliku IP-aadressi teenusepakkujalt, ei tulnud mitmetel põhjustel kõne alla.
Arvestades eelnevate artiklite kogemuste, tegin mitu katset STUNide ja teenusepakkujate NATidega. Tegin väikese eksperimendi, sooritades käsu oma koduse ruuteri peal, mis töötab OpenWRT püsivaraga:

$ stun stun.sipnet.ru

sain tulemuseks:

Avatud port 21234 fd-ga 3
Primary: Independent Mapping, Independent Filter, random port, will hairpin
Tagasiuline väärtus on 0x000002

Sõna-sõnalt tõlge:
Independent Mapping — sõltumatu kaardistamine
Independent Filter — sõltumatu filter
random port — juhuslik port
will hairpin — tuleb pinnale
Tegemisel samasugust käsku oma PC-l, sain:

Avatud port 21234 fd-ga 3
Tagastatav väärtus on 0x000006
Tagasiuline väärtus on 0x000006

Port Dependent Filter — pordi sõltuv filter
Käskude väljundi tulemustes esinev erinevus andis mõista, et kodune ruuter andis „oma panuse“ pakettide edastamise protsessis, see väljendus selles, et arvutis käsu sooritamisel:

stun stun.sipnet.ru -p 11111 -v

sain tulemuseks:


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

sel hetkel avanes UDP-seanss ajaks, kui sellel hetkel saata UDP-päring (näiteks: netcat XX.1XX.1X4.2XX 4398 -u), siis päring jõudis kodusesse ruuteri, mida kinnitas TCPDump, mis oli sellel käimas, kuid päring ei jõudnud arvutini — IPtables NAT-muundajana ruuteris viskas selle tagasi.
VPN-serveri käivitamine pakkuja NAT-i taga
Kuid fakt, et UDP päring läbis teenusepakkuja NATi, andis lootust edule. Kuna ruuter kuulub minu jurisdiktsiooni, 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

Nii sain võimaluse algatada UDP-seansi ja saada Internetist päringuid mis tahes IP-aadressilt. Selle hetke jooksul käivitasin OpenVPN-serveri (eelnevalt konfigureeritud), kuulates UDP/11111 porti, märkisin nutitelefonis välise IP-aadressi ja porti (XX.1XX.1X4.2XX:4398) ning ühendasin eduka ühenduse nutitelefoniga arvutisse. Kuid antud rakenduses tekkis probleem, pidin leidma viisi, kuidas hoida UDP-seanssi OpenVPN-klient serveriga ühendamise hetkeks; mulle ei meeldinud variant STUN-klienti perioodiliselt käivitada — ei tahtnud STUN-servereid tarbetult koormata.
Samuti pöörasin tähelepanu kirjele „will hairpin — tuleb pinnale«, see režiim

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

VPN-serveri käivitamine pakkuja NAT-i taga
Lõpuks lahendasin UDP-seansi hoidmise probleemi lihtsalt — käivitasin kliendi samal arvutis, kus oli server.
See toimis järgmiselt:

  • käivitasin STUN-klienti kohaliku portiga 11111
  • sain vastuse välise IP-aadressiga ja sadamaga XX.1XX.1X4.2XX:4398
  • saatsin andmed välise IP-aadressi ja sadamaga meili (võib kasutada mistahes muud teenust), mille seadistasin nutitelefonis
  • käivitasin OpenVPN-serveri arvutis, kuulates UDP/11111 porti
  • käivitasin OpenVPN-kliendi arvutis, märkides XX.1XX.1X4.2XX:4398 ühendamiseks
  • igalt poolt käivitasin OpenVPN-kliendi nutitelefonis, märkides IP-aadress ja port (minu puhul IP-aadress ei muutunud) ühendamiseks

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

Praktika

Vajalikud materjalid:

# apt install openvpn stun-client sendemail

Kirjutasin paar skripti, paar konfigureerimisfaili ja genereerisin vajalikud sertifikaadid (kuna nutitelefonil töötav klient kasutab ainult sertifikaate), 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

Andmete saatmise skript meili peale:

# 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 konfigureerimisfail:

# 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 konfigureerimisfail:

# 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

Enne selle täitvaks muutmist

# chmod +x vpn11.sh

Nutitelefoni poolel

Rakenduse installimisel OpenVPN Androidile, kopeerides konfifaili, sertifikaadid ja seadistades selle, sai nii:
Kontrollin nutitelefonis postiVPN-serveri käivitamine pakkuja NAT-i taga
Kohanen numbriga seadetesseVPN-serveri käivitamine pakkuja NAT-i taga
Käivitame kliendi ja ühendumeVPN-serveri käivitamine pakkuja NAT-i taga

Artikli kirjutamise protsessi jooksul edastasin konfi arvutist Raspberry Pi 3-le ja proovisin selle kõike LTE-mooduli peal käivitada, aga see ei õnnestunud! Käskluse tulemus

# stun stun.ekiga.net -p 11111

Avatud port 21234 fd-ga 3
Tagastatav väärtus on 0x000006
Tagasiuline väärtus on 0x000006

väärtuse Porti sõltuv filter ei lubanud süsteemil käivituda.
Kuid kodune teenusepakkuja võimaldas süsteemil probleemideta Raspberry Pi 3-l käivituda.
Koos veebikaameraga, VLC-ga
RTSP voogude loomiseks 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 nutitelefonis vaatamiseks (voog rtsp://10.2.0.1:8554/), sai korralik kaugvaatamise videovalve süsteem, samuti saab tõsta Samba, marsruutida liiklust VPN-i kaudu, kaugtöötada arvutiga ja palju muud…

Kokkuvõte

Praktika näitas, et VPN-serveri loomine võib toimuda ka ilma välise IP-aadressita, mille eest tuleb maksta, samuti nagu renditud TP jaoks VPS/VDS. Kuid kõik sõltub teenusepakkujast. Loomulikult oleks tore 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 hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster