我可以通过 DHCP 请求特定 IP 地址而不拒绝来自 DHCP 服务器的不同地址的提议吗?

not*_*oad 6 isc-dhcp ubuntu-16.04

在 ubuntu 服务器 16.04 上使用 isc-dhcp-client,有一个选项听起来应该做我想要的:

send dhcp-requested-address 10.23.33.254;
Run Code Online (Sandbox Code Playgroud)

当这个选项出现在我的 dhclient.conf 文件中时,我的客户端完全符合我的要求:总是从我的专用网络上的 DHCP 服务器获取请求地址的租约,其中 DHCP 范围是 10.23.33.0/24。但是,如果我将计算机连接到请求的地址不在服务器的 DHCP 地址范围内的网络,服务器会提供不同的地址,而 isc-dhcp-client 只会发送 NAK,因为它没有获得请求的地址。

本质上,我想要的是

客户端:“你好,我可以用 10.23.33.254”
服务器:“不,你不能。在这里,用 192.168.1.23 代替”
客户端:“好的,谢谢”

相反,正在发生的事情是

客户端:“你好,我可以有 10.23.33.254”
服务器:“不,你不能。在这里,用 192.168.1.23 代替”
客户端:“这不是我想要的。我可以有 10.23.33.254 吗?”
服务器:“不,你不能……”(永远重复这个循环)

有人知道我想要什么是可能的,缺少编写我自己的 DHCP 客户端吗?

A.B*_*A.B 4

请改用租赁块。经过反复试验,该配置块在 dhclient.conf 文件中被忽略,但在租用文件中使用(默认值,/var/lib/dhcp/dhclient.leases除非用 -lf 覆盖,就像从 NetworkManager 运行时一样)

只需构建一个最小的租约文件,该文件具有过期的续订和重新绑定(以避免几次重试),但仍然有一个未来的到期日期(不要立即忘记它并立即尝试发现而不是请求,并且如果没有则使用此 IP) DHCP 服务器根本没有应答)。保持此文件不变,并在每次运行 dhclient 之前复制它。

这是一个来自我的stretch-amd64容器的最小文件,只要DHCP服务器(这里是dnsmasq)没有为此客户端设置其他租约,它就可以工作。只需在运行 dhclient 之前将其复制到租约文件上即可。

lease {
  interface "eth0";
  fixed-address 10.0.3.222;
  renew 0 2000/1/1 00:00:01;
  rebind 0 2000/01/01 00:00:01;
  expire 0 2038/1/1 00:00:01;
}
Run Code Online (Sandbox Code Playgroud)

在具有为 10.0.3.0/24 提供服务且尚不知道该客户端的 DHCP 服务器的 LAN 中进行尝试:

# dhclient -v eth0
Internet Systems Consortium DHCP Client 4.3.5
Copyright 2004-2016 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/eth0/xx:xx:xx:xx:xx:xx
Sending on   LPF/eth0/xx:xx:xx:xx:xx:xx
Sending on   Socket/fallback
DHCPREQUEST of 10.0.3.222 on eth0 to 255.255.255.255 port 67
DHCPACK of 10.0.3.222 from 10.0.3.1
bound to 10.0.3.222 -- renewal in 1486 seconds.
Run Code Online (Sandbox Code Playgroud)

新的租赁文件/var/lib/dhcp/dhclient.leases

lease {
  interface "eth0";
  fixed-address 10.0.3.222;
  renew 6 2000/01/01 00:00:01;
  rebind 6 2000/01/01 00:00:01;
  expire never;
}
lease {
  interface "eth0";
  fixed-address 10.0.3.222;
  option subnet-mask 255.255.255.0;
  option routers 10.0.3.1;
  option dhcp-lease-time 3600;
  option dhcp-message-type 5;
  option domain-name-servers 10.0.3.1;
  option dhcp-server-identifier 10.0.3.1;
  option dhcp-renewal-time 1800;
  option broadcast-address 10.0.3.255;
  option dhcp-rebinding-time 3150;
  option host-name "stretch-amd64";
  renew 0 2017/10/29 19:57:41;
  rebind 0 2017/10/29 20:24:34;
  expire 0 2017/10/29 20:32:04;
}
Run Code Online (Sandbox Code Playgroud)

在 IP 范围之外时尝试:

Listening on LPF/eth0/xx:xx:xx:xx:xx:xx
Sending on   LPF/eth0/xx:xx:xx:xx:xx:xx
Sending on   Socket/fallback
DHCPREQUEST of 10.0.4.222 on eth0 to 255.255.255.255 port 67
DHCPREQUEST of 10.0.4.222 on eth0 to 255.255.255.255 port 67
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4
DHCPREQUEST of 10.0.3.249 on eth0 to 255.255.255.255 port 67
DHCPOFFER of 10.0.3.249 from 10.0.3.1
DHCPACK of 10.0.3.249 from 10.0.3.1
bound to 10.0.3.249 -- renewal in 1411 seconds.
Run Code Online (Sandbox Code Playgroud)

该 DHCP 服务器似乎不发送 NAK,但无论如何我相信您已经明白了,它可以工作。

如果没有 DHCP 服务器,一段时间后,dhclient 将配置该 IP,因为它在租约和守护进程中尚未过期。如果没有其他选项(广播...),这将是 /32,因为信息不可用。如果需要,请在“模板”租赁文件中添加其他值。这里是:

option subnet-mask 255.255.255.0;
option routers 10.0.3.1;
option domain-name-servers 10.0.3.1;
option broadcast-address 10.0.3.255;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,运行 dhclient 时:

[...]

DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 12
No DHCPOFFERS received.
Trying recorded lease 10.0.3.222
PING 10.0.3.1 (10.0.3.1) 56(84) bytes of data.

--- 10.0.3.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.240/0.240/0.240/0.000 ms
bound: immediate renewal.
DHCPREQUEST of 10.0.3.222 on eth0 to 255.255.255.255 port 67
root@stretch-amd64:~# 
Run Code Online (Sandbox Code Playgroud)