我对此束手无策;我尝试了几个小时才让它工作,但我被难住了。希望你们能帮忙。:-)
我正在尝试让 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
以下是用于验证您是否遇到主题错误的要点列表:
- isc-dhcpd-server 正在查看内部:
/etc/default/isc-dhcp 服务器
文件来识别接口名称,唯一将提供动态地址(它不再是系统的所有接口,而只是在此文件中提及)。确保您至少定义了 1 个接口(并且它是不是必要的话eth0不再):
INTERFACES="enp0s31f6"
- 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 将拒绝运行
- 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;
}