RouterOS v7 kan containers draaien: een kant en klaar image, hetzelfde soort image dat je van Docker kent, dat naast het besturingssysteem op de router draait. Pi-hole, een kleine DNS-server, een MQTT-broker, iets wat data ophaalt. Het is aantrekkelijk omdat je er geen apparaat bij hoeft te zetten, en het gaat mis omdat de router daar niet voor gebouwd is.
Lees eerst de rest van dit hoofdstuk voordat je dit op een apparaat zet dat in gebruik is. Containers vragen om opslag, geheugen en een bevestiging met de hand. Het is het enige onderdeel van de configurator waarbij je bij het apparaat moet staan.
Welke apparaten dit kunnen
Het onderdeel Containers verschijnt alleen als je model het aankan. De configurator kijkt daarvoor naar de architectuur: ARM64, x86 en Tile. Een apparaat met een oudere 32-bits ARM of MIPS krijgt te zien dat containers ARM64 of x86 vereisen, en dan houdt het op.
De architectuur is de enige controle die de tool doet, en dat is niet genoeg. Wat je er zelf bij moet wegen:
- Geheugen. Een router met 64 of 128 MB RAM draait RouterOS en verder niets. Reken op minimaal een half gigabyte voordat een container naast een werkende configuratie past.
- Opslag. De interne flash van een RouterBOARD is klein en slijt van schrijven. Gebruik een USB-stick, een SSD of NVMe. Dat is geen advies om netjes te zijn, dat is de reden dat apparaten sneuvelen.
- Het pakket.
containeris een los pakket dat je zelf downloadt bij MikroTik en op de router zet.
Device-mode
Containers zitten achter device-mode, de beveiliging die RouterOS heeft toegevoegd nadat apparaten op afstand als botnet werden gebruikt. Daarom is de eerste regel van dit onderdeel:
/system device-mode
update container=yes
Die regel vraagt om een fysieke bevestiging binnen vijf minuten: de resetknop indrukken, of de stroom eraf en er weer op. Doe je dat niet, dan gebeurt er niets. Omdat de rest van het onderdeel pas kan werken als dat rond is, draait het in de praktijk in twee ronden: plak het script, bevestig, en draai daarna het containerdeel opnieuw. Het script zegt dat er in een opmerking bij.
In het onderdeel Systeem staat een schakelaar Door device-mode geblokkeerde onderdelen later toepassen, die de geblokkeerde regels in een script zet dat één keer bij de eerstvolgende start draait. Dat helpt hier, maar het voegt ook een stap toe waar je aan moet denken: het apparaat moet daarna binnen een dag uit en weer aan. Zie Systeem en tijd.
De instellingen
- Opslag
- De naam van de schijf die als root-dir wordt gebruikt, standaard
disk1. Kijk met/disk printhoe jouw schijf heet; bij een USB-stick is dat vaakusb1-part1. Hier komen de lagen van het image, de tijdelijke bestanden en de bestanden van elke container te staan. - Containernetwerk
- Het adres van de router in het containernetwerk, standaard
172.17.0.1/24. Dit is het adres dat containers als gateway krijgen. Kies iets dat nergens anders in je netwerk voorkomt. - Registry URL
- Waar de images vandaan komen, standaard
https://registry-1.docker.io. Heb je een eigen registry of een spiegel, dan vul je die hier in.
De containers zelf
Per container vul je in:
- Naam: die komt terug als opmerking, als naam van de veth-interface en als map op je schijf.
- Image, bijvoorbeeld
pihole/pihole:latest. Zet er een versie achter in plaats vanlatestals je wilt dat een herstart hetzelfde blijft doen. - IP in het containernetwerk, bijvoorbeeld
172.17.0.2. Binnen hetzelfde subnet als het adres hierboven. - Omgevingsvariabelen, één
KEY=valueper regel. Zo geef je een container zijn instellingen mee. - Mounts, één
naam:/pad-in-containerper regel. De tool maakt daarvan een map op je schijf, zodat de gegevens een herstart van de container overleven. - Poorten doorzetten vanaf het LAN, bijvoorbeeld
tcp:80,443 udp:53.
Omgevingsvariabelen komen letterlijk in het script te staan. Zet je daar een wachtwoord in, dan staat dat wachtwoord in het script en in wat je deelt. Behandel het bestand daarnaar.
Wat er in het script komt
- De device-mode-regel, met de opmerking dat je moet bevestigen.
- Een bridge
containers, het routeradres daarop en eenmasquerade-regel, zodat containers naar buiten kunnen. /container configmet de registry en de mappen voor tijdelijke bestanden en lagen op jouw schijf.- Per container een
/interface vethmet de naamveth-<naam>, het adres en de router als gateway, die als poort in de bridgecontainerskomt. /container envsen/container mountsals je die hebt ingevuld, en dan de/container-regel zelf metstart-on-boot=yesen logging aan.- Een
dst-nat-regel per poort die je doorzet, op het routeradres vanaf de interfacelijst LAN.
De veth is de kabel tussen RouterOS en de container: de container ziet hem als zijn netwerkkaart, de router ziet hem als een interface in de bridge. Omdat alle containers in dezelfde bridge zitten, kunnen ze elkaar ook zien.
De poortdoorzetting betekent in de praktijk: je bereikt de container op het eigen adres van de router, op die poort. Pi-hole op tcp:80 vind je dus op het LAN-adres van je router, en niet op 172.17.0.2.
Wat het script niet doet
Het script start je container niet. Het image moet eerst binnengehaald worden, en dat duurt en kan misgaan. De laatste regel van het onderdeel vertelt je hoe je hem zelf start:
/container start [find comment="naam"]
/log print where topics~"container"
start-on-boot=yes zorgt daarna wel dat hij bij elke volgende start meekomt.
Dingen die misgaan
- Er gebeurt niets. Negen van de tien keer is device-mode niet bevestigd. Controleer met
/system/device-mode/print. - Het image wil niet binnenkomen. De router heeft daarvoor zelf werkende DNS en internet nodig, en genoeg ruimte op de schijf. Kijk in het log.
- De schijf klopt niet. Staat er
disk1terwijl jouw stick anders heet, dan schrijft alles naar een pad dat niet bestaat. Controleer met/disk printvoordat je plakt. - Vanaf een VLAN is de container onbereikbaar. Heb je die VLAN als geïsoleerd gemarkeerd, dan mag hij alleen naar internet en is dit de isolatie die zijn werk doet. Zie Firewall.
- De router wordt traag. Een container deelt CPU en geheugen met het routeren zelf. Kijk met
/system resource printwat er over is, en wees bereid de container weer weg te halen.
Wanneer je het beter niet doet
Een container op de router is aantrekkelijk voor één klein ding op een apparaat dat ruimte over heeft. Voor alles wat er echt toe doet, en zeker voor je DNS, is een los apparaatje meestal het betere antwoord: als je router herstart voor een update, valt anders je DNS er tegelijk mee uit. Een router die routeert is een router die je vertrouwt.
Verder lezen: Je apparaat kiezen, DNS en Diensten en tools.