Como encaminhar uma porta de uma máquina para outra?

15

Considere a seguinte situação:

Na minha casa, eu tenho um roteador (que está conectado à internet), servidor (S) e minha máquina principal (M). S é acessível a partir da Internet (tem IP estático) e é 24/7, enquanto M não é.

Às vezes, eu quero fazer algum aplicativo (que escuta em alguma porta em M, por exemplo, 8888) acessível a partir da Internet externa.

Para isso, eu queria configurar alguma porta no S (2222) para encaminhar para a porta do M's 8888, para que qualquer pessoa que acessasse o S: 2222 sentisse que estava acessando o M: 8888.

Eu tentei usar o encaminhamento de porta ssh, minha melhor tentativa foi a seguinte:

ssh -L 2222:M:8888 -N M

Mas isso só me permite acessar a porta 2222 do próprio servidor, não de outras máquinas.

Existe alguma maneira de fazer isso corretamente? De preferência, eu gostaria que fosse um comando simples, que eu seria capaz de iniciar e encerrar com ^ C quando eu não precisar mais desse encaminhamento.

    
por Rogach 06.12.2012 / 10:07

3 respostas

12

Sim, isso é chamado de GatewayPorts no SSH. Um trecho de ssh_config(5) :

GatewayPorts
        Specifies whether remote hosts are allowed to connect to local
        forwarded ports.  By default, ssh(1) binds local port forwardings
        to the loopback address.  This prevents other remote hosts from
        connecting to forwarded ports.  GatewayPorts can be used to spec‐
        ify that ssh should bind local port forwardings to the wildcard
        address, thus allowing remote hosts to connect to forwarded
        ports.  The argument must be “yes” or “no”.  The default is “no”.

E você pode usar localhost em vez de M no encaminhamento, quando estiver encaminhando para a mesma máquina que está usando o SSH - se eu entendi sua pergunta corretamente.

Então, o comando se tornará assim:

ssh -L 2222:localhost:8888 -N -o GatewayPorts=yes hostname-of-M

e ficará assim em netstat -nltp :

tcp        0      0    0.0.0.0:2222   0.0.0.0:*  LISTEN  5113/ssh

Agora qualquer um que acesse esta máquina na porta 2222 TCP irá realmente falar com localhost: 8888 como visto na máquina M. Note que isto não é o mesmo que o encaminhamento simples para a porta 8888 de M.

    
por 06.12.2012 / 10:17
8

Existe outro caminho. Você pode configurar o encaminhamento de porta de S: 2222 para W: 8888 com iptables. Comando único:

iptables -t nat -A PREROUTING -p tcp --dport 2222 \
         -j DNAT --to-destination 1.2.3.4:8888

em que 1.2.3.4 é o endereço IP de M. É chamado de NAT (Network Address Translation).

    
por 06.12.2012 / 11:08
3

Mais alternativas: netcat (tradicional) ou socat

No servidor (S):

socat tcp-listen:2222,reuseaddr,fork tcp:M:8888

ou

nc -l -p 2222 -c 'nc M 8888'

Detalhes ver em: Maneira simples de criar um túnel de uma porta local para outra?

    
por 01.01.2018 / 20:21