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

19

Considere a seguinte situação:

Na minha casa, tenho um roteador (conectado à Internet), servidor (S) e minha máquina principal (M). S é acessível pela Internet (possui IP estático) e funciona 24/7, enquanto M não.

Às vezes, desejo tornar algum aplicativo (que escute em alguma porta do M, por exemplo, 8888) acessível a partir da Internet externa.

Para isso, queria configurar alguma porta no S (2222) para encaminhar para a porta 8888 de M, para que qualquer pessoa que estivesse acessando o S: 2222 sentisse que estava acessando o M: 8888.

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, gostaria que fosse um comando simples, que pudesse iniciar e desligar com ^ C quando não precisar mais desse encaminhamento.

Rogach
fonte
Tente localhost.run, que é um site que você pode
acessar

Respostas:

16

Sim, isso é chamado GatewayPortsno 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 em localhostvez de Mencaminhar, pois está encaminhando para a mesma máquina com a qual faz o SSH - se eu entendi sua pergunta corretamente.

Então, o comando se tornará este:

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 pessoa que acesse esta máquina na porta 2222 TCP realmente conversará com o host local: 8888 como visto na máquina M. Observe que isso não é o mesmo que encaminhamento simples para a porta 8888 de M.

gertvdijk
fonte
11
Obrigado! Isso funciona! Mas há alguma estranheza - por algum motivo, a saída contém a linha "bind: Endereço já em uso". O que isso poderia significar?
Rogach 6/12/12
11
Você já tem algum processo em execução nessa porta. Use o mesmo netstatcomando para descobrir exatamente o que. Provavelmente outro SSH semelhante ainda está sendo executado em segundo plano e o mata usando o netstat do PID.
gertvdijk
O mais engraçado é que eu já fiz isso - nenhum processo nessas portas, tanto em S quanto em M. Se houvesse algum, toda a construção provavelmente teria falhado em funcionar.
Rogach 6/12/12
10

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

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

Gevial
fonte
11
Como você está apenas executando o NAT de destino aqui (em oposição ao NAT de origem), isso funcionará apenas de maneira confiável em situações específicas e poderá exigir a modificação de tabelas de roteamento. Para encaminhamento para máquinas virtuais (M) em execução no host (S), isso pode funcionar bem.
gertvdijk
Este comando deve ser emitido no gateway. Presumo que S e M estejam na mesma LAN. O NAT de origem seria feito automaticamente pelo rastreador de conexão nos modernos kernels do Linux. Eu tenho essa configuração na rede do meu escritório e funciona perfeitamente. No entanto, é possível tornar o comando mais específico (por exemplo, informando ao iptables -i eth0 onde eth0 é a interface externa).
Gevial
Se S e M estiverem na mesma LAN, não será necessário o encaminhamento de porta, pois nenhum tráfego entre eles passa pelo gateway.
gertvdijk
11
Sim, mas a conexão com o M: 8888 é feita da Internet, presumo. Alguém forma Internet -> S: 2222 -> roteador LAN M e S com iptables -> M: 8888
Gevial