dhclient 是 Linux 系统里一个非常实用的 DHCP 客户端工具,主要用来动态获取 IP 地址。不过,很多时候默认的配置并不能完全满足我们的需求——比如想固定 DNS、指定网关、或者控制租约时间,这时候就需要手动调整它的配置文件了。通常,这个文件位于 /etc/dhcp/dhclient.conf。下面就来聊聊几个常见的自定义配置场景,以及对应的写法。

指定接口
如果机器上有多个网卡,但只希望为某个特定接口(比如 eth0)获取 IP,可以在配置文件中加上这样一行:
interface "eth0";
这样一来,dhclient 就会忽略其他接口,只处理 eth0 的 DHCP 请求。
固定 IP 地址和覆盖服务器设置
有时候 DHCP 服务器分配的参数并不理想,比如 DNS 服务器地址不对,或者想强制指定一个主机名。这时可以用 supersede 指令来覆盖服务器的响应。例如:
send host-name "myhostname";
supersede domain-name-servers 8.8.8.8, 8.8.4.4;
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, domain-search, host-name,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers;
这里 send host-name 告诉 DHCP 服务器你希望的主机名,supersede domain-name-servers 则强制客户端使用指定的 DNS,而不是服务器下发的。而 request 那一长串是在明确告诉服务器:这些参数我都要,别漏了。
静态 IP 地址(通过 DHCP 请求固定地址)
如果服务器端配置了基于 MAC 地址的静态分配,客户端这边也可以配合发送客户端标识符。比如:
send dhcp-client-identifier "01:00:5e:00:01:01";
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, domain-search, host-name,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers;
这样客户端会主动带上标识符,请求特定的 IP 地址和其他配置。
租约时间控制
如果你希望限制租约的最长和最短时间,可以加上:
max-lease-time 3600;
min-lease-time 1800;
注意,这只是一个客户端侧的约束,实际生效时长还要看服务器端的策略。不过在某些场景下,比如测试环境,这样设置能帮你避免租约过长导致的问题。
DNS 服务器
前面提到过,直接用 supersede 覆盖 DNS 是最常见的做法:
supersede domain-name-servers 8.8.8.8, 8.8.4.4;
这样无论服务器给什么 DNS,客户端都会用 Google 的公共 DNS。当然,你也可以换成自己内部 DNS 的地址。
网关
如果只想获取网关地址,可以这样写:
request routers;
这相当于告诉服务器:请把默认网关给我。
子网掩码
类似地,请求子网掩码:
request subnet-mask;
广播地址
请求广播地址:
request broadcast-address;
时间偏移
如果希望获取时间偏移量(用于 NTP 相关),可以加上:
request time-offset;
主机名
发送自定义主机名给服务器:
send host-name "myhostname";
这样服务器就知道你希望的主机名是什么了。
配置改完之后,记得重启 dhclient 服务才能生效。在大多数现代系统上,用 systemctl 命令:
sudo systemctl restart dhclient
如果系统比较老,没有 systemd,也可以试试:
sudo service dhclient restart
最后提醒一句:自定义配置时,别跟 DHCP 服务器提供的参数产生冲突,否则客户端可能拿不到网络。如果对某个选项不确定,最好的办法就是翻翻手册:man dhclient.conf,里面讲得很详细。