Start af en VPN-server bag providerens NAT

Artikel om, hvordan jeg formåede at oprette forbindelse VPN-server bag NAT'en fra den hjemmeleverede internetudbyder (uden en offentlig IP-adresse). Jeg vil straks bemærke, at funktionaliteten af denne implementering afhænger direkte af den type NAT, som din udbyder bruger, samt din router.
Så opstod behovet for at oprette forbindelse fra min Android-smartphone til min hjemmecomputer, begge enheder er tilsluttet internettet via udbyderens NAT, plus computeren er tilsluttet via en hjemme-router, der også NAT'er forbindelsen.
Den klassiske ordning med brug af en lejet VPS/VDS med en offentlig IP-adresse, samt leje af offentlig IP-adresse fra udbyderen blev ikke overvejet af flere grunde.
I betragtning af erfaringerne fra tidligere artikler, udførte jeg flere eksperimenter med STUN og NAT fra udbydere. Jeg besluttede mig for et lille eksperiment og kørte kommandoen på min hjemme-router, der kører med OpenWRT firmware:

$ stun stun.sipnet.ru

fik jeg følgende resultat:

STUN client version 0.97
Primary: Uafhængig Mapping, Uafhængig Filter, tilfældig port, vil hairpin
Returværdi er 0x000002

Direkte oversættelse:
Uafhængig Mapping — uafhængig mapping
Uafhængig Filter — uafhængig filter
tilfældig port — tilfældig port
vil hairpin — vil hairpin
Da jeg kørte en tilsvarende kommando på min PC, fik jeg:

STUN client version 0.97
Primær: Uafhængig mapping, portafhængig filter, tilfældig port, vil hairpin
Returværdi er 0x000006

Port Afhængig Filter — port afhængig filter
Forskellen i resultaterne fra kommandoerne indikerede, at hjemme-routeren tilføjede 'sin del' til processen med pakkeoversættelse fra internettet, hvilket blev tydeligt, da jeg kørte kommandoen på computeren:

stun stun.sipnet.ru -p 11111 -v

fik jeg resultatet:

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

på dette tidspunkt åbnede en UDP-session i et kort øjeblik, hvis man sendte en UDP-anmodning (f.eks.: netcat XX.1XX.1X4.2XX 4398 -u), så ankom anmodningen til hjemme-routeren, som bekræftet af TCPDump, der kørte på den, men anmodningen nåede ikke computeren — IPtables som NAT-oversætter på routeren droppede den.
Start af VPN-server bag udbyderens NAT
Men selve faktum, at UDP-anmodningen passerede gennem udbyderens NAT, gav håb om succes. Da routeren er under min kontrol, løste jeg problemet ved at omdirigere UDP/11111-porten til computeren:

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

Dermed fik jeg mulighed for at initiere en UDP-session og modtage forespørgsler fra internettet fra enhver IP-adresse. På dette tidspunkt startede jeg OpenVPN-serveren (efter at have konfigureret den) og lyttede på UDP/11111 porten, angav den eksterne IP-adresse og port (XX.1XX.1X4.2XX:4398) på smartphonen og lykkedes med at oprette forbindelse fra smartphonen til computeren. Men i denne implementering opstod der et problem; jeg skulle finde en måde at opretholde UDP-sessionen på, indtil OpenVPN-klienten kunne oprette forbindelse til serveren. Jeg kunne ikke lide muligheden for periodisk at starte STUN-klienten - jeg ville ikke belaste STUN-serverne unødigt.
Jeg lagde også mærke til optagelsen "vil hairpin — vil hairpin"; denne tilstand

Hairpinning gør det muligt for én maskine i det lokale netværk bag NAT at få adgang til en anden maskine i samme netværk via routerens eksterne adresse.

Start af VPN-server bag udbyderens NAT
Som resultat løste jeg problemet med at opretholde UDP-sessionen ganske enkelt - jeg startede klienten på den samme computer som serveren.
Det fungerede sådan her:

  • jeg startede STUN-klienten med lokal port 11111
  • jeg modtog svar med den eksterne IP-adresse og port XX.1XX.1X4.2XX:4398
  • jeg sendte data med den eksterne IP-adresse og port til e-mail (andre tjenester er mulige), konfigureret på smartphonen
  • jeg startede OpenVPN-serveren på computeren, som lyttede på UDP/11111 porten
  • jeg startede OpenVPN-klienten på computeren med angivelse af XX.1XX.1X4.2XX:4398 for at oprette forbindelse
  • til enhver tid startede jeg OpenVPN-klienten på smartphonen med angivelse af IP-adressen og porten (i mit tilfælde ændrede IP-adressen sig ikke) for at oprette forbindelse

Start af VPN-server bag udbyderens NAT
Således fik jeg mulighed for at oprette forbindelse til min computer fra smartphonen. Denne implementation tillader tilslutning af enhver OpenVPN-klient.

Praktik

Du vil få brug for:

# apt install openvpn stun-client sendemail

Ved at skrive et par scripts, et par konfigurationsfiler og generere de nødvendige certifikater (da klienten på smartphonen kun fungerer med certifikater), endte jeg med en almindelig implementering af en OpenVPN-server.

Hovedscriptet på computeren

# 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

Script til at sende data til e-mail:

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

Konfigurationsfil til serveren:

# 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

Konfigurationsfil til klienten:

# 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

Generering af certifikater blev udført på denne artikel.
Kørslen af scriptet:

# ./vpn11.sh

Efter først at have gjort det eksekverbart

# chmod +x vpn11.sh

På smartphonesiden

Efter at have installeret applikationen OpenVPN til Android, kopieret konfigurationsfilen, certifikaterne og konfigureret det, fik jeg det til at se sådan ud:
På smartphone kontrollerer jeg mailenStart af VPN-server bag udbyderens NAT
Ændrer portnummeret i indstillingerneStart af VPN-server bag udbyderens NAT
Starter klienten og forbinderStart af VPN-server bag udbyderens NAT

Under skrivningen af artiklen overførte jeg konfigurationen fra computeren til Raspberry Pi 3 og forsøgte at få det til at køre på LTE-modem, men det lykkedes ikke! Resultatet af kommandoen

# stun stun.ekiga.net -p 11111

STUN client version 0.97
Primær: Uafhængig mapping, portafhængig filter, tilfældig port, vil hairpin
Returværdi er 0x000006

værdien Portafhængig filter gav ikke systemet mulighed for at starte.
Men hjemmeudbyderen gav uden problemer systemet mulighed for at starte på Raspberry Pi 3.
I forbindelse med webkameraet, med VLC til
oprettelse af RTSP-stream fra webkameraet

$ 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

og VLC på smartphone til visning (stream rtsp://10.2.0.1:8554/), blev det til et godt overvågningssystem på afstand, man kan også opsætte Samba, rute trafik gennem VPN, styre computeren fjernbetjent og meget mere…

Output

Som erfaringen har vist, kan man arrangere en VPN-server uden at betale for en offentlig IP-adresse, ligesom man også kan for en lejet VPS/VDS. Men det afhænger selvfølgelig af udbyderen. Jeg ville selvfølgelig gerne have haft mere information om forskellige udbydere og typer af anvendte NAT'er, men det er trods alt kun begyndelsen…
Tak for din opmærksomhed!

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster