如果重启时接口未连接,isc-dhcp-server 将失败

如果重启时接口未连接,isc-dhcp-server 将失败

在我的网关服务器上的 Ubuntu 18.04 上,我已经安装并配置了 isc-dhcp-server,但如果重新启动后没有任何设备连接到 enp2s0,它就无法启动(即无法启动)。

请注意它说“未配置监听任何接口!

$ service isc-dhcp-server status
● isc-dhcp-server.service - ISC DHCP IPv4 server
   Loaded: loaded (/lib/systemd/system/isc-dhcp-server.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Sat 2020-01-18 19:05:34 GMT; 1s ago
     Docs: man:dhcpd(8)
  Process: 3475 ExecStart=/bin/sh -ec      CONFIG_FILE=/etc/dhcp/dhcpd.conf;      if [ -f /etc/ltsp/dhcpd.conf ]; then CONFIG_FILE=/etc/ltsp/dhcpd.conf; fi;      [ -e /var/lib/dhcp/dhcpd.leases ] || touch /v
 Main PID: 3475 (code=exited, status=1/FAILURE)

Jan 18 19:05:34 user-Default-string dhcpd[3475]:
Jan 18 19:05:34 user-Default-string dhcpd[3475]: Not configured to listen on any interfaces!
Jan 18 19:05:34 user-Default-string dhcpd[3475]:
Jan 18 19:05:34 user-Default-string dhcpd[3475]: If you think you have received this message due to a bug rather
Jan 18 19:05:34 user-Default-string dhcpd[3475]: than a configuration issue please read the section on submitting
Jan 18 19:05:34 user-Default-string dhcpd[3475]: bugs on either our web page at www.isc.org or in the README file
Jan 18 19:05:34 user-Default-string dhcpd[3475]: before submitting a bug.  These pages explain the proper
Jan 18 19:05:34 user-Default-string dhcpd[3475]: process and the information we find helpful for debugging..
Jan 18 19:05:34 user-Default-string dhcpd[3475]:
Jan 18 19:05:34 user-Default-string dhcpd[3475]: exiting.

我的网关服务器有两个以太网端口,enp1s0 和 enp2s0。我使用 enp1s0 通过路由器访问互联网,使用 enp2s0 为以太网连接的笔记本电脑提供 Web 应用程序。enp2s0 是 DHCP 服务器分配 IP 地址的端口(用于需要 Web 应用程序的笔记本电脑)。我enp1s0 从 192.168.1.0 子网上连接互联网的路由器获取一个随机 IP 地址,这样该接口不由 isc-dhcp-server 管理,只有 enp2s0 管理。

这是与 enp2s0 没有任何连接的“ip route”,如果这有帮助的话......

$ ip route
default via 192.168.1.254 dev enp1s0 proto dhcp metric 100
169.254.0.0/16 dev enp1s0 scope link metric 1000
192.168.1.0/24 dev enp1s0 proto kernel scope link src 192.168.1.76 metric 100

这是我的 dhcpd.conf 设置:

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

# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.)
ddns-update-style none;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

# This is a very basic subnet declaration.    
subnet 192.168.2.0 netmask 255.255.255.0 {
  range 192.168.2.200 192.168.2.250;
  # option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
  option broadcast-address 192.168.2.255;
}

这是我的 isc-dhcp-server 设置:

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4="enp2s0"
INTERFACESv6=""

一种解决方案是在将笔记本电脑插入 enp2s0 后重新启动 isc-dhcp-server,但我不想每次重启后或每次有人将笔记本电脑插入 enp2s0 时都必须这样做。重新启动服务后,DHCP 服务器即可正常工作...

$ sudo service isc-dhcp-server restart
$ service isc-dhcp-server status
● isc-dhcp-server.service - ISC DHCP IPv4 server
   Loaded: loaded (/lib/systemd/system/isc-dhcp-server.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2020-01-18 18:22:01 GMT; 14min ago
     Docs: man:dhcpd(8)
 Main PID: 2437 (dhcpd)
    Tasks: 1 (limit: 2016)
   CGroup: /system.slice/isc-dhcp-server.service
           └─2437 dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd.pid -cf /etc/dhcp/dhcpd.conf enp2s0

有什么想法吗?我确信我遗漏了一个配置项,它可以解决这个问题...

编辑: 命令“nmcli connection show lan”(又名:nmcli cs lan)的输出

$ nmcli connection show lan

connection.id:                          lan
connection.uuid:                        96fbb458-1178-4af2-a1b7-ccce301176e0
connection.stable-id:                   --
connection.type:                        802-3-ethernet
connection.interface-name:              enp2s0
connection.autoconnect:                 yes
connection.autoconnect-priority:        0
connection.autoconnect-retries:         -1 (default)
connection.auth-retries:                -1
connection.timestamp:                   1579379514
connection.read-only:                   no
connection.permissions:                 --
connection.zone:                        --
connection.master:                      --
connection.slave-type:                  --
connection.autoconnect-slaves:          -1 (default)
connection.secondaries:                 --
connection.gateway-ping-timeout:        0
connection.metered:                     unknown
connection.lldp:                        default
connection.mdns:                        -1 (default)
802-3-ethernet.port:                    --
802-3-ethernet.speed:                   0
802-3-ethernet.duplex:                  --
802-3-ethernet.auto-negotiate:          no
802-3-ethernet.mac-address:             --
802-3-ethernet.cloned-mac-address:      --
802-3-ethernet.generate-mac-address-mask:--
802-3-ethernet.mac-address-blacklist:   --
802-3-ethernet.mtu:                     auto
802-3-ethernet.s390-subchannels:        --
802-3-ethernet.s390-nettype:            --
802-3-ethernet.s390-options:            --
802-3-ethernet.wake-on-lan:             default
802-3-ethernet.wake-on-lan-password:    --
ipv4.method:                            manual
ipv4.dns:                               --
ipv4.dns-search:                        --
ipv4.dns-options:                       ""
ipv4.dns-priority:                      0
ipv4.addresses:                         192.168.2.2/24
ipv4.gateway:                           --
ipv4.routes:                            --
ipv4.route-metric:                      -1
ipv4.route-table:                       0 (unspec)
ipv4.ignore-auto-routes:                no
ipv4.ignore-auto-dns:                   no
ipv4.dhcp-client-id:                    --
ipv4.dhcp-timeout:                      0 (default)
ipv4.dhcp-send-hostname:                yes
ipv4.dhcp-hostname:                     --
ipv4.dhcp-fqdn:                         --
ipv4.never-default:                     no
ipv4.may-fail:                          yes
ipv4.dad-timeout:                       -1 (default)
ipv6.method:                            auto
ipv6.dns:                               --
ipv6.dns-search:                        --
ipv6.dns-options:                       ""
ipv6.dns-priority:                      0
ipv6.addresses:                         --
ipv6.gateway:                           --
ipv6.routes:                            --
ipv6.route-metric:                      -1
ipv6.route-table:                       0 (unspec)
ipv6.ignore-auto-routes:                no
ipv6.ignore-auto-dns:                   no
ipv6.never-default:                     no
ipv6.may-fail:                          yes
ipv6.ip6-privacy:                       -1 (unknown)
ipv6.addr-gen-mode:                     stable-privacy
ipv6.dhcp-send-hostname:                yes
ipv6.dhcp-hostname:                     --
ipv6.token:                             --
proxy.method:                           none
proxy.browser-only:                     no
proxy.pac-url:                          --
proxy.pac-script:                       --

EDIT2:添加了“nmcli -f name,autoconnect connection show”的输出

$ nmcli -f name,autoconnect connection show
NAME                AUTOCONNECT
Wired connection 1  yes
lan                 yes

EDIT3:添加了“cat /etc/NetworkManager/system-connections/lan”的输出

[connection]
id=lan
uuid=96fbb458-1178-4af2-a1b7-ccce301176e0
type=ethernet
interface-name=enp2s0
permissions=
timestamp=1579379263

[ethernet]
mac-address-blacklist=

[ipv4]
address1=192.168.2.2/24
dns-search=
method=manual

[ipv6]
addr-gen-mode=stable-privacy
dns-search=
method=auto

答案1

接口 (enp2s0) 是否已启动?需要添加一个 ipv4 地址,然后启动 (up)

任何客户端是否连接到集线器/交换机都无关紧要。

编辑:网络管理员?

我非常讨厌那个东西,但是无论如何:如果 iface 没有正确的地址,dhcpd 将无法启动,所以你需要弄清楚如何使用 nmcli 创建始终处于启动状态的静态配置。

编辑:这显示了什么?

nmcli connection show lan

connection.autoconnection 属性很有趣。

编辑:显示了什么:

  nmcli -f name,autoconnect connection show

好的,状态如何

  nmcli -f name,autoconnect connection show

重启后无需黑客攻击?自动连接属性应该足以调出界面……不知道为什么有些东西会失败,基本上很简单,这是我不喜欢 NetworkManager 的原因之一(太复杂了,好处不明,我明白客户端需要不断移动,但服务器必须正常工作??)

编辑:etc/NetworkManger/system-connections 中有任何文件吗?这至少是我在系统中配置设备的方式(它是桥接配置),因此我确实使用 NetworkManager 来启动机器。该机器是三个客户的主机,因此 enp1s0 设备是从属设备。

编辑:如果你定义了局域网设备(首先将其完全删除),会发生什么情况,例如:

nmcli connection down lan 
nmcli connection delete lan
nmcli connection add type ethernet ifname enp2s0 con-name lan autoconnect on
nmcli connection modify lan   ipv4.method manual ipv4.addresses 192.168.2.2/24 
nmcli connection lan up

答案2

除非有更好的解决方案,否则目前这对我来说是可行的:当我的 Web 应用程序启动时,它做的前两件事是:

  1. sudo nmcli conn向上lan('lan' 是分配给 enp2s0 的 NetworkManager 连接名称)
  2. sudo 服务 isc-dhcp-服务器重新开始

Web 应用程序按 cron 计划启动 @reboot,因此 NetworkManager 已在此时启动。

如果 enp2s0 尚未“启动”,isc-dhcp-server 总是会失败,因此我必须将其设置为“启动”,然后重新启动 isc-dhcp-server 服务。虽然不太优雅,但目前可以完成工作。

答案3

如果它对任何人都有帮助,我刚刚在 Pi Zero W 上的 DietPi(Debian Buster)上遇到了这个令人恼火的问题,并且已经解决了问题。

isc-dhcp-server 非常出色,但确实存在这个怪癖,正如上面的原始询问者所指出的那样。我已经找到了问题所在 - 这不是错误 - 以下是原因的详细信息:

  1. 如果 isc-dhcp-server 在启动时看不到 UP 以太网网络子网,则会拒绝(抛出错误);它不需要(与某些评论者相反)实际连接到与其关联的以太网端口。

  2. 在开发 WiFi 热点设备时,通常使用 hostapd 作为 AP 服务器功能(重新配置 WiFi 硬件以切换到 AP 模式),并且除了 hostapd 之外,还需要一个 dhcp 服务器(如 isc-dhcp-server)来提供 IP 地址租赁服务。

  3. 因此:通常,起点是 WiFi 设备,在启动时配置为客户端设备,但需要切换到主机模式才能充当热点。因此,在启动 hostapd 之前,早期步骤是将 wlan0(或其他)设置为 DOWN。

但是这种情况是 isc-dhcp-server 不喜欢的情况之一:如果您尝试在 hostapd 之前启动它,它将会失败,并抱怨没有子网可供它监听。

  1. 因此,您可以天真地尝试将新的 IP 地址(用于主机)添加到 wlan0(或等效地址)并重试:这也行不通,因为尽管您现在有一个新的 IP 连接到以太网端口,但您也会发现您无法将其设置为“UP”(ip link set wlan0 up 将失败)。这是因为端口被仍然处于活动状态的陈旧地址和正在使用它的 wpa-supplicant 进程“污染”了。

  2. 长话短说:您需要关闭 wpa-supplicant,以“释放”旧地址/刷新端口的 IP 设置/然后为主机添加新 IP 地址;即使这样,您仍会发现 isc-dhcp-server 仍然无法启动,因为您无法设置接口 - 目前还无法。最后 - 现在在 isc 之前运行 hostapd,IT 还会(在重新配置芯片组时)将 wlan0 接口设置为 UP。所以现在 - 终于 - 您可以运行 isc-dhcp-server,它将干净地启动,并且您的热点将启动。

我花了大约五个小时,希望这能为大家节省一些时间。我的总结:

对 ISC-DHCP-SERVER 和 HOSTAPD 进行排序:解决方案

您必须遵循以下顺序:

  1. 用这种方法终止 wpa-supplicant 进程(维持客户端连接):

     kill -2  $( cat /run/wpa_supplicant.wlan0.pid )
    
     sleep 1
    
     kill -9  $( cat /run/wpa_supplicant.wlan0.pid )
    
  2. 刷新 WLAN IP 设置,使用:

    ip addr flush dev wlan0
    
  3. 添加新的主机 IP 地址,使用:

    ip addr add 10.1.1.1/24 dev wlan0
    
  4. 启动 hostapd,它也会将 wlan0 启动:

     /usr/sbin/hostapd /etc/hostapd/hostapd.conf &
    
  5. 启动 isc-dhcp-server(WLAN 已启动,现在作为主机):

     sudo service isc-dhcp-server restart
    

然后,接入点应该处于启动状态并准备好接受客户端。

当然,这些是我的地址/可以根据您的需要进行编辑。

另外两个提示:配置文件 hostapd.conf 和 dhcp.conf 也会让你抓狂:-这里有工作示例。重要提示:不要为 hostapd.conf 中的“drivername”烦恼:它不是必需的。“注释掉”就可以了:

hostapd.conf

interface=wlan0

#driver=brcmfmac

ssid=THIS-IS-MY-AP

country_code=US

hw_mode=g

channel=6

macaddr_acl=0

auth_algs=1

ignore_broadcast_ssid=0

wpa=2

wpa_passphrase=12345678

wpa_key_mgmt=WPA-PSK

wpa_pairwise=CCMP

wpa_group_rekey=86400

ieee80211n=1

wme_enabled=1

dhcpd配置文件

# COMMENT OUT BOTH OF THE TEMPLATES' 'option domain..' lines.. 
# then ADD THIS AT BOTTOM
#
#
subnet 10.1.1.0 netmask 255.255.255.0 {
        range 10.1.1.100 10.1.1.109;
        option broadcast-address 10.1.1.255;
        option routers 10.1.1.1;
        default-lease-time 600;
        max-lease-time 7200;
        option domain-name "mynetwork.org";
        option domain-name-servers 8.8.8.8, 8.8.4.4;
}
#
#

虽然这项工作在 Pi 上进行,但它是在纯 Debian 的 DietPi 上进行的,因此同样的建议应该适用于许多 Linux,包括多种风格的 Ububtus。

祝大家好运

相关内容