OpenWrt-arvostelu - kotiverkko nörteille

OpenWrt:n idea on muuttaa halvat kuluttajatason WiFi-reitittimet monipuolisiksi, muokattaviksi ja turvallisiksi Linux-laitteiksi. Halusin kokeilla järjestelmää, sillä minua kiinnosti projektin nopea reagointi haavoittuvuuksiin, ohjelmiston monipuolisuus ja vapaa lähdekoodi. Tässä kirjoituksessa käyn läpi, miten OpenWrt:n käyttö luonnistui ja mitä mieltä siitä olin.

OpenWRT:n selaimelta käytettävä graafinen käyttöliittymä LuCI
OpenWRT:n selaimelta käytettävä graafinen käyttöliittymä LuCI

Yhteensopivan laitteen hankinta

Ensimmäiseksi minun piti löytää WiFi-reititin, johon voi asentaa OpenWrt-käyttöjärjestelmän, eikä tämä ollut ihan yksinkertaista. Näennäisesti laitetuki on erittäin laaja eivätkä ylläpitäjät halua suositella mitään yksittäisiä valmistajia tai malleja. Vaikka teoriassa laitekirjo on laaja, on laitteissa monia rajoittavia tekijöitä, joiden vuoksi laitteen käyttö voi olla väärän valinnan kanssa ongelmallista. Huomioitavia asioita on:

  • onko WiFille olemassa avoimen lähdekoodin ajuria?
  • riittääkö laitteen RAM-muisti?
  • riittääkö laitteen prosessoriteho?
  • onko käyttöjärjestelmän korvaaminen helppoa?
OpenWRT:n Table of Hardware näyttää laitteiden speksit ja yhteensopivuuden
OpenWRT:n Table of Hardware näyttää laitteiden speksit ja yhteensopivuuden

Wiki-sivustolle Table of Hardware on kerätty tuetuista laitteista pitkä lista laitteista, joiden kanssa OpenWRT:tä voi käyttää. Useiden laitteiden osalta on olemassa myös oma wiki-sivu, jonne on kerätty asennusohjeita ja huomioita käytöstä ja toimivuudesta. Käyttäjä voisi siis käydä listaa läpi ja valita sieltä itselleen sopivan laitteen. Helpompi ratkaisu on mennä tukifoorumille, jossa on useita ketjuja, jonne ihmiset listaavat suosikkilaitteensa, ja valita sieltä jokin foorumikäyttäjän ylistämä laite.

OpenWRT:n keskustelupalsta on täynnä laitesuosituksia
OpenWRT:n keskustelupalsta on täynnä laitesuosituksia

Minulta kesti aika pitkään tajuta, mikä lopulta on ratkaiseva komponentti laitehankinnassa ja voin paljastaa sen heti: prosessiteho. Tarvitaan tehokas prosessori, jotta OpenWrt:ssä voi käyttää SQM-jononhallintaa, jota todellakin kaikkien kannattaisi käyttää. SQM pitää huolen siitä, että vasteajat eivät nouse liian korkeiksi, kun netistä katsoo Netflixiä tai muita kaistaa vieviä palveluja. Kyse on bufferbloatista, jota ei kannata ratkoa ostamalla kalliimpaa nopeampaa nettiä, vaan priorisoimalla kaistaa järkevästi.

Valitettavasti käyttäjätason WiFi-reitittimissä ei ole kovin tehokkaita suorittimia ja SQM:n rajat tulevat nopeasti vastaan. Karkeasti voisi sanoa, että satasen laitteen tehot riittävät n. 200 Mb/s netin jononhallintaan. Jos kotiverkko on sitä nopeampi, tulee reitittimen CPU:sta pullonkaula, joka pysäyttää netin nopeuden tuohon aiemmin mainittuun nopeuteen. Tein aiheesta päätöspuun, joka yrittää vastata siihen, millainen laite tulisi hankkia.

OpenWRT-päätöspuu
OpenWRT-päätöspuu

Jos kotiverkon nopeus on gigan luokkaa, kannattaa mieluummin rakentaa erillinen Linux- tai BSD-kone, jota käyttää reitittämiseen ja sen rinnalla käyttää halpoja OpenWrt-laitteita vain tyhminä wifi-tukiasemina.

Asennus

OpenWrt:n sivuilta valitaan laitteeseen sopiva asennusmedia
OpenWrt:n sivuilta valitaan laitteeseen sopiva asennusmedia

Asennus kävi yllättävän helposti. Latasin OpenWrt:n sivulta asennustiedoston, jonka talletin muistitikulle ja iskin reitittimeen kiinni. Sen jälkeen avasin laitevalmistajan oman käyttöliittymän, menin firmwaren asennusnäkymään ja valitsin firmware-tiedostoksi muistitikulta OpenWrt:n asennusmedian. Päivitin laitetta siis ihan tavanomaisesti, mutta virallisen firmwaren sijaan käytin OpenWrt:n sivuilta ladattua tiedostoa. Ei ongelmia ja valittamista tästä vaiheesta.

Konfigurointi

OpenWrt:n oletusasetukset ovat dokumentaation mukaan hyvät ja turvalliset. Asennuksen jälkeen laitteeseen vaihdetaan admin-salasana ja sen jälkeen aparaatin voi kytkeä verkkoon ja lähteä käyttämään. Ja käytöllä tarkoitan piuhallista netin käyttöä, sillä jos haluat käyttää wifiä, se EI ONNISTU. Ai haluat käyttää wifiä, niin kuin lähes kaikki käyttäjät? Tästä alkaa ensimmäiset haasteet, jotka tekevät laitteesta tavalliselle kansalla sopimattoman.

Useimmiten laitevalmistajat ovat tehneet wifin säätämisen helpoksi, sillä käyttäjien tarvitsee vain vaihtaa salasana ja homma on sillä selvä. Ja kun käyttäjä haluaa aktivoida vierasverkon, painaa käyttäjä paria nappia. Kuinka vaikeaa tämä voi olla OpenWrt:n kanssa? Yllättävän hankalaa, sillä säädin tämän kanssa aika pitkään.

Ongelman taustalla on se, että OpenWrt-projektissa ei ole tunnistettu yleisiä käyttötilanteita ja tehty niille valmiita konfigurointeja. Kaupalliset valmistajat tietävät, että on tiettyjä käyttöskenaarioita, joita esiintyy sen verran usein, että niitä varten on syytä tehdä helposti päälle kytkettäviä konfigurointeja, mutta OpenWrt:ssä näin ei tehdä. Yhtenä esimerkkinä tästä on vierasverkko, joka on kilpailevissa vaihtoehdoissa yleensä erittäin helppo kytkeä päälle, mutta OpenWrt:ssä vaatii useiden vaiheiden läpikäyntiä. Onneksi wiki-ohjeisiin on kerätty kattava ohjeistus, sillä ilman niitä vierasverkon määritys jäisi uudelta käyttäjältä tekemättä.

Kattavat ja välttämättömät wikiohjeistukset
Kattavat ja välttämättömät wikiohjeistukset

Jos mielenkiintosi heräsi, että miten se vierasverkko sitten OpenWrt:ssä määritellään, niin voit lukea aiheesta wikin tutoriaalista, enkä käsittele aihetta sen tarkemmin tässä kirjoituksessa.

Käyttöliittymä

BusyBox v1.30.1 () built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 OpenWrt 19.07.7, r11306-c4a6851c72
 -----------------------------------------------------
root@reititin:~# 

Linuxiin tottuneet ovat kuin kotonaan OpenWrt:n kanssa. Kirjauduin laitteeseen SSH:lla ja pääsin tutkimaan ja säätämään laitetta tutuilla komennoilla. Asetustiedostot on koottu yhteen paikkaan /etc/config/ -polun alle, jossa jokainen asetustiedosto noudattaa OpenWrt:n käyttämää UCI-formaattia. Alla on esimerkki DNS-kyselyistä vastaavan STUBBY-ohjelman asetuksista:

config stubby 'global' 
    option manual '0' 
    option trigger 'wan' 
    list dns_transport 'GETDNS_TRANSPORT_TLS' 
    option tls_authentication '1' 
    option tls_query_padding_blocksize '128' 
    option appdata_dir '/var/lib/stubby' 
    option edns_client_subnet_private '1' 
    option idle_timeout '10000' 
    option round_robin_upstreams '1' 
    list listen_address '127.0.0.1@5453' 
    list listen_address '0::1@5453' 
    
config resolver 'quad9_ipv4_1' 
    option address '9.9.9.9' 
    option tls_auth_name 'dns.quad9.net' 
    
config resolver 'quad9_ipv4_2' 
    option address '149.112.112.112' 
    option tls_auth_name 'dns.quad9.net' 
    
config resolver 'quad9_ipv6_1' 
    option address '2620:fe::fe' 
    option tls_auth_name 'dns.quad9.net' 
    
config resolver 'quad9_ipv6_2' 
    option address '2620:fe::9' 
    option tls_auth_name 'dns.quad9.net' 

Voin muovata asetustiedostoa VIM-editorilla ja tallennuksen jälkeen käynnistän komennon ‘/etc/init.d/stubby reload’, joka saa konfiguroidun ohjelman käyttämään uusia asetuksia. Asetustiedostot on dokumentoitu todella hyvin wikiin, ja muokkaus käy nopeasti melko sutjakkaasti.

Jos asetustiedostoja haluaa muokata skripteillä, voi käyttää UCI-ohjelmaa, jonka komennot ovat nopeita ymmärtää ja oppia. Jos mietit, miksi joku haluaisi näin tehdä, niin käyn asiaa tarkemmin läpi päivityksiä käsittelevässä osiossa. Tässä vaiheessa tyydyn vain esittelemään, miltä UCI-komentoja sisältävä skripti näyttää:

#!/bin/sh

# router name
uci set system.@system[0].hostname='reititin'
uci set system.@system[0].zonename='Europe/Helsinki'
uci set system.@system[0].timezone='EET-2EEST,M3.5.0/3,M10.5.0/4'

# https://openwrt.org/docs/guide-user/luci/luci.secure
uci delete uhttpd.main.listen_http
uci add_list uhttpd.main.listen_http="127.0.0.1:80"
uci add_list uhttpd.main.listen_http="[::1]:80" 
uci delete uhttpd.main.listen_https 
uci add_list uhttpd.main.listen_https="127.0.0.1:443"
uci add_list uhttpd.main.listen_https="[::1]:443"
 
# apply changes
uci commit uhttpd
uci commit system

Jos komentokehote ei tunnu omalta, voi useimmat asiat hoitaa graafisen käyttöliittymän kautta, jota OpenWrt-projektissa kutsutaan LuCI:ksi. Kyse on HTTP-palvelusta, joka luo käyttöliittymän verkkoselaimeen:

Useimmat asiat voi hoitaa myös graafisen käyttöliittymän kautta
Useimmat asiat voi hoitaa myös graafisen käyttöliittymän kautta
OpenWRT-palomuuri
OpenWRT-palomuuri

Päivitys

Olin toivonut, että OpenWRT toimisi kuten muutkin käyttämäni Linux-jakelut eli kyse olisi asenna ja unohda -tyylisestä jutusta. Selvisi kuitenkin pian, että ylläpito ei tule olemaan aivan niin helppoa. Toisin kuin olin odottanut, tietoturvapäivitykset eivät valu automaattisesti reitittimelleni.

Kehittäjät julkaisevat kuukauden kahden välein uuden .#-version, joka sisältää tietoturvakorjaukset sekä joitain bugikorjauksia. Aina kun tietoturvapäivitys tulee, joudun asentamaan sen manuaalisesi laitteelleni. Käytännössä tämä menee niin, että otan ensin SSH-yhteyden reitittimeeni, lataan oikean firmwaren, käynnistän päivityskomennon ja pyydän säilyttämään vanhat asetukset. Saman voi tehdä myös graafisen käyttöliittymän kautta, mutta vaiheet ovat samat.

Päivitys on oikeasti OpenWrt:n uudelleenasennus
Päivitys on oikeasti OpenWrt:n uudelleenasennus

Prosessi ei kuulosta vielä kauhean ikävältä, mutta lisäyllätyksenä on, että OpenWRT hävittää päivityksen aikana kaikki itse asennetut paketit. Eli vaikka asetustiedostot säilyvät, häviävät niihin liittyvät ohjelmat. Jokaisen päivityksen jälkeen joutuu asentamaan paketteja uudelleen. Asentelun voi kiertää luomalla oman asennuskuvan, mutta sitä en ole vielä kokeillut tehdä. Uudelleen asentaminen ei ole kovin iso homma etenkin kun asennuskomennot voi listata omaan skriptitiedostoonsa.

Vaikeaksi juttu menee siinä vaiheessa, kun aiempi konfiguraatio vaatii jonkin paketin olemassaoloa, että nettiin ylipäätänsä pääsee. Näin käy esimerkiksi silloin, kun asentaa DNS-over-TLS -yhteyteen tarkoitetun Stubby-paketin, joka häviää joka päivityksen jälkeen. Reititin yrittää edelleen selvittää DNS-hakuja Stubbyn kautta, jota ei enää ole olemassa. Jotta saisin reitittimen takaisin toimintakuntoon, joudun poistamaan DNS-määrityksistä Stubbyn, käynnistämään DNSmasqin uudelleen, asentamaan puuttuvat paketit, palauttamaan alkuperäiset DNS-määritykset ja käynnistämään taas uudelleen DNSmasqin.

Olen todennut helpommaksi sen, että teen päivityksen tyhjältä pöydältä siten, että mitään asetuksia ei säilytetä. Asennuksen jälkeen käynnistän tekemäni skriptin, joka asentaa puuttuvat paketit ja määrittää tarvittavat asetukset.

#!/bin/bash

# Tarkista, onko Simple-adblock asennettu
app="luci-app-simple-adblock";
if [ -z "$(opkg status "$app")" ]; then
    opkg install uclient-fetch libustream-mbedtls ca-bundle ca-certificates
    opkg install "$app"
fi;

# Käytä tiettyä estolistaa
uci delete simple-adblock.config.blocked_hosts_url;
uci add_list simple-adblock.config.blocked_hosts_url='https://hosts.oisd.nl/';
uci set simple-adblock.config.enabled=1;
uci set simple-adblock.config.dns='dnsmasq.addnhosts';
uci commit simple-adblock;

# hae listat la klo 03.13
JOB='13 3 * * 6 /etc/init.d/simple-adblock dl';
crontab -l | (grep -v 'simple-adblock dl'; echo "$JOB") | crontab -;
/etc/init.d/cron restart;

Hauskoja juttuja, joihin OpenWRT pystyy

Verkkoliikenteen jononhallinta

Kotiverkko voi nopeasti hidastua, jos perheessä on useita samanaikaisia käyttäjiä. Ongelmat liittyvät Bufferbloat-nimiseen ilmiöön, jossa kaista tukkeutuu liikenteestä niin, että vasteajat kasvavat järjettömän korkeiksi. Toisin kuin voisi kuvitella, asiaa ei ratkaista nopeammalla netillä, vaan verkkoliikenteen älykkäällä jononhallinnalla. Jononhallinnalla varmistetaan, että kaistaa paljon vievät palvelut ja ohjelmat eivät hidasta kaikkea muuta nettiliikennettä vaan paketit priorisoidaan.

OpenWRT:n jononhallintaohjelman nimi on SQM, joka tulee lyhenteestä Smart Queue management. Yksinkertaistettuna voisi sanoa, että SQM varmistaa, että verkkoliikenteeseen jää aina varakaista muita pieniä pyyntöjä varten. Käytännössä jononhallinta pienensi rasituksessa olevan nettini viiveen lähes tuhannesta millisekunnista 20 millisekuntiin. Toisin sanoen jumitus ja epävakaisuus hävisi.

Simple adblock

Nimensä mukaisesti simple-adblock estää mainoksia. Ohjelma käy hakemassa muutamasta lähteestä listan tunnetuista mainos- ja haittasivuista ja lisää ne hosts-tiedostoon eli DNS-kyselyistä vastaavaan asetustiedostostoon.

Stubby ja DNS over TLS

Perinteisesti DNS-kyselyt kulkevat verkon yli salaamattomana, ja Stubby-ohjelma yrittää ratkaista tämän ongelman TLS-salauksella. Lähtökohtaisesti haluan käyttää salausta silloin, kun se on mahdollista ja OpenWrt:llä näin on.

Yhteenveto

OpenWrt on hauska projekti ja olen tyytyväinen, mihin kaikkeen se pystyy. Totuuden nimissä joudun kuitenkin ihmettelemään, että millaisella käyttäjäjoukolle projekti on tehty. Käyttöjärjestelmä on monipuolinen ja sillä voi tehdä hyvinkin monimutkaisia verkkoviritelmiä, mutta rajoittavana tekijänä kuitenkin on, että OpenWrt on suunnattu halpoihin kuluttajalaitteisiin, jotka eivät suorituskyvyltään selviä vaativissa oloissa. Kaikkea voisi tehdä softan puolesta mutta hardware on liian rajoittunutta. Ja jos päättää hankkia parempaa laitteistoa, niin kannattaako enää asentaa OpenWrt:tä vaan jokin täysiverisempi järjestelmä kuten Alpine Linux tai vastaava.

Parasta projektissa on se, että haavoittuvuuksiin julkaistaan nopeasti korjauksia, palomuuriasetuksia saa määritettyä kattavasti ja SQM-jononhallinta ratkoo bufferbloat-ongelmat. Reitittimeen saa myös muita lisätoimintoja, jotka voivat ilahduttaa säätäjiä.

Kaikesta hyvästä huolimatta en voi suositella OpenWrt:tä muita kuin kaikein nörteimmille, joilla on intoa säätää järjestelmien kanssa. Päivittäminen ja konfigurointi on sen verran työlästä ja osaamista vaativaa, että vain pieni joukko ihmisiä on valmis paneutumaan aiheeseen tarpeeksi.

Mikko Harhanen
Mikko Harhanen
Business Intelligence -konsultti

Kauppatieteiden maisteri, liiketoiminnan analyytikko.