再起動時にインターフェースが接続されていない場合、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の2つのイーサネットポートがあります。ルーター経由でインターネットにアクセスするためにenp1s0を使用し、イーサネットに接続されたラップトップにWebアプリを提供するためにenp2s0を使用します。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=""

1 つの解決策は、ラップトップを 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:                       --

編集2: 「nmcli -f name,autoconnect connection show」からの出力を追加しました

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

編集3: 「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 アドレスを追加して起動 (稼働) する必要があります。

ハブ/スイッチにクライアントが接続されているかどうかは問題ではありません。

編集: ネットワーク マネージャー?

私はそれが大嫌いですが、いずれにせよ、iface が正しいアドレスで起動していない場合は dhcpd は起動しないので、nmcli を使用して常に起動している静的構成を作成する方法を見つける必要があります。

編集: これを示すものは何ですか?

nmcli connection show lan

connection.autoconnection プロパティは興味深いです。

編集: これを示すもの:

  nmcli -f name,autoconnect connection show

さて、状況はどうですか

  nmcli -f name,autoconnect connection show

ハックなしで再起動した後、どうなりますか? autoconnect プロパティはインターフェイスを起動するのに十分です... 基本的に非常に単純なもので何かが失敗する理由がわからないのは、NetworkManager の嫌いな点の 1 つです (不明な利点に対して複雑すぎるため、常に移動しているクライアントには意味があると思いますが、サーバーは単純に動作する必要がありますか??)

編集: etc/NetworkManger/system-connections にファイルはありますか? 少なくとも、これが私のシステムでデバイスを構成した方法です (ブリッジ構成です)。そのため、NetworkManager を使用してマシンを起動します。マシンは 3 つのゲストのホストであるため、enp1s0 デバイスはスレーブです。

編集: LAN デバイスを定義すると (まず完全に削除します)、次のようになります。

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 アプリが起動すると、最初に次の 2 つの処理が行われます。

  1. sudo nmcli接続lan ('lan' は enp2s0 に割り当てられた NetworkManager 接続名です)
  2. sudo サービス isc-dhcp-server再起動

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 とともに、IP アドレス リース サービスを提供する isc-dhcp-server などの DHCP サーバーが必要になります。

  3. SO: 通常、開始点は、起動時にクライアント デバイスとして設定された WiFi デバイスですが、ホットスポットとして機能するにはホスト モードに切り替える必要があります。したがって、初期手順としては、hostapd を起動する前に、wlan0 (またはその他) を DOWN に設定します。

しかし、この状況は、isc-dhcp-server が好まない状況の 1 つです。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 を実行できるようになり、正常に起動してホットスポットが起動します。

約 5 時間かかりました。これで誰かの時間が節約できれば幸いです。要約:

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
    

その後、アクセス ポイントは起動し、クライアントを受け入れる準備が整います。

もちろん、これらは私のアドレスです。必要に応じて編集してください。

さらに 2 つのヒント: 設定ファイル hostapd.conf と dhcp.conf も、あなたを困らせる可能性があります: - ここに動作サンプルがあります。重要: hostapd.conf の 'drivername' については心配しないでください。これは必要ありません。'コメントアウト' しても問題ありません:

ホストapd.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.conf

# 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 上で行われたため、同じアドバイスが、さまざまなフレーバーの Ububtus を含む多くの Linux に当てはまるはずです。

皆さん頑張ってください

関連情報