Start af en VPN-server bag en udbyders NAT

En artikel om, hvordan det lykkedes mig at køre en VPN-server bag NAT fra en hjemmeudbyder (uden en hvid IP-adresse). Lad mig fortælle dig med det samme: ydelsen af ​​denne implementering afhænger direkte af typen af ​​NAT, der bruges af din udbyder, såvel som routeren.
Så jeg havde et behov for at oprette forbindelse fra min Android-smartphone til min hjemmecomputer, begge enheder er forbundet til internettet via udbyderens NAT'er, plus at computeren er forbundet via en hjemmerouter, som også er NAT-forbindelser.
Den klassiske ordning med en leaset VPS/VDS med hvid IP-adresse, samt leje af en hvid IP-adresse hos udbyderen, blev ikke overvejet af flere grunde.
Tage med i overvejelse erfaringer med tidligere artikler, efter at have brugt flere eksperimenter med STUN'er og NAT'er fra udbydere. Jeg besluttede mig for et lille eksperiment ved at udføre kommandoen på en hjemmerouter, der kører OpenWRT-firmware:

$ stun stun.sipnet.ru

fik resultatet:

STUN-klientversion 0.97
Primær: Uafhængig kortlægning, uafhængigt filter, tilfældig port, vil hårnåle
returværdi er 0x000002

Ordret oversættelse:
Uafhængig kortlægning - uafhængig visning
Uafhængigt filter - uafhængigt filter
random port - random port
vil hårnål - der vil være en hårnål
Efter at have kørt en lignende kommando på min pc, fik jeg:

STUN-klientversion 0.97
Primær: Uafhængig kortlægning, portafhængigt filter, tilfældig port, vil hårnåle
returværdi er 0x000006

Portafhængigt filter - portafhængigt filter
Forskellen i resultaterne af outputtet af kommandoerne indikerede, at hjemmerouteren ydede "sit bidrag" til processen med at udsende pakker fra internettet, dette blev manifesteret i det faktum, at når kommandoen blev udført på computeren:

stun stun.sipnet.ru -p 11111 -v

jeg fik resultatet:

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

i det øjeblik blev en UDP-session åbnet i et stykke tid, hvis der i det øjeblik blev sendt en UDP-anmodning (for eksempel: netcat XX.1XX.1X4.2XX 4398 -u), så kom anmodningen til hjemmerouteren, som var bekræftet af TCPDump, der kører på den, men anmodningen nåede ikke computeren - IPtables som NAT-oversætter på routeren droppede den.
Start af en VPN-server bag en udbyders NAT
Men selve det faktum at sende en UDP-anmodning gennem udbyderens NAT gav håb om succes. Da routeren er i min jurisdiktion, 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

Jeg fik således mulighed for at starte en UDP-session og modtage anmodninger fra internettet fra enhver IP-adresse. I dette øjeblik lancerede jeg OpenVPN-serveren (efter at have konfigureret den) og lyttede til UDP/11111-porten, indikerede den eksterne IP-adresse og porten (XX.1XX.1X4.2XX:4398) på smartphonen og tilsluttede med succes fra smartphonen til computer. Men i denne implementering opstod der et problem, det var nødvendigt at vedligeholde UDP-sessionen på en eller anden måde, indtil OpenVPN-klienten var forbundet til serveren, jeg kunne ikke lide muligheden for periodisk at starte STUN-klienten - jeg ønskede ikke at indlæse STUN-servere forgæves.
gjorde også opmærksom på indlægget "vil hårnål - der vil være en hårnål", denne tilstand

Hårnåle gør det muligt for en maskine på et lokalt netværk bag NAT at få adgang til en anden maskine på det samme netværk på routerens eksterne adresse.

Start af en VPN-server bag en udbyders NAT
Som et resultat løste jeg problemet med at opretholde en UDP-session simpelthen - jeg startede klienten på den samme computer med serveren.
Det virkede sådan her:

  • lanceret STUN-klient med lokal port 11111
  • modtaget svar med ekstern IP-adresse og port XX.1XX.1X4.2XX:4398
  • sendte data med en ekstern IP-adresse og port til mailen (enhver anden tjeneste er mulig) konfigureret på smartphonen
  • lancerede en OpenVPN-server på en computer, der lytter på UDP/11111-porten
  • lancerede en OpenVPN-klient på en computer, der angiver XX.1XX.1X4.2XX:4398 for at forbinde
  • til enhver tid lancerede 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 en VPN-server bag en udbyders NAT
Dermed fik jeg mulighed for at forbinde til min computer fra en smartphone. Denne implementering giver dig mulighed for at forbinde enhver OpenVPN-klient.

Praksis

Du skal bruge:

# apt install openvpn stun-client sendemail

Efter at have skrevet et par scripts, et par konfigurationsfiler, genereret de nødvendige certifikater (da klienten på smartphonen kun fungerer med certifikater), fik vi den sædvanlige implementering af OpenVPN-serveren.

Hovedscript på computer

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

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

Certifikater blev genereret iflg denne artikel.
Kørsel af scriptet:

# ./vpn11.sh

Gør det eksekverbart først

# chmod +x vpn11.sh

På smartphone-siden

Ved at installere applikationen Åbn VPN til Android, kopiering af konfigurationsfilen, certifikater og konfiguration af den, blev det sådan her:
Tjekker e-mail på min smartphoneStart af en VPN-server bag en udbyders NAT
Jeg redigerer portnummeret i indstillingerneStart af en VPN-server bag en udbyders NAT
Jeg starter klienten og forbinderStart af en VPN-server bag en udbyders NAT

I processen med at skrive artiklen overførte jeg konfigurationen fra computeren til Raspberry Pi 3 og forsøgte at køre det hele på et LTE-modem, men det virkede ikke! kommando resultat

# stun stun.ekiga.net -p 11111

STUN-klientversion 0.97
Primær: Uafhængig kortlægning, portafhængigt filter, tilfældig port, vil hårnåle
returværdi er 0x000006

значение Portafhængigt filter forhindrede systemet i at starte.
Men hjemmeudbyderen lod systemet køre på Raspberry Pi 3 uden problemer.
I forbindelse med et webcam, med VLC til
oprettelse af en RTSP-stream fra et webcam

$ 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 smartphone til visning (stream rtsp://10.2.0.1:8554/), viste det sig ikke at være et dårligt videoovervågningssystem på afstand, du kan også opsætte Samba, dirigere trafik gennem VPN, fjernstyre en computer og meget mere ...

Output

Som praksis har vist, for at organisere en VPN-server, kan du undvære en ekstern IP-adresse, som du skal betale for, såvel som for en lejet VPS / VDS. Men det hele afhænger af udbyderen. Selvfølgelig ønskede jeg at få mere information om de forskellige udbydere og typer af NAT'er, der bruges, men dette er kun begyndelsen ...
Tak for din opmærksomhed!

Kilde: www.habr.com

Tilføj en kommentar