Tráfego UDP através do túnel SSH

61

O título resume muito bem. Eu gostaria de enviar tráfego UDP através de um túnel SSH. Especificamente, eu preciso ser capaz de enviar pacotes UDP através do túnel e ter o servidor ser capaz de enviá-los de volta para mim no outro lado. Eu sei como fazer isso para conexões TCP. Isso é possível com o UDP?

    
por heavyd 09.10.2009 / 06:13

6 respostas

34

Este pequeno guia explica como enviar tráfego UDP via SSH usando ferramentas que vêm de fábrica (ssh, nc, mkfifo) com a maioria dos sistemas operacionais semelhantes ao UNIX.

Realização de tunelamento UDP por meio de uma conexão SSH

Passo a passo Abra uma porta TCP forward com sua conexão SSH

Em sua máquina local (local), conecte-se à máquina distante (servidor) por SSH, com a opção -L adicional para que o SSH com a porta TCP a seguir:

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

Isso permitirá que as conexões TCP no número de porta 6667 de sua máquina local sejam encaminhadas para o número de porta 6667 em server.foo.com através do canal seguro. Configure o TCP para o encaminhamento UDP no servidor

No servidor, abrimos um ouvinte na porta TCP 6667 que encaminhará dados para a porta UDP 53 de um IP especificado. Se você quiser redirecionar DNS como eu, você pode pegar o IP do primeiro servidor de nomes que você encontrará em /etc/resolv.conf. Mas primeiro precisamos criar um fifo. O fifo é necessário para ter comunicações bidirecionais entre os dois canais. Um simples pipe de shell só comunicaria a entrada padrão do processo à esquerda 'saída padrão para o processo correto'.

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

Isso permitirá que o tráfego TCP na porta 6667 do servidor seja encaminhado para o tráfego UDP na porta 53 do 192.168.1.1 e as respostas voltem. Configure o UDP para TCP em frente em sua máquina

Agora, precisamos fazer o oposto do que foi feito na parte superior da máquina local. Você precisa de acesso privilegiado para ligar a porta UDP 53.

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

Isso permitirá que o tráfego UDP na porta 53 da máquina local seja encaminhado para o tráfego TCP na porta 6667 da máquina local. Aproveite o seu servidor DNS local:)

Como você provavelmente já adivinhou agora, quando uma consulta DNS será executada na máquina local, por exemplo, na porta local UDP 53, ele será encaminhado para a porta TCP local 6667, depois para a porta TCP 6667 do servidor e, em seguida, para o servidor DNS do servidor, a porta UDP 53 de 192.168.1.1. Para desfrutar de serviços DNS em sua máquina local, coloque a seguinte linha como primeiro nameserver em seu /etc/resolv.conf:

nameserver 127.0.0.1
    
por 09.10.2009 / 06:37
21

Este exemplo (eu acho que a resposta de John aponta a mesma coisa em um local diferente), descreve como acessar os serviços UDP / DNS de outra máquina por meio de uma conexão TCP / SSH.

We will forward local UDP/53 traffic to TCP, then TCP traffic with the port-forwarding mechanism of SSH to the other machine, then TCP to UDP/53 on the other end.
Typically, you can do it with openvpn.
But here, we'll do it with simpler tools, only openssh and netcat.

No final dessa página, há outro comentário com uma referência a " socat ',
O mesmo acesso UDP / DNS é feito com

Server side: socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
Client side: socat udp4-listen:53,reuseaddr,fork tcp:localhost:5353

Consulte os exemplos de socat para saber mais.

    
por 09.10.2009 / 07:14
19

O SSH (pelo menos o OpenSSH) tem suporte para VPNs simples. Usando a opção -w ou Tunnel no cliente ssh , você pode criar um dispositivo tun em ambas as extremidades, que pode ser usado para encaminhar qualquer tipo de tráfego IP. (Veja também Tunnel na página de manual de ssh_config(5) .) Note que isto requer OpenSSH (e provavelmente privilégios de root) em ambas as extremidades .

    
por 09.10.2009 / 09:42
11

Ou você pode simplesmente usar o ssf (que foi projetado para lidar com esse caso de uso), com um comando simples:

Lado do cliente:

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

Este comando redireciona a porta local 53 (dns) para a porta 192.168.1.1 através de um túnel seguro entre localhost e server.foo.com.

Você precisará de um servidor ssf (em vez de - ou próximo a - seu servidor ssh):

#>./ssfs

A propósito, tanto o cliente quanto o servidor do ssf funcionam em Windows / Linux / Mac. Este é um aplicativo userland, então você não precisa de tun / tap ou VPN.

Para redirecionar a porta 53, você precisará de privilégios administrativos - independentemente da ferramenta que estiver usando.

Para mais informações, detalhes, caso de uso ou download: link

    
por 11.06.2015 / 10:30
8

Não consegui usar nc para trabalhar com o SNMP, porque os clientes SNMP continuam escolhendo uma nova porta UDP de origem e vários podem estar ativos ao mesmo tempo.

Em vez disso, escrevi uma postagem descrevendo como fazer isso com socat neste postagem no blog , usando o SNMP como exemplo. Essencialmente, usando dois terminais, começando com uma visão geral:

Terminal1:

client$ssh-L10000:localhost:10000serverserver$socat-T10TCP4-LISTEN:10000,forkUDP4:switch:161

IssocriaoencaminhamentoSSHdaportaTCP10000eexecutaosocatnoservidor.ObservecomooendereçoIPdoswitchémencionadonalinhadecomandosocatcomo"switch".

Terminal dois:

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

Isso configura o socat no cliente. Isso deve ser feito.

    
por 17.09.2015 / 00:01
3

Uma VPN é uma solução melhor se você tiver acesso a uma porta UDP.

Se você tiver acesso somente à porta TCP SSH, um túnel SSH é tão bom quanto uma VPN, pelo menos para ping e backtracking de pacotes.

    
por 16.11.2011 / 23:17

Tags