Router met OpenWrt firmware nieuw leven inblazen

Noud van Kruysbergen
0

Inhoudsopgave

Iedereen kan het modulaire router-besturingssysteem OpenWrt naar eigen wens aanpassen – ook zonder enige programmeerervaring. We laten zien hoe je een oude router hergebruikt aan de hand van een voorbeeld met het bijzonder efficiënte VPN-protocol WireGuard.

In tegenstelling tot de meeste firmwares van fabrikanten heeft het routerbesturingssysteem OpenWrt een softwarebeheer waarmee je duizenden pakketten voor allerlei denkbare uitbreidingen met de commandline of via de webinterface makkelijk kunt installeren. Met name oudere routers, die anders bij het grof vuil zouden belanden, kun je met OpenWrt hergebruiken voor verschillende taken. Het gebruik van kant-en-klare pakketten wordt vaak dwars­gezeten door het krappe flashgeheugen – veel modellen hebben vaak maar 4 MB tot hun beschikking. Afhankelijk van de grootte van de uitbreiding mislukt dan vaak het uitpakken van de pakketbestanden al omdat het opslaggeheugen overvol is.

Een zelf samengestelde OpenWrt-versie kan dat probleem oplossen: in plaats van dan de kant-en-klare images van de OpenWrt-website te gebruiken, kun je zelf een versie compileren, geheel naar eigen inzicht en eigen eisen.

Met de grafische interface van de OpenWrt-image-configuratie is dat bovendien ook nog eens bijzonder makkelijk te doen. We laten je zien hoe je dat compileren moet voorbereiden onder Windows en Linux, hoe je de niet benodigde dingen weer verwijdert en vervolgens een eigen image compileert. Een goedkope router met 4 MB aan flashgeheugen wordt daarmee bijvoorbeeld een snelle VPN-gateway voor WireGuard.

router OpenWrt firmware aanpassen samenstellen pakketten 4MB WireGuard

We hebben dit uitgeprobeerd op een TP-Link WR841N (tot versie 13) – dat is een van de goed­kopere repeaters/accesspoints. Die TP-Link is een echte OpenWrt-klassieker, maar het wordt met zijn 4 MB geheugen wel krapjes allemaal. Als je de kant-en-klare image van de OpenWrt-website installeert, heb je nog maar 92 kB aan opslagruimte over.

N.B.: een apparaat met 4 MB geheugen voor dit project aanschaffen raden we af! De benodigde ruimte voor de pakketten kan veranderen en WireGaurd is nog niet bestemd voor productief gebruik.

Voorbereiding

Voor dit praktijkartikel moet je wat basiskennis hebben van OpenWrt, netwerktechniek en de Linux-­commandline – en niet vreemd opkijken van de bij­komende Engelse begrippen.

De OpenWrt-image-configuratie werkt daarbij onder ­Linux, BSD en macOS – en het Windows-­subsysteem voor Linux. Voor het gemak gaan we hier uit van het installeren met versie 18.04 van Ubuntu. De commando’s werken hetzelfde voor Debian. Op de OpenWrt-wiki staat een handleiding voor macOS. De link daar naartoe en alle andere hier genoemde bronnen staan bij de link aan het eind van dit artikel.

Windows-gebruikers hebben geen virtuele machine nodig om OpenWrt te kunnen compileren. Ze kunnen met het Windows-subsysteem voor Linux werken. Na het installeren daarvan hoef je verder nergens meer rekening mee te houden.

Omdat het buildsysteem onafhankelijk van de samenstelling van de uiteindelijke gecompileerde ­image de bestanden downloadt voor alle routers en pakketten, moet je rekening houden met een benodigde schijfruimte op de pc van ongeveer 10 GB. Daarnaast zijn 4 GB aan werkgeheugen te adviseren, maar voor kleinere images is 2 GB eventueel ook genoeg. Zowel het voorbereiden als het compileren van de image doe je met de Linux-commandline, zodat we die bij de volgende commando’s niet meer apart noemen.

Zorg er voor het installeren voor dat je besturingssysteem en alle andere programma’s helemaal up-to-date zijn met

sudo apt update
sudo apt upgrade

Daarna installeer je de afhankelijkheden van het buildsysteem, Daar horen onder andere de C-­compiler G++ en de cryptografiebibliotheken bij:

sudo apt -y install subversion g++ zlib1g-dev build-essential git
python time libncurses5-dev gawk gettext unzip file libssl-dev wget libelf-dev -y

De optie -y onderdrukt de vragen van het installatieproces over iedere afzonderlijke module. Alle volgende commando’s kun je zonder rootrechten uitvoeren.

De OpenWrt-ontwikkelaars gebruiken daarbij het bestandsversiebeheer Git om het beheren van de code mogelijk te maken. Met git clone kopieer je de gehele repository naar je computer. Omdat die ook de ontwikkelversie bevat, moet je met -b openwrt-18.06 specificeren dat je de laatste stabiele versie wilt gebruiken.

git clone https://git.openwrt.org/openwrt/openwrt.git -b openwrt-18.06

Afhankelijk van de snelheid van je internetverbinding kan dat een paar minuten in beslag nemen. Vervolgens ga je met cd openwrt naar de eerder gekloonde directory. Om alle beschikbare OpenWrt-pakketten uit de aparte pakketrepository te halen en te installeren, start je het feeds-script twee maal.

./scripts/feeds update -a
./scripts/feeds install -a

De makefile downloadt bij het compileren de even­tueel benodigde broncode. Om hem daar van tevoren al in tegemoet te komen, voer je make download uit. Dat voorkomt dat de compiler afbreekt als je internetverbinding de code niet snel genoeg kan leveren.

Image-configuratie

Voor het configureren van de image maak je het door de makefile benodigde bestand .config aan. In dat bestand wordt onder meer gedefinieerd voor welke routers er images gemaakt moeten worden en welke pakketten en drivers erin moeten zitten. Je hoeft dat bestand niet handmatig aan te maken, maar je kunt het configureren van de image starten met het commando

make menuconfig

Met de pijltjestoetsen navigeer je door de opties heen, met de Enter-toets wissel je in een menu en met de spatiebalk bewerk je de items dan wel selecteer je die. Door twee keer op de Escape-toets te drukken springt het menu een niveau terug en sluit je in het hoofdmenu het configureren van de image.

Welke router-images er gecompileerd gaan worden, wordt bepaald door de zogeheten targets. Die zijn gesorteerd op processorserie (Target system) en op subtarget. Die laatste dekken eventuele specialiteiten van de opgesomde routers af. In ons geval zijn de subtargets ‘tiny’ belangrijk. Daarbij gaat het om apparaten waarop OpenWrt door het gebrek aan genoeg geheugen niet meer draait zonder veel dingen weg te strepen. Daar worden dan bijvoorbeeld versies van bibliotheken en drivers voor gebruikt die beperkt zijn in hun functieomvang.

router OpenWrt firmware aanpassen samenstellen makefile interface

Bij het configureren van de image stel je in wat er in de zelf gemaakte OpenWrt-image moet komen te zitten – dat gaat met de grafische interface erg makkelijk.

Op de OpenWrt-wiki kun je de juiste target voor elk ondersteund apparaat achterhalen. Ga op de pagina ‘Table of Hardware’ met de firmware-downloads van OpenWrt naar de rij met je router – die je handig op kunt zoeken met de zoekvelden bovenin de tabel – en kijk dan daar naar wat er in installatielink staat. Als daar ‘/targets/ar71xx/’ in staat, dan betekent dit dat het om een target uit de Atheros-AR7xxx- of AR9xxx-serie gaat. Als in de installatielink ‘/targets/ramips/mt76x8/’ staat, gaat het om een ‘Mediatek ­Ralink MIPS’-target.

Voor alle TP-Link WR841N-modellen, met uitzondering van versie 13, selecteer je ‘Atheros AR7xxx/AR9xxx’ als Target System en ‘Devices with small flash’ (tiny) als Subtarget. Versie 13 gebruikt een Mediatek-­processor, waardoor je daar ‘Mediatek Ralink MIPS’ en ‘MT76x8 based board’ als target en subtarget moet kiezen.

Bij Target Profile stel je in voor welk apparaat het buildsysteem images moet maken. De standaard ingestelde ‘Default Profile’ compileert in principe voor alle routers. Als je alleen één bepaalde WR841N-versie hebt, dan navigeer je in de lijst naar het betreffende model en bevestig je de keuze met Enter. Je kunt ook bovenaan het item ‘Multiple devices’ selecteren, waarna het nieuwe menu-item ‘Target Devices’ in het overzicht verschijnt.

Ga naar het submenu en selecteer daar de routers naar believen met de spatiebalk uit, zodat make meerdere images ineens maakt als je bijvoorbeeld een WR841N v9 en een WR841N v10 hebt. Hoe meer apparaten je selecteert, des te langer de compiler voor al die images nodig heeft.

Doorlezen is gratis, maar eerst even dit:

Dit artikel is met grote zorg samengesteld door de redactie van c’t magazine – het meest toonaangevende computertijdschrift van Nederland en België. Met zeer uitgebreide tests en praktische workshops biedt c’t de diepgang die je nergens online vindt.

Bekijk de abonnementen   Lees eerst verder

Pakketten selecteren

Met het normale profiel past WireGuard niet in het geheugen van onze router. Om daar plaats voor te maken, gooi je allereerst de pakketten uit de OpenWrt-image die niet nodig zijn. Als je je apparaat niet meer als wifi-accesspoint wilt gebruiken, kun je de wifi-­driver verwijderen. Omdat het daarbij om ‘Kernel modules’ gaat, ga je in het submenu naar de ‘Wireless drivers’. Met <*> gemarkeerde pakketten kun je met de spatiebalk bewerken. Een pakket dat met -*- geblokkeerd is, is oftewel per se noodzakelijk of een afhankelijkheid – dan heeft een ander pakket het nodig om te kunnen werken. Als je de niet benodigde pakketten afvinkt, dan blokkeert het menu de items automatisch. De wifi-drivers bevinden zich allemaal in één categorie. Door die te verwijderen, bespaar je ongeveer 400 kB aan geheugenruimte. Extra aanhangsels als de wifi-commandline-tool iw (34 kB), de WPA-­bibliotheek wpad-mini (295 kB) in de sub­categorie Network en de monitoringtool iwinfo (in Utilities, 5 kB) zijn eveneens niet meer nodig.

Als je niet zonder wifi kunt, zijn er nog andere alternatieven om de benodigde opslagruimte te reduceren: het inbelprotocol PPP (Point-to-Point-­Protocol) wordt bijvoorbeeld door DSL-aansluitingen gebruikt – dat heb je dus niet nodig als de toegang tot internet al op een andere manier geregeld wordt. Je kunt het item ppp-mod-ppoe verwijderen in de subcategorie Network, wat je dan ongeveer 35 kB aan ruimte oplevert.

Afhankelijk van het model zitten er usb-drivers in (‘Kernel modules / USB Support’), die je eveneens kunt deactiveren als je die aansluitingen niet nodig hebt. In het profiel van de WR841N zijn ze echter standaard geactiveerd.

In de categorie ‘Base system’ kun je met de pakketten opkg en dnsmasq respectievelijk 62 en 111 kB winnen. De eerste neemt normaal gesproken de pakket­installatie onder OpenWrt voor zijn rekening, maar dat staat door het gebrek aan geheugen niet op de planning. De tweede geeft IP-adressen uit via DHCP en beantwoordt DNS-requests – beide zijn voor WireGuard niet nodig.

Als laatste activeer je bij de ‘Global build settings’ de opties ‘Strip unnecessary exports from the kernel image’ en ‘Strip unnecessary functions from libraries’ om bij de kernel de bibliotheken te beperken tot het hoogst nodige.

Niet altijd zitten alle afhankelijkheden in dezelfde categorie. Om het zoeken zo kort mogelijk te houden, vul je het geblokkeerde pakket in bij de pakkettabel op de OpenWrt-website (zie de link op de ­pagina hiernaast) bij het zoekveld Dependencies. De tabel laat dan alle pakketten zien die het gevraagde pakket nodig hebben. De kolom Category weerspiegelt de sortering van de image-configuratie.

Na al die bezuinigingsmaatregelen activeer je de OpenWrt-webinterface LuCI in de gelijknamige cate­gorie onder Collections. WireGuard staat in hetzelfde gedeelte in de subcategorie Applications als luci-app-wireguard. Het pakket wil dat naast de webintegratie ook alle benodigde afhankelijkheden geïnstalleerd worden.

Compileren en installeren

Als je de pakketten uitgezocht hebt, selecteer je op de onderste regel van de imageconfiguratie de knop Save en bevestig je de keuze. Laat de voorgestelde bestandsnaam daarbij hetzelfde, want dat is de enige naam waar make naar kijkt. Daarna sluit je het menu met een dubbele Escape.

Met make start je het bouwen van de OpenWrt-images. Met de optionele parameter -j bepaal je hoeveel processen make voor het compileren mag gebruiken. Daarvoor neem je het aantal echte of virtuele kernen (Hyper-Threading-cpu) maal twee om je processor maximaal te benutten en de tijd zo kort mogelijk te houden. Daarbij kan het gebeuren dat je pc tot aan het eind van het compileren niet meer reageert. Voor een Hyper-Threading-cpu met vier kernen zou dat dienovereenkomstig leiden tot make -j16.

Afhankelijk van de processorsnelheid kan een eerste doorloop meer dan een uur duren omdat de compiler OpenWrt en alle pakketten moet compileren. Als dat onderweg mislukt, moet je make in eerste instantie weer herstarten. Als het compileren dan weer afbreekt, start het dan opnieuw met make V=s om uitvoerige status- en foutmeldingen te krijgen.

router OpenWrt image compileren compiler

Het compileren van een OpenWrt-image kan enige tijd duren. Als de compiler klaar is, kun je meteen aan de slag met de binary’s.

Als het maken van de image(s) gelukt is, staan in de subdirectory bin/targets/(platform) de installatiebestanden. De factory-image zet je, afhankelijk van de router, met TFPT, via de webinterface of met FTP op de router. Bij apparaten waar OpenWrt al op draait, kun je de sysupgrade-image via de webinterface uploaden. De OpenWrt-wiki biedt uitvoerige installatietips voor alle ondersteunde routers.

Configureren

Het instellen van je image werkt niet anders dan bij de officiële images van de OpenWrt-website. Je OpenWrt-router is te bereiken op 192.168.1.1 via de web­interface en via SSH zonder wachtwoord. Omdat een DHCP-server ontbreekt, moet je je computer handmatig een IP-adres uit dat bereik geven, bijvoorbeeld 192.168.1.22. Daarna verander je de LAN-interface van je router in de webinterface van 192.168.1.1 naar een vrij adres binnen het subnet van je LAN en vul je je thuisrouter in als internet-gateway.

De WireGuard-configuratie kun je eveneens via de webinterface doen. Om dat te doen, voeg je bij de interface-instellingen simpelweg een nieuwe inter­face toe, selecteer je daarbij WireGuard als protocol en zet je die in de firewall-zone LAN. De commando’s voor het genereren van de sleutels werken bij OpenWrt op dezelfde manier.

router OpenWrt firmware webinterface WireGuard instellen

De OpenWrt-webinterface biedt al WireGuard-integratie, waardoor het configureren heel eenvoudig wordt.

Als je in je thuisrouter statische routes kunt aanmaken, heb je geen bijzondere routingregels nodig om het VPN-netwerk vanuit je thuisnetwerk te kunnen gebruiken en andersom. Bij een Fritzbox zit die optie in het menu ‘Home Network / Network / ­Network ­Settings’. Als je WireGuard-netwerk bijvoorbeeld 192.168.20.0/24 is, maak je voor dat netwerk bij ‘IPv4 Routes’ een ‘New IPv4 Route’ via het lokale IP-adres van je OpenWrt-router (Gateway), bijvoorbeeld

IPv4 network: 192.168.20.0
Subnet mask: 255.255.255.0
Gateway: 192.168.1.55

als 192.168.1.55 als het IP-adres van je router is.

Aan de WireGuard-clients en WireGuard-peers van je OpenWrt-­router deel je het eveneens bereikbare subnetwerk eenvoudig mee via de ‘Allowed IPs’, bijvoorbeeld

192.168.20.0/24,192.168.1.0/24

Als het gehele subnetwerk achter een WireGuard-peer zit, dan moet je aan beide kanten het subnetwerk van de tegenhanger invullen bij de ‘Allowed IPs’ en bij de statische routes van de thuisrouter voor een transparante LAN-naar-LAN-routing.

Uitgebreide informatie over WireGuard, routers en andere onderwerpen lees je in c't magazine. Nieuwste uitgave: c't 05/2024

Deel dit artikel

Noud van Kruysbergen
Noud van KruysbergenNoud heeft de 'American Dream' doorlopen van jongste bediende tot hoofdredacteur van c't, waar hij zo veel mogelijk de diepgang, betrouwbaarheid en diversiteit wil bewaken.

Lees ook

Raspberry Pi als NAS-systeem gebruiken? Dit moet je weten!

Wist je dat je een Raspberry Pi als Network Attached Storage (NAS) kunt gebruiken? Zo voldoet de Raspberry Pi 4 aan de belangrijkste eisen om dit te k...

Je Raspberry Pi op afstand bedienen? Zo krijg je het voor elkaar met SSH!

De Raspberry Pi op afstand bedienen is handig en kan op verschillende manieren. Via SSH is het makkelijkste op te zetten, we laten zien hoe.

0 Praat mee
avatar
  Abonneer  
Laat het mij weten wanneer er