AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 428231
Accepted
LecauseAndThePi
LecauseAndThePi
Asked: 2018-03-06 03:43:45 +0800 CST2018-03-06 03:43:45 +0800 CST 2018-03-06 03:43:45 +0800 CST

SSH trava antes do prompt de login

  • 772

Eu tenho vários túneis ssh reversos configurados a partir de raspberry pis remotos, executando o debian jessie. Os RPIs usam um dongle 3G para obter conectividade intrnet, e é por isso que estou usando ssh reverso para fazer login remotamente. Cada RPI configura um túnel ssh reverso para um servidor em nuvem, que eu uso para fazer login em cada sistema.

Os túneis ssh são configurados da seguinte forma:

ssh -N -o ExitOnForwardFailure=yes -R 23xx:localhost:22 [email protected]

onde 23xx é a porta usada para encaminhar conexões da porta 22 e 178.xxxxx é o endereço IP do servidor.

Meu problema é que, às vezes, quando tento fazer o ssh em um sistema, ele trava para sempre, sem nenhum erro da seguinte forma:

ssh pi_username@localhost -p 23xx

O terminal simplesmente não emite nada depois disso e trava para sempre. Quando tento depurar usando -vvv, é isso que recebo:

ssh pi_username@localhost -p 23xx -vvv

OpenSSH_6.7p1 Debian-5+deb8u4, OpenSSL 1.0.1t  3 May 2016
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to localhost [::1] port 23xx.
debug1: Connection established.
debug1: key_load_public: No such file or directory
debug1: identity file /home/master/.ssh/id_rsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/master/.ssh/id_rsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/master/.ssh/id_dsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/master/.ssh/id_dsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/master/.ssh/id_ecdsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/master/.ssh/id_ecdsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/master/.ssh/id_ed25519 type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/master/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.7p1 Debian-5+deb8u4

Parece que a conexão foi estabelecida, mas o login não é solicitado. Alguma ideia? Alguma recomendação sobre como depurar ainda mais?

debian ssh
  • 2 2 respostas
  • 3400 Views

2 respostas

  • Voted
  1. Best Answer
    phemmer
    2018-03-06T05:56:39+08:002018-03-06T05:56:39+08:00

    Isso é apenas uma teoria, mas o que eu suspeito que esteja acontecendo é que as conexões TCP para suas sessões ssh estão morrendo, mas o "servidor em nuvem" não está detectando. Então, quando você vai fazer uma conexão com localhost -p 23xx, o processo ssh ainda está lá e ouvindo, mas quando ele tenta enviar dados de volta para o Pi, ele trava até que o número máximo de retransmissões TCP seja encontrado e finalmente decide que a conexão está morta e sai (você diz que trava para sempre, mas aposto que, se você esperasse o suficiente, conseguiria redefinir a conexão).
    Agora, supondo que você tenha o Pi configurado para se reconectar se o túnel ssh morrer, você pode pensar que isso deve resolver o problema. Há alguns problemas potenciais com essa ideia. A primeira é que o Pi também pode não estar detectando a conexão morta. Portanto, até que ele tente enviar dados e atinja o limite de retransmissão do TCP, ele não verá a conexão inativa e fará a reconexão. O segundo problema em potencial é que, mesmo que detecte a conexão inoperante e tente reconectar, não será capaz de estabelecer o ouvinte no servidor de nuvem porque o ssh anterior ainda está lá e segurando a porta.

    A solução aqui é configurar o ssh para que ele possa detectar as conexões mortas. Existem algumas maneiras de fazer isso, TCP KeepAlive e SSH KeepAlive. (ref: https://unix.stackexchange.com/a/34201/4358 )

    TCP KeepAlive ( TCPKeepAliveconfiguração na configuração ssh) usa a funcionalidade nativa de manutenção de atividade do TCP. Basicamente, o kernel envia um TCP ACK vazio a cada X segundos e, quando não recebe um ACK da outra ponta (ou é reiniciado), fecha a conexão que notifica o aplicativo (SSH).

    SSH KeepAlive (as configurações ServerAlive*& ClientAlive*) é semelhante, mas opera em uma camada superior. Aqui, o processo SSH envia dados reais por meio da conexão e procura uma resposta. Isso deve detectar uma conexão morta tão bem quanto um TCP KeepAlive normal, no entanto, é mais provável que mantenha a conexão ativa, pois os saltos no meio podem reconhecer pacotes TCP KeepAlive e ignorá-los e expirar a conexão ociosa. Mas um SSH KeepAlive não pode ser reconhecido, pois parece tráfego real para qualquer salto no meio.

    TL;DR:

    No raspberry Pis, adicione as seguintes configurações à configuração do cliente ssh ( ~/.ssh/configou /etc/ssh/ssh_config):

    ServerAliveInterval 15
    ServerAliveCountMax 1
    

    ( documentação )

    No servidor, adicione as seguintes configurações ao seu ssh daemon config ( /etc/ssh/sshd_config):

    ClientAliveInterval 20
    ClientAliveCountMax 1
    

    ( documentação )

    Observe que fiz o valor do intervalo um pouco mais alto. A razão para isso é apenas para que ambos os lados não enviem suas mensagens KeepAlive exatamente ao mesmo tempo e se cruzem no fio. Não há nenhum dano real nisso, apenas uma pequena ineficiência. Também não importa qual lado é mais alto, desde que sejam diferentes.

    • 4
  2. Rahul Bali
    2020-09-13T06:20:12+08:002020-09-13T06:20:12+08:00

    Eu tenho o mesmo problema.

    $ ifconfig wlan0
    wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.1.9  netmask 255.255.255.0  broadcast 192.168.1.255
            inet6 fe80::d949:d257:c622:3388  prefixlen 64  scopeid 0x20<link>
            ether 18:1d:ea:00:4e:cf  txqueuelen 1000  (Ethernet)
            RX packets 333970  bytes 471184965 (449.3 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 76462  bytes 9787485 (9.3 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

    Altere o valor de mtu para 1200. ( MTU )

    $ ifconfig wlan0
    wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1200
            inet 192.168.1.9  netmask 255.255.255.0  broadcast 192.168.1.255
            ether 18:1d:ea:00:4e:cf  txqueuelen 1000  (Ethernet)
            RX packets 334117  bytes 471271158 (449.4 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 76604  bytes 9808842 (9.3 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

    SSH conectado como esperado depois disso. Espero que esta resposta encurte sua busca por soluções alternativas. :)

    • 0

relate perguntas

  • Configuração do GRUB para reconhecer diferentes ambientes de desktop (instalações) da mesma distribuição Linux

  • astyle não altera a formatação do arquivo de origem

  • Recebendo e-mail em um novo Debian fresco

  • Debian Stretch: gnome-software segfault em libgs_plugin_systemd-updates.so

  • Como digitar ü no Pinyin IME?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve