为什么 dhclient 每约 15 秒而不是 T1/T2 计时器发出单播 DHCPREQUEST?

use*_*281 5 dhcp centos dhclient centos6

我运行 CentOS 6.2 服务器作为我的网关和防火墙,同时还提供一些内部服务。这是我多年来使用各种硬件和发行版(基于红帽)的设置。最近我遇到了一个互联网连接问题,我相信这是由于我的 ISP(Roadrunner,纽约州北部)存在缺陷,或者是我的 dhclient 配置(默认)存在缺陷。

我没有在这台服务器上使用 NetworkManager,因为网络配置是静态的,并且服务器作为网关 24/7 全天候运行。我的 sysconfig 网络脚本接口配置如下:

它已通过 dhclient 实用程序在启动时配置了接口并使用 DHCP。我有一个有效的 iptables 防火墙脚本,多年来我一直致力于提供路由/NAT 功能,但这与我的问题无关。

在过去的一两周里(至少,我已经看到这些日志条目断断续续有一段时间了)我看到一旦我的 ISP 提供的 DHCP 租约到达中点,触发续订,dhclient 进入一个循环,其中每个15 秒后,它向 /var/lib/dh​​client/dhclient-eth1.leases 文件(见下文)中指定的 DHCP 服务器条目发出单播 DHCPREQUEST。这会持续数小时,直到网络连接中断或最终尝试广播发现并正确接收新租约。

dhclient 请求循环始终是单播的,始终使用它尝试更新的租约中指定的 DHCP 服务器地址,并且始终为这些请求中的每一个使用相同的 xid 值。我想知道,有没有办法强制 dhclient 总是发出广播 DHCPDISCOVER 而不是单播 REQUEST 数据包进行更新?是否存在可能的配置问题,或者这只是时代华纳的脆弱 DHCP 服务?在过去的 5 年里,我一直使用 TWC 作为我的 ISP,并且在使用 Linux 作为网关时从未遇到过这个问题。

这是我的接口配置脚本:

/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
NAME=Internet
HWADDR=00:D0:B7:**:**:**
MTU=1500
BOOTPROTO=dhcp
PEERDNS=no
IPV6INIT=no
ONBOOT=yes
Run Code Online (Sandbox Code Playgroud)

这是一个示例 dhclient-eth1.leases 文件(当前,但将在 ~6-8 小时内开始循环)

lease {
interface "eth1";
fixed-address 74.***.***.***;
option subnet-mask 255.255.240.0;
option routers 74.***.***.***;
option dhcp-lease-time 43200;
option dhcp-message-type 5;
option domain-name-servers 209.18.47.61,209.18.47.62;
option dhcp-server-identifier 10.111.64.1;
option interface-mtu 576;
option broadcast-address 255.255.255.255;
option domain-name "rochester.rr.com";
renew 3 2012/01/18 21:51:02;
rebind 4 2012/01/19 02:57:58;
expire 4 2012/01/19 04:27:58;
}
Run Code Online (Sandbox Code Playgroud)

以及 /var/log/messages 中关于此问题的摘录(从大约上午 12:30 开始,一直持续到今天早上的上午 11:30:

... DHCPREQUEST 的长列表与下面几乎相同

Jan 17 16:50:59 server dhclient[1384]: DHCPREQUEST on eth1 to 10.111.64.1 port 67 (xid=0x54a5b374)
Jan 17 16:51:13 server dhclient[1384]: DHCPREQUEST on eth1 to 10.111.64.1 port 67 (xid=0x54a5b374)
Jan 17 16:51:21 server dhclient[1384]: DHCPREQUEST on eth1 to 10.111.64.1 port 67 (xid=0x54a5b374)
Jan 17 16:51:31 server dhclient[1384]: DHCPREQUEST on eth1 to 255.255.255.255 port 67 (xid=0x54a5b374)
Jan 17 16:51:31 server dhclient[1384]: DHCPACK from 10.111.64.1 (xid=0x54a5b374)
Jan 17 16:51:31 server dhclient[1384]: bound to 74.69.54.153 -- renewal in 17309 seconds.
Run Code Online (Sandbox Code Playgroud)

似乎在这里成功了,最后,经过一长串尝试后得到了 DHCPACK

昨晚 7:30 左右,远远超过了上面 16:51 的日志条目,最终由于其他原因重新启动了服务器,这导致了下面的 REQUEST 行。

Jan 17 20:11:51 server dhclient[3872]: DHCPREQUEST on eth1 to 255.255.255.255 port 67 (xid=0x4a4507ce)
Jan 17 20:11:51 server dhclient[3872]: DHCPACK from 10.111.64.1 (xid=0x4a4507ce)
Jan 17 20:11:51 server dhclient[3872]: bound to 74.69.54.153 -- renewal in 17073 seconds.
Jan 18 00:56:24 server dhclient[3917]: DHCPREQUEST on eth1 to 10.111.64.1 port 67 (xid=0x4a4507ce)
Jan 18 00:56:32 server dhclient[3917]: DHCPREQUEST on eth1 to 10.111.64.1 port 67 (xid=0x4a4507ce)
Jan 18 00:56:46 server dhclient[3917]: DHCPREQUEST on eth1 to 10.111.64.1 port 67 (xid=0x4a4507ce)
Jan 18 00:57:04 server dhclient[3917]: DHCPREQUEST on eth1 to 10.111.64.1 port 67 (xid=0x4a4507ce)
Jan 18 00:57:24 server dhclient[3917]: DHCPREQUEST on eth1 to 10.111.64.1 port 67 (xid=0x4a4507ce)
Run Code Online (Sandbox Code Playgroud)

.... 省略了上面的几个小时和许多行,每约 15 秒 这是我手动关闭和打开界面的地方。

Jan 18 11:27:29 server dhclient[3917]: DHCPREQUEST on eth1 to 10.111.64.1 port 67 (xid=0x4a4507ce)
Jan 18 11:27:45 server dhclient[3917]: DHCPREQUEST on eth1 to 10.111.64.1 port 67 (xid=0x4a4507ce)
Jan 18 11:27:52 server dhclient[3917]: DHCPREQUEST on eth1 to 10.111.64.1 port 67 (xid=0x4a4507ce)
Jan 18 11:27:58 server dhclient[16174]: DHCPREQUEST on eth1 to 255.255.255.255 port 67 (xid=0x63741216)
Jan 18 11:27:58 server dhclient[16174]: DHCPACK from 10.111.64.1 (xid=0x63741216)
Jan 18 11:27:58 server dhclient[16174]: bound to 74.69.54.153 -- renewal in 19384 seconds.
Run Code Online (Sandbox Code Playgroud)

我一直有一些关于防火墙碎片的 MTU 问题,但这似乎不是这里的根本原因,如果有的话,这将是一个单独的问题。

小智 5

我在同一个 ISP (RoadRunner) 上也遇到了同样的问题。RR 似乎提供了无效或无法访问的 dhcp-server-identifier 主机 IP。虽然如果 ISP 解决了问题就好了,但您可以将以下内容添加到您的文件中/etc/dhcp/dhclient.conf(您的发行版中的位置可能有所不同):

interface "ethX" {
   supersede dhcp-server-identifier 255.255.255.255;
}
Run Code Online (Sandbox Code Playgroud)

这将导致客户端忽略响应中提供的 dhcp 服务器的 IP 地址并发送 DHCPREQUEST 广播。这是一个黑客行为。它可能违反了管理 RFC,但它对我有用。


Mik*_*eyB 2

这很可能是由于奇怪的防火墙规则或服务提供商端的一些奇怪的配置导致不允许定向 DHCP 请求。您的 DHCP 客户端很可能运行正常。

当客户端到达 RENEW 时间时,它将发送回单播 DHCPREQUESTS 以尝试更新最少。

当到达 EXPIRE 时间时,它将再次开始广播。这就是我们从您粘贴的日志中看到的内容。

做一些笨拙的事情,比如杀死 dhclient、清理租约文件和重新启动 dhclient 可能会让事情正常进行。但确实不应该被要求。

您是否有网络连接实际中断时的日志?