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"))
'';
}
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)