我已将 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
( )的当前默认值vendor
。IAID
一旦我了解了它应该采用的格式,我就可以设置一个。
但是,我想弄清楚默认值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-layer
DHCPv6:
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
。)