De routetabel toont een standaardroute via de ZeroTier-interface, het netwerk meldt zich online, en een browser verlaat nog steeds het lokale ISP-adres. Die combinatie komt vaak voor en het is geen fout in de client. Een standaardroute zegt alleen waar pakketten naartoe moeten; aan de andere kant moet iets ze doorsturen en vertalen. Drie afzonderlijke delen moeten kloppen voordat een exitnode werkt.

De route bestaat, maar er gaat niets naar buiten

Controleer eerst de routetabel van de client. Een regel zoals default via 10.147.20.5 dev zt0 bewijst dat de route is geïnstalleerd, niet dat de bestemming het verkeer accepteert. De volgende hop moet een lid zijn dat bereid en in staat is die door te sturen.

Als hetzelfde verzoek nog steeds via de fysieke interface naar buiten gaat, heeft de client de route niet geïnstalleerd, of geïnstalleerd met een metriek die verloor van de lokale standaardroute. Als het verzoek verdwijnt nadat de route is geïnstalleerd, ontvangt het exitlid pakketten en slaagt het er niet in die door te sturen of te vertalen. Een client die de fysieke standaardroute behoudt, stuurt helemaal geen pakket naar de exit.

Dat onderscheid bepaalt waar je moet werken. Een openbaar adres voor en na de wijziging vergelijken scheidt een route die nooit is gebruikt van een die wel is gebruikt en daarna is weggevallen, en het kost één opdracht in plaats van een controle van de hele configuratie. Doe de vergelijking voordat je iets anders wijzigt, zodat beide resultaten uit dezelfde begintoestand komen.

Drie delen die allemaal moeten kloppen

Een exit is een keten, en de zwakste schakel bepaalt het symptoom. De tabel hieronder noemt de schakels in de volgorde waarin ze meestal falen.

PartWhere it livesWhat a failure looks like
Forwarding and NATExit node kernel and firewallTraffic arrives, no reply
Managed default routeZeroTier network controllerNo default via the tunnel on the member
Client acceptanceMember's per-network settingRoute offered but not installed
DNS behaviorClient resolver configurationPages fail by name, IP works

De eerste rij is degene die de naam van de optie verbergt. Een lid wordt pas een exit wanneer zijn kernel pakketten doorstuurt tussen de ZeroTier-interface en de interface die naar het internet kijkt, en wanneer het antwoordpad terug naar de tunnel wordt vertaald. Zonder die doorsturing is het lid een peer, geen gateway.

De controllerrij is autorisatie, geen configuratie. 0.0.0.0/0 via een lid aankondigen vertelt elke client waar de exit is; het maakt dat lid niet in staat het verkeer te dragen. Het controleert ook niet of het lid een werkende weg naar het internet heeft. De ZeroTier-documentatie over de exitnode behandelt dezelfde scheiding tussen node, route en client.

Configureer de exitnode om door te sturen en te vertalen

Schakel IPv4-doorsturing permanent in en voeg daarna bron-NAT toe voor verkeer dat de WAN-interface verlaat. De filterregels moeten de doorgestuurde stroom in beide richtingen toestaan, omdat doorsturen en vertalen losstaan van toestemming:

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i zt0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o zt0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Vervang zt0 en eth0 door de namen op de host; een regel die voor een voorbeeldinterface is opgeslagen, volgt geen pakketten op een echte. Maak de wijzigingen permanent via de firewallbeheerder die de regels bezit, want een opdracht in een interactieve shell verdwijnt bij de volgende herstart.

Als de host een firewallbeheerder zoals UFW of firewalld draait, voeg de regels dan via die beheerder toe in plaats van iptables-regels ernaast te stapelen. Twee eigenaren die dezelfde ketens bewerken, produceren beleid dat van de opstartvolgorde afhangt. De volgorde is belangrijk wanneer de beheerder zijn eigen ketens genereert. Test vanaf een client nadat de beheerder opnieuw is geladen, niet daarvoor.

Kondig de route aan en accepteer die op de client

Voeg op de netwerkcontroller een beheerde route voor 0.0.0.0/0 toe waarvan de volgende hop het ZeroTier-adres van het exitlid is. Sta vervolgens op het lid dat die moet gebruiken de overschrijving voor dat netwerk toe. De toestemming is lokaal: ze herconfigureert andere leden niet en wijzigt de controller niet.

zerotier-cli listnetworks
zerotier-cli set <network-id> allowDefault=1
ip route get 1.1.1.1

De laatste opdracht hoort de ZeroTier-interface en het adres van het exitlid te melden. Meldt die nog steeds de fysieke interface, dan ontbreekt de route of heeft een concurrerende standaardroute een betere metriek.

Houd de instelling beperkt tot het netwerk dat die nodig heeft. Het accepteren van de standaardroute wereldwijd inschakelen, of op een netwerk dat alleen een privésubnet hoort te bieden, stuurt verkeer via een exit die daar nooit op is berekend.

Verifieer de exit en controleer de andere adresfamilies

Vraag een openbaar adres op bij een dienst die de bron meldt, en vergelijk het met het WAN-adres van de exitnode. Laad daarna een site op naam om te bevestigen dat DNS nog steeds resolveert, en test één belangrijke toepassing in plaats van alleen een browser.

Een client met dubbele stack kan zijn eigen IPv6-pad blijven gebruiken terwijl IPv4 via ZeroTier naar buiten gaat. Als het doel is al het verkeer te verbergen of te beheersen, zijn een aparte ::/0-route en IPv6-doorsturing op de exit nodig, en een IPv4-test zegt daar niets over.

De omgekeerde padfiltering van Linux kan ook geldig exitverkeer op de client laten vallen. ZeroTier documenteert een rp_filter-overweging voor deelnemende leden; wijzig die instelling bewust en pas nadat de route en NAT zijn bevestigd, niet als eerste experiment.

Als de eis toegang tot een NAS of één kantoorsubnet is, is een beheerde route voor dat prefix een kleinere en veiligere wijziging dan een volledige exit. Al het browsen via een ander apparaat sturen is een andere beslissing dan één privébron bereiken, en verdient een aparte beoordeling.

Gerelateerde artikelen