私の使っている作業用Linuxデスクトップで、DNSリゾルバはdnsqmasqに変えたという記事を書いた。
この変更はうまく行ってこの状態で運用していたのだが、PCの更新によりクリーンインストールした結果、元の状態(systemd-resolvedを使っている)に戻ってしまった。 また設定変更するのが面倒だなぁ*1っと考えていた結果、タイトルにあるようにsystemd-resolvedとdnsmasqの多段構成にすることにした。 具体的には、通常のクエリはシステムデフォルトのsystemd-resolvedで行い、特定のクエリだけsystemd-resolvedからフォワードしてdnsmasqに問い合わせみたいな感じになっている。 同じ機能を持つデーモンを複数起動するのはやや冗長な感じがするが、dnsmasqプロセスが1つ起動するだけだし昨今のHW事情的に気にするまでもないから、設定の簡便さから許容している。
具体的な設定内容
実際に行った設定内容を書いておく。対象は、Ubuntu 20.10。 まずは、dnsmasqパッケージのインストールをしておく。 デフォルトではdnsmasq-baseというパッケージが入っていてバイナリはこちらに入っているのだが、dnsmasqパッケージを入れないとsystemdのUnitファイルがなかったりして不便である。
$ sudo apt install dnsmasq
インストールを行ったら設定を行う。
ここで重要なのは no-resolv
とlisnten-address=127.0.0.54
を設定することである。
no-resolv
を指定すると /etc/resolv.conf
の書き換えが行われなくなる。
/etc/resolv.conf
はNetworkManagerが管理しているのでdnsmasqにいじられるのはとても都合が悪い。
次に listen-address=127.0.0.54
だがsystemd-resolvedからのリクエストのみに応答したいのでループバックアドレスを指定している。
第4オクテットはなんでもいいのだが、Ubuntuでsystemd-resolvedがリッスンしているアドレスの次のアドレスにしている(なんとなく)。
最終的に作った設定ファイルは以下の通り↓
❯ cat /etc/dnsmasq.conf no-resolv listen-address=127.0.0.54 server=/example.com/****
設定ができたらdnsmasqをreloadしておく
❯ sudo systemctl reload dnsmasq
最後にsystemd-resolvedの設定をする。
DNSの行ではdnsmasqのリッスンアドレスを、Domains行にはdnsmasqにフォワードしたいドメインを書く。ドメインの頭に ~
をつけるのを忘れないこと。
❯ cat /etc/systemd/resolved.conf.d/cascade.conf [Resolve] DNS=127.0.0.54 Domains=~example.com
設定したらreloadをし設定を反映する。
❯ sudo systemctl reload systemd-resolved.service
おまけ: resolvctl
前回の記事では、上位のDNSサーバを確認するのに nmcli d sh | grep DNS
を紹介した。
このコマンドは今も有効なのだが、systemd-resolvedが生きた状態なので resolvctl
を使うことでより簡単にわかりやすく確認することが可能となった。
❯ resolvectl status Global LLMNR setting: no MulticastDNS setting: no DNSOverTLS setting: no DNSSEC setting: no DNSSEC supported: no Current DNS Server: 127.0.0.54 DNS Servers: 127.0.0.54 DNS Domain: ~example.com Link 2 (wlo1) -- snip -- Current DNS Server: *** DNS Servers: *** -- snip --
なお、Ubuntu18.04ではこのコマンドが存在せず、LTSではUbuntu20.04から使えるようになっている(はず)。
*1:mitamaeで管理しているのだがdnsmasqに入れ替えるという工程を作るのが面倒だった…