Ubuntu - dhcp 伺服器“未配置為偵聽任何介面”
我對此束手無策;我已經嘗試了幾個小時來讓它工作,但我很難過。希望你們中的一個可以提供幫助。:-)
我正在嘗試讓 dhcp3-server 在 Ubuntu 上工作。它已安裝並正確設置以在 rc2、3、4、5.d 執行級別中執行。在啟動時,它的 init.d 腳本會執行,並且在 syslog 中,我得到以下資訊:
Oct 18 20:40:37 jez-ubuntu dhcpd: Internet Systems Consortium DHCP Server V3.1.1 Oct 18 20:40:37 jez-ubuntu dhcpd: Copyright 2004-2008 Internet Systems Consortium. Oct 18 20:40:37 jez-ubuntu dhcpd: All rights reserved. Oct 18 20:40:37 jez-ubuntu dhcpd: For info, please visit http://www.isc.org/sw/dhcp/ Oct 18 20:40:37 jez-ubuntu dhcpd: Wrote 2 leases to leases file. Oct 18 20:40:37 jez-ubuntu dhcpd: Oct 18 20:40:37 jez-ubuntu dhcpd: No subnet declaration for eth1 (0.0.0.0). Oct 18 20:40:37 jez-ubuntu dhcpd: ** Ignoring requests on eth1. If this is not what Oct 18 20:40:37 jez-ubuntu dhcpd: you want, please write a subnet declaration Oct 18 20:40:37 jez-ubuntu dhcpd: in your dhcpd.conf file for the network segment Oct 18 20:40:37 jez-ubuntu dhcpd: to which interface eth1 is attached. ** Oct 18 20:40:37 jez-ubuntu dhcpd: Oct 18 20:40:37 jez-ubuntu dhcpd: Oct 18 20:40:37 jez-ubuntu dhcpd: Not configured to listen on any interfaces! Oct 18 20:40:39 jez-ubuntu NetworkManager: <info> (eth0): device state change: 1 -> 2 Oct 18 20:40:39 jez-ubuntu NetworkManager: <info> (eth0): bringing up device. Oct 18 20:40:39 jez-ubuntu NetworkManager: <info> (eth0): preparing device. [...]
如您所見,dhcpd 似乎在 NetworkManager之前執行,它設置了我的 eth0(網際網路)和 eth1(家庭網路)介面。您會認為這與 rcX.d 符號連結名稱有關,並且 dhcpd 被命名為在 NetworkManager 之前啟動。不是這樣。我的 dhcp3-server 符號連結名為“S99dhcp3-server”,網路管理器符號連結名為“S50NetworkManager”,因此它應該在 dhcp 伺服器之前啟動。此外,如果我實際上從命令行“/etc/init.d/dhcp3-server”執行(以 root 身份)……伺服器執行正常!它只會在啟動時失敗!
為什麼它說它沒有配置為監聽任何介面?網路管理器是否在我的所有引導腳本都執行之後才啟動介面 eth0 和 eth1 ?如果是這樣,它有什麼用?其他腳本肯定需要這些介面在啟動時可用嗎?這是我的 /etc/dhcp3/dhcpd.conf 文件:
subnet 192.168.0.0 netmask 255.255.255.0 { option routers 192.168.0.1; option subnet-mask 255.255.255.0; option domain-name-servers 87.194.0.51; option ip-forwarding off; range dynamic-bootp 192.168.0.100 192.168.0.254; default-lease-time 21600; max-lease-time 43200; }
和我的 /etc/default/dhcp3-server 文件:
# Defaults for dhcp initscript # sourced by /etc/init.d/dhcp # installed at /etc/default/dhcp3-server by the maintainer scripts # # This is a POSIX shell fragment # # On what interfaces should the DHCP server (dhcpd) serve DHCP requests? # Separate multiple interfaces with spaces, e.g. "eth0 eth1". INTERFACES="eth1"
據我所知,這些都是正確的。有任何想法嗎?
好的,我想我已經解決了這個問題。它是 Linux 網路管理器中的一個錯誤。
看,網路管理器作為啟動過程的一部分執行(即“S50NetworkManager”符號連結)並啟動您的乙太網介面。但是,它是非同步執行的。這意味著網路管理器立即返回,暗示它之後的腳本,“OK - network’s been set up。” 實際上,它沒有,網路管理員正坐在後台繼續設置網路。同時,啟動腳本在執行後假設網路介面可用,這是一種競爭條件,取決於網路管理員是否已經開始設置它們。
這是一個可怕的情況,我很驚訝的一個錯誤還沒有得到修復。繞過它的一種方法是放棄網路管理器,而是通過編輯 /etc/network/interfaces 來設置你的介面。不過,我沒有做這項工作,而是嘗試了這個錯誤報告中建議的醜陋黑客: https ://bugzilla.redhat.com/show_bug.cgi?id=486372
我在 dhcp3-server 的 init.d 腳本的 start 函式的開頭添加了 5 秒延遲(‘sleep 5’),這給了網路管理員足夠的時間來設置網路介面(當然仍然沒有保證) - 它奏效了。現在,dhcpd 在啟動時成功。
如 bugzilla.redhat.com 上的錯誤 #486372 和 #447442 中所述,這要麼是網路管理器的錯誤(它應該阻塞,直到其有線網路介面可用),或者是 dhcpd(它應該被更新以等待網路介面變得可用,而不僅僅是崩潰)。不過,這絕對是一個錯誤。