NixOS Router met IPv4 en IPv6

Hoi,

Vanwege het constant uitblijven van IPv6 bij Odido de overstap gemaakt naar Freedom. Ik wil vooral leren hoe IPv6 werkt en was ook klaar met de lakse houding van Odido naar klanten.

Op mijn router had ik pfSense 2.7 geïnstalleerd, de overstap naar Freedom ging eigenlijk vlekkeloos en na het instellen van DHCPv6 had ik gelijk een IPv6 verbinding. Totdat ik dacht, ik pak gelijk even de update naar 2.8 mee zodat ik up-to-date ben en bam, mijn router kwam niet verder bij het laden van if_pppoe. Ik wilde toch al langer OPNsense proberen en na dit te installeren kwam ik maar niet online. Terug naar pfSense 2.7, zelfde problemen. Toen het geniale idee om zelf mijn router op te zetten in NixOS en na 15 uur debuggen, blogposts lezen en vibecoding een werkende dual stack verbinding haha.

Voor de mensen die dit ook willen proberen, mijn notities als amateur networking persoon:

  • pppd beheert de volledige IPv4-verbinding (IP, route, DNS).
  • systemd-networkd beheert de volledige IPv6-stack en alle LAN-interfaces.
  • De PPPoE-verbinding loopt over een VLAN met ID 6.
  • Fysieke WAN-poort: linkConfig.MTUBytes = "1512". In de instructies staat 1508, maar op het forum kom je ook 1512 tegen. Weet nog niet wat beste is
  • PPPoE-interface: mtu 1500 en mru 1500 in de pppd-config
  • defaultroute: laat pppd de IPv4-gateway instellen.
  • usepeerdns: laat pppd de DNS-servers van Freedom leren.
  • Een ip-up script om DNS-servers door te geven aan systemd-resolved. Geen manier gevonden om systemd dit van het pppd op te pakken maar zonder nog niet werkend gekregen.
  • Systemd WithoutRA = "solicit": start direct met DHCPv6, want Freedom stuurt geen Router Advertisements.
  • routes = [{ Gateway = "::"; ... }];: stelt handmatig de default IPv6-route in, want Freedom geeft deze niet.
  • linkConfig.RequiredForOnline = "yes"; op de pppd interface. Dit lost een race conditie op tussen pppd en systemd-networkd.

Ik heb een basis nftables config die werkt, maar ik weet hier nog niet genoeg van af. Mooie kans om hier meer over te leren. Uiteindelijk haal ik nu 910 Mbps down en ~830 up.

Interfaces: nixos/hosts/dosukoi/modules/interfaces.nix at master · martijnboers/nixos · GitHub
Firewall: nixos/hosts/dosukoi/modules/firewall.nix at master · martijnboers/nixos · GitHub

Ongetwijfeld dat hier nog dingen aan gaan veranderen, dus mocht je in de toekomst in deze thread komen, check vooral de master branch. Ik ga nu maar even naar buiten om wat gras aan te raken haha.

Nog geen ervaring met hoe stabiel dit gaat draaien. Mochten er andere zijn met vergelijkbare setups laat het me vooral weten.

4 likes

Mooie post. Wat voor hardware gebruik je? Ik heb een NanoPi R6C (Rockchip RK3588S - 8GB LPDDR4X - 32GB eMMC).

Jouw config ziet er best anders uit dan mijn config.

In pppd heb ik uit jouw config niet:

      ifname peepee
      name "fake@freedom.nl"
      defaultroute
      usepeerdns
      ipv6cp-use-ipaddr
      mtu 1500
      mru 1500

En ten opzichte van jouw config wel:

            debug
            user fake@freedom.nl

Op de ppp-interface heb ik:

    ppp0 = {
      dhcpPrefixDelegationConfig = {
        Announce = "no";
        SubnetId = "0";
        UplinkInterface = ":self";
      };
      dhcpV6Config = {
        UseDNS = "no";
        UseDomains = "no";
        UseHostname = "no";
        UseNTP = "no";
      };
      ipv6AcceptRAConfig = {
        DHCPv6Client = "always";
      };
      matchConfig = {
        Type = "ppp";
      };
      networkConfig = {
        DefaultRouteOnDevice = "yes";
        DHCP = "ipv6";
        DHCPPrefixDelegation = "yes";
        Gateway = "::";
        KeepConfiguration = "static";
      };
    };

Op de vlan-interface:

    vlan6 = {
      linkConfig = {
        MTUBytes = "1508";
      };
      matchConfig = {
        Name = "vlan6";
        Type = "vlan";
      };
      networkConfig = {
        IPv6AcceptRA = "no";
      };
    };

Upstream interface:

    end0 = {
      matchConfig = {
        Name = "end0";
        Type = "ether";
      };
      vlan = [ "vlan6" ];
      networkConfig = {
        IPv6AcceptRA = "no";
      };
    };

Downstream:

    enP3p49s0 = {
      address = [
        "fe80::1/64"
        "2a10:<redacted>::1/48"
        "192.168.178.1/24"
      ];
      dhcpPrefixDelegationConfig = {
        Announce = "yes";
        SubnetId = "1";
        UplinkInterface = "ppp0";
      };
      dhcpServerConfig = {
        DNS = "192.168.178.<redacted>";
        PoolOffset = 100;
      };
      ipv6SendRAConfig = {
        DNS = "2a10:<redacted>";
      };
      matchConfig = {
        Name = "enP3p49s0";
        Type = "ether";
      };
      networkConfig = {
        DHCPPrefixDelegation = "yes";
        DHCPServer = "yes";
        Domains = "<redacted>";
        IPMasquerade = "ipv4";
        IPv6AcceptRA = "no";
        IPv6SendRA = "yes";
      };

Dit na eindeloos de systemd-networkd manuals spellen. Al kan ik niet beweren dat dit optimaal is. Het Werkt™

Het routertje update en reboot (wanneer nodig) automatisch.

Deze setup is super-stabiel. Moet ook wel want aan de ene kant is het gezin ervan afhankelijk en aan de andere kant hosten we zelf mail/dns/matrix.

1 like

Nice! Kijk nog meer NixOS gekken haha

Eerst pfSense op een Zimaboard met Realtek NICs maar dit gaf zoveel gezeik dat ik ben gaan rondkijken en voor een Protectli Vault V1410 ben gegaan. Coreboot en 2.5G Intel NICs, wel aan de prijzige kant voor hobby segment. Lang naar Banana Pi gekeken maar misschien dat ik ooit nog een keer een board van hun koop om een meer DIY accesspoint in elkaar te zetten.

Het lijkt er op dat jij wel IPv4 beter werkend heb gekregen in systemd-network. Kreeg dit voor mijn leven maar niet aan de praat maar dit geeft wel weer inzicht. Als ik er de puf voor heb ga ik ook proberen om nog minder op pppoe te leunen, zou de up en down scripts overbodig maken.

Hoe zijn je ervaring met email server thuis? Dat is een van die dingen waar ik mij al lange tijd niet aan gewaagd heb.

Mail (en dns) zelfhosten gaat prima Bij Freedom. En daarvoor bij Xs4all. Volgende maand 24 jaar.

Ik gebruik een vrij streng afgestelde Postfix (met postscreen), Dovecot, Bind en NSD.

Ben wel bezig met een refactor van mail en dns. Postfix is 1 van de eerste dingen die ik naar NixOS overgezet heb en is in al die tijd (9,5 jaar) niet wezelijk aangepast (naast het hernoemen van nix configuratie-opties).

En ik ga Dovecot vervangen door Cyrus IMAP om JMAP te kunnen gebruiken.

Heb jij al een idee over wat je wellicht wil gaan gebruiken?

1 like

Heb je toevallig je NixOS config publiek? Ben wel benieuwd. Nooit gezeik gehad met IP reputation? Vorig jaar mijn vaste e-mail adress over moeten zetten omdat alle Exchange servers bepaald hadden dat mijn .nl domein van 10 jaar+ onbetrouwbaar is (hosting bij Proton). Heb nu een .email die weer breekt in achterhaalde e-mail validatie forms ;-;

Ik ga mijn adguard DNS overzetten van mijn main server naar mijn router. Denk dat ik dit project ga gebruiken om LAN devices in de gaten te houden. Als ik er over uit ben of ik wil gaan investeren in Crowdsec mijn central log api.

Wat updates:

  • MTUBytes naar 1508. Ik had af en toe willekeurige websites die bleven hangen, ik denk dat dit hierdoor kwam. Heb het inmiddels al een uur niet meer gehad
  • ip-up script verwijderd, hardcoded Freedom DNS servers in configuratie gezet.
  • tc-cake toegevoegd voor QoS tijdens downloaden grote bestanden

Speedtest zijn nu ~950 up en 850 down.

Mijn config heb ik niet publiek. Dat is me iets te persoonlijk. Wel post ik af en toe snippets in fora (zoals hier, en ook op https://discourse.nixos.org/).

Tweeeneenhalf jaar geleden heb ik wel een aantal keer gehad dat Microsoft een deel Freedom ip-space enkele dagen blokkeerde. Sindsdien niet meer.

Dank voor je update. Met m’n eerste routertje (een Raspberry Pi 4) kon ik ook enkele websites niet bereiken. Dat bleek te komen omdat de rpi4 geen hogere mtu dan 1500 ondersteunt. Vanwege de vlan-overhead wordt de mtu dan effectief 1492 bytes. Zou gewoon moeten werken maar doet dat dus niet altijd.