Raspberry pi を DHCP + DNS サーバーにしたい
クローズネットワークの台数増加
クローズネットワークを組んで使っています。
最初は台数が少なかったので固定 IP でよかったのですが、台数増加に伴い DHCP サーバーが欲しくなってきました。
ついでに名前もつけてあげれば IP を気にする必要がなくなります。
そこで、Raspberry pi を DHCP 兼 DNS サーバーに仕立て上げることにしました。
使用したのは Raspberry pi 3 Model B です。
Raspberry Pi3 Model B ボード&ケースセット 3ple Decker対応 (Element14版, Clear)-Physical Computing Lab
- 出版社/メーカー: TechShare
- メディア: エレクトロニクス
- この商品を含むブログ (4件) を見る
OS は Raspbian Jessie Lite の April 2017 バージョンを使用しました。
Raspberry pi の初期設定
SSH を有効にする
通常 Raspberry pi はディスプレイと USB マウス/キーボードを接続して操作しますが、DHCP + DNS サーバーにそんなものは贅沢です。
どうせローカルネットワークに入るので、SSH を有効にして SSH 経由で操作できるようにしました。
以下のリンクを参考に。
qiita.com
IP アドレスの設定
SSH でつなぐには IP アドレスを知らないといけません。
というわけで Raspberry pi に固定アドレスを振ることにしました。
2017/07/06 追記
OS Raspbian Jessie からは、/etc/network/interfaces ではなく /etc/dhcpcd.conf をいじるのが正しいようです。
なぜか /etc/network/interfaces でうまくいっていたのですが、Raspberry pi を 2 台導入して同じことをやろうとしたら、できませんでした。
なので /etc/dhcpcd.conf の書きかえ方も記載しておきます。
sudo nano /etc/dhcpcd.conf
最後の方に以下の記述を入れます。
interface eth0 static ip_address=192.168.0.1/24 static domain_name_servers=192.168.0.1
こちらは古い記述です。
アドレスは /etc/network/interfaces の編集で行います。
sudo nano /etc/network/interfaces
eth0 インターフェースに 192.168.0.1 を割り当てます。
auto eth0 iface eth0 inet static address 192.168.0.1 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255 dns-nameservers 127.0.0.1 192.168.0.1 dns-search local
emacs のインストール
ここからは、いろいろとテキストをいじっていくことになります。
nano は使い慣れていないので、大好きな emacs をインストールしておきます。
$ sudo apt-get install emacs
Caps lock を Ctrl にする
以下のサイトのまんまです。
/etc/default/keyboard というファイルを書き換えます。
$ sudo emacs /etc/default/keyboard
途中に XKBOPTIONS という部分があるので、そこを以下のように書き換えます。
XKBOPTIONS="ctrl:nocaps"
このあと再起動すれば OK。
DHCP + DNS サーバーの導入
大部分は以下のリンクを参考にしました。
一部、DNS の設定や運用部分を追記しています。
設定
設定ファイルを編集します。
$ sudo emacs /etc/dnsmasq.conf
/etc/dnsmasq.conf の下のほうにある
#conf-file=/etc/dnsmasq.more.conf
の#を削除します。
# Log lots of extra information about DHCP transactions. #log-dhcp # Include another lot of configuration options. conf-file=/etc/dnsmasq.more.conf #conf-dir=/etc/dnsmasq.d # Include all the files in a directory except those ending in .bak #conf-dir=/etc/dnsmasq.d,.bak
この /etc/dnsmasq.more.conf を作成して編集します。
$ sudo emacs /etc/dnsmasq.more.conf
# ローカルホスト名を上位DNSに転送しない domain-needed # ローカルIPアドレスの逆引きを上位DNSに転送しない bogus-priv # ショートドメイン名を補完するドメイン名(hoge -> hoge.local) local = /local/ # ローカルドメイン名 domain = local # ショートホスト名を補完する expand-hosts # DHCPで割り当てするアドレスの範囲とリース時間 dhcp-range = 192.168.0.50, 192.168.0.200, 12h # DHCPクライアントに通知するルータのIPアドレス dhcp-option = option:router, 192.168.0.1 # DHCPクライアントに通知するDNSサーバのIPアドレス dhcp-option = option:dns-server, 192.168.0.1 # 固定アドレスをふって、名前をつける dhcp-host = aa:aa:aa:aa:aa:aa, pc1, 192.168.0.10, infinite # 名前だけつける dhcp-host = bb:bb:bb:bb:bb:bb, pc2
これでクライアントに関しては DNS/DHCP ともに動作します。
ただこの方法だと、dnsmasq が DHCP を発行した場合のみ名前解決がされるようで、固定アドレス (Raspberry pi 自身) を最初から持っているものは名前解決できませんでした。
これを解決するには、/etc/hosts に名前を書けば良いようです。
$ sudo emacs /etc/hosts
Raspberry pi 自身のアドレスを書きます。
127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters 127.0.1.1 raspberrypi 192.168.0.1 raspi.local raspi
設定ができたので dnsmasq を再起動します。
$ sudo service dnsmasq restart
運用
DHCP リース記録の確認
どのように DHCP がリースされたかが気になったので調べてみました。
/var/lib/misc/dnsmasq.leases を見ることで実現できます。
$ cat /var/lib/misc/dnsmasq.leases 0 aa:aa:aa:aa:aa:aa 192.168.0.10 pc1 01:aa:aa:aa:aa:aa:aa:aa 1506215087 bb:bb:bb:bb:bb:bb 192.168.0.50 pc2 01:bb:bb:bb:bb:bb:bb
一番左がリース時間のようです。
不要な DHCP リースの削除
dnsmasq の設定をいろいろ試していると、リース時間無限大でいらないエントリが残ってしまいました。
そういうものを消すには、単に上記の /var/lib/misc/dnsmasq.leases の不要な行を消せば良いようです。
その場合は、いったん dnsmasq のサービスを止めたほうが良さそうです。
$ sudo service dnsmasq stop $ sudo emacs /var/lib/misc/dnsmasq.leases
0 aa:aa:aa:aa:aa:aa 192.168.0.10 pc1 01:aa:aa:aa:aa:aa:aa:aa
$ sudo service dnsmasq start
これでローカルネットワークの使い勝手が向上しました。
続編
今回はクローズネットワークを Raspberry pi で作りました。
ただこのあと、結局このネットワークを外につなぎたくなりました。
そのときの続編はこちらからどうぞ。