おうちサーバー構築報告：dhcpサーバー冗長化

## 能書き

[おうちサーバー構築報告：予告](https://qiita.com/katz_engineer/items/471408eda1d09507c451)からのおうちサーバー構築の続きです。

今回はDHCPサーバーの冗長化を図ります。[以前もやりました](https://qiita.com/katz_engineer/items/eab3436c79bea6dc1c5e)が、[我が家のプライマリ・サーバー](https://qiita.com/katz_engineer/items/471408eda1d09507c451#%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2)にDHCPサーバーを立てます。

今回はスクリプト化が難しかったので、相も変わらず手作業になります。

### 参考文献

- [私的サーバー構築日誌：dhcpサーバー冗長化・Ubuntu 24.04 LTS in MicroServer N54L - Qiita](https://qiita.com/katz_engineer/items/eab3436c79bea6dc1c5e)

## インストール

踏み台サーバーとして172.16.1.100を使用します。

```console:普段使いのクライアントマシン
ssh ansible@172.16.1.100
```

```console:マシン172.16.1.100:ユーザーansible
ssh root@172.16.1.101
```

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

```console:マシン172.16.1.101:ユーザーroot
apt update
apt upgrade -y
apt install -y isc-dhcp-server
```

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

```console:マシン172.16.1.101:ユーザーroot
cd /etc
svn st
```

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

```console:マシン172.16.1.101:ユーザーroot
# 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:マシン172.16.1.101:ユーザーroot
# svn di --diff-cmd diff -x -U0 group gshadow passwd shadow
Index: group
===================================================================
--- group       (revision 3)
+++ group       (working copy)
@@ -57,0 +58 @@
+dhcpd:x:111:
Index: gshadow
===================================================================
--- gshadow     (revision 3)
+++ gshadow     (working copy)
@@ -57,0 +58 @@
+dhcpd:!::
Index: passwd
===================================================================
--- passwd      (revision 3)
+++ passwd      (working copy)
@@ -29,0 +30 @@
+dhcpd:x:108:111::/run:/usr/sbin/nologin
Index: shadow
===================================================================
--- shadow      (revision 3)
+++ shadow      (working copy)
@@ -29,0 +30 @@
+dhcpd:!:20086::::::
```

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

```console:マシン172.16.1.101:ユーザーroot
svn st | grep "^?" | cut -b9- | sudo xargs -I{} find {} -type f -or -type d -or -type l | xargs -rt svn add
```

```console:マシン172.16.1.101:ユーザーroot
sudo svn ci -m"install isc-dhcp-server"
```

## 設定

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

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

```console:マシン172.16.1.101:ユーザーroot
ip a
```

こんな結果になります。

```console:マシン172.16.1.101:ユーザーroot
# 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: eth0@if49: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether bc:24:11:c4:3e:de brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.1.101/16 brd 172.16.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::be24:11ff:fec4:3ede/64 scope link
       valid_lft forever preferred_lft forever
```

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

```console:マシン172.16.1.101:ユーザーroot
SVR_IPADDR=172.16.1.101
NIC_NAME=eth0@if49
```

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

```console:マシン172.16.1.101:ユーザーroot
RTR_IPADDR=172.16.2.1
```

我が家のドメインネームサーバーのIPアドレス。

```console:マシン172.16.1.101:ユーザーroot
DNS_IPADDR=172.16.1.101
```

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

```console:マシン172.16.1.101:ユーザーroot
cat >/etc/dhcp/dhcpd.conf <<___
option domain-name "local";
option domain-name-servers $DNS_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.3.2 172.16.3.254;
  option subnet-mask 255.255.0.0;
  option broadcast-address 172.16.255.255;
  option routers $RTR_IPADDR;
}
___
```

補足説明。

- `domain-name`は`local`にしましたが、きちんとドメインを購入した方はそちらを設定した方が良いでしょう。
- `domain-name-servers`は[前回構築したUnbound](https://qiita.com/katz_engineer/items/f05186fab0f8971e5348)を想定しています。
- `default-lease-time`と`max-lease-time`は24時間です。ここはお好みで。実験する場合には短い方が良いかも知れません、1分とか。
- `ddns-update-style`について。知らなかったんですが、DynamicDNS的な事が出来るらしいですな。今回はその機能は使いません。
- `authoritative`については難しい事は言いません。オマジナイと思ってとにかく書く！
- `subnet`云々の箇所は、まぁ書いてある通りです。IPアドレスに関する基礎知識があれば何となく理解できるでしょう。

## 起動

起動します。

```console:マシン172.16.1.101:ユーザーroot
systemctl start isc-dhcp-server
```

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

```console:マシン172.16.1.101:ユーザーroot
systemctl status isc-dhcp-server
```

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

## 自動起動

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

```console:マシン172.16.1.101:ユーザーroot
systemctl enable isc-dhcp-server
```

## `/etc`バージョン管理

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

```console:マシン172.16.1.101:ユーザーroot
cd /etc
svn st | grep "^?" | cut -b9- | xargs -I{} find {} -type f -or -type d -or -type l | xargs -rt svn add
```

```console:マシン172.16.1.101:ユーザーroot
svn ci -m"set DHCP server"
```

## 仕舞い

DHCPサーバーを冗長化しました。難しい事はありませんね。