it-swarm-eu.dev

Traffico UDP attraverso il tunnel SSH

Il titolo riassume molto. Vorrei inviare il traffico UDP attraverso un tunnel SSH. Nello specifico, devo essere in grado di inviare pacchetti UDP attraverso il tunnel e avere il server in grado di inviarli di nuovo dall'altra parte. So come farlo per TCP connessioni. È possibile con UDP?

63
heavyd

Questa piccola guida ti dice come inviare traffico UDP tramite SSH usando strumenti che vengono standard (ssh, nc, mkfifo) con la maggior parte dei sistemi operativi simili a UNIX.

Esecuzione del tunneling UDP attraverso una connessione SSH

Passo dopo passo Aprire una porta TCP forward con la connessione SSH

Sulla macchina locale (locale), connettersi alla macchina remota (server) tramite SSH, con l'opzione -L aggiuntiva in modo che SSH con TCP port forwarding:

local# ssh -L 6667:localhost:6667 server.foo.com

Ciò consentirà le connessioni TCP sul numero di porta 6667 del computer locale da inoltrare al numero di porta 6667 su server.foo.com attraverso il canale protetto. Impostare il TCP su UDP in avanti sul server

Sul server, apriamo un listener sulla porta TCP 6667 che inoltrerà i dati alla porta UDP 53 di un IP specificato. Se vuoi fare l'inoltro DNS come me, puoi prendere l'IP del primo server dei nomi che trovi in ​​/etc/resolv.conf. Ma prima, dobbiamo creare un fifo. Il fifo è necessario per avere comunicazioni bidirezionali tra i due canali. Un semplice pipe Shell comunica solo l'input standard del processo di output standard a destra.

server# mkfifo /tmp/fifo
server# nc -l -p 6667 < /tmp/fifo | nc -u 192.168.1.1 53 > /tmp/fifo

Ciò consentirà il traffico TCP sulla porta del server 6667 da inoltrare al traffico UDP sulla porta 53 di 192.168.1.1 e le risposte per tornare indietro. Impostare l'UDP su TCP in avanti sulla macchina

Ora, dobbiamo fare l'opposto di ciò che è stato fatto in alto sulla macchina locale. È necessario un accesso privilegiato per collegare la porta UDP 53.

local# mkfifo /tmp/fifo
local# Sudo nc -l -u -p 53 < /tmp/fifo | nc localhost 6667 > /tmp/fifo

Ciò consentirà il traffico UDP sulla porta 53 della macchina locale da inoltrare al traffico TCP sulla porta della macchina locale 6667. Goditi il ​​tuo server DNS locale :)

Come probabilmente hai indovinato ora, quando una query DNS verrà eseguita sul computer locale, ad es. sulla porta UDP locale 53, verrà inoltrata alla porta locale TCP 6667, quindi alla porta TCP del server 6667, quindi al server DNS del server, porta UDP 53 di 192.168.1.1. Per usufruire dei servizi DNS sul tuo computer locale, inserisci la seguente riga come first nameserver in /etc/resolv.conf:

nameserver 127.0.0.1
35
John T

Questo esempio (Penso che la risposta di John punti la stessa cosa in un posto diverso), descrive come accedere ai servizi UDP/DNS di un'altra macchina su un TCP/Connessione SSH.

Inoltreremo il traffico UDP/53 locale a TCP, quindi il traffico TCP con il meccanismo di port forwarding di SSH sull'altra macchina, quindi TCP su UDP/53 sull'altra estremità.
In genere, puoi farlo con openvpn.
Ma qui, lo faremo con strumenti più semplici, solo openssh e netcat.

Alla fine di quella pagina, c'è un altro commento con un riferimento a ' socat ',
Lo stesso accesso UDP/DNS è fatto con,

Lato server: socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
Lato client: socat udp4-listen:53,reuseaddr,fork tcp:localhost:5353

Fare riferimento a esempi socat per ulteriori informazioni.

24
nik

SSH (almeno OpenSSH) ha il supporto per semplici VPN. Utilizzando l'opzione -w o Tunnel nel client ssh, è possibile creare un dispositivo tun a entrambe le estremità, che può essere utilizzato per inoltrare qualsiasi tipo di traffico IP. (Vedi anche Tunnel nella pagina di manuale di ssh_config(5) .) Si noti che questo richiede OpenSSH (e probabilmente i privilegi di root) ad entrambe le estremità.

20
grawity

Oppure puoi semplicemente usare ssf (che è stato progettato per gestire questo caso d'uso), con un semplice comando:


Dalla parte del cliente:

#>./ssfc -U 53:192.168.1.1:53 server.foo.com

Questo comando reindirizza la porta locale 53 (dns) alla porta 192.168.1.1 53, attraverso un tunnel sicuro tra localhost e server.foo.com.


Avrai bisogno di un server ssf (invece di - o accanto a - il tuo server ssh):

#>./ssfs

A proposito, sia il lato client che server di ssf funzionano su Windows/Linux/Mac. Questa è un'applicazione per l'utente, quindi non è necessario tun/tap o VPN.

Per reindirizzare la porta 53, sono necessari i privilegi di amministratore, indipendentemente dallo strumento che si sta utilizzando.

Per maggiori informazioni, dettagli, use case o download: https://securesocketfunneling.github.io/ssf/

14
ssf-developers

Non potevo ottenere nc per funzionare per SNMP, perché i client SNMP continuano a scegliere una nuova porta UDP di origine, e diversi possono essere attivi contemporaneamente.

Invece, ho scritto un post che descrive come farlo con socat in questo post di blog , usando SNMP come esempio. In sostanza, utilizzando due terminali, a partire da una panoramica:

overview

Terminal uno:

client$ ssh -L 10000:localhost:10000 server
server$ socat -T10 TCP4-LISTEN:10000,fork UDP4:switch:161

Questo crea l'inoltro SSH di TCP porta 10000 ed esegue socat sul server. Si noti come l'indirizzo IP dello switch sia menzionato nella riga di comando di socat come "switch".

Terminal due:

client$ Sudo socat UDP4-LISTEN:161,fork TCP4:localhost:10000

Ciò crea socat sul client. Questo dovrebbe farlo.

9
Peter V. Mørch

Una VPN è una soluzione migliore se si ha accesso a una porta UDP.

Se si ha accesso solo alla porta TCP SSH, allora un tunnel SSH è buono quanto una VPN, almeno per il ping e il backtrack dei pacchetti.

4
Michael