Twee locaties, twee internetlijnen per locatie, en dus de wens om ook twee tunnels te hebben. Dat is een goed idee, maar het werkt anders dan de meeste mensen verwachten: de tool maakt netjes twee tunnels, en die gaan zich vervolgens gedragen als twee gelijkwaardige paden in plaats van als hoofd en reserve.
De twee tunnels maken
Op het netwerkbord klik je met rechts op de router en kies je twee keer Tunnel naar dezelfde router aan de overkant. Je krijgt dan:
| Tunnel 1 | Tunnel 2 | |
|---|---|---|
| Interfacenaam | wg1 aan beide kanten | wg2 aan beide kanten |
| Tunnelnetwerk | 10.255.255.0/30 | 10.255.255.4/30 |
| UDP-poort | 13231 | 13231, aanpassen naar bijvoorbeeld 13232 |
| Routes | naar de netwerken van de overkant | naar dezelfde netwerken |
Let op die poort. Elke nieuwe WireGuard-tunnel krijgt 13231, en twee WireGuard-interfaces op dezelfde router kunnen niet allebei op dezelfde UDP-poort luisteren. Klik de tweede tunnel aan en zet de poort op iets anders voordat je genereert. Vergeet je het, dan mislukt die regel bij het plakken.
Welke wordt er gebruikt
Allebei tegelijk, en dat is meestal niet wat je bedoelde.
De tool schrijft per tunnel statische routes naar de netwerken aan de overkant, en die krijgen geen afstand mee. In RouterOS betekent dat afstand 1 voor beide. Twee routes naar hetzelfde netwerk met dezelfde afstand levert ECMP op: het verkeer wordt over beide tunnels verdeeld.
Dat is op zichzelf niet fout, maar het gedrag bij uitval is onaangenaam. Een WireGuard-interface gaat namelijk nooit "down": hij bestaat zodra hij is aangemaakt, of de overkant nu antwoordt of niet. Valt de lijn onder tunnel 2 weg, dan blijft de route via wg2 staan en verdwijnt ongeveer de helft van je verkeer. Niet alles, wat het lastiger te herkennen maakt dan een totale storing.
Route-afstand is de knop die telt
Het tunneltype doet hier niets toe. WireGuard, GRE over IPsec, IPIP: ze leveren allemaal een interface en een route, en het is de route die bepaalt welke gebruikt wordt. Er is dus één ding dat je moet regelen, en dat is de afstand.
Na het plakken, op beide routers, voor elk netwerk aan de overkant:
/ip route
set [find gateway=wg2] distance=20
Daarmee is wg1 het hoofdpad en wg2 de reserve. Alleen: een route met een hogere afstand neemt pas over als de route met afstand 1 verdwijnt, en dat gebeurt niet vanzelf, want de interface blijft bestaan. Je hebt dus ook iets nodig dat de route wegtrekt.
Drie manieren om de omschakeling te laten gebeuren
- BGP per tunnel. De nettigste. Geef beide routers een AS-nummer op het bord en zet bij elke tunnel BGP aan. De tool schrijft dan per tunnel een BGP-sessie over het tunneladres, laat de statische routes weg, en zet bij de WireGuard-peer vast dat de netwerken van de overkant wel toegestaan blijven, anders zou het verkeer alsnog sneuvelen op de allowed-address. Valt een sessie weg, dan verdwijnen de routes die eroverheen geleerd zijn en blijft de andere tunnel over. Geef de twee sessies verschillende voorkeur, anders krijg je opnieuw twee gelijkwaardige paden. Reken erop dat de omschakeling pas komt als de hold time verlopen is, niet meteen.
- Netwatch. Zet in het onderdeel Hoge beschikbaarheid een host op het tunneladres van de overkant, bijvoorbeeld
10.255.255.6, met een interval van 10 seconden. In het script bij "down" zet je de afstand van de route om, in het script bij "up" weer terug. Dat werkt goed en is te begrijpen, maar het zijn jouw regels: ze staan niet in het gegenereerde script en ze verdwijnen als iemand opnieuw genereert. - Check-gateway op de route. Voor een route via een GRE- of IPIP-tunnel kun je
check-gateway=pingzetten, zodat de route verdwijnt als de overkant niet meer antwoordt. Dat is de eenvoudigste vorm, maar het hangt ervan af of het tunneladres aan de overkant betrouwbaar op ping reageert.
Controleer het resultaat met /ip route print (staat er één actieve route of twee?) en /interface wireguard peers print (hoe lang geleden was de laatste handshake?).
Twee tunnels over twee verschillende lijnen
De reden om twee tunnels te maken is meestal dat er twee internetlijnen zijn. Daar zit een addertje: de tool kent per router één veld voor het publieke adres, en een tunnel gebruikt dat adres als endpoint. Twee tunnels naar dezelfde router krijgen dus hetzelfde endpoint, en lopen daarmee allebei over de route die de router op dat moment kiest.
Wil je dat tunnel 1 echt over lijn 1 gaat en tunnel 2 over lijn 2, dan moet je dat met de hand afdwingen: een route naar het endpoint van de overkant met de uitgaande interface van die ene lijn erbij, en aan de andere kant het endpoint invullen met het adres dat bij die lijn hoort. Dat is de plek waar het echt handwerk wordt, en die je moet opschrijven.
Wat er wel vanzelf goed gaat: schakelt een kant over op zijn tweede lijn, dan belt die kant opnieuw en leert de overkant het nieuwe bronadres bij de eerstvolgende handshake. Zie Twee providers per locatie.
Wat de controles vangen
- Geen van beide routers heeft een publiek adres bij een WireGuard-tunnel: dan weet de tunnel niet waar hij heen moet.
- Een DNS-naam bij een GRE-, IPIP- of EoIP-tunnel. Die willen een IP-adres als bestemming.
- Overlappende netwerken aan beide kanten, waardoor de routes over de tunnel botsen.
- BGP aan zonder AS-nummer bij een van de twee routers.
- Ontbrekende WireGuard-sleutels.
Verder lezen: Tunnels tussen locaties, BGP en Netwatch en monitoring.