La suite de l'
article sur comment j'ai réussi à organiser un tunnel VPN direct entre deux ordinateurs situés derrière des fournisseurs NAT. Le dernier article décrit le processus d'organisation d'une connexion en utilisant un tiers - un intermédiaire (un VPS loué agissant comme quelque chose comme un serveur STUN et un émetteur de données de nœud pour une connexion). Dans cet article je vais vous dire comment faire sans VPS, mais les intermédiaires sont restés et ils étaient le serveur STUN et Yandex.Disk ...

Présentation
Après avoir lu les commentaires du dernier post, j'ai réalisé que le principal inconvénient de la mise en œuvre était l'utilisation d'un intermédiaire - un tiers (VPS) qui indiquait les paramètres actuels du nœud, où et comment se connecter. Compte tenu des recommandations d'utilisation de ce STUN (il
y en a beaucoup ) pour déterminer les paramètres de connexion actuels. Tout d'abord, j'ai décidé de regarder le contenu des paquets utilisant TCPDump lorsque le serveur STUN travaillait avec des clients et recevait un contenu complètement illisible. Googler le protocole est tombé sur un
article décrivant le protocole . J'ai réalisé que je ne pouvais pas implémenter la demande au serveur STUN moi-même et j'ai mis l'idée dans la «boîte éloignée».
Théorie
J'ai récemment dû installer un serveur STUN sur Debian à partir d'un package
et dans les dépendances, j'ai vu le paquet stun-client, mais d'une manière ou d'une autre n'y attaché aucune importance. Mais plus tard, je me suis souvenu du package stun-client et j'ai décidé de comprendre comment cela fonctionne, en recherchant Google et Poindeksiv, j'ai reçu:
En réponse, j'ai reçu:
Client STUN version 0.97
Port ouvert 21234 avec fd 3
Port ouvert 21235 avec fd 4
Encodage du message d'étourdissement:
Encoding ChangeRequest: 0
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 4
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 2
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Message d'étourdissement reçu: 92 octets
MappedAddress = <Mon IP>: 2885
SourceAddress = 216.93.246.18//478
ChangedAddress = 216.93.246.17lla479
Attribut inconnu: 32800
ServerName = Vovida.org 0.98-CPC
Message reçu de type 257 id = 1
Encodage du message d'étourdissement:
Encoding ChangeRequest: 0
Sur le point d'envoyer un msg du len 28 au 216.93.246.17lla478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 4
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 2
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 0
Sur le point d'envoyer un msg de len 28 à <Mon IP>: 2885
Message d'étourdissement reçu: 28 octets
ChangeRequest = 0
Message reçu de type 1 id = 11
Encodage du message d'étourdissement:
Encoding ChangeRequest: 0
Sur le point d'envoyer un msg du len 28 au 216.93.246.17lla478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 4
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 2
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Message d'étourdissement reçu: 92 octets
MappedAddress = <Mon IP>: 2885
SourceAddress = 216.93.246.17lla479
ChangedAddress = 216.93.246.18 {478
Attribut inconnu: 32800
ServerName = Vovida.org 0.98-CPC
Message reçu de type 257 id = 10
Encodage du message d'étourdissement:
Encoding ChangeRequest: 4
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 2
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 4
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 2
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 4
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 2
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 4
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 2
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 4
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
Encodage du message d'étourdissement:
Encoding ChangeRequest: 2
Sur le point d'envoyer un msg de 28 len au 216.93.246.18 opin478
test I = 1
test II = 0
test III = 0
test I (2) = 1
est nat = 1
IP mappé identique = 1
épingle à cheveux = 1
port du conservateur = 0
Primaire: mappage indépendant, filtre dépendant du port, port aléatoire, épingle à cheveux
La valeur de retour est 0x000006
Chaîne avec valeur
MappedAddress = <Mon IP>: 2885
exactement ce dont vous avez besoin! Il a affiché l'état actuel de la connexion sur le port UDP local 21234. Mais ce n'est que la moitié de la bataille, la question s'est posée de savoir comment transférer ces données vers un hôte distant et établir une connexion VPN. En utilisant le protocole de messagerie, peut-être Telegram?! Il existe de nombreuses options et j'ai décidé d'utiliser Yandex.Disk, car je suis tombé sur
un article sur le fonctionnement de Curl via WebDav avec Yandex.Disk . Après avoir réfléchi à la mise en œuvre, je suis arrivé à ce schéma:
- Pour signaler que les nœuds sont prêts à établir une connexion par la présence d'un fichier spécifique avec un horodatage sur Yandex.disk;
- Si les nœuds sont prêts, récupérez les paramètres actuels du serveur STUN;
- Téléchargez les paramètres actuels sur Yandex.Disk;
- Vérifier la disponibilité et lire les paramètres d'un site distant à partir d'un fichier sur Yandex.Disk;
- Établissez une connexion avec un hôte distant à l'aide d'OpenVPN.
Pratique
Après un peu de réflexion, compte tenu de l'expérience de l'article précédent, j'ai écrit un petit script. Nous aurons besoin de:
En fait, le script lui-même:
Option initiale
Pour exécuter le script dont vous avez besoin:
- Copiez dans le presse-papiers et collez-le dans l'éditeur, par exemple:
- spécifiez le nom d'utilisateur et le mot de passe de Yandex.Disk.
- dans le champ "--ifconfig 10.45.54. (1 ou 2) 255.255.255.252" spécifiez l'adresse IP interne de l'interface
- créez secret.key avec la commande:
- rendre le script exécutable:
- exécutez le script:
où nZbVGBuX5dtturD est l'ID de connexion généré ici
Sur le nœud distant, faites de même sauf pour la génération de secret.key et la connexion ID, ils doivent être identiques.
Version mise à jour (pour un fonctionnement correct, l'heure doit être synchronisée):
cat vpn10.sh
Pour exécuter le script dont vous avez besoin:
- Copiez dans le presse-papiers et collez-le dans l'éditeur, par exemple:
- spécifiez l'identifiant (2e ligne) et le mot de passe à partir de Yandex.Disk (3e ligne).
- spécifiez l'adresse IP interne du tunnel (4ème ligne).
- rendre le script exécutable:
- exécutez le script:
où nZbVGBuX5dtturD est l'ID de connexion généré ici
Sur le nœud distant, faites de même, spécifiez l'adresse IP interne correspondante du tunnel et la connexion ID.
Pour démarrer le script au démarrage, j'utilise la commande "nohup / <chemin d'accès au script> /vpn10.sh nZbVGBuX5dtturD> /var/log/vpn10.log 2> / dev / null &" contenue dans le fichier /etc/rc.local
Conclusion
Le script fonctionne, testé sur Ubuntu 18.04 et Debian 9. Vous pouvez utiliser n'importe quel autre service comme émetteur, mais par expérience j'ai utilisé Yandex.Disk.
Au cours des expériences, il a été constaté que certains types de fournisseurs NAT ne permettent pas une connexion. Surtout avec les opérateurs mobiles où les torrents sont bloqués.
Je prévois de finaliser en termes de:
- La génération automatique de secret.key chaque fois que vous démarrez, cryptez et copiez sur Yandex.Disk pour transférer vers un hôte distant (pris en compte dans la version mise à jour)
- Attribuer automatiquement des adresses IP d'interface
- Cryptage des données avant le téléchargement sur Yandex.Disk
- Optimisation du code
Qu'il y ait IPv6 dans chaque maison!