Le titre le résume assez bien. Je souhaite envoyer du trafic UDP via un tunnel SSH. Plus précisément, je dois pouvoir envoyer des paquets UDP via le tunnel et que le serveur puisse me les renvoyer de l'autre côté. Je sais comment le faire pour TCP connexions. Est-ce possible avec UDP?
Ce petit guide vous explique comment envoyer du trafic UDP via SSH à l'aide d'outils fournis en standard (ssh, nc, mkfifo) avec la plupart des systèmes d'exploitation de type UNIX.
Réalisation de tunnels UDP via une connexion SSH
Étape par étape Ouvrez un port de transfert TCP avec votre connexion SSH
Sur votre ordinateur local (local), connectez-vous à l'ordinateur distant (serveur) via SSH, avec l'option -L supplémentaire pour que SSH avec TCP transfert de port:
local# ssh -L 6667:localhost:6667 server.foo.com
Cela permettra aux connexions TCP sur le numéro de port 6667 de votre ordinateur local d'être transférées vers le numéro de port 6667 sur server.foo.com via le canal sécurisé. Configurez le TCP vers le transfert UDP sur le serveur
Sur le serveur, nous ouvrons un écouteur sur le port 6667 TCP qui transmettra les données au port UDP 53 d'une adresse IP spécifiée. Si vous voulez faire le transfert DNS comme moi, vous pouvez utiliser l'adresse IP du premier serveur de noms que vous trouverez dans /etc/resolv.conf. Mais d’abord, nous devons créer un fifo. Le fifo est nécessaire pour établir une communication bidirectionnelle entre les deux canaux. Un simple tuyau Shell ne communiquerait que la sortie standard du processus de gauche avec l'entrée standard du processus de droite.
server# mkfifo /tmp/fifo
server# nc -l -p 6667 < /tmp/fifo | nc -u 192.168.1.1 53 > /tmp/fifo
Cela permettra au trafic TCP sur le port 6667 du serveur d'être transféré au trafic UDP sur le port 53 de 192.168.1.1 et aux réponses à revenir. Configurez le protocole UDP pour TCP transférer sur votre machine
Maintenant, nous devons faire le contraire de ce qui a été fait en haut sur la machine locale. Vous devez disposer d’un accès privilégié pour lier le port UDP 53.
local# mkfifo /tmp/fifo
local# Sudo nc -l -u -p 53 < /tmp/fifo | nc localhost 6667 > /tmp/fifo
Cela permettra au trafic UDP sur le port 53 de la machine locale d'être transféré au trafic TCP sur le port 6667 de la machine locale. Profitez de votre serveur DNS local :)
Comme vous l'avez probablement deviné maintenant, lorsqu'une requête DNS sera effectuée sur la machine locale, par exemple. sur le port UDP local 53, il sera transmis au port local TCP 6667, puis au port TCP du serveur 6667, puis au serveur DNS du serveur, port UDP 53 de 192.168.1.1. Pour profiter des services DNS sur votre ordinateur local, insérez la ligne suivante en tant que premier serveur de noms dans votre fichier /etc/resolv.conf:
nameserver 127.0.0.1
Cet exemple (je pense que la réponse de John indique la même chose à un endroit différent), décrit comment accéder aux services UDP/DNS d'un autre ordinateur via un protocole TCP/IP. Connexion SSH.
Nous allons transférer le trafic UDP/53 local vers TCP, puis le trafic TCP avec le mécanisme de transfert de port de SSH vers l'autre machine, puis le transfert de TCP vers UDP/53 de l'autre côté.
Typiquement, vous pouvez le faire avec openvpn.
Mais ici, nous le ferons avec des outils plus simples, seulement openssh et netcat.
À la fin de cette page, se trouve un autre commentaire avec une référence à ' socat
',
Le même accès UDP/DNS est créé avec,
Côté serveur:
socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
Côté client:socat udp4-listen:53,reuseaddr,fork tcp:localhost:5353
Reportez-vous à des exemples socat pour plus d'informations.
SSH (au moins OpenSSH) prend en charge les VPN simples. A l'aide de l'option -w
ou Tunnel
dans le client ssh
, vous pouvez créer un périphérique tun
aux deux extrémités, qui peut être utilisé pour transférer tout type de trafic IP. (Voir aussi Tunnel
dans la page de manuel de ssh_config(5)
.) Notez que cela nécessite OpenSSH (et probablement des privilèges root) aux deux extrémités.
Ou vous pouvez simplement utiliser ssf (conçu pour gérer ce cas d'utilisation), avec une simple commande:
Côté client:
#>./ssfc -U 53:192.168.1.1:53 server.foo.com
Cette commande redirige le port local 53 (dns) vers le port 192.168.1.1, via un tunnel sécurisé entre localhost et server.foo.com.
Vous aurez besoin d’un serveur ssf (au lieu de - ou à côté de votre serveur ssh):
#>./ssfs
Soit dit en passant, les côtés client et serveur de ssf fonctionnent sous Windows/Linux/Mac. Ceci est une application utilisateur, vous n'avez donc pas besoin de tun/tap ou de VPN.
Pour rediriger le port 53, vous aurez besoin de privilèges d’administrateur, quel que soit l’outil utilisé.
Pour plus d'informations, de détails, un cas d'utilisation ou un téléchargement: https://securesocketfunneling.github.io/ssf/
Je ne pouvais pas utiliser nc
pour SNMP, car les clients SNMP continuent de choisir un nouveau port UDP source et plusieurs d'entre eux peuvent être actifs simultanément.
Au lieu de cela, j'ai écrit un article décrivant comment procéder avec socat
dans cet article de blog , en utilisant SNMP comme exemple. Essentiellement, en utilisant deux terminaux, en commençant par un aperçu:
Terminal un:
client$ ssh -L 10000:localhost:10000 server
server$ socat -T10 TCP4-LISTEN:10000,fork UDP4:switch:161
Cela crée le transfert SSH du TCP port 10000 et exécute socat sur le serveur. Notez que l’adresse IP du commutateur est mentionnée dans la ligne de commande socat en tant que "commutateur".
Terminal deux:
client$ Sudo socat UDP4-LISTEN:161,fork TCP4:localhost:10000
Cela met en place socat sur le client. Ça devrait le faire.
Un VPN est une meilleure solution si vous avez accès à un port UDP.
Si vous avez uniquement accès au port TCP SSH, un tunnel SSH est aussi bon qu'un VPN, du moins pour le ping et le retour arrière de paquets.