Dhcp

dnsmasq 不響應不遵循 DHCP 發現的 DHCP 請求

  • April 4, 2017

我有一個dnsmasq在網路命名空間 X 上執行的實例,我從網路命名空間 Y 中執行dhclient(或任何其他 dhcp 客戶端)以獲取給定介面上的 IP 地址。這兩個網路命名空間位於同一openvswitch網橋上,它們通過該網橋進行通信。

我發現dnsmasq需要很長時間才能回复,大約在 10 到 30 秒之間,即使 atcpdump顯示所有 DHCP 數據包都已及時傳遞到目標名稱空間。

為什麼需要這麼長時間?有沒有辦法減少這種延遲?

這是 /var/log/syslog 中的範例,其中 IP 地址在 11 秒後分配:

Apr  4 14:31:27 localhost dhclient: Listening on LPF/_0.ping/ae:ca:22:bc:3c:7b
Apr  4 14:31:27 localhost dhclient: Sending on   LPF/_0.ping/ae:ca:22:bc:3c:7b
Apr  4 14:31:27 localhost dhclient: Sending on   Socket/fallback
Apr  4 14:31:27 localhost dhclient: DHCPREQUEST on _0.ping to 255.255.255.255 port 67
Apr  4 14:31:33 localhost dhclient: DHCPREQUEST on _0.ping to 255.255.255.255 port 67
Apr  4 14:31:48 localhost dhclient: DHCPDISCOVER on _0.ping to 255.255.255.255 port 67 interval 3
Apr  4 14:31:48 localhost dnsmasq-dhcp[11719]: DHCPDISCOVER(_0.dhcp) 192.168.31.110 ae:ca:22:bc:3c:7b 
Apr  4 14:31:48 localhost dnsmasq-dhcp[11719]: DHCPOFFER(_0.dhcp) 192.168.31.110 ae:ca:22:bc:3c:7b 
Apr  4 14:31:48 localhost dhclient: DHCPREQUEST on _0.ping to 255.255.255.255 port 67
Apr  4 14:31:48 localhost dhclient: DHCPOFFER from 192.168.31.1
Apr  4 14:31:48 localhost dnsmasq-dhcp[11719]: DHCPREQUEST(_0.dhcp) 192.168.31.110 ae:ca:22:bc:3c:7b 
Apr  4 14:31:48 localhost dnsmasq-dhcp[11719]: DHCPACK(_0.dhcp) 192.168.31.110 ae:ca:22:bc:3c:7b mymachine
Apr  4 14:31:48 localhost dnsmasq-dhcp[11719]: not giving name mymachine to the DHCP lease of 192.168.31.110 because the name exists in /etc/hosts with address 127.0.0.1
Apr  4 14:31:48 localhost dhclient: DHCPACK from 192.168.31.1
Apr  4 14:31:48 localhost dhclient: ntp-servers: expecting at least 4 bytes; got 0
Apr  4 14:31:48 localhost dhclient: bound to 192.168.31.110 -- renewal in 33935 seconds.

使用以下dnsmasq命令啟動實例:

dnsmasq --dhcp-range=set:tag0,192.168.31.100,192.168.31.150,24h -l /tmp/dnsmasq-leasefile.dhcp.dhcp --dhcp-option=tag:tag0,option:router,192.168.31.2 --dhcp-option=tag:tag0,option:dns-server,9.9.9.9 --dhcp-option=tag:tag0,42

編輯 好吧,我又跑了幾次,我想我在那裡看到了一個模式。DHCP 客戶端首先發送兩個 DHCP 請求,但均未得到答复。一旦發送了 DHCP 發現,就會dnsmasq回复。首先嘗試使用 DHCP 請求的原因dhclient是它看到了相同介面的先前租約,/var/lib/dhcp/dhclient.leases並嘗試請求出現在那裡的 IP 地址。一旦我刪除了此類文件,dnsmasq就會立即生成來自的響應。我看到兩個選項:

  • 我告訴dhclient不要使用它的租約文件(不知道如何),但這並不理想……
  • 我指示dnsmasq響應不遵循發現消息的請求。我怎樣才能做到這一點?

答案是使用--dhcp-authoritativednsmasq 中的選項。問題是我每次都在重新啟動 dnsmasq 伺服器,所以它沒有租約文件,但 dhclient 有自己的租約文件。由於無法在自己的租用文件中驗證請求的 IP 地址,dnsmasq 會一直等待,直到發出 dhcp discover 消息。

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