在ubuntu服务器16.04上使用isc-dhcp-client,有一个选项听起来像是应该做我想要的:
send dhcp-requested-address 10.23.33.254;
当我的dhclient.conf文件中存在这个选项时,我的客户端完全按照我的要求进行操作:始终从我的专用networking上的DHCP服务器获取请求地址的租约,其中DHCP范围是10.23.33.0/24。 但是,如果我将计算机连接到请求的地址不在服务器的DHCP地址范围内的networking,则服务器提供不同的地址,而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客户端?
改用租赁块 。 从试验和错误中,这个configuration块从dhclient.conf文件中被忽略,但在租约文件中使用(默认是/var/lib/dhcp/dhclient.leases除非用-lf覆盖,就像从NetworkManager运行一样)
只是build立一个最小的租约文件,有一个过期的更新和重新绑定(以避免一些重试),但仍然是一个未来的过期date(不立即忘记它,立即尝试DISCOVER而不是一个REQUEST,并使用这个IP,如果没有DHCP服务器应答)。 保持这个文件不变,每次运行dhclient之前都要复制它。
这里是我的stretch-amd64容器中的一个最小文件,只要DHCP服务器(dnsmasq here)没有为这个已经设置的客户端设置一个其他租约。 在运行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; }
试图在一个DHCP服务器服务于10.0.3.0/24,并不知道这个客户端的局域网:
# 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.
新的租约文件/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; }
在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.
这个DHCP服务器似乎并没有发送NAK,但是无论如何,我相信你明白了,它是有效的。
如果没有DHCP服务器,一段时间后,dhclient会configurationIP,因为它没有在租约期满和守护进程。 没有其他选项(广播…)这将是/ 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;
在这种情况下运行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:~#