Mosh

Q: Vem skrev Mosh?

Mosh skrevs av Keith Winstein tillsammans med Anders Kaseorg, Quentin Smith, Richard Tibbetts, Keegan McAllister och John Hood.

F: Varför ännu ett fjärrterminalprotokoll?

Den praktiska latensen på Internet ökar i takt med bufferbloat och sofistikerade trådlösa länkar som optimerar för genomströmning framför fördröjning. Och roaming är vanligare än någonsin, nu när bärbara datorer och handhållna enheter till stor del har ersatt stationära datorer. SSH är bra, men frustrerande att använda när man vill ändra IP-adresser eller när man har en länk med lång fördröjning eller en osäker anslutning.

Telnet hade dessutom en del goda egenskaper – ett lokalt ekoläge och en väldefinierad virtuell nätverksterminal. Till och med idag har SSH inte ordentligt stöd för UTF-8 end-to-end på ett POSIX-system.

F: Är mosh-principerna relevanta för andra nätverkstillämpningar?

Vi tror det. De designprinciper som Mosh står för är konservativa: varning till användaren om det tillstånd som visas är inaktuellt, serialisering och checkpointing av alla transaktioner så att användaren vet att varje tidigare transaktion har lyckats om det inte finns några varningar, och hantering av förväntade händelser (som roaming från ett WiFi-nätverk till ett annat) på ett elegant sätt.

Dessa verkar inte alltför kontroversiella, men avancerade appar som Gmail-in-Chromium eller på Android uppför sig fortfarande grymt dåligt på osäkra anslutningar eller efter att ha bytt IP-adress. (Har du någonsin haft Gmail som har låtit ett e-postmeddelande ligga kvar i ”Sending…” i tio timmar samtidigt som det hämtar ny e-post utan att ange någon form av fel? Vi också.) Vi tror att det kan finnas betydande utrymme för förbättringar i många nätverksgränssnitt genom att tillämpa de här värdena.

F: Jag får ”mosh kräver en UTF-8-ställenhetsadress”. Hur kan jag åtgärda detta?

För att diagnostisera problemet kör du locale på den lokala terminalen och ssh remotehost locale. För att kunna använda Mosh måste båda sidor av anslutningen visa ett UTF-8-landskap, till exempel LC_CTYPE="en_US.UTF-8".

På många system överför SSH de lokalrelaterade miljövariablerna, som sedan ärvs av mosh-server. Om denna mekanism misslyckas kommer Mosh (från och med version 1.2) att överföra variablerna själv. Om ingendera mekanismen är framgångsrik kan du göra något i stil med

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

Om en_US.UTF-8 inte finns på fjärrservern kan du ersätta den med en UTF-8 lokalvariabel som finns. Du kan också behöva ställa in LANG lokalt för att dra nytta av mosh-client. Det är möjligt att den lokala maskinen och fjärrmaskinen behöver olika lokalnamn. Se även den här GitHub-biljetten.

F: Vad betyder meddelandet ”Ingenting har mottagits från servern på UDP-port 60003”?

Detta betyder att mosh lyckades starta mosh-server framgångsrikt på fjärrmaskinen, men att klienten inte kan kommunicera med servern. Detta innebär i allmänhet att någon typ av brandvägg blockerar UDP-paketen mellan klienten och servern. Om du var tvungen att vidarebefordra TCP-port 22 på en NAT för SSH måste du också vidarebefordra UDP-portar. Mosh kommer att använda den första tillgängliga UDP-porten, från 60001 till 60999. Om du bara kommer att ha en liten handfull samtidiga sessioner på en server kan du vidarebefordra ett mindre antal portar (t.ex. 60000 till 60010).

Verktyg som netstat, netcat, socat och tcpdump kan vara användbara för att felsöka problem med nätverk och brandväggar.

Detta problem kan också bero på ett fel i glibc 2.22 som påverkar program som länkar med protobuf och utempter och använder aggressiva kompilatorhärdningsflaggor. (Glibc bugtracker entry, liksom Mosh bugtracker entry.) Problemet gör att mosh-server segrar omedelbart vid uppstart. Vi tror att vi har löst problemet i Mosh 1.2.6, men rapportera ett fel om du upptäcker något annat.

F: Varför insisterar ni på UTF-8 överallt?

Vi är verkligen inga UTF-8-anhängare. Men det är mycket lättare att korrekt implementera en terminalemulator än att försöka göra rätt sak i en mängd svåra kantfall. (Detta är vad GNU screen försöker göra, och enligt vår erfarenhet leder det till några mycket svåra situationer att felsöka.) Så mosh kommer helt enkelt inte att starta förrän användaren har konfigurerat allt för en UTF-8-ren väg. Det kan vara irriterande, men det minskar förmodligen också frustrationen längre fram. (Tyvärr är en 8-bitars vt220 och en UTF-8 vt220 olika och inkompatibla terminaltyper; UTF-8 går in under vt220-tillståndsmaskinen.)

F: Hur använder jag en annan SSH-port (inte 22)?

Sedan Mosh 1.2 kan du skicka argument till ssh på följande sätt:

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

Och konfigurera ett värdalias i ~/.ssh/config med ett Port-direktiv. Mosh respekterar det också.

F: Jag får ”mosh-server not found”.

Se till att mosh är installerat på klienten och att mosh (eller åtminstone mosh-server) är installerat på den server du försöker ansluta till. Dessutom förväntas servern vara tillgänglig på din servers standardinloggning PATH, vilket vanligtvis inte stämmer på OS X- och BSD-servrar, eller om du installerar mosh-server i din hemkatalog. I dessa fall hänvisas till instruktionerna ”Server binary outside path” i avsnittet Användning ovan.

F: SSH autentiserar sig med hjälp av Kerberos-biljetter, men Mosh ber mig om ett lösenord.

I vissa konfigurationer kanoniserar SSH värdnamnet innan det skickas till insticksmodulen Kerberos GSSAPI. Detta bryter mot Mosh, eftersom den initiala DNS-uppslagningen görs av Mosh-omslagsskriptet. För att komma runt detta kan du anropa Mosh as

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

Detta kommer ofta att misslyckas på en round-robin-DNS-inställning. I det fallet är det förmodligen bäst att välja en specifik värd från round-robin-poolen.

F: Varför är min terminals scrollbackbuffert ofullständig?

Mosh synkroniserar endast terminalens synliga tillstånd. Vi följer detta problem; se detta problem och de andra som är länkade därifrån. För tillfället är lösningen att använda screen eller tmux på fjärrsidan.

F: Hur får jag 256 färger?

Säkerställ att du kör mosh i en terminal som annonserar sig själv som 256-färgskompatibel. (Detta innebär i allmänhet att TERM är xterm-256color eller screen-256color-bce.)

F: Hur skriver jag C-^, Moshs standard escape-tecken?

På tangentbord med USA-layout kan detta skrivas som Ctrl-Shift-6, eller ofta som Ctrl-6 (detta beror på ditt operativsystem och din terminalemulator). På tangentbord som inte är amerikanska är det ofta svårt att hitta rätt tangent, och ibland finns den inte alls. Om ditt tangentbord har en död tangent med accent-circumflex är det inte troligt att detta är rätt tangent. Ctrl-6 fungerar dock ibland. Om du inte kan skriva det här tecknet måste du ställa in variabeln MOSH_ESCAPE_KEY; se Mosh man-sidan för mer information.

F: Hur kan jag få servern att automatiskt rensa upp vilande sessioner?

Se posterna för MOSH_SERVER_NETWORK_TMOUT och MOSH_SERVER_SIGNAL_TMOUT i man-sidan för mosh-server(1).

F: Hur ser Moshs säkerhet ut hittills?

Mosh 1.0 släpptes i mars 2012. Sedan Mosh 1.3.2 släpptes i juli 2017, såvitt utvecklarna känner till:

  • Under de senaste fyra åren har inga säkerhetsproblem av något slag (större eller mindre) rapporterats i Mosh.
  • Ingen större säkerhetsbrister har någonsin rapporterats i Mosh. Vi definierar större säkerhetssårbarheter som bland annat privilegieeskalering, exekvering av fjärrkod, överbelastning av tjänsten av en tredje part osv.
  • Två överbelastningsproblem upptäcktes och åtgärdades i versioner 2012. Det ena problemet gjorde det möjligt för en mosh-server att få themosh-client att använda för mycket CPU (CVE-2012-2385, rättad i Mosh1.2.1, släppt i maj 2012). Ett annat problem gjorde det möjligt för serverhost att få mosh-klienten att skicka UDP-datagram till en felaktig adress, vilket gjorde det omöjligt för den att ansluta (åtgärdat i Mosh 1.2.3, släppt i oktober 2012).

F: Hur är Moshs säkerhet jämfört med SSH:s?

Vi anser att Moshs konservativa utformning innebär att dess angreppsyta står sig väl jämfört med mer komplicerade system som OpenSSL och OpenSSH. Moshs resultat har hittills bekräftat detta. I slutändan kommer dock bara tiden att visa när den första allvarliga säkerhetsbristen upptäcks i Mosh – antingen för att den fanns där hela tiden eller för att den oavsiktligt lades till under utvecklingen. OpenSSH och OpenSSL har haft fler sårbarheter, men de har också släppts längre och är mer utbredda.

I ett konkret avseende är Mosh-protokollet säkrare än SSH: SSH förlitar sig på oautentiserat TCP för att transportera innehållet i den säkra strömmen. Det innebär att en angripare kan avsluta en SSH-anslutning med ett enda falskt ”RST”-segment. Mosh däremot tillämpar sin säkerhet på ett annat lager (autentisering av varje datagram), så en angripare kan inte avsluta en Mosh-session om inte angriparen kontinuerligt kan hindra paket från att nå den andra sidan. En tillfällig angripare kan bara orsaka ett tillfälligt användarsynligt avbrott; när angriparen försvinner återupptar Mosh sessionen.

I typisk användning förlitar sig Mosh dock på SSH för att utbyta nycklar i början av en session, så Mosh kommer att ärva SSH:s svagheter – åtminstone i den mån de påverkar den korta SSH-sessionen som används för att upprätta en långvarig Mosh-session.

F: Påverkas Mosh av 2018 års attacker mot chifferläget OCB2?

Inte vad vi vet, Mosh använder OCB3. Författarna till pappret skriver att attacken inte är tillämplig på OCB3.

F: Varför använder mosh AES-128 för en sessionsnyckel och inte AES-192 eller AES-256?

  • AES-128 är en mer än tillräcklig nyckellängd för en sessionsnyckel.
  • OCB FAQ rekommenderar AES-128.
  • AES-128 är lite snyggare och är inte utsatt för de attacker på relaterade nycklar som drabbar AES-192 och AES-256. (Schneier: ”Nyckelschemat för 256-bitarsversionen är ganska uselt – något som vi påpekade i vårt dokument från 2000 – men det gäller inte AES med en 128-bitarsnyckel”. Se det här blogginlägget.)

F: Fungerar mosh med Amazon EC2?

Ja, det fungerar utmärkt, men kom ihåg att öppna UDP-portarna 60000-61000 på EC2-brandväggen.

F: Hur vet jag om mosh fungerar korrekt?

När du kör mosh user@server kommer du, om du lyckas, att hamna i ditt inloggningsskal på fjärrmaskinen. Om du vill kontrollera att mosh används i stället för ssh kan du prova att skriva Ctrl-^ Ctrl-Z för att avbryta sessionen (med mosh 1.2.4 eller senare på klienten). Om du kör fg kommer du sedan tillbaka.

F: Vad är skillnaden mellan mosh, mosh-client och mosh-server? Vilken ska jag använda?

Kommandot mosh är ett omslagsskript som är utformat för att vara det primära sättet för dig att använda mosh. I de flesta fall kan du helt enkelt bara ersätta ”ssh” med ”mosh” i din kommandorad. Bakom kulisserna kommer mosh-omslagsskriptet att SSH-ansluta till servern, starta mosh-server och sedan stänga SSH-anslutningen. Därefter startar det mosh-client på klienten och skickar den nödvändig information för att den ska kunna ansluta till den nyligen skapade mosh-server-instansen.

I normal användning behöver mosh-client och mosh-server inte köras direkt.

F: Hur kör jag mosh-klienten och -servern separat?

Om skriptet mosh wrapper inte fungerar för dig kan du försöka köra programmen mosh-client och mosh-server separat för att skapa en anslutning. Detta kan vara en användbar felsökningsteknik.

1. Logga in på fjärrvärden och kör mosh-server.

Det ger utdata som:

$ 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. Kör:

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

på den lokala värddatorn där ”key” är den 22-byte-sträng som skrivs ut av mosh-server (i det här exemplet ”4NeCCgvZFe2RnPgrcU1PQw”), ”remote-PORT” är det portnummer som servern anger (60004 i det här fallet) och ”remote-IP” är serverns IP-adress. Du kan söka upp serverns IP-adress med ”host remotehost”.

3. Om allt går bra bör du ha en fungerande Mosh-anslutning. Information om var processen misslyckas kan hjälpa oss att felsöka varför Mosh inte fungerar för dig.

F: Med mosh-servern på FreeBSD eller OS X får jag ibland konstiga färgproblem. Vad är det för fel?

Detta fel är åtgärdat i Mosh 1.2. Tack till Ed Schouten och Peter Jeremy för att de spårade upp detta.

F: Hur bidrar jag till mosh?

Vi välkomnar ditt bidrag! Följ med oss i #mosh-kanalen på Freenode IRC, besök oss på GitHub eller skicka ett e-postmeddelande till [email protected]. Om du vill bidra till vår kodbas kan du gaffla upp arkivet på GitHub och öppna en pull request där.

F: Vem har hjälpt till med mosh?

Vi är mycket tacksamma för hjälp och stöd från:

  • Hari Balakrishnan, som gav råd om det här arbetet och kom på namnet.
  • Paul Williams, vars omvända vt500-tillståndsdiagram är grunden för Mosh-parser.
  • De anonyma användare som bidrog med sessionsloggar för att trimma och mäta Moshs prediktiva eko.
  • Nickolai Zeldovich för hjälpsamma kommentarer till Mosh-forskningsartikeln.
  • Richard Stallman för hjälpsamma diskussioner om möjligheterna hos 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

Lämna ett svar

Din e-postadress kommer inte publiceras.