Túnel de porta reversa

59

Preciso mostrar a alguém um site em execução na minha máquina local amanhã. Normalmente, eu realizava isso encaminhando portas no meu roteador local, mas, devido à falha do hardware e sua substituição ser péssima, meu roteador atual não me permite fazer o encaminhamento de portas.

Tão preso a esse atraso e não querendo enviar 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 geralmente faço o caminho certo:

  • Eu me conecto a uma caixa remota e solicito que a porta 12345 apareça na minha máquina local na porta 12345.
  • Eu começo 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 solicite que o P12345 local busque itens do P12345 local (sobre o túnel)
  • Inicio algo no meu computador local na P12345
  • Outras pessoas podem acessar o controle remoto: 12345 e ver meu localhost: 12345
Oli
fonte

Respostas:

96

O comando para encaminhar a porta 80 da 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 executando o servidor sudo reload ssh.

A configuração GatewayPorts yesfaz com que o SSH ligue a porta 8000 no endereço curinga, para que 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 no endereço curinga, mude GatewayPorts yespara GatewayPorts clientspecified. Como sshvincula ao endereço de loopback por padrão, é necessário especificar um vazio bind_addresspara vincular o endereço curinga:

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

O :antes 8000é obrigatório se GatewayPortsestiver definido como clientspecifiede você desejar permitir acesso público remote-machine:8000.

Trechos manuais relevantes:

ssh (1)

-R [bind_address:] port: host: hostport
Especifica que a porta especificada no host remoto (servidor) deve ser encaminhada para o host especificado e a porta no lado local. Isso funciona alocando um soquete para escutar a porta no lado remoto, e sempre que uma conexão é feita a essa porta, a conexão é encaminhada pelo canal seguro e uma conexão é feita para hospedar o hostport 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 um endereço de ligação. Um endereço bind_ vazio, ou o endereço '*', indica que o soquete remoto deve escutar em todas as interfaces. A especificação de um endereço bind_ad remoto somente será bem-sucedida se a opção GatewayPorts do servidor estiver ativada (consulte sshd_config (5)).

sshd_config (5)

GatewayPorts
Especifica se os hosts remotos têm permissão para se conectar às portas encaminhadas para o cliente. GatewayPorts pode ser usado para especificar que o sshd deve permitir o encaminhamento de portas remotas para se vincular a endereços sem loopback, permitindo assim que outros hosts se conectem. O argumento pode ser 'não' para forçar o encaminhamento de porta remota a estar disponível apenas para o host local, 'yes' para forçar o encaminhamento de porta remota para vincular ao endereço curinga ou 'clientspecified' para permitir que o cliente selecione o endereço ao qual o encaminhamento é vinculado. O padrão é 'não'.

Veja também:

Lekensteyn
fonte
7
GatewayPortsfoi a bala mágica aqui. Gosto que você tenha encontrado uma versão que me permita limitar essa técnica bastante poderosa a determinados usuários.
Oli
11
O que foi confuso para mim foi que o GatewayPorts deve ser definido na máquina que executa o comando ssh real para iniciar o túnel reverso (local). Na minha opinião, era de certa forma mais lógico que a outra extremidade (remota) lidasse com a onde aceitar conexões, uma vez que é de onde você se conecta e é redirecionado. Levei anos para contornar isso.
Ars Magika
2
@ArsMagika Não tenho certeza se estou entendendo você. O GatewayPorts deve ser definido no servidor SSH, não na máquina local que executa o sshcomando. Ele configura se outros clientes podem se comunicar com as portas encaminhadas no servidor.
Lekensteyn
Desvantagem desta solução: você perde a capacidade de determinar o endereço IP do cliente no log de acesso do servidor web. Alguma maneira de resolver esse incômodo também?
Twonky
@Twonky Se você não precisa saber o endereço IP exato do cliente (apenas que era remoto e não "localhost"), e seu servidor local está ouvindo o endereço curinga (por exemplo, aceitando conexões de qualquer endereço), você pode tentar encaminhar para -R :8000:127.0.1.1:80(ou qualquer outro 127.x.x.xendereço). Caso contrário, não, você não poderá aprender o endereço IP remoto.
Lekensteyn
14

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

FaST4
fonte