Die Fortsetzung des
Artikels darüber, wie es mir gelungen ist, einen direkten VPN-Tunnel zwischen zwei Computern zu organisieren, die sich hinter NAT-Anbietern befinden. Der letzte Artikel beschrieb den Prozess des Organisierens einer Verbindung unter Verwendung eines Dritten - eines Vermittlers (eines gemieteten VPS, der wie ein STUN-Server und ein Sender von Knotendaten für eine Verbindung fungiert). In diesem Artikel erkläre ich Ihnen, wie man ohne VPS auskommt, aber die Vermittler blieben und sie waren der STUN-Server und Yandex.Disk ...

Einleitung
Nachdem ich die Kommentare des letzten Posts gelesen hatte, stellte ich fest, dass der Hauptnachteil der Implementierung die Verwendung eines Vermittlers war - eines Drittanbieters (Third Party, VPS), der die aktuellen Parameter des Knotens angibt, wo und wie eine Verbindung hergestellt werden soll. Angesichts der Empfehlungen zur Verwendung dieser STUN (es
gibt viele von ihnen ), um die aktuellen Verbindungsparameter zu bestimmen. Zunächst habe ich beschlossen, den Inhalt von Paketen mit TCPDump zu untersuchen, als der STUN-Server mit Clients arbeitete und vollständig unlesbaren Inhalt erhielt. Beim Googeln des Protokolls wurde ein
Artikel gefunden, der das Protokoll beschreibt . Ich habe festgestellt, dass ich die Anforderung nicht selbst auf dem STUN-Server implementieren kann, und habe die Idee in das Feld "Weit" gestellt.
Theorie
Ich musste kürzlich einen STUN-Server unter Debian aus einem Paket installieren
und in den abhängigkeiten habe ich das stun-client paket gesehen, aber irgendwie hat das nichts damit zu tun. Aber später erinnerte ich mich an das Betäubungs-Client-Paket und beschloss herauszufinden, wie es funktioniert, indem ich googelte und Poindeksiv erhielt:
Als Antwort erhielt ich:
STUN Client Version 0.97
Port 21234 mit fd 3 geöffnet
Port 21235 mit fd 4 geöffnet
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 0
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 4
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 2
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Empfangene Betäubungsnachricht: 92 Bytes
MappedAddress = <Meine IP-Adresse>: 2885
SourceAddress = 216.93.246.18//478
ChangedAddress = 216.93.246.17lla479
Unbekanntes Attribut: 32800
Servername = Vovida.org 0.98-CPC
Erhaltene Nachricht vom Typ 257 id = 1
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 0
Kurz vor dem Senden der Nachricht von Len 28 an 216.93.246.17lla478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 4
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 2
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 0
Nachricht von len 28 an <My IP> senden: 2885
Empfangene Betäubungsnachricht: 28 Bytes
ChangeRequest = 0
Erhaltene Nachricht vom Typ 1 id = 11
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 0
Kurz vor dem Senden der Nachricht von Len 28 an 216.93.246.17lla478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 4
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 2
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Empfangene Betäubungsnachricht: 92 Bytes
MappedAddress = <Meine IP-Adresse>: 2885
SourceAddress = 216.93.246.17lla479
ChangedAddress = 216.93.246.18 {478
Unbekanntes Attribut: 32800
Servername = Vovida.org 0.98-CPC
Erhaltene Nachricht vom Typ 257 id = 10
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 4
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 2
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 4
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 2
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 4
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 2
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 4
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 2
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 4
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Codierung der Betäubungsnachricht:
Encoding ChangeRequest: 2
Über den Versand der Nachricht von len 28 an 216.93.246.18 opinion478
Test I = 1
Test II = 0
Test III = 0
Test I (2) = 1
ist nat = 1
zugeordnete IP gleich = 1
Haarnadel = 1
Preserver-Port = 0
Primär: Unabhängiges Mapping, Portabhängiger Filter, zufälliger Port, Haarnadelkurve
Der Rückgabewert ist 0x000006
String mit Wert
MappedAddress = <Meine IP-Adresse>: 2885
genau das, was du brauchst! Es wurde der aktuelle Status der Verbindung auf dem lokalen UDP-Port 21234 angezeigt. Dies ist jedoch nur die halbe Miete. Es stellte sich die Frage, wie diese Daten an einen Remote-Host übertragen und eine VPN-Verbindung hergestellt werden können. Verwenden Sie das Mail-Protokoll, vielleicht Telegramm?! Es gibt viele Möglichkeiten und ich habe mich für Yandex.Disk entschieden, da mir
ein Artikel über die Funktionsweise von Curl über WebDav mit Yandex.Disk begegnet ist . Nachdem ich über die Implementierung nachgedacht hatte, kam ich zu diesem Schema:
- Zu signalisieren, dass die Knoten bereit sind, eine Verbindung herzustellen, indem eine bestimmte Datei mit einem Zeitstempel auf Yandex.disk vorhanden ist;
- Wenn die Knoten bereit sind, rufen Sie die aktuellen Parameter vom STUN-Server ab.
- Laden Sie die aktuellen Parameter auf Yandex.Disk hoch.
- Überprüfen Sie die Verfügbarkeit und lesen Sie die Parameter eines Remote-Standorts aus einer Datei auf Yandex.Disk.
- Stellen Sie mit OpenVPN eine Verbindung zu einem Remote-Host her.
Übe
Nach einigem Überlegen, unter Berücksichtigung der Erfahrungen des vorherigen Artikels, schrieb ich ein schnelles Skript. Wir werden brauchen:
Eigentlich das Skript selbst:
Anfängliche Option
Um das Skript auszuführen, benötigen Sie:
- In die Zwischenablage kopieren und in den Editor einfügen, zum Beispiel:
- Geben Sie den Benutzernamen und das Passwort von Yandex.Disk an.
- Geben Sie im Feld "--ifconfig 10.45.54. (1 oder 2) 255.255.255.252" die interne IP-Adresse der Schnittstelle an
- erstelle secret.key mit dem Befehl:
- mache das Skript ausführbar:
- Führen Sie das Skript aus:
Dabei ist nZbVGBuX5dtturD die hier generierte Verbindungs-ID
Führen Sie auf dem Remote-Knoten dasselbe aus, mit Ausnahme der Generierung von secret.key und der ID-Verbindung. Diese müssen identisch sein.
Aktualisierte Version (für einen korrekten Betrieb sollte die Uhrzeit synchronisiert werden):
cat vpn10.sh
Um das Skript auszuführen, benötigen Sie:
- In die Zwischenablage kopieren und in den Editor einfügen, zum Beispiel:
- Geben Sie Login (2. Zeile) und Passwort von Yandex.Disk (3. Zeile) an.
- Geben Sie die interne IP-Adresse des Tunnels an (4. Zeile).
- mache das Skript ausführbar:
- Führen Sie das Skript aus:
Dabei ist nZbVGBuX5dtturD die hier generierte Verbindungs-ID
Gehen Sie auf dem Remote-Knoten genauso vor und geben Sie die entsprechende interne IP-Adresse des Tunnels und der ID-Verbindung an.
Um das Skript beim Start zu starten, verwende ich den Befehl "nohup / <Pfad zum Skript> /vpn10.sh nZbVGBuX5dtturD> /var/log/vpn10.log 2> / dev / null &", der in der Datei /etc/rc.local enthalten ist
Fazit
Das Skript funktioniert, getestet auf Ubuntu 18.04 und Debian 9. Sie können jeden anderen Dienst als Sender verwenden, aber aus Erfahrung habe ich Yandex.Disk verwendet.
Im Verlauf der Experimente wurde festgestellt, dass einige Arten von NAT-Anbietern keine Verbindung zulassen. Meist bei Mobilfunkbetreibern, bei denen Torrents blockiert sind.
Ich plane den Abschluss in Bezug auf:
- Die automatische Generierung von secret.key bei jedem Start, Verschlüsseln und Kopieren auf Yandex.Disk zur Übertragung auf einen Remote-Host (in der aktualisierten Version berücksichtigt)
- Automatische Zuweisung von Schnittstellen-IP-Adressen
- Datenverschlüsselung vor dem Hochladen auf Yandex.Disk
- Code-Optimierung
Möge es IPv6 in jedem Zuhause geben!