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

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

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

我没有在此服务器上使用 NetworkManager,因为网络配置是静态的,并且服务器作为网关全天候运行。我的 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

这是一个示例 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;
}

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

... 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.

经过一长串的尝试后,似乎终于成功获得了 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)

.... 省略了上面的几个小时和很多行内容,每隔~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.

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

答案1

我遇到了与同一 ISP(RoadRunner)相同的问题。看起来 RR 提供了无效或无法访问的 dhcp-server-identifier 主机 IP。虽然如果 ISP 修复了这个问题会很好,但您可以将以下内容添加到您的/etc/dhcp/dhclient.conf(您的发行版中的位置可能不同):

interface "ethX" {
   supersede dhcp-server-identifier 255.255.255.255;
}

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

答案2

我的有线电视提供商也遇到了这个问题。他们不响应单播 DHCPREQUEST 数据包。我使用:

iptables -t nat -A OUTPUT -d 10.0.0.0/255.0.0.0 -o eth1 -p udp -m udp --dport 67 -j DNAT --to-destination 255.255.255.255

把它们变成广播,问题就解决了。

答案3

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

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

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

做一些笨拙的事情,例如终止 dhclient、清除租约文件并重新启动 dhclient 可能会使事情正常进行。但实际上不应该这样做。

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

答案4

我的日志中也有 DHCPREQUEST 垃圾邮件(Debian 8)。我有 dhclient(isc-dhcp-client 4.3.1)。我的设置有点奇怪,但我只需删除 isc-dhcp-client 并安装 dhcpcd 6.0.5(由 Roy Marples 开发)即可解决问题。dhcpcd 似乎比 isc-dhcp-client 更智能。现在运行良好。

相关内容