Como configurar o túnel ssh para encaminhar ssh?

13

Eu tenho um computador com o Ubuntu atrás do roteador que não consigo configurar. No entanto, eu quero ter acesso ssh a esse computador. Eu acho que é possível com o tunelamento ssh, mas não sei como fazê-lo. Eu tenho outro servidor no qual gostaria de configurar o encapsulamento. Como fazer isso? Ou talvez você tenha alguma outra idéia de como resolver esse problema?

Eu tentei:

ssh -N user@my_server -L 22/localhost/8090

mas diz:

bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 22
Could not request local forwarding.
klew
fonte

Respostas:

18

Você está solicitando que ele escute na porta 22 local e encaminhe as conexões para a porta 8090 de um sistema remoto. Você não pode fazer isso, porque a porta 22 local já foi acessada pelo servidor SSH local.

Eu acho que o que você está procurando é encaminhamento remoto. Substituindo -L 22:localhost:8090por-R 8090:localhost:22 informará o host remoto para escutar na porta 8090 e encaminhar solicitações para o servidor SSH.

Se você estiver deixando a conexão em execução para poder entrar mais tarde em um site remoto, precisará garantir que a conexão não atinja o tempo limite devido à inatividade adicionando as opções relevantes ( -o TCPKeepAlive=yesou-o ServerAliveInterval=30 )

Então você vai acabar com algo como:

ssh -N user@my_server -R 8090:localhost:22 -o ServerAliveInterval=30

Além disso, se um dos saltos de rede entre você e o servidor estiver inativo a qualquer momento, a conexão será interrompida, apesar das opções KeepAlive que você especificar, portanto, você pode adicionar esse comando ao inittab ou procurar no pacote daemontools ou na sua distribuição. equivalente, para que ele sempre inicie na inicialização e seja reiniciado quando for encerrado por algum motivo que não seja o desligamento do sistema (ou você pode executá-lo a partir de um shell script que executa loops infinitamente, mas init ou daemontools são soluções mais limpas).

David Spillett
fonte
Isso quase funciona. Posso conectar-me ao meu computador, mas só posso fazê-lo quando estiver conectado ao servidor. Eu gostaria de conectar através dessa porta de qualquer lugar.
klew
3
Se você adicionar o endereço público do servidor ou um curinga à definição de encaminhamento de porta (-R 111.222.333.444:8090:localhost:22 ou -R *: 8090: localhost: 22), isso poderá funcionar, embora esse tipo de coisa pode ser desativado no servidor. Se o servidor for um que você controla, verifique se a opção GatewayPorts está ativada no sshd_config.
David Spillett
Eu escrevi um script que me ajuda a fazer tunelamento ssh, você pode verificá-la em: github.com/gdbtek/ssh-tunneling
Nam Nguyen
A adição GatewayPorts Yesao meu sshd_config me ajudou a abrir a porta ao público.
Adam F
8

A razão pela qual você não pode fazer isso é porque está tentando encaminhar a porta 22 no computador local para a porta 8090 no servidor remoto e algo já está em execução na porta 22 no servidor local. Provavelmente você tem um servidor SSH em execução. Você pode corrigir isso alterando 22 para um valor diferente. Você pode verificar se uma porta está livre executando:

# netstat -lep --tcp

Isso lista todos os soquetes de escuta; portanto, se a porta não estiver listada, será gratuita.

David Pashley
fonte
3

Estou usando o comando lsof -i: PortNumber para verificar se a porta está livre:

# lsof -i :2272

se a porta estiver livre, você não verá nada na saída.

Taras
fonte