systemd.network DUID、IAID 和 DHCPv4 客户端标识符

systemd.network DUID、IAID 和 DHCPv4 客户端标识符

我已将 NixOS 设置为使用systemd-networkd::

  systemd.network.enable = true;

我的接口配置如下:

networking {
  interfaces.enp5s0f0np0.useDHCP = true;
  interfaces.enp5s0f1np1.macAddress = cfg.myMacAddress;
  interfaces.enp5s0f1np1.ipv6.addresses = [ {
    address = "fd00:cafe::1";
    prefixLength = 64;
  }];
};

现在对于DHCPv4,我想修复clientIdentifier(最终我的 DHCP 服务器需要该MAC地址和clientID来提供固定 IP);为此我可以做这样的事情:

systemd.network.networks."40-enp5s0f1np1" = {
  dhcpV4Config.ClientIdentifier = "duid";
  dhcpV4Config.DUIDType = "vendor";
  dhcpV4Config.IAID = <something>;
};

clientIdentifier本质上是( duid) 和DUIDType( )的当前默认值vendorIAID一旦我了解了它应该采用的格式,我就可以设置一个。

但是,我想弄清楚默认值IAID是如何生成的(以便我可以了解请求DUID中获得的默认值DHCPv4是如何形成的)。

这个想法是确保我的 NixOS 配置包含正确数量的详细信息。现在,我可以使用默认值DUID,但我不知道它是否会在重新启动后持续存在......

答案1

ClientIdentifier=duid为 DHCPv4 选择 时,生成的 DHCPv4 客户端标识符为 0xFF (类型=DUID) + 四字节 IAID + DHCPv6 DUID(取决于DUIDType=)。

默认的 systemd-networkd“供应商”DHCPv6 DUID 基于的哈希值/etc/machine-id。看man networkd.conf对于其他可用的 DUID 类型。

IAID的格式只是一个32位整数,用于区分具有相同DUID的多个IA。如果未提供自定义 IAID,systemd-networkd 将通过散列接口的“可预测”名称(如果已知)(即使这不是当前活动的名称)来生成稳定的 IAID,或者散列 MAC 地址。

networkctl status eth0将告诉您 DHCPv4 客户端 ID 以及 DHCPv6 DUID。

客户端标识符的字节格式duid定义如下RFC 4361:

ClientIdentifier=duid 
DUIDType=供应商

DHCPv4 客户端 ID = ff:5d:e2:6c:15:0:2:0:0:ab:11:f9:f9:80:f7:f7:20:2c:f5 |--|------------------------|---------------------------------- ---| 客户端 ID 类型 = ff (255 =DHCPv6 IAID+DUID DHCPv6 IAID = 5d:e2:6c:15 (“enp2s0”的 siphash?) DHCPv6 DUID = 0:2:0:0:ab:11:f9:f9:80:f7:f7:20:2c:f5 |---|---------|------------------------| DHCPv6 DUID 类型 = 0:2 (2 =杜伊恩 DUID-EN 供应商 = 0:0:ab:11 (43793 =系统 DUID-EN 数据 = f9:f9:80:f7:f7:20:2c:f5

由于您的 MAC 地址是静态的,因此使用起来会简单得多ClientIdentifier=mac,它始终仅包含前缀为 0x01(类型 = 以太网)的 MAC 地址。这是大多数其他 DHCPv4 客户端(例如 dhclient 或 Windows)发送的传统 ID 类型,如下所示:

客户端标识符=mac

DHCPv4 客户端 ID = 1:4e:c8:ac:b7:d8:4e |-|-----------------| 客户端 ID 类型= 1 (1 =以太网 硬件地址 = 4e:c8:ac:b7:d8:4e

同样,您可以使用DUIDType=link-layerDHCPv6:

DUIDType=链路层

DHCPv6 DUID = 0:3:0:1:4e:c8:ac:b7:d8:4e |---|---|------------------| DUID 类型 = 0:3 (3 =DUID-LL 链接类型 = 0:1 (1 =以太网 LL 地址 = 4e:c8:ac:b7:d8:4e

(理论上您可以ClientIdentifier=duid与结合使用DUIDType=link-layer,但这有点多余,并且大多数 DHCP 服务器对 都有更好的支持ClientIdentifier=mac。)

相关内容