Spustenie servera VPN za NAT poskytovateľa

Článok o tom, ako sa mi podarilo spustiť VPN server za NAT môjho domáceho poskytovateľa (bez bielej IP adresy). Dovoľte mi ihneď urobiť rezerváciu: to výkon tejto implementácie priamo závisí od typu NAT, ktorý používa váš poskytovateľ, ako aj smerovač.
Potreboval som sa teda pripojiť zo svojho smartfónu s Androidom k domácemu počítaču, obe zariadenia sú pripojené k internetu cez NAT poskytovateľa, plus počítač je pripojený cez domáci router, ktorý tiež NAT pripojenie.
Klasická schéma využívajúca prenajatú VPS/VDS s bielou IP adresou, ako aj prenájom bielej IP adresy od poskytovateľa, neprichádzala do úvahy z viacerých dôvodov.
Vziať do úvahy skúsenosti z minulých článkov, ktorý vykonal niekoľko experimentov s STUN a NAT poskytovateľov. Rozhodol som sa urobiť malý experiment spustením príkazu na domácom smerovači s firmvérom OpenWRT:

$ stun stun.sipnet.ru

dostal výsledok:

Verzia klienta STUN 0.97
Primárne: Nezávislé mapovanie, nezávislý filter, náhodný port, bude vlásenka
Návratná hodnota je 0x000002

Doslovný preklad:
Independent Mapping - nezávislé mapovanie
Nezávislý filter - nezávislý filter
náhodný port - náhodný port
bude vlásenka - bude vlásenka
Spustením podobného príkazu na mojom PC som dostal:

Verzia klienta STUN 0.97
Primárne: Nezávislé mapovanie, filter závislý od portu, náhodný port, bude vlásenka
Návratná hodnota je 0x000006

Port Dependent Filter - port závislý filter
Rozdiel vo výsledkoch výstupu príkazu naznačoval, že domáci smerovač „prispieval“ k procesu prenosu paketov z internetu, čo sa prejavilo v tom, že pri vykonávaní príkazu na počítači:

stun stun.sipnet.ru -p 11111 -v

Dostal som výsledok:

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

v tomto momente bola na nejaký čas otvorená UDP relácia, ak v tomto momente pošlete UDP požiadavku (napríklad: netcat XX.1XX.1X4.2XX 4398 -u), tak požiadavka prišla na domáci router, ktorý bol potvrdil na ňom spustený TCPDump, ale požiadavka sa nedostala do počítača - IPtables ako prekladač NAT na routeri ju zahodil.
Spustenie servera VPN za NAT poskytovateľa
Ale samotná skutočnosť, že požiadavka UDP prešla cez NAT poskytovateľa, dávala nádej na úspech. Keďže sa router nachádza v mojej jurisdikcii, problém som vyriešil presmerovaním portu UDP/11111 do počítača:

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

Takto som mohol iniciovať reláciu UDP a prijímať požiadavky z internetu z akejkoľvek adresy IP. V tejto chvíli som spustil OpenVPN-server (po jeho predchádzajúcej konfigurácii), ktorý počúva port UDP/11111, uviedol externú IP adresu a port (XX.1XX.1X4.2XX:4398) na smartfóne a úspešne sa pripojil zo smartfónu k počítač. Pri tejto implementácii však nastal problém: bolo potrebné nejakým spôsobom udržiavať reláciu UDP, kým sa klient OpenVPN nepripojí k serveru; nepáčila sa mi možnosť pravidelného spúšťania klienta STUN - nechcel som plytvať záťažou servery STUN.
Všimol som si aj záznam „bude vlásenka - bude vlásenka“, tento režim

Hairpinning umožňuje jednému stroju v lokálnej sieti za NAT pristupovať k inému stroju v rovnakej sieti na externej adrese smerovača.

Spustenie servera VPN za NAT poskytovateľa
V dôsledku toho som jednoducho vyriešil problém udržiavania relácie UDP - spustil som klienta na rovnakom počítači so serverom.
Fungovalo to takto:

  • spustil klienta STUN na lokálnom porte 11111
  • dostal odpoveď s externou IP adresou a portom XX.1XX.1X4.2XX:4398
  • odosielané údaje s externou IP adresou a portom na e-mail (je možná akákoľvek iná služba) nakonfigurované v smartfóne
  • spustil server OpenVPN na počítači, ktorý počúva port UDP/11111
  • spustil klienta OpenVPN na počítači so špecifikáciou XX.1XX.1X4.2XX:4398 na pripojenie
  • kedykoľvek spustiť klienta OpenVPN na smartfóne s uvedením IP adresy a portu (v mojom prípade sa IP adresa nezmenila) na pripojenie

Spustenie servera VPN za NAT poskytovateľa
Týmto spôsobom som sa mohol pripojiť k počítaču zo svojho smartfónu. Táto implementácia vám umožňuje pripojiť akéhokoľvek klienta OpenVPN.

Prax

Budete potrebovať:

# apt install openvpn stun-client sendemail

Po napísaní niekoľkých skriptov, niekoľkých konfiguračných súborov a vygenerovaní potrebných certifikátov (keďže klient na smartfóne funguje iba s certifikátmi) sme dostali obvyklú implementáciu servera OpenVPN.

Hlavný skript v počítači

# 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 na odosielanie údajov e-mailom:

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

Konfiguračný súbor servera:

# 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

Konfiguračný súbor klienta:

# 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

Certifikáty boli vytvorené pomocou v tomto článku.
Spustenie skriptu:

# ./vpn11.sh

Tým, že ho najprv urobíte spustiteľným

# chmod +x vpn11.sh

Na strane smartfónu

Inštaláciou aplikácie OpenVPN pre Android, po skopírovaní konfiguračného súboru, certifikátov a jeho konfigurácii to dopadlo takto:
Kontrolujem si email na svojom smartfóneSpustenie servera VPN za NAT poskytovateľa
Číslo portu upravujem v nastaveniachSpustenie servera VPN za NAT poskytovateľa
Spustím klienta a pripojím saSpustenie servera VPN za NAT poskytovateľa

Pri písaní tohto článku som preniesol konfiguráciu z môjho počítača do Raspberry Pi 3 a pokúsil som sa celú vec spustiť na LTE modem, ale nefungovalo to! Výsledok príkazu

# stun stun.ekiga.net -p 11111

Verzia klienta STUN 0.97
Primárne: Nezávislé mapovanie, filter závislý od portu, náhodný port, bude vlásenka
Návratná hodnota je 0x000006

hodnota Filter závislý na porte neumožnil spustenie systému.
Domáci poskytovateľ ale bez problémov umožnil spustenie systému na Raspberry Pi 3.
V spojení s webovou kamerou, s VLC pre
vytvorenie streamu RTSP z webovej kamery

$ 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

a VLC na smartfóne na prezeranie (stream rtsp://10.2.0.1:8554/), ukázalo sa, že je to dobrý vzdialený video monitorovací systém, môžete si tiež nainštalovať Sambu, smerovať premávku cez VPN, diaľkovo ovládať počítač a mnoho ďalších viac...

Výkon

Ako ukázala prax, na organizáciu servera VPN sa môžete zaobísť bez externej adresy IP, za ktorú musíte zaplatiť, rovnako ako za prenajaté VPS/VDS. Všetko však závisí od poskytovateľa. Samozrejme, chcel som získať viac informácií o rôznych poskytovateľoch a typoch používaných NAT, ale toto je len začiatok...
Ďakujem vám za pozornosť!

Zdroj: hab.com

Pridať komentár