DHCPサーバの設定 on Ubuntu 18.04

DHCPサーバの設定について,書き残す
( こんなに手間取るとは思わなかった… )

1. DHCPサーバのインストール

1
% sudo apt-get install isc-dhcp-server

2. 設定ファイルの記述

/etc/dhcp/dhcpd.conf を自分の環境にあわせて修正する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
% cd /etc/dhcp/
% sudo cp dhcpd.conf dhcpd.conf.ORG
% sudo vi dhcpd.conf
...編集作業...
% diff dhcpd.conf dhcpd.conf.ORG
10,11c10,12
< option domain-name "example.org";
< option domain-name-servers ns1.example.org, ns2.example.org;
---
> option domain-name "my-subnet-1";
> # option domain-name-servers ns1.example.org, ns2.example.org;
> option domain-name-servers 192.168.111.10, 1.1.1.1;
24c25
< #authoritative;
---
> authoritative;
28c29
< #log-facility local7;
---
> log-facility local7;
34a36,39
> subnet 192.168.111.0 netmask 255.255.255.0 {
> range 192.168.111.100 192.168.111.120;
> option routers 192.168.111.10;
> }

当方が行なった修正は,以下の通り,

  1. domain-name (10行目)
    適当につけた
  2. domain-name-servers (12行目)
    DNSサーバのリスト.これも環境に合わせて設定する
  3. authoritativeの有効化 (16行目)
    コメントアウトされていたものを,有効化する
  4. syslogのfacility設定 (20行目)
    これもコメントアウトされていたものを有効化した.(これは好み)
  5. DHCPサーバが世話するsubnetの設定 (22-25行目)
    これは設定するDHCPサーバがIPアドレス払い出しの世話をするsubnetの設定を記述する.上記の記載は最もシンプルなものかと.この設定ファイル内にもいくつかの事例が書かれているので,自身の環境に合わせて設定のこと

3. 設定ファイルの記述 (その2)

もう1つの設定ファイルである,/etc/default/isc-dhcp-server にNICの設定を行う.
当方はIPv4のDHCPサーバだけが必要だったので,以下のように INTERFACESv4 の設定にDHCPサーバが動作して欲しいNICの名称を記述した

1
2
3
4
5
6
7
8
9
% cd /etc/default
% sudo cp isc-dhcp-server isc-dhcp-server.ORG
% sudo vi isc-dhcp-server
(編集作業)
% diff isc-dhcp-server.ORG isc-dhcp-server
17c17
< INTERFACESv4=""
---
> INTERFACESv4="enp3s0"

4. 動作確認

動作確認を試みるが,失敗に終わる (T T

1
2
3
% sudo systemctl start isc-dhcp-server
% ps ax | grep dhcp
22182 pts/1 S+ 0:00 grep --color=auto dhcp

このなぞを解くには,systemdがどのようにDHCPサーバを起動しているのかを知る必要があると思い,systemdの設定ファイルをのぞきにいく.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
% cd /etc/systemd/system/multi-user.target.wants
% cat isc-dhcp-server.service
[Unit]
Description=ISC DHCP IPv4 server
Documentation=man:dhcpd(8)
Wants=network-online.target
After=network-online.target
After=time-sync.target
ConditionPathExists=/etc/default/isc-dhcp-server
ConditionPathExists=|/etc/ltsp/dhcpd.conf
ConditionPathExists=|/etc/dhcp/dhcpd.conf

[Service]
EnvironmentFile=/etc/default/isc-dhcp-server
RuntimeDirectory=dhcp-server
# The leases files need to be root:dhcpd even when dropping privileges
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 /var/lib/dhcp/dhcpd.leases; \
chown root:dhcpd /var/lib/dhcp /var/lib/dhcp/dhcpd.leases; \
chmod 775 /var/lib/dhcp ; chmod 664 /var/lib/dhcp/dhcpd.leases; \
exec dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd.pid -cf $CONFIG_FILE $INTERFACES'

[Install]
WantedBy=multi-user.target

この23行目末尾の $INTERFACES という記載が気になった.なぜかというと,/etc/default/isc-dhcp-serverの設定ファイル内には,INTERFACES ではなくて INTERFACESv4 と書かれていたからだ.なので,このファイルの当該部分を書き換えた.そうしたところ,無事にDHCPサーバが手動では起動するようになった.(これって…)

5. DHCPサーバの有効化

システム起動時にDHCPサーバが起動されるようにする.

1
2
3
4
5
6
7
8
9
10
11
12
13
% sudo systemctl enable isc-dhcp-server
% sudo systemctl start isc-dhcp-server
(↑ もしかしたら,不要かも.前述のenableコマンドで起動するから)
% systemctl status isc-dhcp-server (← 状況確認)
● isc-dhcp-server.service - ISC DHCP IPv4 server
Loaded: loaded (/lib/systemd/system/isc-dhcp-server.service; enabled; vendor
Active: active (running) since Fri 2020-03-27 18:29:17 JST; 1 day 5h ago
Docs: man:dhcpd(8)
Main PID: 955 (dhcpd)
Tasks: 1 (limit: 4539)
CGroup: /system.slice/isc-dhcp-server.service
└─955 dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd

6. 計算機起動時のサーバ起動を確認,

「よし,これで大丈夫だ」と思い,計算機を再起動する.計算機の起動時に,DHCPサーバがきちんと起動するかを確認するためだ.が,なーんと,起動しないではないか.
あらためて手動で起動するか確認すると,それは問題なく起動する.不思議に思い,システムログを確認したら,以下のようなエラーメッセージが残されていた.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
% grep dhcp /var/log/syslog 
(一部だけ抜粋)
Mar 27 17:47:45 myhost1 dhcpd[888]: Internet Systems Consortium DHCP Server 4.3.
5
Mar 27 17:47:45 myhost1 dhcpd[888]: Copyright 2004-2016 Internet Systems Consort
ium.
Mar 27 17:47:45 myhost1 dhcpd[888]: All rights reserved.
Mar 27 17:47:45 myhost1 dhcpd[888]: For info, please visit https://www.isc.org/s
oftware/dhcp/
Mar 27 17:47:45 myhost1 dhcpd[888]: Wrote 1 leases to leases file.
Mar 27 17:47:45 myhost1 sh[888]: in your dhcpd.conf file for the network segm
ent
Mar 27 17:47:45 myhost1 systemd[1]: isc-dhcp-server.service: Main process exited
, code=exited, status=1/FAILURE
Mar 27 17:47:45 myhost1 dhcpd[888]:
Mar 27 17:47:45 myhost1 sh[948]: in your dhcpd.conf file for the network segm
ent
Mar 27 17:47:45 myhost1 systemd[1]: isc-dhcp-server.service: Failed with result
'exit-code'.
Mar 27 17:47:45 myhost1 dhcpd[888]: No subnet declaration for enp3s0 (no IPv4 ad
dresses).
Mar 27 17:47:45 myhost1 dhcpd[888]: ** Ignoring requests on enp3s0. If this is
not what
Mar 27 17:47:45 myhost1 dhcpd[888]: you want, please write a subnet declarati
on
Mar 27 17:47:45 myhost1 dhcpd[888]: in your dhcpd.conf file for the network s
egment
Mar 27 17:47:45 myhost1 dhcpd[888]: to which interface enp3s0 is attached. **

Mar 27 17:47:45 myhost1 dhcpd[888]:
Mar 27 17:47:45 myhost1 dhcpd[888]:
Mar 27 17:47:45 myhost1 dhcpd[888]: Not configured to listen on any interfaces!
Mar 27 17:47:45 myhost1 dhcpd[888]:
Mar 27 17:47:45 myhost1 dhcpd[888]: If you think you have received this message
due to a bug rather
Mar 27 17:47:45 myhost1 dhcpd[888]: than a configuration issue please read the s
ection on submitting
Mar 27 17:47:45 myhost1 dhcpd[888]: bugs on either our web page at www.isc.org o
r in the README file
Mar 27 17:47:45 myhost1 dhcpd[888]: before submitting a bug. These pages explai
n the proper
Mar 27 17:47:45 myhost1 dhcpd[888]: process and the information we find helpful
for debugging..
Mar 27 17:47:45 myhost1 dhcpd[888]:
Mar 27 17:47:45 myhost1 dhcpd[888]: exiting.
Mar 27 17:47:45 myhost1 dhcpd[948]:
Mar 27 17:47:45 myhost1 dhcpd[948]: No subnet6 declaration for enp3s0 (no IPv6 a
ddresses).
Mar 27 17:47:45 myhost1 dhcpd[948]: ** Ignoring requests on enp3s0. If this is
not what
... (以降略)

どうやら「きちんと設定されたNICがない.」と言っているようだ.いや,networkはきちんと使えているし,変だな〜.と思い,エラーメッセージを頼りに調べてみる.すると,以下のようなWebを見つけた.

DHCP server won’t start. Gives ‘Not configured to listen on any interfaces!’ even when configured
https://askubuntu.com/questions/536531/dhcp-server-wont-start-gives-not-configured-to-listen-on-any-interfaces-eve

これによると,どうやらNICの設定が終わる前に,DHCPサーバの起動処理が走ってしまい,動作できるNICが見つからないため,エラーになっているということらしい.なので「NICの設定が終わるまで,DHCPサーバの起動処理を遅らせておけ」とある.これって,いわゆる Bad know-how なの?と思った.が,計算機の起動時に自動的にDHCPがスタートして欲しいので,仕方なく以下のようにsystemdの起動ファイルを1行だけ修正する.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
% cd /etc/systemd/system/multi-user.target.wants
% cat isc-dhcp-server.service
[Unit]
Description=ISC DHCP IPv4 server
...(省略)...
# The leases files need to be root:dhcpd even when dropping privileges
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 /var/lib/dhcp/dhcpd.leases; \
chown root:dhcpd /var/lib/dhcp /var/lib/dhcp/dhcpd.leases; \
chmod 775 /var/lib/dhcp ; chmod 664 /var/lib/dhcp/dhcpd.leases; \
sleep 15; \
exec dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd.pid -cf $CONFIG_FILE $INTERFACES'
...(省略)...

修正点は13行目のみ.実際にdhcpdを起動する前に15秒待つ処理を追加した.Web記事では30秒待っているが,そんなにかからないだろうということで15秒の設定にした.今のところそれでも問題なく動作している.

たかが,DHCPサーバのインストールでこんなに苦労するとは思わなかった.やれやれ

余談1:
IPv6のDHCPサーバも同時にインストールされ,defaultでenableになっているようだ.不要ならば止めておくべきだろう.

1
2
3
4
5
6
% sudo systemctl disable isc-dhcp-server6
% systemctl status isc-dhcp-server6
● isc-dhcp-server6.service - ISC DHCP IPv6 server
Loaded: loaded (/lib/systemd/system/isc-dhcp-server6.service; disabled; vendo
Active: inactive (dead)
Docs: man:dhcpd(8)

余談2:
一晩寝て,ふと思ったのは,計算機の再起動時間を短縮するために行なった設定のことである.以下のメモ内の「追伸」欄に書いた設定で,network設定のための待ち時間を強制的にナシにする設定をしていたのだが,これが,上記の「起動処理の開始を15秒遅らせる」に該当する待ち時間になっていたのかもしれない.

IPアドレスの静的設定ができん! at Ubuntu 18.04 LTS server

しかし,あの待ち時間は2分ぐらい待たされていたので我慢できなかった.設定に苦労はしたが,再起動にかかる時間はこちらのほうが短いので,今となっては結果オーライ,と思うしかない.

— ends here

DHCPサーバの設定 on Ubuntu 18.04

http://the.netaro.info/2020/03/28/2020-0328_dhcp-server/

Author

T.T

Posted on

2020-03-28

Updated on

2020-12-12

Licensed under