ホームラボや開発環境で、以下のような使い方をしている人は多いと思う。
nas.lanやrouter.lanなどの固定ホスト名を解決させたい- dnsmasq を入れて
address=/nas.lan/192.168.123.20のような設定だけをしている
実は、この程度の用途なら dnsmasq は不要で、systemdに標準で含まれているsystemd-resolved のDNS機能だけで十分に実現できる。
systemd-resolved でできること
| 機能 | systemd-resolved | dnsmasq |
|---|---|---|
/etc/hosts の解決 |
○(デフォルト) | ○ |
| 固定ホスト名の解決 | ○ | ○ |
.local ドメイン(mDNS) |
○(ネイティブ) | △(Avahi併用が必要) |
| Split DNS | ◎ | ○ |
| DNS over TLS | ◎ | × |
| 設定のシンプルさ | ◎ | △ |
ワイルドカード(*.dev.local) |
× | ◎ |
| DHCPサーバとの連動 | × | ◎ |
「固定エントリを解決したいだけ」で、ワイルドカードが不要ならsystemd-resolved の方がむしろ優位。
systemd-resolvedを「うちのDNSサーバ」にする
systemd-resolvedはデフォルトでは 127.0.0.53にしかバインドされないため、LAN内の他のホストからDNSの問い合わせを受け付けたい場合は明示的にバインドしてやる[1]必要がある。
/etc/systemd/resolved.conf.d/stub-listener-extra.conf
[Resolve]
DNS=8.8.8.8 8.8.4.4 # 上流のDNSサーバー例(DHCPで取れている場合は不要)
DNSStubListenerExtra=192.168.123.10 # 自身(他のマシンから見える)のIPアドレス
DNSStubListenerExtra=fd00::192:168:123:10 # IPv6アドレス(必要なら)。リンクローカルアドレスは使用不可
上記のドロップイン設定ファイルを作成したら、systemd-resolved を再起動して設定を適用する。
systemctl restart systemd-resolved
ファイアウォールが有効な場合は53番ポート(TCP/UDPとも)をLAN向けに解放すること。
/etc/hosts にエントリを追加
192.168.123.1 router.lan
192.168.123.20 nas.lan
192.168.123.30 pihole.lan
確認
他のマシンから
dig @192.168.123.10 nas.lan
Windows では nslookup を使う
nslookup nas.lan 192.168.123.10
これで /etc/hosts に書いた名前が解決できればOK
メリット
- 最初からある:systemd-resolved は systemd の一部
- 設定が極めてシンプル:バインドするIPアドレスを増やすだけ
- mDNS/LLMNR も引ける:
.localドメインを特別な設定なしで解決可能 - DNS over TLS などの現代的機能が使える
注意点・デメリット
- ワイルドカードは使えない
*.dev.localのような一括解決は不可 - 大量エントリには向かない /etc/hostsに全部書くため
- 動的登録はできない DHCPとの連携機能はない
- A/AAAA/PTR以外は設定できない /etc/hostsではそれしか表現できないため
これらデメリットに問題がなければ dnsmasq をアンインストールできる。
まとめ
多くのホームラボ勢が「dnsmasq を入れないと…」と思い込んでいるが、実はオーバーキルになっているケースがある。今はおよそどのLinuxディストリビューションも systemdで動いているので、標準で含まれている systemd-resolvedを使って /etc/hosts ファイルだけで解決できるならそれにこしたことはない。
関連記事
- localhost を使った開発で TLS を有効にする方法
- またWiFiがつながらなくなったLinuxユーザーの日常: RTL8723BSとLinux 7.0
- Zabbixを使ってエージェント無しで単純な Webサイト監視だけを行う最短の方法
- OP25Bを回避するため Postfixのリレー先を gmailに設定する方法
この機能は systemd 247 以降にのみ存在するので注意 ↩︎