Reverter tunelamento de porta

50

Eu preciso mostrar a alguém um site em execução na minha máquina local amanhã. Normalmente eu realizo isso através do encaminhamento de porta no meu roteador local, mas graças ao hardware com defeito e sua substituição é horrível, meu roteador atual não me permite fazer o encaminhamento de porta.

Então, preso a esse atraso e não querendo empurrar tudo para um servidor adequado, tive uma ideia maluca: Posso simplesmente encaminhar minha porta para um servidor externo por SSH?

Já fiz o tunelamento de portas antes, mas normalmente faço da maneira correta:

  • Eu conecto a uma caixa remota e peço que a porta 12345 apareça na minha máquina local na porta 12345.
  • inicio algo no P12345 na máquina remota
  • eu posso acessá-lo via localhost: 12345

O que eu quero fazer:

  • Conecte-se a um PC remoto e peça que esse seu P12345 local busque coisas no meu P12345 local (sobre o túnel)
  • Eu começo algo no meu computador local no P12345
  • Outras pessoas podem acessar o remoto: 12345 e ver meu localhost: 12345
por Oli 22.06.2011 / 18:46

2 respostas

83

O comando para encaminhar a porta 80 de sua máquina local ( localhost ) para o host remoto na porta 8000 é:

ssh -R 8000:localhost:80 oli@remote-machine

Isso requer um ajuste adicional no servidor SSH, adicione as linhas a /etc/ssh/sshd_config :

Match User oli
   GatewayPorts yes

Em seguida, recarregue a configuração pelo servidor executando sudo reload ssh .

A configuração GatewayPorts yes faz com que o SSH vincule a porta 8000 ao endereço curinga, para que ele fique disponível para o endereço público de remote-machine ( remote-machine:8000 ).

Se você precisar ter a opção de não vincular tudo ao endereço curinga, altere GatewayPorts yes para GatewayPorts clientspecified . Como o ssh se vincula ao endereço de loopback por padrão, é necessário especificar um bind_address vazio para vincular o endereço curinga:

ssh -R :8000:localhost:80 oli@remote-machine

O : antes de 8000 é obrigatório se GatewayPorts estiver definido como clientspecified e você quiser permitir o acesso público a remote-machine:8000 .

Trechos manuais relevantes:

ssh (1)

  

-R [bind_address:] porta: host: hostport
  Especifica que a porta especificada no host remoto (servidor) deve ser encaminhada para o host e porta fornecidos no lado local. Isso funciona alocando um soquete para escutar porta no lado remoto, e sempre que uma conexão é feita para essa porta, a conexão é encaminhada através do canal seguro e é feita uma conexão ao porto host da porta da máquina local. Por padrão, o soquete de escuta no servidor será vinculado apenas à interface de loopback. Isso pode ser substituído especificando-se um bind_address. Um bind_address vazio, ou o endereço '*', indica que o socket remoto deve escutar em todas as interfaces. Especificar um bind_address remoto só terá sucesso se a opção GatewayPorts do servidor estiver habilitada (ver sshd_config (5)) .

sshd_config (5)

  

GatewayPorts
  Especifica se os hosts remotos podem se conectar às portas encaminhadas para o cliente. O GatewayPorts pode ser usado para especificar que o sshd deve permitir que os encaminhamentos de porta remota sejam vinculados a endereços que não sejam de loopback, permitindo que outros hosts se conectem. O argumento pode ser 'no' para forçar o reencaminhamento de portas remotas a estar disponível apenas para o host local, 'yes' para forçar redirecionamentos remotos de portas a serem vinculados ao endereço curinga ou 'clientspecified' para permitir que o cliente selecione o endereço para o qual o encaminhamento está vinculado. O padrão é 'não'.

Veja também:

por Lekensteyn 22.06.2011 / 19:28
11

Se o servidor tiver GatewayPorts no , você poderá obter o mesmo resultado executando ssh -g -L 8001:localhost:8000 oli@remote-machine no servidor depois de ter executado o comando ssh -R no cliente. Isso tornará a porta de loopback 8000 no servidor acessível em todas as interfaces na porta 8001.

    
por FaST4 20.06.2016 / 12:17

Tags