g00chyの技術ブログ

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移行導入されているようです。
ローカル向け(自分自身に対してのはず)に対して、下記の機能を提供

んで、ローカルからの問い合わせに対して名前解決をするためのインターフェースを提供する。

systemd-resolved.service

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 ☆今回これが問題であった

resolved.conf

コメントアウトされているところについては、値が設定されているところは、その値でデフォルト値がセットされます。
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サーバーができたので、おかげでサービスごとにドメインを持つことができるようになったよ。


Share

comments powered by Disqus