在 Linux 上运行的 Dhcpd 通过在其他远程机器上运行的 dhcrelay 获取 dhcp 请求。
Oct 6 10:09:46 2012 dhcpd: DHCPDISCOVER from 00:1e:68:06:eb:37
(oguz-U300) via 172.16.17.81
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
10:35:01.112500 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF],
proto: UDP (17), length: 328) 192.168.0.81.67 > 192.168.0.1.67:
BOOTP/DHCP, Request from 00:1e:68:06:eb:37, length: 300, hops:1,
xid:0xe378fc7e, flags: [none] (0x0000)
Gateway IP: 172.16.17.81
Client Ethernet Address: 00:1e:68:06:eb:37 [|bootp]
它匹配子网并发送回复。但是回复不会发送到请求的 dhcrelay 外部 IP(192.168.0.81)。相反,它会发送到运行 dhcrelay 的机器的内部接口 IP。我认为这是因为运行 dhcrelay 的远程机器或 dhcrelay 本身丢弃了数据包。
Oct 6 10:09:46 2012 dhcpd: DHCPOFFER on 172.16.17.11 to
00:1e:68:06:eb:37 (oguz-U300) via 172.16.17.81
10:35:02.050108 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF],
proto: UDP (17), length: 328) 192.168.0.1.67 > 172.16.17.81.67:
BOOTP/DHCP, Reply, length: 300, hops:1, xid:0xe378fc7e, flags: [none]
(0x0000)
Your IP: 172.16.17.11
Gateway IP: 172.16.17.81
Client Ethernet Address: 00:1e:68:06:eb:37 [|bootp]
这是正常行为吗?
运行 dhcrelay 的机器:
eth1(ext) Link encap:Ethernet HWaddr 00:90:0B:21:43:F4
inet addr:192.168.0.81 Bcast:192.168.0.255 Mask:255.255.255.0
eth2(int) Link encap:Ethernet HWaddr 00:90:0B:21:43:F5
inet addr:172.16.17.81 Bcast:172.16.17.255 Mask:255.255.255.0
3582 ? Ss 0:00 /usr/sbin/dhcrelay -i eth2 192.168.0.1
运行 dhcpd 的机器:
eth1 Link encap:Ethernet HWaddr 00:90:0B:23:97:D1
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
option domain-name "test.com";
option subnet-mask 255.255.255.0;
authoritative;
ignore client-updates;
ddns-update-style ad-hoc;
default-lease-time 86400;
max-lease-time 86400;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.135 192.168.0.169;
option broadcast-address 192.168.0.255;
option domain-name-servers 192.168.0.1;
option domain-name "test.com";
option routers 192.168.0.1;
}
subnet 172.16.17.0 netmask 255.255.255.0 {
local-address 192.168.0.1;
server-identifier 192.168.0.1;
range 172.16.17.10 172.16.17.11;
option broadcast-address 172.16.17.255;
option routers 172.16.17.81;
}
(我输入了本地地址和服务器标识符。但这没有帮助)
问候,
—— 奥古兹·耶尔马兹
更新:
第一个问题找到了。我已将 dhcrelay 配置为仅监听内部接口。看来(当然)它还应该监听外部接口以获取回复。看来数据包的目的地并不重要。dhrelay 会将其转发到内部网络。
但是,我已删除 dhcpd 服务器上到达 172.16.17.x 子网的路由。它再次尝试向 172.16.17.81 发送回复。由于它不知道路由,因此将其从默认网关发送到互联网。
eth0: IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: UDP
(17), length: 328) 192.168.1.2.67 > 172.16.17.81.67: BOOTP/DHCP,
Reply, length: 300, hops:1, xid:0x32830125, secs:3, flags: [none]
(0x0000)
eth0: Your IP: 172.16.17.11
eth0: Gateway IP: 172.16.17.81
eth0: Client Ethernet Address: 00:1e:68:06:eb:37 [|bootp]
我如何强制 dhcpd 强制向请求 IP 发送回复?因为,为我们分配 IP 的子网添加路由意义不大。
互联网 - dhcpd - 192.168.0.1 - SOMENET - 192.168.0.81 - dhcrelay - 172.16.17.0/24
192.168.0.1 没有 172.16.17.0 的路由,也没有直接连接到该网络的接口。
答案1
这是正常的。DHCP 服务器将使用网关 IP(giaddr)中存在的 IP 地址发送响应,如规范中所述。一般而言,DHCP 更倾向于使用 DHCP/BOOTP 有效负载中存在的地址,而不是 IP 和 MAC 标头中的地址。
网关 IP 地址必须是连接到客户端的接口的地址;这样,如果中继有多个连接到客户端的接口,那么它只需发送收到请求的接口的 IP 地址,服务器就会响应该 IP,这样中继就可以知道必须在哪个接口上中继答案。这允许 DHCP 中继无状态。
如果中继拒绝了,那么中继就有问题。可能是路由问题?
更新:
但是,我已经删除了 dhcpd 服务器上到达 172.16.17.x 子网的路由。
从很多方面来看,这种做法都是错误的。一旦客户端通过 DHCP 进行配置,它们可能会直接通过单播联系 DHCP 服务器,而无需使用中继。如果 DHCP 服务器无法回答这些查询,则可能会发生不好的事情,例如客户端无法延长或删除其租约。
因为,给我们分配IP的子网添加路由意义不大。
除了 DHCP 的工作方式之外......