systemd-resolvedとunbound ubuntu20
結論
- Ubuntu Serverだと、systemd-resolvedをちゃんと設定しないと、ubuntu18以降はDNSサーバーたてられない
- unboundはdockerでたてると、127.0.0.1からのリクエストをはじいちゃうっぽい?(おそらく、unboundのコンテナに対して127.0.0.1でアクセスしていないためだと思うけど)
環境
- Raspberry Pi 4
- Raspberry Pi OS(64bit)
- systemd-resolved
- unbound(docker)
unboundをdockerで使いたい人がいるかもしれないので、Dockerfileさらしておきますね。
FROM alpine
RUN apk update && apk add unbound openrc
RUN wget -S https://www.internic.net/domain/named.cache -O /etc/unbound/root.hints
EXPOSE 53
ENTRYPOINT ["unbound", "-d"]
# RUN rc-service unbound start
確か、unbound設定ファイル回りについては、下記記事を参考に作成した気がします。
Unboundで内向きDNSを建てる | 純規の暇人趣味ブログ
systemd-resolved
Ubuntuだと16移行導入されているようです。
ローカル向け(自分自身に対してのはず)に対して、下記の機能を提供
- DNS
- DNSSEC(インターネット用語1分解説~DNSSECとは~ - JPNIC
- MulticastDNS(いわゆるmDNS hostname.localとかでアクセスできるやつ)
- LLMNR(これはipv6アドレス.ipv6-literal.netで名前解決する機能っぽい)
んで、ローカルからの問い合わせに対して名前解決をするためのインターフェースを提供する。
mDNSが勝手に入ってるのはこの子のおかげだったのね。
さて、このデーモン、厄介なことに53番(DNS)にバインドされているのがデフォルトの挙動みたいです。(local DNS stub listener)
DNSを立てない限りはこんなことで困ることはないのだけど、開発サーバーを立てるのあたってどうしても、unboundを入れたかったので問題となった。
ここで、systemd-resolvedの設定ファイルを見てみよう
/etc/systemd/resolved.conf
[Resolve]
#DNS=
#FallbackDNS=
#Domains=
#LLMNR=no
#MulticastDNS=yes
#DNSSEC=no
#DNSOverTLS=no
#Cache=yes
#ReadEtcHosts=yes
#DNSStubListener=yes ☆今回これが問題であった
コメントアウトされているところについては、値が設定されているところは、その値でデフォルト値がセットされます。
DNSStubListenerが友好の状態だと、53番ポートを占有してしまい、結果、unboudが使えない。
そのため、ここは「DNSStubListener=no」を指定する
次に、そうなると、DNSの接続先指定が必要となる。
そこに関しては、FallbackDNSにdockerコンテナで立てたunboundのIPアドレスを指定する。
おそらく、ローカルにunboudをローカルインストールした場合、127.0.0.1で逝けるのだろうけど、私はdockerで立てたので、Pi4自身のIPv4アドレスを指定しました。
次に、これだけでは、どうしても127.0.0.53を参照しに行くため、下記の通りシンボリックリンク先を修正
unlink /etc/resovl.conf
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
結構この辺のことについて書いてあるけども、systemd-resolvedの4つのモードなるものはいったい何かわからなかったな。
Ubuntu : systemd-resolved、及び Resolvconf 設定 - eTuts+ Server Tutorial
unbound
これは、DNSサーバーだね。
環境で最初にまとめたのであまり言うことはないかな。
最後に
これで内部DNSサーバーができたので、おかげでサービスごとにドメインを持つことができるようになったよ。