You are currently viewing Mosh – SSH katkoville yhteyksille

Mosh – SSH katkoville yhteyksille

Mosh (mobile shell) on kuin SSH:n laajennos. Se pitää eräällä tavalla sisällään kaiken minkä SSH, mutta siinä on yksi erikoisuus. Se puskuroi annetut komennot ja muokkaukset, jos SSH-yhteys on hitaalla tai katkennut kokonaan. Sitä ei kuitenkaan huomaa, koska Mosh ennakoi mitä pitäisi antaa vastaukseksi. Ei se tietenkään tiedä mikä on serverin aito reaktio, mutta sillä ei ole suurtakaan merkitystä. Kun komento saadaan serverille asti, niin tilanne päivitetään.

Tuo tarkoittaa kahta asiaa. Mosh on parhaimmillaan, kun

  • yhteys katkeilee, koska sitä ei tarvitse erikseen avata uudestaan
  • serveri on hitaalla, koska lagaamista ei näe

Tien päällä, oli sitten junassa tai autossa, ei tarvitse huolehtia tukimastojen vaihtumisesta. SSH:lla yhteys katkeaa ja se on itse nostettava aina ylös. Samalla saa arvuutella tapahtuiko juuri puoli sekuntia ennen kenttien häviämistä annettu komento vai ei. Moshilla tuota ongelmaa ei ole.

Joskus netti on vaan hitaalla. Operaattorin 100 megainen taivaskaista romahtaakin 100 kiloon, kun naapurin teini ehtii ennen sinua linjoilla warettamaan tai taistelemaan kolmatta maailmansotaa. Netti niiaa, kun korttelin kaikki samaan aikaan kotiutuneet avaavat samaan aikaan Facebookin ja alkavat katsella kissavideoita. Tai Windowsin seuraava iso päivitys vie huushollin koko kaistan. Onko tuttua, että wifi hidastelee tai katkeaa hetkeksi?

Moshin kanssa mitään noista ei useimmiten edes huomaa. Näyttää siltä, että yhteys on ylhäällä – mutta aidosti kaikki tehty onkin enemmän tai vähemmän virtuaalista ja Mosh vain odottaa sopivaa rakoa siirtää kaikki serverille.

Olen jo pitkään käyttänyt Moshia. Ihan siksi, että kun työt eivät etene, ja kyllästyessäni laitan laitteen nukkumaan, niin jatkaessani siitä missä luovutin, Mosh herää samalla ja on valmiina jatkamaan siitä mihin jäätiin. Oikeammin – käytän moshia aina kun se on mahdollista, sillä PuTTY ei sitä osaa. Toki voisin käyttää screen komentoa, mutta en ole oikein koskaan oppinut käyttämään sitä sujuvasti. Sillä ja WSL:llä saisi kuitenkin moshin toimimaan myös Windowsissa.

Enkä minä moshia pelkästään laitetasolla käytä. Käytän sitä myös serverieni välillä, aina kun käyttäisin muutoin SSH:ta.

Mosh-serveri

Mosh tarvitsee oman serverinsä ja sille oman portin auki. Lienee hieman tulkinta- ja termikysymys, että onko Mosh aidosti serveri, vai onko se drop-in laajennos OpenSSH:lle. Ymmärtääkseni teknisesti yhteys aloitetaan normaalisti SSH:lla, mutta sen jälkeen mosh-server toimii apuohjelmana ja siirtää yhteyden omiin hoteisiinsa. Mutta minulle se on serveri.

Asennan sen tämän ohjeen mukaisesti Raspberry Pi’lle, mutta samalla tavalla mosh kaikkiin asentuu – toki jakeluerot huomioiden, mutta mitään eroa ei sinällään ole Raspberryn ja DigitalOceanin virtuaaliserverin välillä.

Minä käytän Ubuntu 20.04 serveriasennusta, joten ohjeet ovat sen mukaiset. Samaten yleensä teen aina kaiken root-oikeuksilla, koska en kerta kaikkiaan jaksa naputella sudoa joka paikkaan. Tällä kertaa teen poikkeuksen – koska Mosh on… niin tolkuttoman helppo asentaa.

Asennetaan Mosh:

sudo apt install mosh

Avataan palomuuriin reikä:

sudo ufw allow mosh

tai jos käytät mieluummin iptablesia suoraan:

sudo iptables -I INPUT 1 -p udp --dport 60000:60010 -j ACCEPT

  • Mosh tarvitsee portin per yhteys, joten sen mukaan kannattaa niitä availla; esimerkissä on 10 porttia auki. Ainoa rajoitus on, että ensimmäinen portti täytyy olla 60000 – eikä sekään ole ehdotonta, vaan vivulla -p voi ilmoittaa mosh-komennossa mistä UDP-portti löytyy.

Jos yrität sisäverkkoon, tai sisäverkosta ulos, niin routeriin on syytä avata SSH-serverille (tai mikä sitten ulos meneekin) riittävät UDP-portit 60000 ja ylöspäin. Jos jätät moshin kaipaamat portit aukaisematta, niin yhteyden muodostaminen toki onnistuu, kunhan SSH:n portti on auki. Mutta sen jälkeen tulee ilmoitus, että Mosh ei saa liikennettä serverin portista 60001.

Se oli siinä. Ei tarvita mitään muuta. Nyt mosh-yhteydet onnistuvat.

Mosh-asiakasohjelma

Mosh vaatii oman asiakasohjelmansa, clientin, sekä serverin, joka juttelee aidon SSH-serverin kanssa. Joten molemmat on asennettava. Kaikille muille järjestelmille kuin Windowsille löytyy SSH-ohjelma, joka taitaa moshin. PuTTY:lle on jo vuosia pyydetty mosh-tukea, mutta sitä ei ole tulossa. Vuonna 2015 kerrottiin, että suurimmat esteet ovat vaadittavan koodauksen laajuus sekä ristiriidat lisenssoinnissa. Jos mikään ei ole muuttunut, niin PuTTY ei tue eikä tule tukemaan moshia.

Windowsille, tai siis Windowsiin, saa kahta tietä Moshin, ainakin ulos menevillä yhteyksille. Cygwin kuulemma toimii. Mutta on parempikin ratkaisu. Asentaa WSL:n sekä Ubuntu-appin ja asentaa sinne moshin. Ei se serverinä toimi, koska Windowsin SSH-serveri estää WSL:n, mutta kun komentaa Windowsin komentokehoitteessa wsl mosh tunnus@example.tld niin pääsee iloisesti moshilla ulos.

Windowsissa voi korvaavina käyttää selainlisäosia, mutta aletaan olla jo niin purkkavirityksen oloisessa ratkaisussa, että minua ei kiinnosta – eivätkä nekään salli sisääntulevaa moshin liikennettä. WSL on paljon parempi vaihtoehto, ja saa pysyä terminaalissa, vaikkakin Windowsin omassa komentokehoitteessa. Tai PowerShellissä, samalla tavalla se toimii.

Molemmat (kaupalliset) iOS:lla käytetettävät terminaalit, Termius ja Blink, hallitsevat myös moshin ja käyttäjätasolla ero löytyy vain komennosta: ssh tai mosh. Itse käytän Blinkiä.

Moshin käyttö

Moshin käyttö on helposti selitetty. Se toimii useimmiten kuten SSH. Joitain eroja löytyy, mutta oma käyttö on niin perustasolla, että niillä ei ole minulle merkitystä. Esimerkiksi X forwarding ei onnistu. Suurin rajoite on tainnut olla määrätyt ongelmat ProxyJump-viritysten kanssa. Minulla kylläkin  toimi ilman ongelmia aivan sen mukaan mitä ~/.ssh/config määräsi

Tai ainakin melkein. Virtuaaliserveriltä aloitetty ProxyJump pääsi kotiverkon SSH-serverille, mutta tyssäsi siihen, koska suunta oli Windows-koneelle – jossa ei ole mosh-serveriä. Jos mosh komentona osaisi fallbackin SSH:hon, kun mosh ei vastaa, niin kaikki olisi hienosti.

Yksi muistettava asia lienee myös, että jos on joutunut aiemmin antamaan vaikka portin takia komennon ssh -p 1234 niin nyt muoto olisi mosh --ssh="ssh -p 1234".

Kun wifi katkeaa

Tein sinällään aivottoman testin. Otin WSL:n ja Ubuntun kautta moshilla yhteyden sisäverkon SSH-serverinä toimivaan Raspberryyn ja toisen yhteyden tein myös WSL:llä, mutta PowerShellistä, yhteen virtuaaliserveriin. Sitten ajoin raspin alas ja sammutin routerin. En minä tuota testin takia tehnyt, vaan oli muutenkin tarve siirtää routeri toiseen paikkaan ja silloin mukana kulkee myös Raspberry. Siinä samassa sain sitten testata Moshia nopeasti.

Raspberryn yhteys katkesi välittömästi, mutta sen taisi katkaista komento shutdown -P now, joten mosh ei saanut edes mahdollisuuksia. Sen sijaan routerin kautta kulkenut yhteys virtuaaliserverille pysyi, vaikka routerilta lähti sähköt, ja mikä hassuinta – muutamassa sekunnissa routerin virtojen kytkemisen jälkeen annoin komennon varnishstat (se näyttää reverse proxy Varnishin live-tilastot) ja sain siitä syötteen; tuossa ajassa on mahdotonta, että routeri löytäisi Elisan verkon taivaalta ja rakentaisi wifin ennen kuin ehdin antamaan komennon – mutta pakko sen oli kuitenkin ehtiä, sillä mikään ennakoiva toiminto ei voi arvuutella serverin webvälimuistin tilastoja. Aika vaikuttavaa silti. Ja yhteys säilyi.

Kokeilin kuitenkin uudestaan. Avasin yhteyden wifin kantamissa ja sen jälkeen kävelin ulos wifin ulottumattomiin. Yhteys säilyi ja Mosh kertoi myös koska viimeksi yhteys on ollut saatavilla.

 

 

Komensin uudestaan varnishstat ja sain tilaston näkyviin. Kyllä, tämä tuntuu todellakin maagiselta.

Mosh: You have a detached Mosh session on this server (mosh [400608])

Jos itse terminaali kaatuu, tai tapahtuu joku vastaava katastrofin alku, niin seuraavalle kirjautumisella saa otsikon kaltaisen ilmoituksen. Se kertoo, että serverillä on mosh-istunto odottamassa, että sen omistaja kirjautuisi takaisin. Jos tiedetään, että kyseessä on aito tilanne, eli jokin asiakasohjelma on menettänyt yhteyden, niin kirjautumalla juuri sillä asiakasohjelmalla poistaa ilmoituksen.

Ongelma on siinä, että ei tiedetä mikä asiakasohjelma on kyseessä – ainakaan periaatteessa, sillä komento who kertoo jotain:

[00:41:55] root@eksis:~# who
root     pts/5        2020-08-11 00:40 (mosh [4057658])
jagster  pts/7        2020-08-11 00:41 (64.225.73.149 via mosh [4062969])
[00:41:59] root@eksis:~#

Ja jos kyse on oman kaatumisesta tai kaatamisesta, niin kirjautuminen ei auta mitään. Sitä sessiota ei enää ole, mutta silti mosh odottaa moista. Itselläni tuo on syntynyt, kun on tullut ongelmia screen komennon kanssa.

Vastaava kuin screen -r olisi mukava, mutta turvallisuussyistä mosh ei anna yhdistää vierasta istuntoa omaan. Silloin prosessi täytyy tappaa.

Ilmoitus kertoo mikä on tapettava. Esimerkissä se olisi 400608.

kill 400608

Sen jälkeen voi kokeilla onko vielä jäljellä liitettäviä screen-istuntoja komennolla screen -r

On myös mahdollista tappaa kaikki mosh-yhteydet (ja samalla lentää itsekin pihalle, jos on kirjautunut moshilla):

kill `pidof mosh-server`

 

Jakke Lehtonen

Teen B2B-markkinoille sisällöntuottoa sekä UX-testauksia. Samaan liittyy myös koulutukset yrityksille ja webmaailman kanssa muutoin painiville. Serverien sielunelämää on joutunut ohessa opettelmaan. Toinen puoli toiminnasta on koirien ravitsemuksen ja ruokinnan suunnittelua sekä varsinkin omistajien kouluttamista hoitamaan koiriaan oikein ja vielä paremmin. Profiili: Jakke Lehtonen

Keskustele foorumilla Meta/KATISKA