Isc-Dhcp

對來自中繼的請求的回復轉到中繼的內部 IP,而不是原始請求的源 IP

  • October 6, 2012

在 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 或 dhcrealy 本身丟棄了數據包。

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 的路由,也沒有直接連接到該網路的介面。

這很正常。DHCP 伺服器將使用網關 IP (giaddr) 中的 IP 地址來發送響應,如規範中所述。通常,DHCP 更喜歡使用 DHCP/BOOTP 有效負載中的地址,而不是 IP 和 MAC 標頭中的地址。

網關IP地址必須是連接客戶端的介面地址;這樣,如果中繼有多個介面連接到客戶端,那麼它可以簡單地發送接收請求的介面的 IP 地址,伺服器將響應該 IP,因此中繼可以知道答案必須在哪個介面上轉達了。這允許 DHCP 中繼是無狀態的。

如果您中繼拒絕它,那麼您的中繼有問題。可能是路由問題?


更新:

但是,我已經刪除了 dhcpd 伺服器上到達 172.16.17.x 子網的路由。

這在很多方面都是錯誤的。一旦客戶端通過 DHCP 進行配置,它們就可以通過單播直接聯繫 DHCP 伺服器,而無需使用中繼。如果 DHCP 伺服器無法回答這些查詢,則可能會發生不好的事情,例如客戶端無法延長或刪除他們的租約。

因為,將路由添加到我們為其分配 IP 的子網並沒有多大意義。

除了這就是 DHCP 的工作方式……

引用自:https://serverfault.com/questions/435453