Limites da multiplexação SSH

26

Eu tenho a seguinte entrada no meu .ssh/configarquivo

Host AAA
    User BBB
    HostName CCC
    ControlMaster auto
    ControlPath ~/.ssh/%r@%h:%p

O exposto acima permite-me multiplexar várias sessões ssh através da mesma conexão ssh sem precisar digitar a senha toda vez que precisar de uma nova sessão (desde que a conexão principal permaneça aberta).

No entanto, notei que, quando tenho um número relativamente alto de conexões multiplexadas (~ 7), não consigo adicionar mais sessões à mesma conexão multiplexada e começo a receber o seguinte erro:

> ssh -X AAA

mux_client_request_session: session request failed: Session open refused by peer
Password: 

Minhas perguntas:

Por que estou recebendo esse erro? Existe um limite no número de sessões ssh que posso multiplexar na mesma conexão? Posso mudar esse limite? Seria uma má ideia?

Amelio Vazquez-Reina
fonte
2
Não consigo responder às perguntas diretamente, mas posso oferecer algumas sugestões para rastrear o problema. Como o ponto recusou a conexão, eu começaria examinando os logs no sistema ao qual você está se conectando. Veja se sshd dá algum erro. Caso contrário, aumente o LogLevel e tente novamente. Se você encontrar uma mensagem de log que não seja imediatamente óbvia e a busca pela frase não ajudar, use grep no código-fonte. As mensagens de erro são frequentemente cercadas por conjuntos de condições - um (ou alguns) deles não foram atendidos, e é por isso que essa mensagem surgiu.
Shawn J. Goff

Respostas:

26

O sshddaemon no servidor está limitando o número de sessões por conexão de rede. Isso é controlado pela MaxSessionsopção in /etc/ssh/sshd_config. Além disso, MaxStartupspode ser necessário aumentar a opção se você usar um grande número de sessões. (Veja man sshd_configpara mais detalhes.) A opção para modificar o MaxSessionslimite foi introduzida no OpenSSH 5.1 e parece que o número foi corrigido anteriormente em 10. Se você exceder MaxSessionso servidor, verá sshd[####]: error: no more sessionsno log do servidor.

rozcietrzewiacz
fonte
4

Encontrei esse problema em um servidor com uma versão anterior do OpenSSH. Eu controlo o servidor e resolvi o problema criando dois CNAMEs na minha configuração nomeada:

realhost.myexample.com.      IN  A       XXX.XXX.XXX.XXX
realhost2.myexample.com.     IN  CNAME   realhost.myexample.com.
realhost3.myexample.com.     IN  CNAME   realhost.myexample.com.

Então, na minha configuração local do cliente ssh:

ControlMaster auto
ControlPath ~/.ssh/%r_%p_%h

host realhost
hostname realhost.myexample.com

host realhost2
hostname realhost2.myexample.com

host realhost3
hostname realhost3.myexample.com

A instrução ControlPath é para que os nomes dos soquetes de controle não se interajam.

É isso, mas para facilitar o gerenciamento, escrevi um script de wrapper para 'ssh' no lado do cliente. Ele entende que existem 'grupos' de hosts (neste caso, realhost, realhost1, realhost2 compõem um grupo). Ao emitir 'sshwrapper realhost', se não houver canais abertos, todos os três serão abertos e uma sessão será iniciada. Na próxima vez em que for executado, conta as conexões abertas por canal e abre a nova sessão no canal com o menor número de conexões.

Com um real e dois hosts 'falsos', eu posso conectar 30 vezes antes de receber um erro. O login é extremamente rápido, exceto que o tempo inicial leva um ou dois segundos, pois todos os três canais de controle são abertos naquele momento.

Joe
fonte
O script soa como uma economia de tempo real e seria realmente útil. Se você ainda o tiver, se importaria de compartilhá-lo com o público?
thefourtheye
Não sei se é apropriado aqui, pois não é a resposta para uma pergunta. Além disso, eu escrevi para mim mesmo e é executado em um cliente Mac (para acessar meus servidores Linux). O código analisa a saída 'ps' e precisaria ser alterado para ser executado no Linux, devido à sintaxe 'ps' diferente.
joe
Justo. Obrigado por compartilhar a ideia geral.
thefourtheye 11/09
Coloquei o script em moosiefinance.com:8081/sshm.zip.
joe
Impressionante ... Muito obrigado ... Deixe-me passar por isso
thefourtheye