私的サーバー構築日誌：dhcpサーバー冗長化・Ubuntu 24.04 LTS in MicroServer N54L

## 能書き

[私的サーバー構築日誌：仕切り直し](https://qiita.com/katz_engineer/items/1f21de2bd9072c260ae6)からの自宅サーバー構築の続きです。

今回はDHCPサーバーの冗長化を図ります。[以前もやりました](https://qiita.com/katz_engineer/items/03be4aac1db264ca4197)が、その時の計画に基づき、セカンダリサーバー（＝ファイルサーバー）にもDHCPサーバーを立てます。

## 我が家のIPアドレス体系（再掲）

[以前も同じ事をやりました](https://qiita.com/katz_engineer/items/03be4aac1db264ca4197)ので、その再掲です。クラスBにして、第3オクテットで分類して使い分ける方針です。

DHCPプロトコルについて。プロトコルの仕様は、LAN 内に複数のDHCPサーバーが在っても問題無く動くようになっているそうです。問題はDHCPサーバーのIPアドレス管理が同期されない事で、IPアドレスが重複して発行されてしまう事態になりかねない点にあります。だからDHCPサーバー毎にIPアドレス範囲を分離する事で、多重発行を防ぐようにすれば良い、との事。

我が家のネットワークアドレス: **172.16.0.0/16**

<dl>
<dt>172.16.0.*<dt>
<dd>エイリアスIPアドレスとして、サービス毎に割り当てる固定IPアドレス（仮想IPアドレス）</dd>
<dt>172.16.1.*</dt>
<dd>ステイショナリIPアドレスとして、NIC毎に割り当てる固定IPアドレス及びMACアドレス毎にDHCPサーバが固定的に割り当てるIPアドレス</dd>
<dt>172.16.2.*</dt>
<dd>無線LANルータ内蔵のDHCPサーバーによる動的割り当てのIPアドレス</dd>
<dt>172.16.3.*</dt>
<dd>プライマリサーバーのDHCPサーバーによる動的割り当てのIPアドレス</dd>
<dt>172.16.4.*</dt>
<dd>セカンダリサーバーのDHCPサーバーによる動的割り当てのIPアドレス</dd>
</dl>

## 目標

Ubuntu 24.04 LTS を入れた[我が家のファイルサーバー MicroServer N54L](https://qiita.com/katz_engineer/items/1f21de2bd9072c260ae6#%E3%81%8A%E3%81%86%E3%81%A1%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC) にDHCPサーバーを立てます。

## 参考文献

- [私的サーバー構築日誌：dhcpサーバー冗長化 - Qiita](https://qiita.com/katz_engineer/items/03be4aac1db264ca4197)

## インストール

dhcpサーバーをインストール。

```console
sudo apt -y install isc-dhcp-server
```

インストールに成功したら`/etc`をSubversionで確認します。

```console
cd /etc
sudo svn st
```

結果は下記のようになりました。

```console
$ sudo svn st
?       apparmor.d/dhcpd.d
?       apparmor.d/local/usr.sbin.dhcpd
?       apparmor.d/usr.sbin.dhcpd
?       default/isc-dhcp-server
?       dhcp/ddns-keys
?       dhcp/dhcpd.conf
?       dhcp/dhcpd6.conf
M       group
M       gshadow
?       init.d/isc-dhcp-server
?       logcheck/ignore.d.server/isc-dhcp-server
M       passwd
?       rc0.d/K01isc-dhcp-server
?       rc1.d/K01isc-dhcp-server
?       rc2.d/S01isc-dhcp-server
?       rc3.d/S01isc-dhcp-server
?       rc4.d/S01isc-dhcp-server
?       rc5.d/S01isc-dhcp-server
?       rc6.d/K01isc-dhcp-server
M       shadow
?       systemd/system/multi-user.target.wants/isc-dhcp-server.service
?       systemd/system/multi-user.target.wants/isc-dhcp-server6.service
```

アカウントが増えている様子(group,gshadow,passwd,shadow)なので、中身を確認。

```console
$ sudo svn di --diff-cmd diff -x -U0 group gshadow passwd shadow
Index: group
===================================================================
--- group       (revision 5)
+++ group       (working copy)
@@ -62,0 +63 @@
+dhcpd:x:110:
Index: gshadow
===================================================================
--- gshadow     (revision 5)
+++ gshadow     (working copy)
@@ -62,0 +63 @@
+dhcpd:!::
Index: passwd
===================================================================
--- passwd      (revision 5)
+++ passwd      (working copy)
@@ -36,0 +37 @@
+dhcpd:x:110:110::/run:/usr/sbin/nologin
Index: shadow
===================================================================
--- shadow      (revision 6)
+++ shadow      (working copy)
@@ -36,0 +37 @@
+dhcpd:!:20057::::::
```

[以前と同じ](https://qiita.com/katz_engineer/items/03be4aac1db264ca4197#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)ですな。

このまま`/etc`を`svn commit`します。

```console
sudo svn st | grep "^?" | cut -b9- | sudo xargs -I{} find {} -type f -or -type d -or -type l | sudo xargs -rt svn add
```

```console
sudo svn ci -m"installed isc-dhcp-server"
```

## 設定

いよいよDHCPサーバーを設定します。

まずはサーバーのネットワーク関係を確認します。

```console
ip a
```

こんな結果になります。

```console
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 9c:b6:54:a9:14:76 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.3/16 brd 172.16.255.255 scope global enp3s0
       valid_lft forever preferred_lft forever
    inet6 fe80::9eb6:54ff:fea9:1476/64 scope link
       valid_lft forever preferred_lft forever
```

これを見て、IPアドレスとNIC名を取得します。

```console
SVR_IPADDR=172.16.1.3
NIC_NAME=enp3s0
```

そして家庭内ルーターのIPアドレス。我が家はこうです。

```console
RTR_IPADDR=172.16.2.1
```

我が家のドメインネームサーバーのIPアドレス。プライマリ・サーバーになります。

```console
PRIMARY_IPADDR=172.16.1.2
```

これを踏まえてdhcpd.confを設定します。

```console
cat | sudo tee /etc/dhcp/dhcpd.conf >/dev/null <<___
option domain-name "home";
option domain-name-servers $PRIMARY_IPADDR;

default-lease-time 86400;
max-lease-time 86400;

ddns-update-style none;

authoritative;

subnet 172.16.0.0 netmask 255.255.0.0 {
  range 172.16.4.2 172.16.4.254;
  option subnet-mask 255.255.0.0;
  option broadcast-address 172.16.255.255;
  option routers $RTR_IPADDR;
}

# secondary server
host $(cat /etc/hostname) {
  hardware ethernet $(cat $(find /sys/devices -name $NIC_NAME)/address);
  fixed-address $SVR_IPADDR;
}
___
```

この設定の説明については[以前の記事](https://qiita.com/katz_engineer/items/03be4aac1db264ca4197#%E8%A8%AD%E5%AE%9A)を参照してください。

## 起動

起動します。

```console
sudo systemctl start isc-dhcp-server
```

恐ろしい事に、エラーが発生して起動に失敗しても画面には表示されません。必ず確認しましょう。

```console
systemctl status isc-dhcp-server
```

本当は動作確認すべきなんですが、もういいよね。

## 自動起動

全部上手くいったら、マシン再起動で自動起動するようにします。

```console
sudo systemctl enable isc-dhcp-server
```

## /etcバージョン管理

成功を確認したら`/etc`をSubversion登録します。

```console
cd /etc
sudo svn st | grep "^?" | cut -b9- | sudo xargs -I{} find {} -type f -or -type d -or -type l | sudo xargs -rt svn add
```

```console
sudo svn ci -m"setting DHCP server"
```

## 仕舞い

DHCPサーバーを冗長化しました。[以前](https://qiita.com/katz_engineer/items/03be4aac1db264ca4197)の手順をそのままなぞっただけで、難しい事は何もありませんね。