Pokretanje VPN poslužitelja iza davateljeva NAT-a

Članak o tome kako sam uspio pokrenuti VPN poslužitelj iza NAT-a svog kućnog pružatelja usluga (bez bijele IP adrese). Odmah da rezerviram: to izvedba ove implementacije izravno ovisi o vrsti NAT-a koju koristi vaš pružatelj, kao i usmjerivač.
Dakle, trebao sam se povezati sa svog Android pametnog telefona na kućno računalo, oba uređaja su povezana s internetom putem NAT-ova pružatelja usluga, a računalo je povezano putem kućnog usmjerivača, koji također ima NAT veze.
Klasična shema korištenja zakupljenog VPS/VDS-a s bijelom IP adresom, kao i najam bijele IP adrese od provajdera, nije razmatrana iz nekoliko razloga.
Uzeti u obzir iskustva iz prošlih članaka, nakon što je proveo nekoliko eksperimenata sa STUN-ovima i NAT-ovima pružatelja usluga. Odlučio sam napraviti mali eksperiment pokretanjem naredbe na kućnom usmjerivaču koji koristi OpenWRT firmware:

$ stun stun.sipnet.ru

dobio rezultat:

STUN klijent verzija 0.97
Primarni: Neovisno mapiranje, Neovisni filtar, nasumični priključak, ukosnica
Povratna vrijednost je 0x000002

Doslovni prijevod:
Independent Mapping - neovisno preslikavanje
Independent Filter - nezavisni filtar
random port - slučajni priključak
će ukosnica - bit će ukosnica
Pokrećući sličnu naredbu na računalu, dobio sam:

STUN klijent verzija 0.97
Primarno: neovisno mapiranje, filtar ovisan o portu, nasumični port, bit će ukosnica
Povratna vrijednost je 0x000006

Port Dependent Filter - filtar ovisan o portu
Razlika u rezultatima izlaza naredbe pokazala je da kućni usmjerivač daje "svoj doprinos" procesu prijenosa paketa s Interneta; to se očitovalo u činjenici da prilikom izvršavanja naredbe na računalu:

stun stun.sipnet.ru -p 11111 -v

Dobivao sam rezultat:

...
Mapirana adresa = XX.1XX.1X4.2XX:4398
...

u ovom trenutku, UDP sesija je bila otvorena neko vrijeme, ako u ovom trenutku pošaljete UDP zahtjev (na primjer: netcat XX.1XX.1X4.2XX 4398 -u), tada je zahtjev došao do kućnog usmjerivača, koji je potvrdio TCPDump pokrenut na njemu, ali zahtjev nije došao do računala - IPtables ga je, kao NAT prevoditelj na routeru, ispustio.
Pokretanje VPN poslužitelja iza davateljeva NAT-a
Ali sama činjenica da je UDP zahtjev prošao kroz NAT provajdera davala je nadu za uspjeh. Budući da se usmjerivač nalazi u mojoj nadležnosti, riješio sam problem preusmjeravanjem UDP/11111 porta na računalo:

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

Tako sam mogao pokrenuti UDP sesiju i primati zahtjeve s Interneta s bilo koje IP adrese. U ovom trenutku sam pokrenuo OpenVPN-poslužitelj (prethodno ga konfigurirajući) slušajući UDP/11111 port, označio vanjsku IP adresu i port (XX.1XX.1X4.2XX:4398) na pametnom telefonu i uspješno se povezao sa pametnog telefona na Računalo. Ali u ovoj implementaciji pojavio se problem: bilo je potrebno nekako održavati UDP sesiju dok se OpenVPN klijent ne poveže s poslužiteljem; nije mi se svidjela opcija povremenog pokretanja STUN klijenta - nisam želio gubiti opterećenje na STUN poslužitelja.
Također sam primijetio unos "će ukosnica - bit će ukosnica", ovaj način rada

Hairpinning omogućuje jednom stroju na lokalnoj mreži iza NAT-a pristup drugom stroju na istoj mreži na vanjskoj adresi usmjerivača.

Pokretanje VPN poslužitelja iza davateljeva NAT-a
Kao rezultat toga, jednostavno sam riješio problem održavanja UDP sesije - pokrenuo sam klijenta na istom računalu s poslužiteljem.
Radilo je ovako:

  • pokrenuo STUN klijent na lokalnom priključku 11111
  • dobio odgovor s vanjskom IP adresom i portom XX.1XX.1X4.2XX:4398
  • šalje podatke s vanjskom IP adresom i portom za e-poštu (bilo koja druga usluga je moguća) konfiguriranim na pametnom telefonu
  • pokrenuo OpenVPN poslužitelj na računalu koje sluša UDP/11111 port
  • pokrenuo OpenVPN klijent na računalu navodeći XX.1XX.1X4.2XX:4398 za povezivanje
  • u bilo kojem trenutku pokrenuo OpenVPN klijent na pametnom telefonu navodeći IP adresu i port (u mom slučaju IP adresa se nije promijenila) za povezivanje

Pokretanje VPN poslužitelja iza davateljeva NAT-a
Na ovaj sam se način uspio spojiti na svoje računalo sa svog pametnog telefona. Ova implementacija vam omogućuje povezivanje bilo kojeg OpenVPN klijenta.

Praksa

Trebat će vam:

# apt install openvpn stun-client sendemail

Nakon što smo napisali par skripti, par konfiguracijskih datoteka i generirali potrebne certifikate (pošto klijent na pametnom telefonu radi samo s certifikatima), dobili smo uobičajenu implementaciju OpenVPN servera.

Glavna skripta na računalu

# 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

Skripta za slanje podataka e-poštom:

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

Konfiguracijska datoteka poslužitelja:

# 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

Konfiguracijska datoteka klijenta:

# 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

Certifikati su generirani pomoću ovaj članak.
Pokretanje skripte:

# ./vpn11.sh

Tako što ga prvo učinite izvršnim

# chmod +x vpn11.sh

Na strani pametnog telefona

Instaliranjem aplikacije OpenVPN za Android, nakon što je kopirao konfiguracijsku datoteku, certifikate i konfigurirao je, ispalo je ovako:
Provjeravam e-poštu na pametnom telefonuPokretanje VPN poslužitelja iza davateljeva NAT-a
Uredim broj porta u postavkamaPokretanje VPN poslužitelja iza davateljeva NAT-a
Pokrenem klijent i spojim sePokretanje VPN poslužitelja iza davateljeva NAT-a

Dok sam pisao ovaj članak, prebacio sam konfiguraciju sa svog računala na Raspberry Pi 3 i pokušao pokrenuti cijelu stvar na LTE modemu, ali nije išlo! Rezultat naredbe

# stun stun.ekiga.net -p 11111

STUN klijent verzija 0.97
Primarno: neovisno mapiranje, filtar ovisan o portu, nasumični port, bit će ukosnica
Povratna vrijednost je 0x000006

vrijednost Filtar ovisan o portu nije dopustio pokretanje sustava.
No, domaći pružatelj omogućio je pokretanje sustava na Raspberry Pi 3 bez ikakvih problema.
U kombinaciji s web kamerom, s VLC za
stvaranje RTSP streama s web kamere

$ 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

i VLC na pametnom telefonu za gledanje (stream rtsp://10.2.0.1:8554/), pokazao se kao dobar daljinski sustav video nadzora, možete instalirati i Sambu, usmjeravati promet preko VPN-a, daljinski upravljati računalom i još mnogo toga više...

Izlaz

Kao što je praksa pokazala, za organiziranje VPN poslužitelja možete bez vanjske IP adrese za koju morate platiti, baš kao i za iznajmljeni VPS/VDS. Ali sve ovisi o provajderu. Naravno, želio sam dobiti više informacija o različitim pružateljima usluga i vrstama korištenih NAT-ova, ali ovo je tek početak...
Hvala vam!

Izvor: www.habr.com

Dodajte komentar