Kjører en VPN-server bak leverandørens NAT

En artikkel om hvordan jeg klarte å kjøre en VPN-server bak NAT til hjemmeleverandøren min (uten hvit IP-adresse). La meg gjøre en reservasjon med en gang: det ytelsen til denne implementeringen avhenger direkte av typen NAT som brukes av leverandøren din, samt ruteren.
Så jeg trengte å koble fra Android-smarttelefonen min til hjemmedatamaskinen min, begge enhetene er koblet til Internett via NAT-leverandører, pluss at datamaskinen er koblet til via en hjemmeruter, som også er NAT-tilkoblinger.
Den klassiske ordningen med leid VPS/VDS med hvit IP-adresse, samt leie av hvit IP-adresse fra leverandør, ble ikke vurdert av flere grunner.
Tar i betraktning erfaring fra tidligere artikler, etter å ha utført flere eksperimenter med STUN-er og NAT-er fra leverandører. Jeg bestemte meg for å gjøre et lite eksperiment ved å kjøre kommandoen på en hjemmeruter som kjører OpenWRT-fastvare:

$ stun stun.sipnet.ru

fikk resultatet:

STUN-klientversjon 0.97
Primær: Uavhengig kartlegging, Uavhengig filter, tilfeldig port, vil hårnåle
Returverdi er 0x000002

Bokstavelig oversettelse:
Uavhengig kartlegging - uavhengig kartlegging
Uavhengig filter - uavhengig filter
tilfeldig port - tilfeldig port
vil hårnål - det vil være en hårnål
Når jeg kjører en lignende kommando på PC-en min, fikk jeg:

STUN-klientversjon 0.97
Primær: Uavhengig kartlegging, portavhengig filter, tilfeldig port, vil hårnåle
Returverdi er 0x000006

Portavhengig filter - portavhengig filter
Forskjellen i resultatene av kommandoutgangen indikerte at hjemmeruteren ga "sitt bidrag" til prosessen med å overføre pakker fra Internett; dette ble manifestert i det faktum at når du utfører kommandoen på datamaskinen:

stun stun.sipnet.ru -p 11111 -v

Jeg fikk resultatet:

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

i dette øyeblikket ble en UDP-økt åpnet i noen tid, hvis du i dette øyeblikk sender en UDP-forespørsel (for eksempel: netcat XX.1XX.1X4.2XX 4398 -u), så kom forespørselen til hjemmeruteren, som var bekreftet av TCPDump som kjører på den, men forespørselen nådde ikke datamaskinen - IPtables, som en NAT-oversetter på ruteren, droppet den.
Kjører en VPN-server bak leverandørens NAT
Men selve det faktum at UDP-forespørselen gikk gjennom leverandørens NAT ga håp om suksess. Siden ruteren er plassert i min jurisdiksjon, løste jeg problemet ved å omdirigere UDP/11111-porten til datamaskinen:

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 var jeg i stand til å starte en UDP-økt og motta forespørsler fra Internett fra hvilken som helst IP-adresse. I dette øyeblikket startet jeg OpenVPN-serveren (har tidligere konfigurert den) og lyttet til UDP/11111-porten, indikerte den eksterne IP-adressen og porten (XX.1XX.1X4.2XX:4398) på smarttelefonen og koblet fra smarttelefonen til datamaskinen. Men i denne implementeringen oppsto et problem: det var nødvendig å på en eller annen måte opprettholde UDP-økten til OpenVPN-klienten koblet til serveren; jeg likte ikke muligheten til å starte STUN-klienten med jevne mellomrom - jeg ønsket ikke å kaste bort lasten på STUN-serverne.
Jeg la også merke til oppføringen "vil hårnål - det vil være en hårnål", denne modusen

Hårnåling lar én maskin på et lokalt nettverk bak en NAT få tilgang til en annen maskin på samme nettverk på ruterens eksterne adresse.

Kjører en VPN-server bak leverandørens NAT
Som et resultat løste jeg ganske enkelt problemet med å opprettholde en UDP-økt - jeg startet klienten på samme datamaskin med serveren.
Det fungerte slik:

  • lanserte STUN-klienten på lokal port 11111
  • mottok et svar med en ekstern IP-adresse og port XX.1XX.1X4.2XX:4398
  • sendte data med en ekstern IP-adresse og port til e-post (enhver annen tjeneste er mulig) konfigurert på smarttelefonen
  • lanserte OpenVPN-serveren på en datamaskin som lytter til UDP/11111-porten
  • lanserte OpenVPN-klienten på datamaskinen som spesifiserte XX.1XX.1X4.2XX:4398 for tilkobling
  • når som helst startet OpenVPN-klienten på smarttelefonen som indikerer IP-adressen og porten (i mitt tilfelle endret ikke IP-adressen seg) for å koble til

Kjører en VPN-server bak leverandørens NAT
På denne måten var jeg i stand til å koble til datamaskinen min fra smarttelefonen min. Denne implementeringen lar deg koble til en hvilken som helst OpenVPN-klient.

Praksis

Du trenger:

# apt install openvpn stun-client sendemail

Etter å ha skrevet et par skript, et par konfigurasjonsfiler og generert de nødvendige sertifikatene (siden klienten på en smarttelefon bare fungerer med sertifikater), fikk vi den vanlige implementeringen av en OpenVPN-server.

Hovedskript på datamaskinen

# 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 for å sende data via e-post:

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

Serverkonfigurasjonsfil:

# 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

Klientkonfigurasjonsfil:

# 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

Sertifikater ble generert ved hjelp av denne artikkelen.
Kjøre skriptet:

# ./vpn11.sh

Ved først å gjøre den kjørbar

# chmod +x vpn11.sh

På smarttelefonsiden

Ved å installere applikasjonen OpenVPN for Android, etter å ha kopiert konfigurasjonsfilen, sertifikater og konfigurert den, ble det slik:
Jeg sjekker e-posten min på smarttelefonen minKjører en VPN-server bak leverandørens NAT
Jeg redigerer portnummeret i innstillingeneKjører en VPN-server bak leverandørens NAT
Jeg starter klienten og kobler tilKjører en VPN-server bak leverandørens NAT

Mens jeg skrev denne artikkelen, overførte jeg konfigurasjonen fra datamaskinen til Raspberry Pi 3 og prøvde å kjøre hele greia på et LTE-modem, men det fungerte ikke! Kommando resultat

# stun stun.ekiga.net -p 11111

STUN-klientversjon 0.97
Primær: Uavhengig kartlegging, portavhengig filter, tilfeldig port, vil hårnåle
Returverdi er 0x000006

значение Portavhengig filter tillot ikke systemet å starte.
Men hjemmeleverandøren lot systemet starte på Raspberry Pi 3 uten problemer.
I forbindelse med et webkamera, med VLC for
lage en RTSP-strøm fra et webkamera

$ 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å en smarttelefon for visning (stream rtsp://10.2.0.1:8554/), viste det seg å være et godt eksternt videoovervåkingssystem, du kan også installere Samba, rute trafikk via VPN, fjernstyre datamaskinen og mye mer...

Utgang

Som praksis har vist, for å organisere en VPN-server, kan du klare deg uten en ekstern IP-adresse som du må betale for, akkurat som for en leid VPS/VDS. Men alt avhenger av leverandøren. Jeg ønsket selvfølgelig å få mer informasjon om de forskjellige leverandørene og typene NAT-er som brukes, men dette er bare begynnelsen...
Takk for din oppmerksomhet!

Kilde: www.habr.com

Legg til en kommentar