túnel ssh recusando conexões com o "canal 2: falha na abertura"

70

De repente (leia-se: sem alterar nenhum parâmetro), minha máquina virtual netbsd começou a agir de maneira estranha. Os sintomas dizem respeito ao tunelamento ssh.

Do meu laptop eu lanço:

$ ssh -L 7000:localhost:7000 user@host -N -v

Então, em outra concha:

$ irssi -c localhost -p 7000

O debug ssh diz:

debug1: Connection to port 7000 forwarding to localhost port 7000 requested.
debug1: channel 2: new [direct-tcpip]
channel 2: open failed: connect failed: Connection refused
debug1: channel 2: free: direct-tcpip: listening port 7000 for localhost port 7000, connect from 127.0.0.1 port 53954, nchannels 3

Tentei também com o localhost: 80 para conectar ao servidor da Web (remoto), com resultados idênticos.

O host remoto executa o NetBSD:

bash-4.2# uname -a
NetBSD host 5.1_STABLE NetBSD 5.1_STABLE (XEN3PAE_DOMU) #6: Fri Nov  4 16:56:31 MET 2011  root@youll-thank-me-later:/m/obj/m/src/sys/arch/i386/compile/XEN3PAE_DOMU i386

Estou um pouco perdido. Tentei rodar tcpdumpno host remoto e vi esses 'bad chksum':

09:25:55.823849 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 67, bad cksum 0 (->3cb3)!) 127.0.0.1.54381 > 127.0.0.1.7000: P, cksum 0xfe37 (incorrect (-> 0xa801), 1622402406:1622402421(15) ack 1635127887 win 4096 <nop,nop,timestamp 5002727 5002603>

Tentei reiniciar o daemon ssh sem sucesso. Ainda não reiniciei - talvez alguém aqui possa sugerir outros diagnósticos. Eu acho que pode ser o driver da placa de rede virtual ou alguém enraizou nosso ssh.

Idéias ..?

Lorenzog
fonte
11
Para solução de problemas, tente $ ssh -L 7000:127.0.0.1:7000 user@host -N -v -v. (Você pode usar "-v" até 3 vezes para aumentar a verbosidade.) Além disso, é possível que o ssh tenha sido atualizado recentemente?
Mike Sherrill 'Cat Recall'
O log de saída que colei já foi coletado com -v.
Lorenzog 31/03
11
Você pode usar -v até três vezes para aumentar a verbosidade. Então você pode olhar para a saída de ssh -L 7000... -N -v -v(dois v's) ou ssh -L 7000... -N -v -v -v.
Mike Sherrill 'Cat Recall'
@ MikeSherrill'CatRecall' A taquigrafia pode ser usado como bem: -vvv
jnns

Respostas:

42

Problema resolvido:

$ ssh -L 7000:127.0.0.1:7000 user@host -N -v -v

... aparentemente, ' localhost ' não foi apreciado pelo host remoto. No entanto, remoto /etc/hostscontém:

::1                     localhost localhost.
127.0.0.1               localhost localhost.

enquanto a interface de rede local estiver

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33184
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2

Suspiro. tanto para a recompensa de 100rp eu coloquei :)

Lorenzog
fonte
11
Ah Bem, então, não vou me incomodar em escrever meu comentário como resposta. (Verifique se o ssh prefere endereços IPv6 no seu sistema.)
Mike Sherrill 'Cat Recall'
Bem, você sugeriu dobrar a opção -v, mas isso não mostrou nada de novo .. no entanto, ao me fazer olhar para a saída novamente depois de alguns dias, ajudou a identificar o problema. Se você quiser escrever a resposta, fico feliz em lhe dar a recompensa.
Lorenzog
11
Na verdade, o ponto importante foi substituir "localhost" por "127.0.0.1". Os argumentos "-v" adicionais podem ter sido úteis, mas não eram o que eu pretendia. Obrigado.
Mike Sherrill 'Cat Recall'
de acordo com esse post no superusuário: superuser.com/questions/346971/ssh-tunnel-connection-refused um programa configurado para escutar em um endereço específico vai ouvir esse endereço específico
jopasserat
11
Para mim acrescentando líder ":" funciona tão comando no seu caso seria algo como isto: ssh -L: 7000: 127.0.0.1: utilizador 7000 @ host -N -v -v
valentt
21

Embora o problema do OP já tenha sido resolvido, decidi compartilhar a solução para o meu problema, porque recebi a mesma mensagem de erro do ssh e não encontrei nenhuma solução em outros sites.

No meu caso, tive que me conectar ao serviço que escuta apenas no IPv6. Eu tentei:

ssh -f [email protected] -L 51005: 127.0.0.1: 51005 -N
ssh -f [email protected] -L 51005: localhost: 51005 -N

e algumas outras maneiras, mas não funcionou. Qualquer tentativa de conexão http://localhost:51005causa erros como este: channel 2: open failed: connect failed: Connection refused

A solução é:

ssh -f [email protected] -L 51005: [:: 1]: 51005 -N

O endereço IPv6 deve estar entre colchetes.

rzymek
fonte
11
E se você estiver usando um arquivo de configuração ssh? exemplo: "LocalForward localhost: 64160 192.168.1.56:3389"
meffect
Para mim, a adição de ":" à esquerda funciona para que o comando no seu caso tenha a seguinte aparência: ssh -f [email protected] -L: 51005: 127.0.0.1: 51005 -N
valentt
9

Eu tentaria primeiro isso.

$ ssh -L 7000:127.0.0.1:7000 user@host -N -v -v

Você pode usar "-v" até 3 vezes para aumentar a verbosidade.

Acho que essa mensagem de erro pode surgir se um firewall bloquear a porta 7000, mas você já descartou isso. (Se os leitores posteriores não descartarem isso, veja a saída de netstat --numeric-ports.)

Eu acho que eu poderia ter visto esta mensagem de erro muito tempo atrás, quando ssh teve conhecimento de endereços IPv6 após uma atualização. Eu posso estar errado sobre isso. Se você quiser experimentar, tente o endereço de loopback IPV6 "0: 0: 0: 0: 0: 0: 0: 1" (ou ":: 1").

Mike Sherrill 'Rechamada de gato'
fonte
3

"... aparentemente, 'localhost' não foi apreciado pelo host remoto. Ainda assim, o / etc / hosts remoto contém:"

Exceto que você estava executando o ssh no cliente, portanto, 'localhost' não foi apreciado pelo seu cliente. O arquivo remoto / etc / hosts é para o controle remoto de conexão para fora não recebidas conexões.

Bilbo Bolseiro
fonte
11
isso também foi confuso para mim. Quando você digita localhost na sua máquina local, ele é resolvido localmente
Ahmedov
3

Encontrei esse mesmo erro ao tentar conectar-me ao mysql em outro servidor via um túnel ssh. Eu descobri que o parâmetro de endereço de ligação no /etc/my.cnf no servidor de destino estava vinculado ao meu ip externo (servidor NIC duplo) em vez de interno, para o qual eu não usava.

Ao definir o endereço de ligação = 127.0.0.1, eu poderia usar com êxito meu túnel ssh da seguinte maneira:

ssh -N -f -L 3307:127.0.0.1:3306 [email protected]

mysql -h 127.0.0.1 --port=3307 --protocol=TCP -uusername -ppassword
Tom McQuarrie
fonte
Isso funcionou para mim também. Você só pode vincular o MySQL a um endereço.
leeand00
3

Encontrei este erro quando encaminhava portas com um nome de domínio completo em vez de localhost:

ssh -L 5900:host.name.com:5900 x11vnc

A porta estava sendo aberta apenas para o host local, portanto, para aceitar conexões com um nome completo, tive que adicionar uma descrição da porta de ligação :

ssh -L *:5900:host.name.com:5900 x11vnc

que permitiria conexões de qualquer lugar (por isso não é tão seguro, use-o com moderação).

cengique
fonte
2

Para mim, a adição de ":" à esquerda funciona para que o comando no seu caso fique assim:

ssh -L :7000:localhost:7000 user@host -N -v
valentt
fonte
Passou muito tempo e não posso voltar e verificar, mas isso parece ótimo.
Lorenzog 13/04
1

???

canal 2: aberto falhou: conexão falhou: conexão recusada

Na user@hostporta de escuta 7000, nada é simples e é tudo.

poige
fonte
11
Isso não é verdade. Há um serviço em execução no host: 7000. Eu também tentei com outros serviços.
Lorenzog 31/03
2
Não, então ele simplesmente trava de conexão.
RickyA
4
@ RickyA: Na verdade, isso não é verdade. Se a porta não estiver ligada, a conexão será recusada. Recebi esse erro ao usar a porta interna errada (onde nenhum serviço estava sendo executado), o erro desapareceu quando corrigi o erro. poige está certo em que, se nada estiver escutando na porta, isso causará o erro.
erb
1

Recebi a mesma mensagem de erro:

canal 3: falha na abertura: falha na conexão: conexão recusada

E a causa foi um erro humano - eu tentando acessar uma porta diferente no host remoto daquela que eu especifiquei.

Apenas pensei em compartilhar isso, embora provavelmente esse não seja o motivo pelo qual a maioria de vocês esteja enfrentando esse erro.

Roei Bahumi
fonte
No meu caso: é exatamente isso que eu estava fazendo. Um erro tão estúpido, mas foi preciso esta resposta para me fazer checar a porta. Doh.
Ken afiada
1

Para mim, eu estava tentando ssh -L <port>:<remote server IP>:<port> <login>@<remote server IP>quando deveria estar fazendo ssh -L <port>:127.0.0.1:<port> <login>@<remote server IP>.

Espero que isso ajude alguém!

ryanwc
fonte
1

Interpretação alternativa é, no meu caso, você digitar errado.

user@host ~ $ ssh -vvvNL 4444:127.0.0.0.1:4444
...
channel 2: open failed: connect failed: Name or service not known

O que acontece aqui é que o endereço IP tem muitos zeros, não sendo, portanto, um endereço válido. Portanto, o ssh o trata como um nome de domínio, que não pode ser resolvido. Opa!

PS: Complemento isso para que tenhamos uma lista abrangente de possíveis problemas ao solucionar os mesmos sintomas.

Hincor
fonte