Starta en VPN-server bakom leverantörens NAT

En artikel om hur jag lyckades starta VPN-servern bakom min hemleverantörs NAT (utan en offentlig IP-adress). Låt mig genast nämna att funktionaliteten hos denna implementation beror direkt på typ av NAT som din leverantör använder samt routern.
Så, jag behövde ansluta från min Android-smartphone till min hem-PC, båda enheterna är anslutna till Internet via leverantörens NAT, dessutom är datorn ansluten genom en hem-router, som också NAT:ade anslutningarna.
Den klassiska schemat med en hyrd VPS/VDS med en offentlig IP-adress och att hyra en offentlig IP-adress från leverantören övervägdes inte av flera skäl.
Med hänsyn till erfarenheterna från tidigare artiklar, efter att ha genomfört några experiment med STUN och leverantörens NAT. Jag bestämde mig för ett litet experiment och körde kommandot på min hem-router som kör OpenWRT:

$ stun stun.sipnet.ru

fick följande resultat:

STUN-klientversion 0.97
Primär: Oberoende mappning, oberoende filter, random port, kommer att hairpin
Returvärdet är 0x000002

Bokstavlig översättning:
Oberoende mappning — oberoende mappning
Oberoende filter — oberoende filter
random port — slumpmässig port
kommer att hairpin — kommer att hairpina
Genom att köra ett liknande kommando på min PC fick jag:

STUN-klientversion 0.97
Primär: Oberoende mappning, portberoende filter, random port, kommer att hairpin
Returvärdet är 0x000006

Portberoende filter — portberoende filter
Skillnaden i resultaten av kommandona visade att den hem-router bidrog till processen med översättning av paket från Internet, vilket visade sig när jag körde kommandot på datorn:

stun stun.sipnet.ru -p 11111 -v

jag fick resultatet:

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

vid detta tillfälle öppnades en UDP-session under en kort stund, om jag skickade en UDP-förfrågan (exempel: netcat XX.1XX.1X4.2XX 4398 -u), kom förfrågan till den hemroutern, vilket bekräftades av TCPDump som kördes på den, men förfrågan nådde inte datorn — IPtables som NAT-översättare på routern droppade den.
Start av VPN-server bakom leverantörens NAT
Men själva faktumet att UDP-förfrågan passerade genom leverantörens NAT gav hopp om framgång. Eftersom routern är under min jurisdiktion, löste jag problemet genom att vidarebefordra UDP/11111-porten till datorn:

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

Därmed fick jag möjlighet att initiera en UDP-session och ta emot förfrågningar från internet med vilken IP-adress som helst. Vid den tiden startade jag OpenVPN-servern (efter att ha konfigurerat den) och lyssnade på UDP/11111-porten, angav den externa IP-adressen och porten (XX.1XX.1X4.2XX:4398) på min smartphone och lyckades ansluta från smartphones till datorn. Men i denna implementation uppstod ett problem, jag behövde på något sätt upprätthålla UDP-sessionen tills OpenVPN-klienten kopplades till servern; jag gillade inte alternativet att periodiskt starta STUN-klienten - jag ville inte belasta STUN-servrarna i onödan.
Jag märkte också anteckningen "kommer att hairpin — kommer att hairpina"; detta läge

Hairpinning gör det möjligt för en dator i det lokala nätverket bakom NAT att komma åt en annan dator i samma nätverk via routerns externa adress.

Start av VPN-server bakom leverantörens NAT
Till slut löste jag problemet med att upprätthålla UDP-sessionen enkelt – jag startade klienten på samma dator som servern.
Det fungerade så här:

  • jag startade STUN-klienten med lokal port 11111
  • jag fick svar med extern IP-adress och port XX.1XX.1X4.2XX:4398
  • jag skickade data med extern IP-adress och port till e-post (vilken annan tjänst är också möjlig), inställd på smartphones
  • jag startade OpenVPN-servern på datorn som lyssnade på UDP/11111-porten
  • jag startade OpenVPN-klienten på datorn och angav XX.1XX.1X4.2XX:4398 för anslutning
  • Jag kunde när som helst starta OpenVPN-klienten på smartphones med att ange IP-adressen och porten (i mitt fall ändrades inte IP-adressen) för anslutning

Start av VPN-server bakom leverantörens NAT
På så sätt fick jag möjlighet att ansluta till min dator från smartphones. Denna implementation tillåter att ansluta vilken OpenVPN-klient som helst.

Praxis

Jag behöver:

# apt install openvpn stun-client sendemail

Efter att ha skrivit några skript, några konfigurationsfiler, och genererat nödvändiga certifikat (eftersom klienten på smartphones endast fungerar med certifikat), fick jag en standardimplementation av OpenVPN-servern.

Huvudskriptet på datorn

# 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 för att skicka data till 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"

Konfigurationsfilen för servern:

# 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

Konfigurationsfilen för 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

Certifikatgenereringen utfördes enligt denna artikel.
Kör skriptet:

# ./vpn11.sh

Efter att ha gjort det körbart

# chmod +x vpn11.sh

På sidan av smarttelefonen

Installera appen OpenVPN för Android, genom att kopiera konfigurationsfilen, certifikaten och ställa in det, blev det så här:
På smarttelefonen kollar jag mejlenStart av VPN-server bakom leverantörens NAT
Jag ändrar portnumret i inställningarnaStart av VPN-server bakom leverantörens NAT
Jag startar klienten och ansluterStart av VPN-server bakom leverantörens NAT

Under skrivandet av artikeln flyttade jag konfigurationen från datorn till Raspberry Pi 3 och försökte köra allt detta på en LTE-modem, men det fungerade inte! Resultatet av kommandot

# stun stun.ekiga.net -p 11111

STUN-klientversion 0.97
Primär: Oberoende mappning, portberoende filter, random port, kommer att hairpin
Returvärdet är 0x000006

värdet Portberoende filter gjorde att systemet inte kunde starta.
Men hemleverantören gav problemfritt systemet möjlighet att starta på Raspberry Pi 3.
I koppling med webbkameran, med VLC för
att skapa en RTSP-ström från webbkameran

$ 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

och VLC på smarttelefonen för att titta (ström rtsp://10.2.0.1:8554/), blev det ett bra övervakningssystem på distans, samt att man kan sätta upp Samba, routa trafik genom VPN, fjärrstyra datorn och mycket mer…

Utdata

Som praktiken visade, kan man organisera en VPN-server utan att behöva en extern IP-adress som man måste betala för, precis som för en hyra. VPS/VDS. Men allt beror på leverantören. Jag skulle gärna vilja få mer information om olika leverantörer och typer av använda NAT:er, men detta är bara början…
Tack för uppmärksamheten!

Källa: habr.com

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster