web-dev-qa-db-fra.com

Trafic UDP via le tunnel SSH

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?

63
heavyd

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
35
John T

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.

24
nik

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.

20
grawity

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/

14
ssf-developers

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:

overview

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.

9
Peter V. Mørch

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.

4
Michael