Debian

DHCP 更新失敗,同一鏈路上有多個子網

  • April 19, 2016

我們的網路目前由同一鏈路上的 3 個子網組成:

  • 1.2.3.0/24 是全域子網
  • 10.1.0.0/16用於NAT(因為客戶端遠超200)
  • 192.168.0.0/16 是“訪客網路”,具有用於未知主機的簡單強制門戶

我們的 dhcpd 主機具有以下 /etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
allow-hotplub eth0
iface eth0 inet static
   address 1.2.3.2
   netmask 255.255.255.0
   gateway 1.2.3.1

iface eth0:1 inet static
   address 192.168.0.1
   netmask 255.255.0.0

iface eth0:2 inet static
   address 10.1.0.2
   netmask 255.255.0.0

而這個dhcpd.conf:

authoritative;
# option definitions common to all supported networks...
option domain-name "example.com";
option domain-search "example.com";
option domain-name-servers 8.8.8.8;
option ntp-servers 1.2.3.8;

default-lease-time 600;
max-lease-time 600;


shared-network "corp" {
 include "/etc/nat-classes.conf";

 subnet 1.2.3.0 netmask 255.255.255.0 {
   option subnet-mask 255.255.255.0;
   option broadcast-address 1.2.3.255;
   option routers 1.2.3.1;
   default-lease-time 600; 
   max-lease-time 600; 
   deny unknown-clients;
 }

 subnet 10.1.0.0 netmask 255.255.0.0 {
   option subnet-mask 255.255.0.0;
   option broadcast-address 10.1.255.255;
   option routers 10.1.0.1;
   default-lease-time 600;
   max-lease-time 600;

   include "/etc/nat-pools.conf"; # every user owns a pool of addresses
 }

 subnet 192.168.0.0 netmask 255.255.0.0 {
   pool {
     range 192.168.0.3 192.168.255.254;
     deny known-clients;
   }
   option subnet-mask 255.255.0.0;
   option broadcast-address 192.168.255.255;
   option routers 192.168.0.1;
   option domain-name-servers 192.168.0.1;
   filename "pxelinux.0";
   next-server 192.168.0.1;
   allow unknown-clients;
 }
}
# ... known host definitions ...

我們現在觀察到以下情況:

  • 10.1/16 和 192.168/16 子網的 DHCP OFFER 包含帶有伺服器公共 IP 地址 (1.2.3.2) 的 DHCP 選項 54(DHCP 伺服器標識符),此外,IP 標頭的源地址為 1.2.3.2 和目標子網中的目標地址。
  • 在這些子網中的租約時間結束前不久,客戶端嘗試到達 1.2.3.2 以進行租約更新並失敗(或者他們甚至沒有嘗試,因為它不是他們配置的子網中的地址?)
  • 至少在 Android 和 Win 10 上,這會導致短暫但重要的第 3 層斷開連接。

我們知道根據 dhcpd.conf(5)有一個server-identifier選項:

The usual case where the server-identifier statement needs to be sent is
when a physical interface has more than one IP  address,  and
the  one  being  sent  by  default isn't appropriate for some or
all clients served by that interface.  Another common case is when an
alias is defined for the purpose of having a consistent IP
address for the DHCP server, and it is desired that the clients use this IP
address when contacting the server.

但是,當在所有 3 個相應的子網定義中設置此選項時,DHCP 將停止在 10.1/16 和 192.168/16 子網上工作,因為由於某種原因 DHCP OFFER(現在具有正確的 Src IP 和 DHCP 伺服器標識符標頭)不會到達客戶端了。

儘管 600 的租用時間與我們的強制門戶相結合併不是一個安全的解決方案,但我們如何才能使不同子網上的 DHCP 在租用時間用完後立即以正確的方式發出更新的客戶端正常工作?

我終於自己解決了這個問題。我們在交換機上啟用了 DHCP 偵聽,因此我在交換機上輸入 10.1.0.2 IP 作為授權 IP,並將伺服器標識符放回配置中,瞧,它起作用了!

shared-network "corp" {
 subnet 1.2.3.0 netmask 255.255.255.0 {
   server-identifier 1.2.3.2;
   # ...
 }
 subnet 10.1.0.0 netmask 255.255.0.0 {
   server-identifier 10.1.0.2;
   # ...
 }
 subnet 192.168.0.0 netmask 255.255.0.0 {
   server-identifier 192.168.0.1;
   # ...
 }
}

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