Lancement d'un serveur VPN derrière le fournisseur NAT

Cet article explique comment j'ai réussi à démarrer le serveur VPN derrière le NAT du fournisseur d'origine (sans adresse IP blanche). Je vais faire une réservation tout de suite: que les performances de cette implémentation dépendent directement du type de NAT utilisé par votre fournisseur, ainsi que du routeur .
J'ai donc eu besoin de me connecter de mon smartphone Android à mon ordinateur personnel, les deux appareils sont connectés à Internet via des FAI, plus l'ordinateur est connecté via un routeur domestique, qui a également des connexions NAT.
Le schéma classique utilisant un VPS / VDS loué avec une adresse IP blanche, ainsi que la location d'une adresse IP blanche auprès du fournisseur, n'a pas été envisagé pour plusieurs raisons.
Basé sur l' expérience des articles précédents , ayant mené plusieurs expériences avec des STUN et des fournisseurs NAT. J'ai décidé d'une petite expérience en exécutant la commande sur un routeur domestique fonctionnant avec le firmware OpenWRT:
$ stun stun.sipnet.ru 

a obtenu le résultat:
Client STUN version 0.97
Primaire: mappage indépendant, filtre indépendant, port aléatoire, épingle à cheveux
La valeur de retour est 0x000002

Traduction littérale:
Cartographie indépendante - Cartographie indépendante
Filtre indépendant - Filtre indépendant
port aléatoire - port aléatoire
épingle à cheveux - il y aura une épingle à cheveux
Après avoir exécuté une commande similaire sur mon PC, j'ai obtenu:
Client STUN version 0.97
Primaire: mappage indépendant, filtre dépendant du port, port aléatoire, épingle à cheveux
La valeur de retour est 0x000006

Port Dependent Filter - filtre dépendant du port
La différence de sortie des commandes indique que le routeur domestique a apporté sa contribution au processus de diffusion des paquets à partir d'Internet, cela s'est manifesté par le fait que lors de l'exécution de la commande sur l'ordinateur:
 stun stun.sipnet.ru -p 11111 -v 

J'ai obtenu le résultat:
...
MappedAddress = XX.1XX.1X4.2XX: 4398
...
à ce moment, une session UDP a été ouverte pendant un certain temps, si à ce moment une demande UDP a été envoyée (par exemple: netcat XX.1XX.1X4.2XX 4398 -u), alors la demande est arrivée au routeur domestique, ce qui a été confirmé par le TCPDump en cours d'exécution, mais la requête n'a pas atteint l'ordinateur - IPtables l'a déposée sur le routeur en tant que traducteur NAT.

Mais le fait qu'une demande UDP soit passée par le FAI NAT donnait de l'espoir pour le succès. Puisque le routeur est dans ma juridiction, j'ai résolu le problème en redirigeant le port UDP / 11111 vers l'ordinateur:
 iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX 
Ainsi, j'ai pu lancer une session UDP et recevoir des demandes d'Internet depuis n'importe quelle adresse IP. À ce stade, j'ai lancé le serveur OpenVPN (après l'avoir configuré) en écoutant le port UDP / 11111, indiqué sur le smartphone l'adresse IP externe et le port (XX.1XX.1X4.2XX: 4398) et connecté avec succès du smartphone à l'ordinateur. Mais dans cette implémentation, un problème est survenu, il fallait en quelque sorte maintenir une session UDP jusqu'à ce que le client OpenVPN soit connecté au serveur, je n'aimais pas l'option de démarrer périodiquement le client STUN - je ne voulais pas gaspiller les serveurs STUN pour rien.
A également attiré l'attention sur l'entrée " épingle à cheveux - il y aura une épingle à cheveux ", ce mode
L'épingle à cheveux permet à une machine sur le réseau local pour NAT d'accéder à une autre machine sur le même réseau à l'adresse externe du routeur.

image
En conséquence, le problème de la maintenance d'une session UDP a été simplement résolu - j'ai lancé le client sur le même ordinateur avec le serveur.
Cela a fonctionné comme ceci:
  • a lancé un client STUN avec le port local 11111
  • Reçu une réponse avec une adresse IP externe et le port XX.1XX.1X4.2XX: 4398
  • envoyé des données avec une adresse IP externe et un port vers le courrier (tout autre service est possible) configuré sur le smartphone
  • a lancé le serveur OpenVPN sur un ordinateur avec écoute de port UDP / 11111
  • a lancé le client OpenVPN sur l'ordinateur avec l'indication XX.1XX.1X4.2XX: 4398 pour se connecter
  • à tout moment j'ai démarré le client OpenVPN sur le smartphone avec l'adresse IP et le port (dans mon cas, l'adresse IP n'a pas changé) pour me connecter


Ainsi, j'ai eu l'opportunité de me connecter à mon ordinateur depuis un smartphone. Cette implémentation vous permet de connecter n'importe quel client OpenVPN.

Pratique


Vous aurez besoin de:
 # apt install openvpn stun-client sendemail 

Après avoir écrit quelques scripts, quelques fichiers de configuration, généré les certificats nécessaires (puisque le client sur le smartphone ne fonctionne qu'avec des certificats), l'implémentation habituelle du serveur OpenVPN a été obtenue.

Le script principal sur l'ordinateur


 # 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 d'envoi de données par 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" 

Fichier de configuration du serveur:
 # 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 

Fichier de configuration client:
 # 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 

La génération de certificats a été effectuée sur cet article .
Exécution de script:
 # ./vpn11.sh 

Après l'avoir rendu exécutable
 # chmod +x vpn11.sh 

Du côté du smartphone


Après avoir installé l'application OpenVPN pour Android , copié le fichier de configuration, les certificats et l'avoir installé, cela s'est avéré comme ceci:
Je vérifie le courrier sur un smartphone

Je corrige le numéro de port dans les paramètres

Je lance le client et me connecte


Au cours de la rédaction de l'article, j'ai transféré la configuration de l'ordinateur vers le Raspberry Pi 3 et j'ai essayé d'exécuter le tout sur le modem LTE, mais cela n'a pas fonctionné! Résultat d'équipe
 # stun stun.ekiga.net -p 11111 

Client STUN version 0.97
Primaire: mappage indépendant, filtre dépendant du port, port aléatoire, épingle à cheveux
La valeur de retour est 0x000006
la valeur du filtre dépendant du port n'a pas permis au système de démarrer.
Mais le fournisseur d'origine a laissé sans problème le système Raspberry Pi 3 démarrer.
En conjonction avec une webcam, avec VLC pour
création d'un flux RTSP à partir d'une 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 


et VLC sur le smartphone pour le visionner (flux rtsp: //10.2.0.1: 8554 /), il s'est avéré pas un mauvais système de surveillance vidéo à distance, vous pouvez également augmenter Samba et échanger des fichiers, acheminer le trafic via VPN,
contrôler à distance un ordinateur
et bien plus encore ...

Conclusion


Comme l'a montré la pratique, pour organiser un serveur VPN, vous pouvez vous passer d'une adresse IP externe pour laquelle vous devez payer, ainsi que d'un VPS / VDS loué. Mais tout dépend du fournisseur. Bien sûr, je voulais obtenir plus d'informations sur les différents fournisseurs et les types de NAT utilisés, mais ce n'est que le début ...
Merci de votre attention!

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


All Articles