先日、無計画に Dell の型落ちデスクトップに FreeBSD をインストールしましたが、現実的な用途としては「何でもサーバ」にしてしまうのが便利だと感じています。
そこで、まず手持ちデバイスへの IP アドレスの割り当てを自動化するため、DHCP サーバ機能を追加することにしました。
市販の Wi-Fi ルーターなどに搭載されている DHCP サーバは弱すぎる、古すぎる、制限がありすぎるので、できれば他のサーバを使いたい人は多いと思います。DHCP のプロトコル自体は枯れているものなので、数十台程度のクライアントに IP を割り振る程度なら、無理矢理使ったとしても問題はなさそうです。しかし、手前の Wi-Fi ルーターは光回線と LAN を繋げること以外の機能は、オマケ程度の機能なので、まわりのデバイスで弱い部分を補強してやる必要があります。
今回は、DHCP サーバの一般的な設定を行っただけですが、次段階としてクライアントを PXE ブートさせる OS サーバとしての構築を前提にしています。FreeBSD ベースでの設定ですので、Linux 等のユーザーは、isc-dhcp をインストールすれば、dhcp.conf の設定部分は OS に関わらず同じになります。その場合のネットワークの自動起動などについては、各 OS の方法(起動スクリプト)にならってください。
設定環境
FreeBSD INSPIRON 12.1-RELEASE FreeBSD 12.1-RELEASE r354233 GENERIC amd6
isc-dhcp44-server-4.4.2
わざわざ家庭用 DHCP サーバを構築するメリットは?
家庭用 DHCP サーバをルーターとは別に立てるデメリットとしては、わざわざ手間がかかる、設定がルーターと併せて二度手間になるなどがありますが、それ以上のメリットもあります。
- DHCP で静的アドレス割り当ての数制限がなくなる
- PXE ブートの前段階の設定になる
- ネットワークの設計に柔軟性が出せる
あたりが考えられます。
市販の Wi-Fi ルーターやプロバイダ供与のルーターでは、静的 IP アドレスで運用したい場合、設定できる台数に制限があります。多く登録できるもので 32 台、中級クラスで 16 台(HAUWEなど)、よく見かける8台タイプ、ヤバイ4台登録、モバイルルーターは設定自体が不可というような感じで、比較的 16 台と8台までに制限されたものが多いようです。設定数が多ければ良いルーターというものでもなく、DHCP 機能が弱い分、パケット、フレームの転送が高速なもの、安定しているものもあります。手前にプロバイダから割り当てられたルーターは、静的 IP が8台、VLAN 等の機能なし、ブリッジ等の設定不可、安定度は高いというタイプでした。
組み込みルーターの性能を考えれば、8台程度というのも頷けますが、少し少ないと思う人は多いはず。特にゲーム専用機などを運用している方は、ポート転送等の機能をフルに使うためには、IP を固定しないと始まりません(固定した方が安定します)。
制限はルーターに組み込まれている OS の制限によるものなので、フォームウェア等のアップデートが良い方向に行われない限り解消されません。一方、自前で DHCP サーバーを用意すれば、固定割り当てできる IP アドレスは、ネットワークの制限は受けても、理不尽な OS による(ハードウェアによる制限など)制限を受けません。つまり、すべてのデバイスのアドレスを、固定化することが可能です。
1番目の理由は、8台も静的アドレスを払い出せれば十分という人もいるので、弱い理由ですが、2番目の理由に関してはプロバイダから与えられるルーターではどうしようもありません。PXE ブートに設定ついては、別のページに譲るとして、要はネットワークから直接 PC を起動したいケースや、ネットワーク・インターフェイスしか持たない簡易 PC にネットワーク経由で OS をインストールするときは重宝する機能です。また、メモリ読み書きチェックなどのプログラムをネットワーク起動時に直接読み込ませて、ハードウェアの健康状態を確認するようなこともできます。
3番目の機能は、家庭用ネットワークには必ずしも必要ではないにせよ、IP アドレスさえ管理していればハッキング時の対応も行いやすくなります。素人でも誰でもできるインターネット管理がまず IP チェックなので、ネットワークに興味がある方は十分な動機、理由になると思います。
有名どころの DHCP サーバをインストール
DHCP(IPv4)自体は枯れているプロトコルですので、どのサーバプログラムでも機能しますが、今回は PXE でネットワークブートさせるためのサーバ構築を前提にしているので、古い dhcpd プログラムだとその目的を達成できません。
dhcpd には、ISC(Internet Software Consortium)版 dhcp-4 系を使うことにします。dhcp-2、dhcp-3 系を使う場合は dhcpd.conf の書き方が少々異なります。以下のインストール例は、FreeBSD で Ports を利用したものです。
bash # pkg install net/isc-dhcp44-server (以下略)
もしくは、
bash # portinstall net/isc-dhcp44-server install -m 0644 /usr/ports/net/isc-dhcp44-server/work/dhcp-4.4.2/contrib/ldap/README.ldap /usr/ports/net/isc-dhcp44-server/work/stage/usr/local/share/doc/isc-dhcp44-server ====> Compressing man pages (compress-man) ===> Staging rc.d startup script(s) ---> Installing the new version via the port ===> Deinstalling for isc-dhcp44-server ===> isc-dhcp44-server not installed, skipping ===> Installing for isc-dhcp44-server-4.4.2 ===> Checking if isc-dhcp44-server is already installed ===> Registering installation for isc-dhcp44-server-4.4.2 Installing isc-dhcp44-server-4.4.2... ~(途中略)~ ===> Cleaning for isc-dhcp44-server-4.4.2 (以下略)
インストールする際に、いくつかオプションを有効にするかどうか聞かれることになりますが、テスト目的ということもあり、すべてオン(有効化)にしています。かつては IPv6 関係は無条件にオフにしてきましたが、最近は意識的に有効化しています。今後は積極的に、IPv6 の活用を考えて行くつもりです。
DHCP サーバの設定ファイルを編集する
デフォルトの設定ファイルは、/usr/local/etc/dhcp.conf になります。
後々、複数のネットワークを繋げるテストのために作った dhcpd.conf が下の例で、
ドメイン名:example.org
ルーター兼ネームサーバ:192.168.100.1
ネットワーク:192.168.100.216/29
を想定しています。よく使う 192.168.1.0/24 で設定する場合は、該当箇所を読み替えます。
例では、無線 LAN(wlan0)側をルーターに、有線 LAN(re0)側をハブに繋げています。dhcpd は re0 で動かします。
FreeBSD dhcpd.conf
# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#
option domain-name "example.org";
option domain-name-servers 192.168.100.1, 8.8.8.8;
default-lease-time 600; # デフォルトのリース時間
max-lease-time 7200; # 最大リース時間
log-facility local7; # syslog を使わない場合はこの行は不要
subnet 192.168.100.216 netmask 255.255.255.248 {
range 192.168.100.217 192.168.100.222;
}
### 192.168.1.0/24 で設定する場合
#subnet 192.168.1.0 netmask 255.255.255.0 {
# 192.168.1.10 ~ 192.168.1.222 の範囲で割り当てる
# range 192.168.1.10 192.168.1.222;
#}
# 静的アドレス割り当て
host pxe {
# 割り当てたいデバイスの MAC アドレス
hardware ethernet 08:00:07:26:c0:a5;
# 割り当てたいアドレス
fixed-address 192.168.100.221;
# PXE ブート用
filename "/pxeboot";
#next-server 192.168.100.217;
# PXE でマウントするルートディレクトリ
option root-path "192.168.100.217:/pxeboot-freebsd";
}
今回の例は、後々のネットワークがらみのテスト用に、ホストアドレス(クライアントに与えるアドレスのこと)を最大で6個に押さえています。そのため、ネットマスクは 29 ビットにしています。
今回の 192.168.100.216/29 (192.168.100.216/255.255.255.248)は IP アドレスが 192.168.100.216 から 192.168.100.223 までカバーします。実際は、192.168.100.217~192.168.100.222 までの6個のアドレスが使えます。
さらに、むやみやたらと DHCP パケットを送っても困るので、どのインターフェイスで dhcpd を起動するかはあらかじめ固定しておきます。
ここでは、ネットに繋がっていない有線 LAN インターフェイス(re0)のみに dhcpd を有効にします。
また、DHCP サーバーを起動する有線 LAN インターフェイス(re0)には固定アドレス 192.168.100.217/29 を割り当てておきます。
FreeBSD rc.conf
ipv4_addrs_re0="192.168.100.217/29"
ifconfig_re0="up"
DHCPD をOS 起動時に有効にする
FreeBSD の場合、OS 起動時に DHCPD を有効にするには、/etc/rc.conf に以下の内容を付け足します。
FreeBSD rc.conf
dhcpd_enable="YES" # OS 起動時に DHCPD を有効にする
dhcpd_flags="-q"
dhcpd_conf="/usr/local/etc/dhcpd.conf" # DHCPD 起動時に読み込む設定ファイル
dhcpd_ifaces="re0" # DHCPD を起動させたいインターフェイス