如何防止 systemd-networkd 发送客户端标识符?

how can I prevent systemd-networkd from sending client identifier?

我有一台machine,CoreOS 1800(or 1855)安装在磁盘上,下面是systemd-networkd config([=60中只有一个网络接口=]hine):

$ cat /etc/systemd/network/zz-default.network
[Network]
DHCP=yes

[DHCP]
ClientIdentifier=mac
UseMTU=true
UseDomains=true

另一个值得注意的事情是这个 machine 也配置了 PXE 启动但是 PXE 服务器将拒绝启动所以它最终将从磁盘启动。

当我重新启动machine时,会为它分配两个DHCP IP,我通过查看DHCP服务器中的/var/lib/dhcpd.leases来确认:

lease 100.79.223.152 { 
  starts 5 2018/09/28 02:34:00; ends 6 2018/09/29 02:33:59; tstp 6 2018/09/29 02:33:59; cltt 5 2018/09/28 02:34:00; 
  binding state active; next binding state free; rewind binding state free; 
  hardware ethernet 08:9e:01:d9:28:64; 
  option agent.circuit-id 0:5:8:b9:1:0:29;
}
lease 100.79.223.150 { 
  starts 5 2018/09/28 02:34:29; ends 6 2018/09/29 02:34:28; tstp 6 2018/09/29 02:34:28; cltt 5 2018/09/28 02:34:29; 
  binding state active; next binding state free; rewind binding state free; 
  hardware ethernet 08:9e:01:d9:28:64; uid "001010236001331(d"; 
  option agent.circuit-id 0:5:8:b9:1:0:29;
}

一切似乎都很好,但是 PXE 租用记录 100.79.223.152 导致了其他问题(当真正的 PXE 启动 machine 并部署另一个 OS 时,它将获得 100.79.223.152而不是 150,然后导致其他私人问题)。

如果我安装其他 OS 不使用 systemd-networkd,那么重启只会导致 1 个租用记录。

可以看到租约100.79.223.150有一个uid字段"001010236001331(d)",意思是让DHCP服务器根据uid(客户端标识符)分配IP,目前和mac的内容是一样的地址,只打印为八位字节。

这就是两个IP的根本原因。

为了防止这两个 IP 问题,我尝试在 DHCP 服务器的 /etc/dhcp/dhcpd.conf 中设置 deny duplicates,但没有任何改变。

我在想是否可以告诉 systemd-networkd 不要发送 uid(客户端标识符)。根据source of systemd,有意实施为“始终发送客户端标识符”,

在这种情况下,如何防止 systemd-networkd 发送客户端标识符?

编辑 2019/02/17:我发现我误解了 deny duplicates 的意思,这对解决这个问题没有帮助。

我记得我曾先测试过另一个选项,但没有用。

ignore-client-uids on;

The ignore-client-uids statement

ignore-client-uids flag;

If the ignore-client-uids statement is present and has a value of true or on, the UID for clients will not be recorded. If this statement is not present or has a value of false or off, then client UIDs will be recorded.

https://www.isc.org/wp-content/uploads/2017/08/dhcp43.html

DHCP服务器版本为isc-dhcpd-4.2.4

编辑 2019-03-12:我有一些错误并发现了一些东西,所以我自己回答了这个问题。简单的答案是 ignore-client-uids true; 在服务器端运行良好,ClientIdentifier=mac 在客户端运行不佳。

您是否尝试过将客户端标识符设置为(空)?

$ cat /etc/systemd/network/zz-default.network
[Network]
DHCP=yes

[DHCP]
ClientIdentifier=
UseMTU=true
UseDomains=true

经过多次实验,我发现只有ignore-client-uids true;一直在工作,所有的神秘都消失了。,当你设置它时,你可以确认没有uid "....."出现在/var/lib/dhcp/dhcpd.leases`文件中,服务器完全忽略客户端发送的客户端标识符,只使用MAC来确定如何分配IP。

如果你坚持要用ClientIdentifier=mac,你可以看看我发现了什么:

  • 指定 ClientIdentifier=mac(在客户端 *.network 上)确实让我获得了与以前相同的 IP。我之所以说它不起作用,可能是因为我有另一个 NIC 默认情况下也启用了 DHCP,因此导致了一个新的 IP。

/lib/systemd/network/zz-default.network

[Network]
DHCP=yes

[DHCP]
UseMTU=true
UseDomains=true

我把上面的文件改成

[Network]
DHCP=no

我只有 1 个 IP 和以前一样。

  • 客户端标识符将是一个字符串“\0x1”+MAC,你可以在/var/lib/dhcp/dhcpd.leases[=18=中grepuid "..."确认]uid "001304TDD210272"`,对于任何不可打印的字符,它将被编码为 3 位八进制,例如 304。一些客户端会自动生成这样的客户端标识符 "\0x1" + "MAAS" + MAC ...

  • 最不幸的是:一旦客户端发送客户端标识符,对于相同的MAC,如果客户端发送没有客户端标识符的花药请求,它将得到新IP.

  • 考虑到DDNS,对于相同的MAC,当DHCP服务器为它编写DNS更新请求时,带客户端标识符和不带客户端标识符的DHCP请求被视为不同的客户端。简单来说,

    • 对于没有客户端标识符的 DHCP 请求 -> 服务器发送带有 MAC 散列的 DDNS 请求 -> DNS 服务器:OK
    • 对于带有客户端标识符的 DHCP 请求 -> 服务器发送带有客户端标识符散列的 DDNS 请求 -> DNS 服务器:出于安全原因,由于散列不同而被拒绝。

这就是我找到的所有内容,希望对您有所帮助。

你也可以查看/运行/.../systemd/network/*.network下是否有配置,我也遇到过同样的问题,因为netplan把一个配置网络文件放在/运行 代替 etc 或 lib 应用。 这种情况下的解决方案是在 netplan yml 配置中添加 dhcp-identifier: mac