DHCPサーバーの構築

今更、何でこんな事を…と思う作業

ホームゲートウェイと呼ばれている各家庭の入口に置かれたルーターの性能が悪すぎて、悲しいことに内蔵しているDHCPサーバーをそのまま利用できない状況です。

仕方なく、別にサーバーを立てて、そこに個別のDHCPサーバーを作らなければならない状況です。天下のNECさん、まともな製品を作ってくださいよね。仕様通りの機能が無くてもレンタル料金を搾取するって詐欺ですね。

我が家のネット環境の変革

最初のネット常時接続

プライベートな写真やこのブログの公開は、以前から長い期間を継続して行っています。それは家に置かれた電化代の少ない小さなサーバーで、Webサーバーを構築して実行しています。

そのための家庭内のネットワーク環境は、契約した常時接続のネットワーク環境で行われていますが、当初は FTTH(光回線)とADSLが混在している時代の環境でした。

(0) その頃にADSLを申し込みましたが、NTTの庁舎からの距離が長く途中で中継されているためメタル線で接続されていないことが判明してアウトでした。(1) そして暫くして普及し始めたフレッツ光で常時接続される環境が提供されたのが最初でした。その頃のレンタルは沖電気工業製のルーターでした。

その後の変革

暫くフレッツ光で 初期のWebサーバーを公開していましたが、世界的に見てもグローバルIPアドレスが不足していて、グローバルアドレスの割り振りに問題があるため世界的に IPv6の試行が始まりました。

我が家のサーバーも技術が無いのに対応に迫られました。しかしNTTのフレッツ光は何故かIPv6の利用を、その頃のオプションとして有料での提供でした。世界的に移行しなければならないIPv6環境への試行が有料オプションだなんてありえないと感じました。

経緯は忘れましたが、KDDIに移行

契約料が安かったからかも知れませんが、(2) 少ししてKDDIの光回線に移行しました。IPv6は無料のまま利用でき、ネットワーク環境も良好でした。今ではこのまま継続していれば良かったのかと後悔しています。

家族のスマホ購入で光回線も切替

時代の流れで妻や子供達のスマホを購入する事になりました。当時の電話としての安さからWillcomのPHSを使用していた流れで、Yモバイルのスマホになり、(3) その親会社のソフトバンクに光回線を切替えると料金が割り引かれて安くなると説明されて切替えました。実際には、色々な条件で割引の規制が行われていて、安くなっていませんでした。

はっきり言ってソフトバンクはNTTに任せっきりなのか技術力がないと感じました。設置されたホームゲートウェイは最悪で、ローカルアドレスを割振るDHCPサーバー機能にネームサーバーを指定できなくて、更に内部にあると思われるネームサーバーが機能をいつの間にか停止してしまうようで、名前の解決ができなくてネットの検索ができない事が多発しました。

Wifiの接続を使用させないようにして、従量制の回線の稼働率を上げながら知らない間に金儲けするような悪意を感じて、不信感が募りました。当時社長の孫さんの意向でしょうか。

そのためWifi接続では、インターネットに接続できない…とほとんどの期間に表示していて、外部回線を使用すれば利用できるのですが、分かっていても使わないためスマホからは何の通信もできない日々が続きました。半日経ったり数時間経つと繋がることもあり、スマホ利用を急ぐ時はホームゲートウェイの電源を再投入し初期化して利用していました。

高価な常時接続の光回線なのに、大昔のパソコン通信のような利用に際してのお膳立てが必要な環境になってしまい苦労しました。その頃、実はWebで公開していた昔のサーバー内にDHCP機能があったのですが、老朽化で物理的に故障して使えなくなり、新しく立ち上げたPogoPlugのWebサーバーにDHCP機能が組み込めなかったりとストレスの溜まる期間でした。

そしてブラスト光の電話セールスで切替

ソフトバンクの前に調子良く利用できていたKDDIに戻したい気持ちがありましたが、ブラスト光の売り込みがあり、特に安くなく使い物にならないソフトバンク以外なら何でも良かったのが本音です。(4) ブラスト光はオプションをカスタマイズすると契約料金も安く快適で、ホームゲートウェイは中国製ファーウェイのHG8045Qで、色々な細かな設定もでき実に使いやすく安定していました。

問題は、ならず者国家の北朝鮮と大差のない習近平ひきいる中国共産党の傘下にある企業が制作しているルーターなので、バックドアや何が仕掛けられているのか分からない恐怖を感じながら利用していることです。

特に安くなるわけでもないけど光回線契約をKDDIに戻すことに

電話のセールスで、北海道や九州の複数の au光の代理店が売り込んできたので、安くなるわけではないものの気になるファーウェイのルーターを外す意味で、(5) au光に乗り換えを承諾しました。

ただ後々確認して分かったことは、レンタルになるホームゲートウェイがNEC製だと知りました。ソフトバンクで痛い目にあっている出来の悪かったNEC製なので、あれから年月は経っているのでまさかとは思いますが不吉な予感を感じました。

レンタルルーター説明書を確認、やはり使えねえ〜

機種名からネットで説明書を探し、機能を真っ先に確認しましたが、やはりDHCPサーバーにDNSを設定する箇所が見当たらなくて、不吉な予感はあたっていました。

説明書によると、DHCPで割振る開始アドレスの位置を設定できるらしく、固定で割り当てされているサーバーのアドレスの変更までは必要がないと胸をなでおろしました。

ところが送られてきたルーターを設定し始めて分かったことは、設定項目を入れる箇所があっても何を入れても受付けずに全てエラーを返して機能しないことが分かりました。天下のNECさん作りが悪すぎだよ、これって製品としてテストして出荷している市販品ですか。

DHCPで振られるアドレスが、サーバーの固定アドレスと競合

①工事費は、詐欺に有ったと思い諦めて切替の契約を破棄して戻すか、②旧型でも中古品でもまともに使えるルーターに交換させるか、あるいは③自分でDHCPサーバーを立ち上げて処理させるか、3択の選択に悩む大きな問題に直面しました。

最新のRaspberry pi に期待して画策

③の実現性を1週間位で見極めることにしました。以前、Raspberry pi にDHCPサーバーを組み込もうと考えて挫折したことがありました。それはインストールしてもエラーが起こり、対策方法をネットの検索では見付けられずに諦めた経緯があります。でもそれから Debian のバージョンも上がり、Raspberry pi の利用者も大きく増えていることを考えると、今ならできそうな気がします。

腹を決めDHCPサーバーを立ち上げることに

まずはワーキングとして動作させていた最新の Raspberry pi に組み込み動作検証から始めました。ネットの情報を確認するとシステムの立ち上げで自動的に起動しないことが頻繁に起こるようで、サーバーが起動してから10秒位待たせてスクリプトで起動したり、皆さん苦労して動作させているのが現状のようでした。

systemd の振舞に則った対策をしているサイト

DHCPサーバーが停止しても自動的に再起動させるための systemd に則った手順を定義して対策しているサイトを見つけることができました。ほぼ丸写しで立ち上げできる目処が立ち、レンタルルーター内の IPv4 のDHCPサーバー機能を停止して、自前のDHCPサーバーを利用する目処が立ちました。

今後のためにDHCPサーバーの記録を残す

もしもの事も考えて、検証したワーキングサーバーの組み込みは自動で立ち上げしないようにしておき dhcp_disable、公開しているWebサーバーの Raspberry pi 内にDHCPサーバー機能を組込むことにしました。

ISC-dhcp-server インストール

DHCPサーバーをインストールします。isc-dhcp-server は、純粋の systemd としての構成になっていないようなので、前述の親切なネット情報を参考にして組込み、起動しなかったり何かの状況で停止しても再起動させる手順の追加が必要になります。

$ sudo apt install isc-dhcp-server
以前に未選択のパッケージ libisccfg-export163 を選択しています。 (データベースを読み込んでいます ... 現在 174552 個のファイルとディレクトリがインストールされています。) .../libisccfg-export163_1%3a9.11.5.P4+dfsg-5.1+deb10u3_armhf.deb を展開する準備をしています ... libisccfg-export163 (1:9.11.5.P4+dfsg-5.1+deb10u3) を展開しています... 以前に未選択のパッケージ libirs-export161 を選択しています。 .../libirs-export161_1%3a9.11.5.P4+dfsg-5.1+deb10u3_armhf.deb を展開する準備をしています ... libirs-export161 (1:9.11.5.P4+dfsg-5.1+deb10u3) を展開しています... 以前に未選択のパッケージ isc-dhcp-server を選択しています。 .../isc-dhcp-server_4.4.1-2_armhf.deb を展開する準備をしています ... isc-dhcp-server (4.4.1-2) を展開しています... 以前に未選択のパッケージ selinux-utils を選択しています。 .../selinux-utils_2.8-1+b1_armhf.deb を展開する準備をしています ... selinux-utils (2.8-1+b1) を展開しています... 以前に未選択のパッケージ policycoreutils を選択しています。 .../policycoreutils_2.8-1_armhf.deb を展開する準備をしています ... policycoreutils (2.8-1) を展開しています... selinux-utils (2.8-1+b1) を設定しています ... policycoreutils (2.8-1) を設定しています ... selinux-autorelabel-mark.service is a disabled or a static unit, not starting it. libisccfg-export163 (1:9.11.5.P4+dfsg-5.1+deb10u3) を設定しています ... libirs-export161 (1:9.11.5.P4+dfsg-5.1+deb10u3) を設定しています ... isc-dhcp-server (4.4.1-2) を設定しています ... Generating /etc/default/isc-dhcp-server... Job for isc-dhcp-server.service failed because the control process exited with error code. See "systemctl status isc-dhcp-server.service" and "journalctl -xe" for details. invoke-rc.d: initscript isc-dhcp-server, action "start" failed. isc-dhcp-server.service - LSB: DHCP server Loaded: loaded (/etc/init.d/isc-dhcp-server; generated) Active: failed (Result: exit-code) since Mon 2021-03-01 10:58:51 JST; 52ms ago Docs: man:systemd-sysv-generator(8) Process: 623 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=1/FAILURE) 3月 01 10:58:49 web-server dhcpd[644]: bugs on either our web page at www.isc.org or in the README file 3月 01 10:58:49 web-server dhcpd[644]: before submitting a bug. These pages explain the proper 3月 01 10:58:49 web-server dhcpd[644]: process and the information we find helpful for debugging. 3月 01 10:58:49 web-server dhcpd[644]: 3月 01 10:58:49 web-server dhcpd[644]: exiting. 3月 01 10:58:51 web-server isc-dhcp-server[623]: Starting ISC DHCPv4 server: dhcpdcheck syslog for diagnostics. ... failed! 3月 01 10:58:51 web-server isc-dhcp-server[623]: failed! 3月 01 10:58:51 web-server systemd[1]: isc-dhcp-server.service: Control process exited, code=exited, status=1/FAILURE 3月 01 10:58:51 web-server systemd[1]: isc-dhcp-server.service: Failed with result 'exit-code'. 3月 01 10:58:51 web-server systemd[1]: Failed to start LSB: DHCP server. man-db (2.8.5-2) のトリガを処理しています ... libc-bin (2.28-10+rpi1) のトリガを処理しています ... systemd (241-7~deb10u6+rpi1) のトリガを処理しています ...

インストールしてもそのままでは稼働しません。いくつかの呪文のような修正を施して動作させる必要があります。割振るアドレス範囲等の情報をIPv4 / IPv6に対応して定義しますが、今回はIPv4のみ作成します。アドレスの要求を受付けるインターフェイス eth0 の定義、それとインストール時に出されていた上記メッセージに書かれている debug に関する修正で、no を yes に書き換える必要があります。

起動のタイミングや何らかの問題で停止しても再起動させるように、新規に次のような定義ファイルを作成します。内容は参考にしたサイトの丸写しで問題無く動作するようです。systemd では、ユニットファイルと呼ぶ定義ファイルを /etc/systemd/system/ の下に配置するようで、丸コピーした次の例では isc-dhcp-server.service.d としてディレクトリを配置して、更にその下に定義ファイル 10-additional.conf を作成していました。

試していませんが、例えば 直接 /etc/systemd/system/ ディレクトリの下に isc-dhcp-server.service と名付けて以下内容のユニットファイルを配置しても良さそうです。

$ cat /etc/systemd/system/isc-dhcp-server.service.d/10-additional.conf

[Unit] SourcePath=/etc/init.d/isc-dhcp-server [Service] Type=forking PIDFile=/var/run/dhcpd.pid RemainAfterExit=no Restart=on-failure RestartSec=15s

要求にアドレスを割振る範囲やDNSの設定

稼働させるための定義ファイルを作成します。割振るアドレスは、192.168.11.31 〜 192.168.11.200 の範囲としています。

定義した内容の注目箇所のみに省略した内容で、次に示します。

$ sudo vi /etc/dhcp/dhcpd.conf

# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#

# option definitions common to all supported networks...
option domain-name "sunao-mita.pgw.jp";
#option domain-name-servers ns1.example.org, ns2.example.org;

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;

# network, the authoritative directive should be uncommented.
authoritative;

subnet 192.168.11.0 netmask 255.255.255.0 {
 range 192.168.11.31 192.168.11.200;
 option routers 192.168.11.1;
 option domain-name-servers 192.168.11.2, 192.168.11.20;
 option broadcast-address 192.168.11.255;
 ignore declines;
}

アドレス要求に答えるインターフェイスの設定

DHCPサーバーへのアドレス要求を受け付けるインターフェイスを定義します。なお、IPv6に関しては、レンタルのホームゲートウェイに任せます。そのためIPv4の機能のみ自前で稼働させます。定義内容は、最後にある空欄に eth0 を追加しているだけです。

$ cat /etc/default/isc-dhcp-server

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

ついでにDHCP関連の簡易コマンドを作成

稼働状況を確認したり、定義を変更して再起動したり、停止したり、サーバーを再起動で自動的に起動したり、サーバーの再起動で自動起動させないようにしたりすることも多く発生すると思われますが、/usr/local/bin 内にコマンドを作成しておきます。

  • dhcp_status …稼働状況の確認や簡易ログ
  • dhcp_start …手動で開始
  • dhcp_stop …手動で停止
  • dhcp_restart …定義変更等で再起動
  • dhcp_enable …サーバーの電源投入で自動起動させる
  • dhcp_disable …サーバーの電源投入で起動させない
  • dhcpリース …割振り状況のリストを表示
  • dhcpジャーナル …蓄積されたジャーナル、statusの簡易ログが蓄積?

定義を次のようにしています。rootになって、cd /usr/local/bin に移動して、dhcp_status を最初に作成して、それにリンクを定義しています。

$ sudo su -
# cd /usr/local/bin
# vi dhcp_status

#!/bin/sh
# status start stop enable disable restart 
rc=`echo $0 | sed -e "s/^.*_\(.*\)$/\1/"`

sudo systemctl $rc isc-dhcp-server.service

各コマンドに対するリンクを張ります。

# chmod +x dhcp_status
# ln -s ./dhcp_status dhcp_start # ln -s ./dhcp_status dhcp_stop # ln -s ./dhcp_status dhcp_restart # ln -s ./dhcp_status dhcp_enable # ln -s ./dhcp_status dhcp_disable

ついでにアドレスを割振ったリース状況の確認コマンドも作成しておきます。理由は、直ぐに忘れる少し長いステートメントのコマンドをリースとかdhcpとかの簡単な文字列から見付けて利用するためです。それとジャーナルの確認コマンドも追加です。

# vi dhcpリース
#!/bin/sh
less /var/lib/dhcp/dhcpd.lease 
# chmod +x dhcpリース

# vi dhcpジャーナル
#!/bin/sh
journalctl -u isc-dhcp-server.service
# chmod +x dhcpジャーナル

安全のためか稼働には修正の必要がある

dhcpサーバーを導入して、debug を修正する必要があるらしいので、no ⇒ yes に書き換えます。

$ cat /etc/dhcp/debug
#
# The purpose of this script is just to show the variables that are
# available to all the scripts in this directory. All these scripts are
# called from dhclient-script, which exports all the variables shown
# before. If you want to debug a problem with your DHCP setup you can
# enable this script and take a look at /tmp/dhclient-script.debug.

# To enable this script set the following variable to "yes"
RUN="yes"

if [ "$RUN" = "yes" ]; then 〜〜以下省略

準備ができたので起動して確認

$ sudo systemctl daemon-reload
$ dhcp_restart

稼働しているのかエラーで停止しているのか確認

作成した簡易コマンド dhcp_status を起動すると状況が表示されますが、画面から溢れている部分は矢印キーで移動して、最後に q で終了します。

$ dhcp_status
Warning: The unit file, source configuration file or drop-ins of isc-dhcp-server.service changed on disk. Run '
 isc-dhcp-server.service - LSB: DHCP server
   Loaded: loaded (/etc/init.d/isc-dhcp-server; generated)
  Drop-In: /etc/systemd/system/isc-dhcp-server.service.d
           └─10-additional.conf
   Active: active (running) since Wed 2021-03-03 09:58:22 JST; 13h ago
     Docs: man:systemd-sysv-generator(8)
  Process: 28579 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=0/SUCCESS)
 Main PID: 28592 (dhcpd)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/isc-dhcp-server.service
           └─28592 /usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf eth0

 3月 03 23:06:51 web-server dhcpd[28592]: DHCPACK on 192.168.11.31 to b0:4e:26:84:7b:34 (Archer_C1200) via eth0
 3月 03 23:07:12 web-server dhcpd[28592]: reuse_lease: lease age 61 (secs) under 25% threshold, reply with unal
 3月 03 23:07:12 web-server dhcpd[28592]: DHCPREQUEST for 192.168.11.31 from b0:4e:26:84:7b:34 (Archer_C1200) v
 3月 03 23:07:12 web-server dhcpd[28592]: DHCPACK on 192.168.11.31 to b0:4e:26:84:7b:34 (Archer_C1200) via eth0
lines 1-17

割当てられたIPアドレスのリース状況

割振られたIPアドレスやリースの確認は、作成した簡易コマンド dhcpリース を利用して、矢印キーで移動して確認します。操作は、コマンド less の操作になります。最後に q で終了します。

$ dhcpリース
  set vendor-class-identifier = "MSFT 5.0";
  client-hostname "Archer_C1200";
}
lease 192.168.11.32 {
  starts 3 2021/03/03 14:06:22;
  ends 3 2021/03/03 14:16:22;
  cltt 3 2021/03/03 14:06:22;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet dc:a6:32:8d:18:2c;
  uid "\001\334\2462\215\030,";
  set vendor-class-identifier = "dhcpcd-8.1.2:Linux-5.10.11-v7l+:armv7l:BCM2711";
  client-hostname "working";
}
lease 192.168.11.54 {
  starts 3 2021/03/03 14:06:37;
:

DHCPの稼働で蓄積されたジャーナルの確認

ジャーナルの確認には、作成した簡易コマンドで dhcpジャーナル を使用します。操作は less の操作と同じです。最後は q で終了します。

$ dhcpジャーナル
-- Logs begin at Mon 2021-03-01 20:50:19 JST, end at Thu 2021-03-04 00:52:41 JST. --
 3月 01 20:50:34 web-server dhcpd[1270]: reuse_lease: lease age 81 (secs) under 25% threshold, reply with unalt
 3月 01 20:50:34 web-server dhcpd[1270]: DHCPREQUEST for 192.168.11.31 from b0:4e:26:84:7b:34 (Archer_C1200) vi
 3月 01 20:50:34 web-server dhcpd[1270]: DHCPACK on 192.168.11.31 to b0:4e:26:84:7b:34 (Archer_C1200) via eth0
 3月 01 20:50:37 web-server dhcpd[1270]: DHCPREQUEST for 192.168.11.32 from dc:a6:32:8d:18:2c (working) via eth
 3月 01 20:50:37 web-server dhcpd[1270]: DHCPACK on 192.168.11.32 to dc:a6:32:8d:18:2c (working) via eth0
 3月 01 20:50:54 web-server dhcpd[1270]: reuse_lease: lease age 101 (secs) under 25% threshold, reply with unal
 3月 01 20:50:54 web-server dhcpd[1270]: DHCPREQUEST for 192.168.11.31 from b0:4e:26:84:7b:34 (Archer_C1200) vi
 3月 01 20:50:54 web-server dhcpd[1270]: DHCPACK on 192.168.11.31 to b0:4e:26:84:7b:34 (Archer_C1200) via eth0
 3月 01 20:51:01 web-server dhcpd[1270]: DHCPREQUEST for 192.168.11.52 from dc:a6:32:4a:d7:39 (web-server) via 
 3月 01 20:51:01 web-server dhcpd[1270]: DHCPACK on 192.168.11.52 to dc:a6:32:4a:d7:39 (web-server) via eth0
 3月 01 20:51:04 web-server dhcpd[1270]: reuse_lease: lease age 3 (secs) under 25% threshold, reply with unalte
 3月 01 20:51:04 web-server dhcpd[1270]: DHCPREQUEST for 192.168.11.52 from dc:a6:32:4a:d7:39 (web-server) via 
 3月 01 20:51:04 web-server dhcpd[1270]: DHCPACK on 192.168.11.52 to dc:a6:32:4a:d7:39 (web-server) via eth0
 3月 01 20:51:12 web-server dhcpd[1270]: reuse_lease: lease age 11 (secs) under 25% threshold, reply with unalt
 3月 01 20:51:12 web-server dhcpd[1270]: DHCPREQUEST for 192.168.11.52 from dc:a6:32:4a:d7:39 (web-server) via 
 3月 01 20:51:12 web-server dhcpd[1270]: DHCPACK on 192.168.11.52 to dc:a6:32:4a:d7:39 (web-server) via eth0
lines 1-17

ネット環境を日常の状況により操作

DHCPサーバーを一時的に停止する場合 dhcp_stop や、
停止から起動する場合 dhcp_start
定義情報を書き換えて再起動するには dhcp_restart
更にはサーバーの停止再起動でDHCPサーバーを自動起動させたくない時 dhcp_disable、サーバーの再立ち上げで自動起動させたい場合 dhcp_enable
等を簡易コマンドで操作します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)