Volumioで内部DNSサーバーも兼用する


はじめに🧀

Volumio を音楽再生のためだけに常時稼働させているのがもったいないので、ついでに内部 DNS サーバーとしての役割も兼用してみる。

基本的には dnsmasqDNS サーバーを建てる方法と一緒。
ただし、Volumio では systemd ユニットの設定を修正する必要がある。

Table 1. 環境
Tool Version

Raspberry Pi 3A

Volumio

2.861

テキストエディタ
Volumio にインストールされているエディタは vim ではなく nano になる。

dnsmasq 設定💻

Volumioでは元から dnsmasq がインストール済みになっている。
よって dnsmasq の設定を編集して内部 DNS サーバーを実装する。

設定ファイル修正

内部 DNS サーバー用に設定。

元の設定ファイルをバックアップ
sudo cp /etc/dnsmasq.conf{,.bak}
Example 1. /etc/dnsmasq.conf
domain-needed   (1)
bogus-priv      (2)
no-resolv       (3)
addn-hosts=/etc/dnsmasq.hosts.d   (4)
expand-hosts    (5)
domain=my.home,192.168.100.0/24,local  (6)
cache-size=0    (7)
conf-dir=/etc/dnsmasq.d,.conf     (8)
1 ドメインが指定されていない場合は上位ネームサーバーに問い合わせない。
2 /etc/hostsDHCP リースの範囲にないプライベートIPの逆引きを上位ネームサーバーに転送しない。
3 /etc/resolv.conf ファイルを読み込まない。
上位 DNS サーバの指定は後述する conf-dir オプションのディレクトリ以下で指定する。
4 読み込む hosts ファイルを追加する。
ディレクトリパスを指定すると、そのディレクトリに含まれるすべてのファイルが読み込まれる。
5 /etc/hosts に書かれたドメインなしのホスト名に、下記の domain プロパティ値を付加する。
6 任意のローカルドメインと使用するローカルLANのIPアドレス範囲を指定。
7 キャッシュを無効化(キャッシュポイズニング対策)。
8 追加で読み込みたい、他の設定ファイルがあるディレクトリパスとファイル拡張子を指定。
上位 DNS サーバーやブロックするドメインなどの設定は別ファイルにしたかったので記述した。
Hotspot 時に Volumio ドメイン名が変わるかも。

設定編集後は以下のコマンドでチェックする。

dnsmasq設定のチェック
/usr/sbin/dnsmasq --test
dnsmasq: syntax check OK.

上位DNSサーバーの設定

resolv-file プロパティで指定したファイルで上位DNSサーバーを指定する。
親ルーターとか GoogleCloudflare の公開DNSとか。

Example 2. /etc/dnsmasq.d/nameservers.conf
# Cloudflare DNS
server=1.1.1.1
server=1.0.0.1

内部ホスト名

内部LANにあるホストに関しては短縮名だけ記述すればいい。
今までの設定により、短縮名だけでもローカルドメインを自動的に付与するようになっているため。

Example 3. 内部LAN用のホスト名を指定
/etc/dnsmasq.hosts.d/internals
192.168.100.2                       volumio
172.16.1.10     other.example.com   example01

dnsmasq の自動起動オプションを修正

dnsmasqsystemd ユニット設定を修正する。

Volumio では dnsmasq の自動起動時に --address=/#/192.168.xxx.1 オプションが付け加えられている。
これによって /etc/hostsDHCP から応答がない場合は、すべて 192.168.xxx.1 アドレスとして処理してしまう。

このオプションのせいで名前解決がうまくいかないので、以下の操作で取り除く。

ドロップインファイル用ディレクトリを作成
sudo mkdir /etc/systemd/system/dnsmasq.service.d
/etc/systemd/system/dnsmasq.service.d/override.conf
[Service]
ExecStart=  (1)
ExecStart=/usr/sbin/dnsmasq -2 --interface=wlan0  (2)
1 ExecStart は置き換える前に空にする必要がある。
2 --address=…​ オプションを削除した起動コマンド。
--interface= の値は各デバイスにより違うので注意する。
ユニットファイルをリロードして再起動
sudo systemctl daemon-reload
sudo systemctl restart dnsmasq
sudo systemctl status dnsmasq

上記設定後、エラーなどがなければルーターが参照する DNS サーバーを Volumio のIPアドレスに変更しておく。

広告ブロック🚫

必要なら広告ドメインのブロックも行っておく。

広告のドメインに対して NXDOMAIN を返すようにすればいい。
よって dnsmasq 設定の address オプションにて、 address=/example.com/ というようにドメインを指定しなければいい。

Example 4. /etc/dnsmasq.d/adblock-sample.conf
address=/ad.example.com/
address=/ads.example.com/
address=/ads-foo.example.com/

今回は280blockerさんの広告ドメインリストを利用させてもらった。
この場合、リストファイルがBOM付きUTF-8の改行コードCRLFなので、BOM無し改行LFに変換しておく必要がある。

広告ドメインリストを取得し、dnsmasq設定ファイルに変換
curl -Ss -o 280blocker.txt \
  "https://280blocker.net/files/280blocker_domain_$(date +'%Y%m').txt"

tail --byte=+4 280blocker.txt |    (1)
  sed "s/\r//g" |   (2)
  sed -E "s@(^[a-zA-Z0-9].+)@address=/\1/@g" |  (3)
  sudo tee /etc/dnsmasq.d/280blocker.conf > /dev/null
1 ファイルから BOM を削除。
2 ファイルの改行コードを CRLF から LF に変換。
3 ドメインリストを dnsmasq の設定プロパティ(address=/<domain>/)に変換。

設定終了したら dnsmasq を再起動。

sudo systemctl restart dnsmasq

おわりに😎

最初 vim を使おうとしてなかったのと、dnsmasq の起動オプションになかなか気づけなかったところで詰まってた。

とりあえずこれで VolumioDNS サーバーなのでエコと言い張れるはず。