2013-04-27 22:14:51 +0000 2013-04-27 22:14:51 +0000
189
189

Como tornar o túnel ssh aberto ao público?

Bem, voltando a isto pergunta, estou a executar o comando

ssh -R 8080:localhost:80 -N root@example.com

num Mac. No entanto, a porta que está a ser afinada não está a funcionar publicamente. Estou a executar um tal comando para que a porta local possa ser aberta no computador remoto. E funciona quando se abre a porta no computador remoto, mas quando tento aceder ao endereço IP público do computador remoto a partir do meu computador local, a porta não parece estar aberta. Como tornaria o túnel público no IP para que qualquer pessoa possa aceder?

EDIT: Parece que o lado remoto se liga apenas ao localhost em vez de a todas as interfaces.

EDIT 2: O cliente é Mac OS X 10.6 e o servidor é Linux Mint, mas ambos são OpenSSH.

Respostas (7)

368
368
368
2013-05-06 06:11:42 +0000

Se verificar a página de homem para ssh, verá que a sintaxe para -R lê:

-R [_bind\_address_:]_port_:_host_:_hostport_

Quando `bindaddress`_ é omitido (como no seu exemplo), a porta é ligada apenas na interface loopback. A fim de a ligar a todas as interfaces, utilizar

ssh -R \*:8080:localhost:80 -N root@example.com
ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com

ou

ssh -R "[::]:8080:localhost:80" -N root@example.com

0x1&

A primeira versão liga-se a todas as interfaces individualmente. A segunda versão cria uma ligação geral apenas para IPv4, o que significa que a porta é acessível em todas as interfaces via IPv4. A terceira versão é provavelmente equivalente tecnicamente à primeira, mas mais uma vez cria apenas um bind a ::, o que significa que a porta é acessível via IPv6 nativamente e via IPv4 através de endereços IPv4-mapped IPv6 (não funciona em Windows, OpenBSD).   (Precisa das aspas porque [::] poderia ser interpretado como um glob de outra forma.)

Note que se utilizar o OpenSSH sshd servidor, a opção GatewayPorts do servidor precisa de ser activada (definida para yes ou clientspecified) para que isto funcione (verifique o ficheiro /etc/ssh/sshd_config no servidor). Caso contrário (valor por defeito para esta opção é no), o servidor forçará sempre a porta a ser ligada apenas na interface de loopback.

40
40
40
2013-04-28 03:34:48 +0000

Editar:

-g funciona para portos encaminhados locais, mas o que se pretende é um porto encaminhado inverso/remoto, o que é diferente.

O que pretende é isto .

Essencialmente, em example.com, definir GatewayPorts=clientspecified em /etc/ssh/sshd_config.

— resposta anterior (incorrecta) —

Use a opção -g. A partir da página de manual do ssh:

-g Allows remote hosts to connect to local forwarded ports.
15
15
15
2013-10-29 12:09:40 +0000

Aqui está a minha resposta para conclusão:

acabei por usar ssh -R ... para a construção de túneis, e usando socat além disso para redireccionar o tráfego da rede para 127.0.0.1:

túnel ligado a 127.0.0.0.1: ssh -R mitm:9999:<my.ip>:8084 me@mitm

socat: mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999

Outra opção é fazer um túnel apenas local em cima disso, mas acho isto much mais lento

mitm$ ssh -L<mitm.ip.address>:9090:localhost:9999 localhost

10
10
10
2016-08-01 22:37:07 +0000

Também pode usar um duplo avanço se não quiser ou puder alterar /etc/ssh/sshd_config.

Primeiro encaminhar para a porta temporária (por exemplo 10080) no dispositivo de loopback na máquina remota, depois utilizar o encaminhamento local para lá para redireccionar a porta 10080 para 80 em todas as interfaces:

ssh -A -R 10080:localhost_or_machine_from:80 user@remote.tld "ssh -g -N -L 80:localhost:10080 localhost"
8
8
8
2013-04-28 13:58:50 +0000

Utilizar a opção “portas de entrada”.

ssh -g -R REMOTE_PORT:HOST:PORT ...

Para usar isso, provavelmente terá de adicionar “GatewayPorts yes” ao /etc/ssh/sshd_config do seu servidor.

2
2
2
2019-06-03 20:09:02 +0000

Os anfitriões dos saltos ](https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Jump_Hosts_–_Passing_Through_a_Gateway_or_Two) são uma adição bastante recente ao OpenSSH. Isto requer acesso SSH ao intermediário, mas deve funcionar sem configuração adicional.

ssh -J root@example.com remoteuser@localhost -p 8080

Este comando instrui o SSH a ligar-se primeiro a root@example.com, e depois, a partir dessa máquina, a iniciar uma ligação à porta 8080 a localhost (isto é, a porta que é tunelada do hospedeiro de salto para o hospedeiro remoto) sob o nome de utilizador remoteuser.

0
0
0
2018-08-26 15:50:49 +0000

Se quiser colocar a configuração ~/.ssh/config em vez de usar parâmetros de linha de comando, pode tentar algo como

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

Lembre-se de ter a firewall do seu anfitrião remoto a permitir ligações a 8080 e assegurar que a opção GatewayPorts da sua /etc/ssh/sshd configuração não está definida para no.