Ubuntu - dhcp 服务器“未配置为侦听任何接口”

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”,而 Network Manager 符号链接名为“S50NetworkManager”,因此它应该在 dhcp 服务器之前启动。此外,如果我实际上从命令行“/etc/init.d/dhcp3-server”运行(以 root 身份)... 服务器运行正常!它仅在启动时失败!

为什么它说没有配置监听任何接口?网络管理器是否直到我的所有启动脚本都运行了吗?如果是这样,那它有什么用呢?其他脚本肯定也需要这些接口在启动时可用吧?这是我的 /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"

据我所知,这些都是正确的。有什么想法吗?

答案1

好的,我想我已经修复了这个问题。这确实是 Linux 网络管理器的一个错误。

瞧,网络管理器作为引导过程的一部分运行(即“S50NetworkManager”符号链接)并启动以太网接口。但是,它是异步执行的。这意味着网络管理器会立即返回,向其后的脚本暗示“OK - 网络已设置”。实际上,它还没有,网络管理器正在后台继续设置网络。同时,其后的引导脚本在运行时假设网络接口可用,这是一种竞争条件,取决于网络管理器是否已经开始设置它们。

这是一个可怕的情况,我很惊讶这个错误还没有被修复。解决这个问题的一种方法是放弃网络管理器,而是通过编辑 /etc/network/interfaces 来设置接口。不过,我没有这样做,而是尝试了这个错误报告中建议的丑陋的破解方法: https://bugzilla.redhat.com/show_bug.cgi?id=486372

我在 dhcp3-server 的 init.d 脚本的启动函数开头添加了 5 秒延迟(“sleep 5”),这为网络管理员提供了充足的时间来设置网络接口(当然,这仍然不能保证) - 并且它成功了。现在,dhcpd 启动成功。

正如 bugzilla.redhat.com 上的 bug #486372 和 #447442 中所述,这要么是网络管理器的一个 bug(它应该阻塞直到有线网络接口可用),要么是 dhcpd 的一个 bug(它应该更新以等待网络接口可用,而不是直接崩溃)。不过,这肯定是一个 bug。

答案2

您可以像这样修改 /etc/network/interfaces:

iface eth1 inet static
  address 192.168.50.1
  netmask 255.255.255.0
  up service dhcp3-server restart

因此,当网络接口(eth1)真正启动后,dhcp3-server 将会重新启动。

答案3

以下是用于验证您是否遇到主题错误的要点列表:

  1. isc-dhcpd-server 正在查看内部:

/etc/default/isc-dhcp 服务器

文件来识别接口名称,唯一将提供动态地址(它不再是系统的所有接口,而只是在此文件中提及)。确保您至少定义了 1 个接口(并且它是不是必要的话eth0不再):

INTERFACES="enp0s31f6"
  1. isc-dhcpd-server 将不会接受上面提到的接口(enp0s31f6在我的示例中)如果您没有为该 IP 地址分配静态 IP 地址,则可以使用该 IP 地址来为其提供动态分配的 IP 地址。地址分配完成如下:

/etc/网络/接口

通过提供以下设置块:

# Define the static address and set it to serve with DHCP.  Link it to the existing interface.
iface enp0s31f6 inet static
address 10.20.0.1
netmask 255.255.255.240
#below are optional settings
#gateway 192.168.100.251
#dns-nameservers 8.8.8.8

为所选接口配置静态地址后,请确保它可用,并借助以下命令分配已定义的地址(通过重新启动网络):

sudo service networking restart

否则 isc-dhcpd-server 将拒绝运行

  1. isc-dhcpd-server 将仅为具有动态释放子网的接口提供服务

/etc/dhcp/dhcpd.conf

通过为接口地址提供单独的块定义(至少一个)(您选择的接口静态 IP 必须与配置的子网匹配):

subnet 10.20.0.0 netmask 255.255.255.0 {
    range 10.20.0.10 10.20.0.100;
    option subnet-mask 255.255.255.0;
    option routers 10.20.0.1;
    option broadcast-address 10.20.0.255;
    option domain-name-servers 192.168.100.254, 8.8.8.8;
}

只要遵守所有 3 条规则,您的 Ubuntu 上的 DHCP 服务即可运行(已在 16.04 版本上解决并验证)

最后,是时候通过执行命令来启动 isc-dhcpd-server 了:

sudo service isc-dhcp-server start

要验证配置是否成功,请使用另一个命令:

sudo service isc-dhcp-server status

并查看以下几行以确认是否成功:

● isc-dhcp-server.service - ISC DHCP IPv4 server
Active: active (running) since Wed 2017-05-10 15:28:13 CEST; 29min ago
May 10 15:28:13 system-P50 dhcpd[26869]: Listening on LPF/enp0s31f6/0a:3e:47:75:17:a8/10.20.0.0/24

答案4

我遇到了错误,例如“ No subnet declaration for eth1”和“ Not configured to listen on any interfaces!”。

然后我添加了 eth1subnet声明,尽管dhcpd.conf子网没有租用地址。并且它工作了。

subnet 10.32.64.0 netmask 255.255.252.0 {
    option routers 10.32.64.1;
}

相关内容