子育てしながらエンジニアしたい

現在 2 歳女の子の子育て中エンジニアによる、技術系 + 日常系ブログ。

Raspberry pi を DHCP + DNS サーバーにしたい

f:id:edosha:20170622083157j:plain:w400

クローズネットワークの台数増加

クローズネットワークを組んで使っています。
最初は台数が少なかったので固定 IP でよかったのですが、台数増加に伴い DHCP サーバーが欲しくなってきました。
ついでに名前もつけてあげれば IP を気にする必要がなくなります。
そこで、Raspberry piDHCPDNS サーバーに仕立て上げることにしました。

使用したのは Raspberry pi 3 Model B です。

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
SSH を有効にする

SSH を有効にするには raspi-config から行います。

pi@raspberrypi:~ $ sudo raspi-config

以下のような設定画面が出てきます。

f:id:edosha:20170622090958p:plain:w600

ここで、"5 Interfacing Options" を選択、"P2 SSH" を選択して、Yes を選択すれば OK。

SSH の接続確認

Windows なら Tera term とか、Mac ならターミナルとかから接続できるか確認します。
デフォルトのユーザ名は pi、パスワードは raspberry です。

$ ssh pi@192.168.0.1

これでディスプレイとか USB 類を外し、SSH 経由で操作できるようになりました。

emacs のインストー

ここからは、いろいろとテキストをいじっていくことになります。
nano は使い慣れていないので、大好きな emacs をインストールしておきます。

$ sudo apt-get install emacs

Caps lock を Ctrl にする

以下のサイトのまんまです。

l-w-i.net

/etc/default/keyboard というファイルを書き換えます。

$ sudo emacs /etc/default/keyboard

途中に XKBOPTIONS という部分があるので、そこを以下のように書き換えます。

XKBOPTIONS="ctrl:nocaps"

このあと再起動すれば OK。

DHCP + DNS サーバーの導入

大部分は以下のリンクを参考にしました。
一部、DNS の設定や運用部分を追記しています。

gazee.net

Dnsmasq のインストー

apt-get でインストールします。

$ sudo apt-get install dnsmasq

設定

設定ファイルを編集します。

$ 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 で作りました。
ただこのあと、結局このネットワークを外につなぎたくなりました。
そのときの続編はこちらからどうぞ。

edosha.hatenablog.jp