Switch to Kea for dhcp4 servec

This commit is contained in:
niten 2023-12-05 20:45:34 -08:00
parent cf4b24da99
commit e770842fa6
1 changed files with 64 additions and 32 deletions

View File

@ -6,7 +6,8 @@ let
join-lines = concatStringsSep "\n";
traceout = out: builtins.trace out out;
inherit (pkgs.lib.ip)
getNetworkBase maskFromV32Network networkMinIp networkMaxIp;
in {
@ -14,6 +15,11 @@ in {
enable = mkEnableOption "Enable local network configuration (DHCP & DNS).";
state-directory = mkOption {
type = str;
description = "Path at which to store server state.";
};
domain = mkOption {
type = str;
description = "The domain to use for the local network.";
@ -120,38 +126,64 @@ in {
hostname
]) other-hosts;
services.dhcpd4 = let zone = cfg.zone-definition;
in {
services.kea = {
enable = true;
machines = mapAttrsToList (hostname: hostOpts: {
ethernetAddress = hostOpts.mac-address;
hostName = hostname;
ipAddress = hostOpts.ipv4-address;
}) (filterAttrs (host: hostOpts:
hostOpts.mac-address != null && hostOpts.ipv4-address != null)
zone.hosts);
interfaces = cfg.dhcp-interfaces;
extraConfig = ''
subnet ${pkgs.lib.ip.getNetworkBase cfg.network} netmask ${
pkgs.lib.ip.maskFromV32Network cfg.network
} {
authoritative;
option subnet-mask ${pkgs.lib.ip.maskFromV32Network cfg.network};
option broadcast-address ${pkgs.lib.ip.networkMaxIp cfg.network};
option routers ${cfg.gateway};
option domain-name-servers ${concatStringsSep " " cfg.dns-servers};
option domain-name "${cfg.domain}";
option domain-search "${
concatStringsSep " " ([ cfg.domain ] ++ cfg.search-domains)
}";
range ${pkgs.lib.ip.networkMinIp cfg.dhcp-dynamic-network} ${
pkgs.lib.ip.networkMaxButOneIp cfg.dhcp-dynamic-network
};
}
'';
settings = {
interfaces-config.interfaces = cfg.dhcp-interfaces;
lease-database = {
name = "${cfg.state-directory}/dhcp4.leases";
type = "memfile";
persist = true;
};
valid-lifetime = 4000;
rebind-timer = 2000;
renew-timer = 1000;
option-data = [
{
name = "domain-name-servers";
data = cfg.dns-servers;
}
{
name = "subnet-mask";
data = maskFromV32Network cfg.network;
}
{
name = "broadcast-address";
data = networkMaxIp cfg.network;
}
{
name = "routers";
data = cfg.gateway;
}
{
name = "domain-name";
data = cfg.domain;
}
{
name = "domain-search";
data = [ cfg.domain ] ++ cfg.search-domains;
}
];
subnet4 = [{
pools = [{
pool = let
minIp = networkMinIp cfg.dhcp-dynamic-network;
maxIp = networkMaxIp cfg.dhcp-dynamic-nework;
in "${minIp} - ${maxIp}";
}];
subnet = cfg.network;
reservations = let
hostsWithMac = filterAttrs (_: hostOpts:
!isNull hostOpts.mac-address && !isNull hostOpts.ipv4-address)
cfg.zone-definition.hosts;
in mapAttrsToList (hostname:
{ mac-address, ipv4-address, ... }: {
enthernetAddress = mac-address;
hostName = hostname;
ipAddress = ipv4-address;
}) hostsWithMac;
}];
};
};
services.bind = let