Mosh

Q: Wie heeft Mosh geschreven?

Mosh is geschreven door Keith Winstein, samen met Anders Kaseorg, Quentin Smith, Richard Tibbetts, Keegan McAllister, en John Hood.

Q: Waarom nog een remote-terminal protocol?

Praktische latency op het Internet neemt toe, met de opkomst van bufferbloat en geavanceerde draadloze verbindingen die optimaliseren voor doorvoer boven vertraging. En roaming is gebruikelijker dan ooit, nu laptops en handhelds hun desktops grotendeels hebben verdrongen. SSH is geweldig, maar frustrerend om te gebruiken als je IP adressen wilt veranderen of een lange-vertraging link hebt of een onbetrouwbare verbinding.

Bovendien, TELNET had een aantal goede dingen – een local-echo mode en een goed gedefinieerde netwerk virtuele terminal. Zelfs vandaag de dag ondersteunt SSH UTF-8 niet goed end-to-end op een POSIX-systeem.

V: Zijn de mosh-principes relevant voor andere netwerktoepassingen?

Wij denken van wel. De ontwerpprincipes waar Mosh voor staat zijn conservatief: de gebruiker waarschuwen als de status die wordt weergegeven verouderd is, serialiseren en checkpointing van alle transacties, zodat als er geen waarschuwingen zijn, de gebruiker weet dat elke voorafgaande transactie is geslaagd, en het netjes afhandelen van verwachte gebeurtenissen (zoals roaming van het ene WiFi-netwerk naar het andere).

Dit lijkt niet al te controversieel, maar fancy apps zoals Gmail-in-Chromium of op Android gedragen zich nog steeds afschuwelijk op onbetrouwbare verbindingen of na het wisselen van IP-adressen. (Heb je ooit gehad dat Gmail een e-mailbericht tien uur lang in “Verzenden…” liet staan terwijl het vrolijk nieuwe mail ophaalde en geen enkele fout aangaf? Wij ook.) Wij denken dat er aanzienlijke ruimte is voor verbetering in veel netwerk user interfaces door de toepassing van deze waarden.

Q: Ik krijg “mosh vereist een UTF-8 locale.” Hoe kan ik dit oplossen?

Om het probleem vast te stellen, voert u locale uit op de lokale terminal, en ssh remotehost locale. Om Mosh te kunnen gebruiken, moeten beide kanten van de verbinding een UTF-8 locale tonen, zoals LC_CTYPE="en_US.UTF-8".

Op veel systemen zal SSH de locale-gerelateerde omgevingsvariabelen overdragen, die vervolgens worden overgenomen door mosh-server. Als dit mechanisme faalt, geeft Mosh (vanaf versie 1.2) de variabelen zelf door. Als geen van beide mechanismen werkt, kunt u iets doen als

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

Als en_US.UTF-8 niet bestaat op de server op afstand, kunt u dit vervangen door een UTF-8 locale die wel bestaat. Het kan ook zijn dat u LANG lokaal moet instellen ten gunste van mosh-client. Het is mogelijk dat de lokale en remote machines verschillende locale namen nodig hebben. Zie ook dit GitHub ticket.

V: Wat betekent het bericht “Niets ontvangen van de server op UDP poort 60003”?

Dit betekent dat mosh in staat was om mosh-server succesvol te starten op de externe machine, maar de client is niet in staat om te communiceren met de server. Dit betekent over het algemeen dat een of andere firewall de UDP-pakketten tussen de client en de server blokkeert. Als u TCP poort 22 moest doorsturen op een NAT voor SSH, dan zult u ook UDP-poorten moeten doorsturen. Mosh zal de eerste beschikbare UDP poort gebruiken, beginnend bij 60001 en eindigend bij 60999. Als u slechts een handvol gelijktijdige sessies op een server wilt hebben, dan kunt u een kleinere reeks poorten doorsturen (bijvoorbeeld 60000 tot 60010).

Hulpmiddelen als netstat, netcat, socat, en tcpdump kunnen nuttig zijn voor het debuggen van netwerk- en firewall problemen.

Dit probleem kan ook het gevolg zijn van een bug in glibc 2.22 die programma’s beïnvloedt die linken met protobuf en utempter en agressieve compiler hardening flags gebruiken. (glibc bugtracker entry, evenals Mosh bugtracker entry.) Het probleem veroorzaakt een onmiddellijke segfault van mosh-server bij het opstarten. We denken dat we dit probleem hebben opgelost in Mosh 1.2.6, maar meldt u alstublieft een bug als u iets anders vindt.

V: Waarom staan jullie overal op UTF-8?

We zijn echt geen UTF-8 fanaten. Maar het is een stuk eenvoudiger om één terminal emulator correct te implementeren dan om te proberen het juiste te doen in een verscheidenheid van moeilijke randgevallen. (Dit is wat GNU screen probeert te doen, en in onze ervaring leidt het tot een aantal zeer lastig te debuggen situaties). Dus mosh start gewoon niet op totdat de gebruiker alles heeft geconfigureerd voor een UTF-8-schoon pad. Dat is misschien vervelend, maar het vermindert waarschijnlijk ook de frustratie in de toekomst. (Helaas zijn een 8-bit vt220 en een UTF-8 vt220 verschillende en incompatibele terminal types; de UTF-8 gaat onder de vt220 state machine.)

V: Hoe gebruik ik een andere SSH poort (niet 22)?

Vanaf Mosh 1.2 kunt u argumenten aan ssh doorgeven zoals:

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

Of configureer een host alias in ~/.ssh/config met een Port directief. Mosh zal dat ook respecteren.

V: Ik krijg ‘mosh-server niet gevonden’.

Zorg ervoor dat mosh op de client is geïnstalleerd, en dat mosh (of tenminste mosh-server) is geïnstalleerd op de server waarmee u verbinding probeert te maken. Ook wordt verwacht dat de server beschikbaar is op de standaard login PATH van uw server, wat meestal niet het geval is op OS X- en BSD-servers, of als u mosh-server installeert in uw home directory. Zie in deze gevallen de instructies “Server binary outside path” in de sectie Gebruik, hierboven.

Q: SSH authenticeert met Kerberos tickets, maar Mosh vraagt me om een wachtwoord.

In sommige configuraties canonicaliseert SSH de hostnaam voordat het die doorgeeft aan de Kerberos GSSAPI plugin. Dit werkt niet voor Mosh, omdat de initiële forward DNS lookup wordt gedaan door het Mosh wrapper script. Om dit te omzeilen kan Mosh aangeroepen worden als

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

Dit zal vaak mislukken bij een round-robin DNS opstelling. In dat geval is het waarschijnlijk het beste om een specifieke host uit de round-robin pool te kiezen.

V: Waarom is de scrollback buffer van mijn terminal onvolledig?

Mosh synchroniseert alleen de zichtbare status van de terminal. We volgen dit probleem; zie dit probleem en de anderen die er aan gelinkt zijn. Voor nu is de workaround het gebruik van screen of tmux aan de remote kant.

Q: Hoe krijg ik 256 kleuren?

Zorg ervoor dat u mosh uitvoert in een terminal die zichzelf aanprijst als geschikt voor 256 kleuren. (Dit betekent over het algemeen dat TERM xterm-256color of screen-256color-bce zal zijn.)

V: Hoe typ ik C-^, Mosh’s standaard escape karakter?

Op toetsenborden met de Amerikaanse indeling kan dit worden getypt als Ctrl-Shift-6, of vaak als Ctrl-6 (dit hangt af van uw OS en terminal emulator). Op niet-Amerikaanse toetsenborden is het vaak moeilijk om de juiste toets te vinden, en soms is hij helemaal niet beschikbaar. Als uw toetsenbord een dode toets met een accent-circumflex heeft, is dit waarschijnlijk niet de juiste toets. Ctrl-6 werkt soms wel. Als u dit karakter niet kunt typen, moet u de variabele MOSH_ESCAPE_KEY instellen; zie de Mosh man page voor details.

V: Hoe kan ik de server automatisch slapende sessies laten opruimen?

Zie de entries voor MOSH_SERVER_NETWORK_TMOUT en MOSH_SERVER_SIGNAL_TMOUT in de mosh-server(1) man page.

V: Hoe staat het met de veiligheid van Mosh tot nu toe?

Mosh 1.0 werd uitgebracht in maart 2012. Vanaf de release van Mosh 1.3.2 in juli 2017, voor zover de ontwikkelaars weten:

  • In de afgelopen vier jaar zijn er geen beveiligingslekken van welke aard dan ook (major of minor) gerapporteerd in Mosh.
  • Er zijn nooit grote beveiligingslekken in Mosh gerapporteerd. We definiëren grote beveiligingsproblemen als privilege-escalatie, remote code-executie, denial-of-service door derden, etc.
  • Twee denial-of-service-problemen zijn ontdekt en verholpen in releases in 2012. Door één probleem kon een mosh-server ertoe leiden dat de mosh-client te veel CPU gebruikte (CVE-2012-2385, opgelost in Mosh1.2.1, uitgebracht in mei 2012). Een ander probleem zorgde ervoor dat de serverhost UDP-datagrammen naar een verkeerd adres stuurde, waardoor de mosh-client geen verbinding kon maken (opgelost in Mosh 1.2.3, uitgebracht in oktober 2012).

V: Hoe verhoudt de beveiliging van Mosh zich tot die van SSH?

We denken dat het conservatieve ontwerp van Mosh betekent dat het aanvalsoppervlak gunstig afsteekt bij meer gecompliceerde systemen als OpenSSL en OpenSSH. Mosh’s staat van dienst heeft dit tot nu toe bewezen. Uiteindelijk zal echter alleen de tijd leren wanneer het eerste serieuze beveiligingslek in Mosh wordt ontdekt-hetzij omdat het er al die tijd al in zat, hetzij omdat het onopzettelijk is toegevoegd tijdens de ontwikkeling. OpenSSH en OpenSSL hebben meer kwetsbaarheden gehad, maar ze zijn ook langer uitgebracht en meer gangbaar.

In één concreet opzicht is het Mosh protocol veiliger dan dat van SSH: SSH vertrouwt op niet-geverifieerde TCP om de inhoud van de beveiligde stroom te vervoeren. Dat betekent dat een aanvaller een SSH-verbinding kan beëindigen met een enkel vals “RST”-segment. Mosh daarentegen past zijn beveiliging toe op een andere laag (waarbij ieder datagram wordt geauthenticeerd), zodat een aanvaller een Mosh-sessie niet kan beëindigen tenzij de aanvaller continu kan voorkomen dat pakketten de andere kant bereiken. Een voorbijgaande aanvaller kan slechts een voorbijgaande, voor de gebruiker zichtbare, onderbreking veroorzaken; zodra de aanvaller weg is, zal Mosh de sessie hervatten.

Bij normaal gebruik vertrouwt Mosh echter op SSH voor het uitwisselen van sleutels aan het begin van een sessie, dus Mosh zal de zwakheden van SSH erven – althans voor zover ze van invloed zijn op de korte SSH-sessie die wordt gebruikt om een langlopende Mosh-sessie op te zetten.

V: Wordt Mosh beïnvloed door de 2018-aanvallen tegen de OCB2-cipher mode?

Niet dat we weten-Mosh gebruikt OCB3. De auteurs van het artikel schrijven dat de aanval niet van toepassing is op OCB3.

V: Waarom gebruikt Mosh AES-128 voor een sessie-sleutel, en niet AES-192 of AES-256?

  • AES-128 is een meer dan adequate sleutellengte voor een sessiesleutel.
  • De OCB FAQ beveelt AES-128 aan.
  • AES-128 is een beetje mooier en is niet onderhevig aan de related-key aanvallen die AES-192 en AES-256 teisteren. (Schneier: “het sleutelschema voor de 256-bit versie is behoorlijk belabberd — iets waar we in ons artikel uit 2000 op hebben gewezen — maar dat geldt niet voor AES met een 128-bit sleutel.” Zie deze blog post.)

V: Werkt mosh met Amazon EC2?

Ja, het werkt geweldig, maar vergeet niet om UDP-poorten 60000-61000 op de EC2-firewall open te zetten.

V: Hoe weet ik of mosh goed werkt?

Nadat u mosh user@server hebt uitgevoerd, wordt u, indien succesvol, gedropt in uw login-shell op de machine op afstand. Als u wilt controleren of mosh wordt gebruikt in plaats van ssh, kunt u Ctrl-^ Ctrl-Z typen om de sessie op te schorten (met mosh 1.2.4 of later op de client). Het draaien van fg zal dan terugkeren.

V: Wat is het verschil tussen mosh, mosh-client en mosh-server? Welke moet ik gebruiken?

Het mosh-commando is een wrapper-script dat is ontworpen om de primaire manier te zijn waarop u mosh gebruikt. In de meeste gevallen kunt u gewoon “ssh” vervangen door “mosh” in uw commandoregel. Achter de schermen zal het mosh-wrapper-script SSH-en naar de server, mosh-server opstarten, en dan de SSH-verbinding sluiten. Daarna start het mosh-client uitvoerbare bestand op de client, en geeft het de benodigde informatie door om verbinding te maken met de nieuw gespawnde mosh-server instantie.

In normaal gebruik hoeven mosh-client en mosh-server niet direct te worden uitgevoerd.

V: Hoe kan ik de mosh-client en -server afzonderlijk draaien?

Als het mosh wrapper script niet voor u werkt, kunt u proberen de mosh-client en mosh-server programma’s afzonderlijk uit te voeren om een verbinding te vormen. Dit kan een nuttige debugging techniek zijn.

1. Log in op de host op afstand, en voer mosh-server uit.

Het zal uitvoer geven als:

$ 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. Op de lokale host voert u uit:

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

waarbij “key” de 22-byte string is die door mosh-server wordt afgedrukt (in dit voorbeeld “4NeCCgvZFe2RnPgrcU1PQw”), “remote-PORT” het poortnummer is dat door de server wordt gegeven (60004 in dit geval), en “remote-IP” het IP-adres van de server is. U kunt het IP-adres van de server opzoeken met “host remotehost”.

3. Als alles goed gaat, zou u een werkende Mosh-verbinding moeten hebben. Informatie over waar het proces mislukt kan ons helpen te debuggen waarom Mosh voor u niet werkt.

Q: Met de mosh-server op FreeBSD of OS X, krijg ik soms rare kleurproblemen. Wat is er mis?

Deze bug is verholpen in Mosh 1.2. Met dank aan Ed Schouten en Peter Jeremy voor het opsporen.

V: Hoe kan ik bijdragen aan Mosh?

Wij verwelkomen uw bijdrage! Kom bij ons in het #mosh kanaal op Freenode IRC, bezoek ons op GitHub, of email [email protected]. Om bij te dragen aan onze code base, fork dan de repository op GitHub en open een pull request daar.

V: Wie heeft geholpen met mosh?

We zijn erg dankbaar voor hulp en ondersteuning van:

  • Hari Balakrishnan, die dit werk heeft geadviseerd en de naam heeft bedacht.
  • Paul Williams, wiens reverse-engineered vt500 toestandsdiagram de basis is voor de Mosh parser.
  • De anonieme gebruikers die sessielogs hebben bijgedragen voor het tunen en meten van Mosh’s voorspellende echo.
  • Nickolai Zeldovich voor behulpzaam commentaar op het Mosh research paper.
  • Richard Stallman voor behulpzame discussie over de mogelijkheden van het SUPDUP Local Editing Protocol.
  • 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

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.