Maneira simples de criar um túnel de uma porta local para outra?

62

Eu tenho um servidor de desenvolvimento, que só é acessível a partir de 127.0.0.1:8000, não 192.168.1.x: 8000. Como um hack rápido, existe uma maneira de configurar algo para escutar em outra porta (digamos, 8001) para que a partir da rede local eu pudesse conectar 192.168.1.x: 8001 e iria encapsular o tráfego entre o cliente e 127.0 .0.1: 8000?

    
por waitinforatrain 01.04.2011 / 07:07

6 respostas

34

Usar o ssh é a solução mais fácil.

ssh -g -L 8001:localhost:8000 -f -N [email protected]

Isso encaminha a porta local 8001 em sua estação de trabalho para o endereço de host local na porta 8000 do remote-server.
-g significa permitir que outros clientes em minha rede se conectem à porta 8001 em minha estação de trabalho. Caso contrário, apenas os clientes locais em sua estação de trabalho podem se conectar à porta encaminhada.
-N significa que tudo que estou fazendo é encaminhar portas, não iniciar um shell.
-f significa bifurcação no plano de fundo após um SSH bem-sucedido conexão e login.
A porta 8001 permanecerá aberta para muitas conexões, até que o ssh morra ou seja morto. Se acontecer de você estar no Windows, o excelente cliente SSH PuTTY também pode fazer isso. Use 8001 como a porta local e localhost: 8000 e o destino e adicione um encaminhamento de porta local nas configurações. Você pode adicioná-lo após uma conexão bem-sucedida com o PuTTY.

    
por 01.04.2011 / 07:55
80

Com socat no servidor:

socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000

Por padrão, socat escutará na porta TCP 8001 em qualquer endereço IPv4 ou IPv6 (se suportado) na máquina. Você pode restringi-lo ao IPv4 / 6 substituindo tcp-listen por tcp4-listen ou tcp6-listen ou por um endereço local específico adicionando um ,bind=that-address .

Mesmo para o soquete de conexão ao qual você está fazendo proxy, você pode usar qualquer endereço no lugar de localhost e substituir tcp por tcp4 ou tcp6 se quiser restringir a resolução de endereço a IPv4 ou Endereços IPv6.

Observe que, para o servidor que atende na porta 8000, a conexão aparecerá como proveniente do proxy (no caso de localhost , que será localhost ), não do cliente original. Você precisaria usar abordagens DNAT (mas que requer privilégios de superusuário) para que o servidor possa dizer quem é o cliente.

    
por 26.02.2015 / 17:57
37

Usar o tradicional nc é a solução mais fácil:

nc -l -p 8001 -c "nc 127.0.0.1 8000"

Esta versão do nc está no pacote netcat-traditional no Ubuntu. (Você tem que update-alternatives ou chamar nc.traditional .)

Observe que, em contraste com o ssh, isso não é criptografado. Tenha isso em mente se você usá-lo fora de um host.

    
por 20.11.2013 / 12:18
21

O OpenBSD netcat está disponível por padrão no Linux e também no OS X.

OSX:

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &

Linux:

mkfifo backpipe
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe

Uma alternativa que funciona no bash do OS X é usar um tubo bidirecional . Pode funcionar em outros Unixes:

nc 127.0.0.1 8000 <&1 | nc -l 8001 >&0
    
por 02.07.2013 / 00:37
4

Citando de David Spillett responder no ServerFault

rinetd should do the job, and a Windows binary for it can be had from http://www.boutell.com/rinetd/ (for anyone looking for the same thing under Linux, rinetd is in the standard repositories of just about every distro so can be installed with "apt-get install rinetd" or "yum install rinetd" or similar)

É um binário simples que pega um arquivo de configuração no formato

bindaddress bindport connectaddress connectport

Por exemplo:

192.168.1.1 8001 127.0.0.1 8000

ou

0.0.0.0 8001 127.0.0.1 8000

se você quiser vincular a porta de entrada a todas as interfaces.

    
por 15.03.2018 / 09:57
2
iptables -t nat -A PREROUTING -p tcp --dport <origin-port> -j REDIRECT --to-port <destination-port>

service iptables save
service iptables restart
    
por 27.05.2016 / 11:27