Starten eines VPN-Servers hinter dem Provider NAT

In diesem Artikel geht es darum, wie ich es geschafft habe, den VPN-Server hinter dem NAT des Heimanbieters zu starten (ohne eine weiße IP-Adresse). Ich werde sofort eine Reservierung vornehmen: Die Leistung dieser Implementierung hängt direkt vom NAT-Typ Ihres Providers sowie vom Router ab .
Ich musste also eine Verbindung von meinem Android-Smartphone zu meinem Heimcomputer herstellen. Beide Geräte sind über Provider-NATs mit dem Internet verbunden, und der Computer ist über einen Heimrouter verbunden, der auch über NAT-Verbindungen verfügt.
Das klassische Schema der Nutzung eines gemieteten VPS / VDS mit einer weißen IP-Adresse sowie die Anmietung einer weißen IP-Adresse vom Anbieter wurde aus mehreren Gründen nicht in Betracht gezogen.
Basierend auf den Erfahrungen früherer Artikel , die mehrere Experimente mit STUNs und NAT-Anbietern durchgeführt haben. Ich entschied mich für ein kleines Experiment, indem ich den Befehl auf einem Heimrouter mit OpenWRT-Firmware ausführte:
$ stun stun.sipnet.ru 

habe das Ergebnis:
STUN Client Version 0.97
Primär: Unabhängiges Mapping, unabhängiger Filter, zufälliger Port, Haarnadelkurve
Rückgabewert ist 0x000002

Wörtliche Übersetzung:
Unabhängiges Mapping - Unabhängiges Mapping
Unabhängiger Filter - Unabhängiger Filter
zufälliger Port - zufälliger Port
wird Haarnadel - es wird eine Haarnadel sein
Nachdem ich einen ähnlichen Befehl auf meinem PC ausgeführt habe, habe ich:
STUN Client Version 0.97
Primär: Unabhängiges Mapping, Portabhängiger Filter, zufälliger Port, Haarnadelkurve
Der Rückgabewert ist 0x000006

Port Dependent Filter - Portabhängiger Filter
Der Unterschied in der Ausgabe der Befehle deutete darauf hin, dass der Heimrouter seinen Beitrag zum Senden von Paketen aus dem Internet geleistet hat. Dies äußerte sich in der Tatsache, dass der Befehl auf dem Computer ausgeführt wurde:
 stun stun.sipnet.ru -p 11111 -v 

Ich habe das Ergebnis erhalten:
...
MappedAddress = XX.1XX.1X4.2XX: 4398
...
In diesem Moment wurde eine UDP-Sitzung für eine Weile geöffnet. Wenn in diesem Moment eine UDP-Anfrage gesendet wurde (zum Beispiel: netcat XX.1XX.1X4.2XX 4398 -u), dann ging die Anfrage an den Heimrouter, die durch den darauf laufenden TCPDump bestätigt wurde, aber Die Anforderung erreichte den Computer nicht - IPtables hat sie als NAT-Übersetzer auf dem Router abgelegt.

Die Tatsache, dass eine UDP-Anfrage über ISP NAT ging, gab Hoffnung auf Erfolg. Da sich der Router in meiner Zuständigkeit befindet, habe ich das Problem behoben, indem ich den UDP / 11111-Port auf den Computer umgeleitet habe:
 iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX 
So konnte ich eine UDP-Sitzung initiieren und Anfragen aus dem Internet von jeder IP-Adresse empfangen. Zu diesem Zeitpunkt startete ich den OpenVPN-Server (nachdem ich ihn konfiguriert hatte), hörte auf den UDP / 11111-Port, gab auf dem Smartphone die externe IP-Adresse und den Port an (XX.1XX.1X4.2XX: 4398) und verband mich erfolgreich vom Smartphone mit dem Computer. Bei dieser Implementierung trat jedoch ein Problem auf. Es war irgendwie erforderlich, eine UDP-Sitzung aufrechtzuerhalten, bis der OpenVPN-Client mit dem Server verbunden war. Die Option, den STUN-Client regelmäßig zu starten, gefiel mir nicht. Ich wollte STUN-Server nicht umsonst verschwenden.
Auch machte auf den Eintrag " wird Haarnadel - es wird eine Haarnadel " aufmerksam, dieser Modus
Hairpinning ermöglicht einem Computer im lokalen Netzwerk für NAT den Zugriff auf einen anderen Computer im selben Netzwerk unter der externen Adresse des Routers.

Bild
Infolgedessen wurde das Problem der Aufrechterhaltung einer UDP-Sitzung einfach gelöst: Ich habe den Client auf demselben Computer wie den Server gestartet.
Es hat so funktioniert:
  • hat einen STUN-Client mit lokalem Port 11111 gestartet
  • Erhielt eine Antwort mit einer externen IP-Adresse und Port XX.1XX.1X4.2XX: 4398
  • Daten mit einer externen IP-Adresse und einem auf dem Smartphone konfigurierten Port an Mail gesendet (jeder andere Dienst ist möglich)
  • hat den OpenVPN-Server auf einem Computer mit UDP / 11111-Portüberwachung gestartet
  • Starten Sie den OpenVPN-Client auf dem Computer mit der Angabe XX.1XX.1X4.2XX: 4398, um eine Verbindung herzustellen
  • Ich habe jederzeit den OpenVPN-Client auf dem Smartphone mit der IP-Adresse und dem Port gestartet (in meinem Fall hat sich die IP-Adresse nicht geändert), um eine Verbindung herzustellen


So hatte ich die Möglichkeit, von einem Smartphone aus eine Verbindung zu meinem Computer herzustellen. Mit dieser Implementierung können Sie einen beliebigen OpenVPN-Client verbinden.

Übe


Sie benötigen:
 # apt install openvpn stun-client sendemail 

Nach dem Schreiben einiger Skripte, einiger Konfigurationsdateien und dem Generieren der erforderlichen Zertifikate (da der Client auf dem Smartphone nur mit Zertifikaten arbeitet) wurde die übliche Implementierung des OpenVPN-Servers erhalten.

Das Hauptskript auf dem 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 

Skript zum Versenden von Daten an 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" 

Serverkonfigurationsdatei:
 # 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 

Client-Konfigurationsdatei:
 # 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 

Für diesen Artikel wurde eine Zertifikaterstellung durchgeführt.
Skript ausführen:
 # ./vpn11.sh 

Nachdem es zuvor ausführbar gemacht wurde
 # chmod +x vpn11.sh 

Auf der Seite des Smartphones


Nach der Installation der OpenVPN- Anwendung für Android , dem Kopieren der Konfigurationsdatei, der Zertifikate und dem Einrichten stellte sich Folgendes heraus:
Ich überprüfe E-Mails auf einem Smartphone

Ich korrigiere die Portnummer in den Einstellungen

Ich starte den Client und verbinde mich


Beim Schreiben des Artikels habe ich die Konfiguration vom Computer auf den Raspberry Pi 3 übertragen und versucht, das Ganze auf dem LTE-Modem auszuführen, aber es hat nicht funktioniert! Mannschaftsergebnis
 # stun stun.ekiga.net -p 11111 

STUN Client Version 0.97
Primär: Unabhängiges Mapping, Portabhängiger Filter, zufälliger Port, Haarnadelkurve
Der Rückgabewert ist 0x000006
Der Wert von Port Dependent Filter erlaubte dem System nicht, zu starten.
Der Heimanbieter ließ das Raspberry Pi 3-System jedoch problemlos starten.
In Verbindung mit einer Webcam mit VLC für
Erstellen eines RTSP-Streams von einer 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 


und VLC auf dem Smartphone für die Anzeige (RTSP-Stream: //10.2.0.1: 8554 /), stellte sich heraus, kein schlechtes Videoüberwachungssystem in der Ferne, Sie können auch Samba erhöhen und Dateien austauschen, Verkehr über VPN leiten,
Computer fernsteuern
und vieles mehr ...

Fazit


Wie die Praxis gezeigt hat, können Sie bei der Organisation eines VPN-Servers auf eine kostenpflichtige externe IP-Adresse sowie einen gemieteten VPS / VDS verzichten. Aber es kommt alles auf den Anbieter an. Natürlich wollte ich mehr über die verschiedenen Anbieter und die verwendeten NAT-Typen erfahren, aber dies ist nur der Anfang ...
Vielen Dank für Ihre Aufmerksamkeit!

Source: https://habr.com/ru/post/de482888/


All Articles