ぶていのログでぶログ

思い出したが吉日

作業PCをsystemd-resolvedとdnsmasqの多段構成にした

私の使っている作業用Linuxデスクトップで、DNSリゾルバはdnsqmasqに変えたという記事を書いた。

tech.buty4649.net

この変更はうまく行ってこの状態で運用していたのだが、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-resolvlisnten-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に入れ替えるという工程を作るのが面倒だった…