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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions