Mosh

Q: Quem escreveu Mosh?

Mosh foi escrito por Keith Winstein, juntamente com Anders Kaseorg, Quentin Smith, Richard Tibbetts, Keegan McAllister e John Hood.

P: Porquê outro protocolo remoto-terminal?

A latência prática na Internet está aumentando, com o aumento do bufferbloat e sofisticados links sem fio que otimizam para o throughput over delay. E o roaming é mais comum do que nunca, agora que os laptops e dispositivos portáteis deslocaram em grande parte os desktops. SSH é ótimo, mas frustrante de usar quando você quer mudar endereços IP ou ter um link de longa espera ou uma conexão duvidosa.

Além disso, a TELNET tinha algumas coisas boas – um modo de eco local e um terminal virtual de rede bem definido. Ainda hoje, o SSH não suporta UTF-8 de ponta a ponta em um sistema POSIX.

P: Os princípios mosh são relevantes para outras aplicações de rede?

Pensamos que sim. Os princípios de design que Mosh representa são conservadores: avisar o usuário se o estado exibido está desatualizado, serializar e verificar todas as transações para que, se não houver avisos, o usuário saiba que todas as transações anteriores foram bem sucedidas, e lidar com os eventos esperados (como roaming de uma rede WiFi para outra) graciosamente.

Estes não parecem muito controversos, mas aplicativos sofisticados como o Gmail-in-Chromium ou no Android ainda se comportam de forma atroz em conexões duvidosas ou depois de trocar de endereço IP. (Você já teve o Gmail deixando uma mensagem de e-mail em “Enviando…” por dez horas enquanto recuperava novos e-mails e não indicava nenhum tipo de erro? Para nós também). Achamos que pode haver um espaço considerável para melhorias em muitas interfaces de usuário de rede a partir da aplicação destes valores.

P: Estou recebendo “mosh requer um locale UTF-8”. Como eu posso corrigir isso?

Para diagnosticar o problema, execute locale no terminal local, e ssh remotehost locale. Para usar Mosh, ambos os lados da conexão precisarão mostrar um locale UTF-8, como LC_CTYPE="en_US.UTF-8".

Em muitos sistemas, o SSH irá transferir as variáveis de ambiente relacionadas ao local, que são então herdadas por mosh-server. Se este mecanismo falhar, Mosh (a partir da versão 1.2) irá passar as variáveis em si. Se nenhum dos dois mecanismos tiver sucesso, você pode fazer algo como

mosh remotehost --server="LANG=en_US.UTF-8 mosh-server"

Se en_US.UTF-8 não existir no servidor remoto, você pode substituir isto por um locale UTF-8 que existe. Você também pode precisar definir LANG localmente para o benefício de mosh-client. É possível que as máquinas locais e remotas precisem de diferentes nomes de locale. Veja também este ticket GitHub.

P: O que significa a mensagem “Nada recebido do servidor na porta UDP 60003”?

Isso significa que mosh foi capaz de iniciar mosh-server com sucesso na máquina remota, mas o cliente não é capaz de se comunicar com o servidor. Isto geralmente significa que algum tipo de firewall está bloqueando os pacotes UDP entre o cliente e o servidor. Se você tiver que encaminhar a porta TCP 22 em um NAT para SSH, então você terá que encaminhar as portas UDP também. Mosh irá usar a primeira porta UDP disponível, começando em 60001 e parando em 60999. Se você só vai ter um pequeno punhado de sessões simultâneas em um servidor, então você pode encaminhar uma gama menor de portas (por exemplo, 60000 para 60010).

Ferramentas como netstat, netcat, socat, e tcpdump podem ser úteis para depuração de problemas de rede e firewall.

Este problema também pode ser o resultado de um bug na glibc 2.22 que afeta programas que se ligam com protobuf e utempter e usam bandeiras agressivas de endurecimento do compilador. (entrada do glibc bugtracker, assim como a entrada do Mosh bugtracker). O problema faz com que o mosh-server segure a falha imediatamente na inicialização. Nós acreditamos ter trabalhado em torno deste problema no Mosh 1.2.6, mas por favor relate um bug se você achar o contrário.

P: Por que você insiste em UTF-8 em todos os lugares?

Não somos realmente fanáticos por UTF-8. Mas é muito mais fácil implementar corretamente um emulador de terminal do que tentar fazer a coisa certa em uma variedade de casos difíceis. (Isto é o que a tela do GNU tenta fazer, e em nossa experiência leva a algumas situações muito complicadas de se depurar). Portanto, mosh só inicia quando o usuário tiver tudo configurado para um caminho de limpeza UTF-8. Pode ser irritante, mas também provavelmente reduz a frustração no caminho. (Infelizmente um vt220 de 8 bits e um UTF-8 vt220 são tipos de terminais diferentes e incompatíveis; o UTF-8 entra por baixo da máquina de estado vt220.)

P: Como eu uso uma porta SSH diferente (não 22)?

Como do Mosh 1.2, você pode passar argumentos para ssh assim:

mosh remotehost --ssh="ssh -p 2222"

Configurar um host alias em ~/.ssh/config com uma diretiva Port. Mosh vai respeitar isso também.

P: Estou recebendo ‘mosh-server not found’.

Por favor certifique-se que o mosh está instalado no cliente, e o mosh (ou pelo menos o mosh-server) está instalado no servidor ao qual você está tentando se conectar. Além disso, espera-se que o servidor esteja disponível no login padrão do seu servidor PATH, o que normalmente não é verdade nos servidores OS X e BSD, ou se você instalar o mosh-server no seu diretório home. Nestes casos por favor veja as instruções “Server binary outside path” na secção Utilização, acima.

Q: O SSH autentica usando bilhetes Kerberos, mas o Mosh pede-me uma palavra-passe.

Em algumas configurações, o SSH canonicaliza o nome da máquina antes de o passar para o plugin GSSAPI do Kerberos. Isto quebra para Mosh, porque a pesquisa inicial do DNS é feita pelo script do wrapper Mosh. Para contornar isso, invoque Mosh como

mosh remotehost --ssh="ssh -o GSSAPITrustDns=no"

Isso frequentemente falhará em uma configuração de DNS round-robin. Nesse caso, provavelmente é melhor escolher um host específico a partir do round-robin pool.

P: Por que o buffer scrollback do meu terminal está incompleto?

Mosh sincroniza apenas o estado visível do terminal. Use o rastreamento deste problema; veja este problema e os outros que estão ligados a partir dele. Por enquanto, a solução é usar o screen ou tmux no lado remoto.

P: Como faço para obter 256 cores?

Certifique-se que está a correr mosh num terminal que se anuncia a si próprio como sendo capaz de 256 cores. (Isto geralmente significa que o TERM será xterm-256color ou screen-256color-bce.)

P: Como eu digito C-^, o caractere de escape padrão do Mosh?

Em teclados com o layout dos Estados Unidos, isto pode ser digitado como Ctrl-Shift-6, ou frequentemente como Ctrl-6 (isto depende do seu SO e emulador de terminal). Em teclados não americanos, muitas vezes é difícil encontrar a chave certa, e às vezes não está disponível de todo. Se o seu teclado tem uma tecla morta com um acento-circumflex, não é provável que esta seja a tecla certa. Mas o Ctrl-6 às vezes funciona. Se você não conseguir digitar este caractere, você precisará definir a variável MOSH_ESCAPE_KEY; veja a página de manual Mosh para detalhes.

P: Como posso fazer o servidor limpar automaticamente as sessões adormecidas?

Por favor veja as entradas para MOSH_SERVER_NETWORK_TMOUT e MOSH_SERVER_SIGNAL_TMOUT na página de manual mosh-server(1).

P: Qual é o histórico de segurança do Mosh até agora?

Mosh 1.0 foi lançado em março de 2012. Desde o lançamento do Mosh 1.3.2 em julho de 2017, até onde os desenvolvedores estão cientes:

  • Nos últimos quatro anos, nenhuma vulnerabilidade de segurança de qualquer tipo (maior ou menor) foi relatada no Mosh.
  • Nenhuma vulnerabilidade de segurança maior ou menor foi relatada em Mosh. Definimos grandes vulnerabilidades de segurança para incluir escalonamento de privilégios, execução remota de código, negação de serviço por terceiros, etc.
  • Duas questões de negação de serviço foram descobertas e corrigidas inreleases em 2012. Um problema permitiu que um mosh-server fizesse o cliente-mosh gastar excesso de CPU (CVE-2012-2385, corrigido em Mosh1.2.1, lançado em maio de 2012). Outro problema permitiu que o servidor servidor fizesse com que o cliente-mosh enviasse datagramas UDP para um endereço incorreto, impedindo sua tentativa de conexão (corrigido emMosh 1.2.3, lançado em outubro de 2012).

P: Como a segurança do Mosh se compara com a do SSH?

Pensamos que o design conservador do Mosh significa que sua superfície de ataque se compara favoravelmente com sistemas mais complicados como OpenSSL e OpenSSH. O histórico do Mosh tem até agora confirmado isso. No final das contas, no entanto, apenas o tempo dirá quando a primeira vulnerabilidade séria de segurança é descoberta em Mosh – seja porque ela estava lá o tempo todo ou porque foi adicionada inadvertidamente no desenvolvimento. OpenSSH e OpenSSL tiveram mais vulnerabilidades, mas eles também foram lançados por mais tempo e são mais prevalentes.

Em um aspecto concreto, o protocolo Mosh é mais seguro que o do SSH: O SSH depende de TCP não autenticado para carregar o conteúdo do fluxo seguro. Isso significa que um atacante pode terminar uma conexão SSH com um único segmento “RST” falso. Por outro lado, Mosh aplica sua segurança em uma camada diferente (autenticando cada datagrama), então um atacante não pode terminar uma sessão Mosh a menos que o atacante possa continuamente evitar que os pacotes cheguem ao outro lado. Um atacante transitório pode causar apenas uma interrupção transitória visível pelo usuário; uma vez que o atacante for embora, Mosh retomará a sessão.

No entanto, em uso típico, Mosh depende do SSH para trocar chaves no início de uma sessão, então Mosh herdará as fraquezas do SSH – pelo menos na medida em que elas afetam a breve sessão SSH que é usada para configurar uma sessão Mosh de longa duração.

P: Mosh é afetado pelos ataques de 2018 contra o modo de cifra OCB2?

Não que saibamos de-Mosh usa OCB3. Os autores do artigo escrevem que o ataque não é aplicável ao OCB3.

P: Porque é que o Mosh usa AES-128 para uma chave de sessão, e não AES-192 ou AES-256?

  • AES-128 é mais do que um comprimento de chave adequado para uma chave de sessão.
  • A FAQ da OCB recomenda AES-128.
  • AES-128 é um pouco mais agradável e não está sujeito aos ataques de chaves relacionadas que afligem o AES-192 e AES-256. (Schneier: “o calendário de chaves para a versão de 256 bits é muito ruim — algo que apontamos em nosso trabalho de 2000 — mas não se estende ao AES com uma chave de 128 bits”. Veja este post no blog.)

P: O mosh funciona com o Amazon EC2?

Sim, funciona bem, mas por favor lembre-se de abrir as portas UDP 60000-61000 no firewall EC2.

P: Como posso dizer se o mosh está funcionando corretamente?

Depois de correr mosh user@server, se tiver sucesso será largado na sua shell de login na máquina remota. Se você quiser verificar se o mosh está sendo usado ao invés do ssh, tente digitar Ctrl-^ Ctrl-Z para suspender a sessão (com mosh 1.2.4 ou posterior no cliente). Executando fg irá então retornar.

P: Qual é a diferença entre mosh, mosh-client, e mosh-server? Qual deles eu uso?

O comando mosh é um script wrapper que é projetado para ser a forma primária que você usa mosh. Na maioria dos casos, você pode simplesmente substituir “ssh” por “mosh” na sua linha de comando. Nos bastidores, o script de wrapper mosh irá SSH para o servidor, iniciar mosh-server, e então fechar a conexão SSH. Então ele iniciará o executável mosh-client no cliente, passando-lhe as informações necessárias para que ele se conecte à instância mosh-server recém-desovada.

Em uso normal, mosh-client e mosh-server não precisa ser executado diretamente.

P: Como eu executo o mosh cliente e servidor separadamente?

Se o script mosh wrapper não estiver funcionando para você, você pode tentar executar os programas mosh-client e mosh-server separadamente para formar uma conexão. Esta pode ser uma técnica de depuração útil.

1. Entre na máquina remota, e execute mosh-server.

>Dará saída como:

$ mosh-server MOSH CONNECT 60004 4NeCCgvZFe2RnPgrcU1PQwmosh-server (mosh 1.1.3)Copyright 2012 Keith Winstein <[email protected]>License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.

2. No host local, execute:

$ MOSH_KEY=key mosh-client remote-IP remote-PORT

onde “key” é a string de 22 bytes impressa pelo mosh-server (neste exemplo, “4NeCCgvZFe2RnPgrcU1PQw”), “remote-PORT” é o número de porta dado pelo servidor (60004 neste caso), e “remote-IP” é o endereço IP do servidor. Você pode procurar o endereço IP do servidor com “host remotehost”.

3. Se tudo correr bem, você deve ter uma conexão Mosh funcionando. Informação sobre onde o processo falha pode nos ajudar a depurar porque Mosh não está funcionando para você.

P: Com o mosh-server no FreeBSD ou OS X, às vezes eu tenho problemas de cor estranhos. O que está errado?

Este erro foi corrigido no Mosh 1.2. Graças a Ed Schouten e Peter Jeremy por rastrear isso.

P: Como eu posso contribuir com o mosh?

Apreciamos a sua contribuição! Por favor junte-se a nós em #mosh canal no Freenode IRC, visite-nos no GitHub, ou envie um e-mail para [email protected]. Para contribuir com a nossa base de código, por favor, bifurque o repositório no GitHub e abra um pedido de puxar lá.

P: Quem ajudou com o mosh?

Estamos muito gratos pela assistência e suporte de:

  • Hari Balakrishnan, que aconselhou este trabalho e veio com o nome.
  • Paul Williams, cujo diagrama de estado vt500 com engenharia reversa é a base para o analisador Mosh.
  • Os usuários anônimos que contribuíram com logs de sessão para afinar e medir o eco preditivo de Mosh.
  • Nickolai Zeldovich para comentários úteis sobre o artigo de pesquisa Mosh.
  • Richard Stallman para discussão útil sobre as capacidades do Protocolo de Edição Local do SUPDUP.
  • Nelson Elhage
  • Christine Spang
  • Stefie Tellex
  • >

  • Joseph Sokol-Margolis
  • Waseem Daher
  • Bill McCloskey
  • Austin Roach
  • >

  • Greg Hudson
  • Karl Ramm
  • Alexander Chernyakhovsky
  • Peter Iannucci
  • Evan Broder
  • Neha Narula
  • >

  • Katrina LaCurts
  • >

  • Ramesh Chandra
  • >

  • Peter Jeremy
  • >

  • Ed Schouten
  • Ryan Steinmetz
  • Jay Freeman
  • Dave Täht
  • Larry Doolittle
  • Daniel Drown
  • >

  • Timo Juhani Lindfors
  • Timo Sirainen
  • Ira Cooper
  • Felix Gröbert
  • >

  • Luke Mewburn
  • >

  • Anton Lundin
  • >

  • Philipp Haselwarter
  • >

  • Timo J. Rinne
  • Barosl Lee
  • Andrew Chin
  • Louis Kruger
  • >

  • Jérémie Courrèges-Anglas
  • Pasi Sjöholm
  • Richard Woodbury
  • Igor Bukanov
  • Geoffrey Thomas
  • Steve Dignam
  • HIGUCHI Yuta
  • Baruch Siach

Deixe uma resposta

O seu endereço de email não será publicado.