Skip to content

DHCPv6-PD #30

Description

@felbinger

I tried around with dhcpv6-pd some time ago, but never even got a non pd setup working:

Just some garbage, copied from multiple notes (incorrect)

{ lib, pkgs, ... }:
{
  name = "dhcpv6";

  globalTimeout = 60;

  defaults = {
    networking.interfaces = {
      # prevent creation of default route from management network
      eth0.useDHCP = false;
      eth1 = {
        ipv4.addresses = lib.mkForce [ ];
        ipv6.addresses = lib.mkForce [ ];
        useDHCP = true;
      };
    };
  };

  nodes = {
    machine1 = {
      networking.interfaces.eth1.ipv6.addresses = lib.mkForce [
        {
          address = "2001:db8:bad:c0de::1";
          prefixLength = 64;
        }
      ];

      #boot.kernel.sysctl = {
      #  "net.ipv6.conf.all.forwarding" = "1";
      #  "net.ipv6.conf.eth1.accept_ra" = "2"; # allow RA while forwarding
      #};

      services.kea.dhcp6 = {
        enable = true;
        settings = {
          interfaces-config.interfaces = [ "eth1" ];
          subnet6 = [
            {
              id = 1;
              subnet = "2001:db8:bad:c0de::/64";
              interface = "eth1";
              pools = [
                {
                  pool = "2001:db8:bad:c0de::100-2001:db8:bad:c0de::200";
                }
              ];
            }
          ];
        };
      };

      services.radvd = {
        enable = true;
        config = ''
          interface eth1 {
            AdvSendAdvert on;
            # Tell clients to use DHCPv6
            AdvManagedFlag on;
            AdvOtherConfigFlag on;

            prefix 2001:db8:bad:c0de::/64 {
              AdvOnLink on;
              # Disable SLAAC, force DHCPv6
              AdvAutonomous off;
            };
          };
        '';
      };
    };
    machine2 = {
      networking.dhcpcd = {
        enable = true;
        extraConfig = ''
          interface eth1
            ipv6only
            ipv6rs
            ia_na  # Request a DHCPv6 Normal Address
            ia_ta  # Request a DHCPv6 Temporary Address
        '';
      };
      environment.systemPackages = [ pkgs.dhcpcd ];
    };
  };

  testScript = ''
    start_all()

    machine1.wait_for_unit("network-online.target")
    machine2.wait_for_unit("network-online.target")

    machine1.wait_for_unit("radvd.service")
    machine1.wait_for_unit("kea-dhcp6-server.service")

    machine2.sleep(2)

    print(machine2.succeed("ip -br -6 a sh eth1"))
    print(machine2.succeed("ip -6 route"))

    machine2.wait_until_succeeds("ip -6 a sh eth1 | grep 2001:db8:bad:c0de:")

    # wait for ipv6 dad to finish (initial ! causes the exit status to be negated)
    machine2.wait_until_succeeds("! ip -6 a sh eth1 | grep tentative")

    print(machine2.succeed("ip -6 address show eth1"))
    print(machine2.succeed("ip -6 route"))
  '';
}
{ ... }:
{
  name = "dhcpv6-pd";

  globalTimeout = 120;

  nodes = {
    machine1 = {
      virtualisation.interfaces.eth1 = {
        vlan = 1;
        assignIP = false;
      };
      networking.interfaces.eth1.ipv6.addresses = [
        {
          address = "2001:db8:bad:c0de::1";
          prefixLength = 64;
        }
      ];

      boot.kernel.sysctl."net.ipv6.conf.all.forwarding" = 1;

      services.kea.dhcp6 = {
        enable = true;
        settings = {
          interfaces-config.interfaces = [ "eth1" ];
          #renew-timer = 600;
          #rebind-timer = 900;
          #preferred-lifetime = 1800;
          #valid-lifetime = 3600;
          subnet6 = [
            {
              id = 1;
              subnet = "2001:db8:bad:c0de::/64";
              pools = [
                {
                  pool = "2001:db8:bad:c0de::/64";
                }
              ];
              pd-pools = [
                {
                  prefix = "2001:db8:dead::";
                  prefix-len = 48;
                  delegated-len = 56;
                }
              ];
            }
          ];
        };
      };

      services.radvd = {
        enable = true;
        config = ''
          interface eth1 {
            AdvSendAdvert on;
            # Tell clients to use DHCPv6
            AdvManagedFlag on;
            prefix 2001:db8:bad:c0de::/64 {
              AdvOnLink on;
              AdvAutonomous on;
            };
          };
        '';
      };
    };
    machine2 = {
      virtualisation.interfaces.eth1 = {
        vlan = 1;
        assignIP = false;
      };

      boot.kernel.sysctl."net.ipv6.conf.all.forwarding" = 1;

      #virtualisation.interfaces.eth2 = {
      #  vlan = 2;
      #  assignIP = false;
      #};

      #networking.useNetworkd = true;
      #systemd.network.networks = {
      #  "10-eth1" = {
      #    matchConfig.Name = "eth1";
      #    networkConfig.DHCP = "ipv6";
      #    # request delegation of /56 prefix
      #    #networkConfig.DHCPPrefixDelegation = true;
      #    #dhcpV6Config.PrefixDelegationHint = 56;
      #  };
      #  #"20-eth2" = {
      #  #  matchConfig.Name = "eth2";
      #  #  # use one of the delegated prefixes
      #  #  networkConfig.DHCPv6PrefixDelegation = true;
      #  #  # announce using slaac
      #  #  networkConfig.IPv6SendRA = true;
      #  #};
      # dhcpcd extra conf:
      # interface wlan1
      #  option rapid_commit
      #  ipv6rs
      #  ia_na 0
      #  ia_pd 1 wlan0/0 see https://man.archlinux.org/man/dhcpcd.conf.5#ia_pd
      #};
    };
    #machine3 = {
    #  virtualisation.interfaces.eth1 = {
    #    vlan = 2;
    #    assignIP = false;
    #  };
    #  networking.interfaces.eth1 = {
    #    ipv4.addresses = lib.mkForce [];
    #    ipv6.addresses = lib.mkForce [];
    #  };
    #};
  };

  interactive.nodes = {
    machine1 = import ../debug-host-module.nix;
    machine2 = import ../debug-host-module.nix;
    #machine3 = import ../debug-host-module.nix;
  };

  testScript = ''
    machine1.start()
    machine1.wait_for_unit("network-online.target")
    machine1.wait_for_unit("radvd.service")
    #machine1.wait_for_unit("kea-dhcp6-server.service")

    machine2.start()
    machine2.wait_for_unit("network-online.target")

    machine2.sleep(1)

    # wait for dhcp lease
    print("m1-----------------------------------------")
    print(machine1.succeed("ip -br a"))
    print(machine1.succeed("ip -6 r"))
    print("m2-----------------------------------------")
    print(machine2.succeed("ip -br a"))
    print(machine2.succeed("ip -6 r"))

    #machine3.start()
    # check if we got the prefix

    #print(machine3.succeed("ip -br a"))

    #print(machine1.succeed("ping 2001:db8:dead:dead::2"))
  '';
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions