Köra en VPN-server bakom leverantörens NAT

En artikel om hur jag lyckades köra en VPN-server bakom NAT hos min hemleverantör (utan en vit IP-adress). Låt mig göra en reservation direkt: det prestandan för denna implementering beror direkt på vilken typ av NAT som används av din leverantör, såväl som routern.
Så jag behövde ansluta från min Android-smarttelefon till min hemdator, båda enheterna är anslutna till Internet via leverantörens NAT:er, plus att datorn är ansluten via en hemrouter, som också är NAT-anslutningar.
Det klassiska systemet med en hyrd VPS/VDS med vit IP-adress, samt att hyra en vit IP-adress från en leverantör, övervägdes inte av flera skäl.
Med förbehåll för erfarenhet från tidigare artiklar, efter att ha genomfört flera experiment med STUN och NAT från leverantörer. Jag bestämde mig för att göra ett litet experiment genom att köra kommandot på en hemmarouter som kör OpenWRT-firmware:

$ stun stun.sipnet.ru

fick resultatet:

STUN-klientversion 0.97
Primär: Oberoende mappning, oberoende filter, slumpmässig port, kommer att hårnåla
Returvärdet är 0x000002

Bokstavlig översättning:
Oberoende mappning - oberoende mappning
Oberoende filter - oberoende filter
slumpmässig port - slumpmässig port
kommer hårnål - det kommer att finnas en hårnål
När jag kör ett liknande kommando på min dator fick jag:

STUN-klientversion 0.97
Primär: Oberoende mappning, portberoende filter, slumpmässig port, kommer att hårnåla
Returvärdet är 0x000006

Portberoende filter - portberoende filter
Skillnaden i resultaten av kommandoutgången indikerade att hemroutern gjorde "sitt bidrag" till processen att överföra paket från Internet; detta manifesterades i det faktum att när kommandot kördes på datorn:

stun stun.sipnet.ru -p 11111 -v

Jag fick resultatet:

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

i detta ögonblick öppnades en UDP-session under en tid, om du i detta ögonblick skickar en UDP-förfrågan (till exempel: netcat XX.1XX.1X4.2XX 4398 -u), så kom begäran till hemroutern, som var bekräftat av TCPDump som kördes på den, men begäran nådde inte datorn - IPtables, som en NAT-översättare på routern, tappade den.
Köra en VPN-server bakom leverantörens NAT
Men själva det faktum att UDP-förfrågan gick igenom leverantörens NAT gav hopp om framgång. Eftersom routern ligger i min jurisdiktion löste jag problemet genom att omdirigera 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

Således kunde jag initiera en UDP-session och ta emot förfrågningar från Internet från vilken IP-adress som helst. Just nu startade jag OpenVPN-servern (har tidigare konfigurerat den) och lyssnade på UDP/11111-porten, angav den externa IP-adressen och porten (XX.1XX.1X4.2XX:4398) på smarttelefonen och lyckades ansluta från smarttelefonen till datorn. Men i den här implementeringen uppstod ett problem: det var nödvändigt att på något sätt bibehålla UDP-sessionen tills OpenVPN-klienten var ansluten till servern; jag gillade inte alternativet att regelbundet starta STUN-klienten - jag ville inte slösa bort belastningen på STUN-servrarna.
Jag lade också märke till posten "kommer hårnål - det kommer att finnas en hårnål", detta läge

Med hårnålning kan en maskin på ett lokalt nätverk bakom en NAT komma åt en annan maskin på samma nätverk på routerns externa adress.

Köra en VPN-server bakom leverantörens NAT
Som ett resultat löste jag helt enkelt problemet med att upprätthålla en UDP-session - jag startade klienten på samma dator som servern.
Det fungerade så här:

  • lanserade STUN-klienten på lokal port 11111
  • fick ett svar med en extern IP-adress och port XX.1XX.1X4.2XX:4398
  • skickade data med en extern IP-adress och port till e-post (vilken annan tjänst är möjlig) konfigurerad på smarttelefonen
  • startade OpenVPN-servern på en dator som lyssnade på UDP/11111-porten
  • startade OpenVPN-klienten på datorn som specificerade XX.1XX.1X4.2XX:4398 för anslutning
  • när som helst startade OpenVPN-klienten på smartphonen som anger IP-adressen och porten (i mitt fall ändrades inte IP-adressen) för att ansluta

Köra en VPN-server bakom leverantörens NAT
På så sätt kunde jag ansluta till min dator från min smartphone. Denna implementering låter dig ansluta vilken OpenVPN-klient som helst.

Praxis

Du behöver:

# apt install openvpn stun-client sendemail

Efter att ha skrivit ett par skript, ett par konfigurationsfiler och genererat de nödvändiga certifikaten (eftersom klienten på en smartphone bara fungerar med certifikat), fick vi den vanliga implementeringen av en OpenVPN-server.

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

Serverkonfigurationsfil:

# 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

Klientkonfigurationsfil:

# 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

Certifikat genererades med hjälp av den här artikeln.
Kör skriptet:

# ./vpn11.sh

Genom att först göra det körbart

# chmod +x vpn11.sh

På smartphonesidan

Genom att installera applikationen OpenVPN för Android, efter att ha kopierat konfigurationsfilen, certifikaten och konfigurerat den, blev det så här:
Jag kollar min e-post på min smartphoneKöra en VPN-server bakom leverantörens NAT
Jag redigerar portnumret i inställningarnaKöra en VPN-server bakom leverantörens NAT
Jag startar klienten och ansluterKöra en VPN-server bakom leverantörens NAT

När jag skrev den här artikeln överförde jag konfigurationen från min dator till Raspberry Pi 3 och försökte köra allt på ett LTE-modem, men det fungerade inte! Kommando Resultat

# stun stun.ekiga.net -p 11111

STUN-klientversion 0.97
Primär: Oberoende mappning, portberoende filter, slumpmässig port, kommer att hårnåla
Returvärdet är 0x000006

betyder Portberoende filter tillät inte systemet att starta.
Men hemleverantören lät systemet starta på Raspberry Pi 3 utan problem.
I samband med en webbkamera, med VLC för
skapa en RTSP-ström från en webbkamera

$ 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å en smartphone för visning (stream rtsp://10.2.0.1:8554/), det visade sig vara ett bra fjärrövervakningssystem för video, du kan även installera Samba, dirigera trafik via VPN, fjärrstyra din dator och mycket Mer...

Utgång

Som praxis har visat, för att organisera en VPN-server kan du klara dig utan en extern IP-adress som du behöver betala för, precis som för en hyrd VPS/VDS. Men allt beror på leverantören. Naturligtvis ville jag få mer information om de olika leverantörerna och typerna av NAT som används, men det här är bara början...
Tack för din uppmärksamhet!

Källa: will.com

Lägg en kommentar