CoreDNSでDNSサーバを構築する方法

CoreDNSでDNSサーバを構築する方法を説明します。

CoreDNSとは

CNCFのプロジェクトであるCoreDNSはGoで書かれたDNSサーバです。 Kubernetesの中で利用されているため、名前は聞いたことがあるでしょうか。 シンプルな作りとシングルバイナリで動作することから、手軽に利用できます。

CoreDNSの実行

CoreDNSはシングルバイナリで動作しますが、ここではDockerを使って実行します。 設定ファイルとしてCorefilehostsをカレントディレクトリに配置して、次のコマンドを実行します。

docker run \
  --rm -d --name coredns -p 1053:53/udp -v $(pwd):/data \
  coredns/coredns -conf /data/Corefile

Corefile

. {
  # 各種プラグイン利用
  cache 30
  errors
  log
  loop
  reload
  health
  ready
  prometheus

  # 自前のレコード(ワイルドカード)
  template IN A apps.example.com {
    match "^([^\.]+)\.apps\.example\.com\.$"
    answer "{{ index .Match 1 }}.apps.example.com. IN A 192.168.10.10"
    fallthrough
  }

  # 自前のレコード(hosts形式)
  hosts /data/hosts example.com {
    fallthrough
  }

  # 自前のレコードに該当しない場合、パブリックDNSへフォワード
  forward . 1.1.1.1 8.8.8.8
  # forward . /etc/resolv.conf
}

hosts

192.168.10.11 a.example.com
192.168.10.12 b.example.com

たったこれだけで、DNSサーバの構築は完了です。

動作検証

hostsに記載したレコードの正引きを検証します。

dig @localhost -p 1053 +noall +ans a.example.com
a.example.com.          30      IN      A       192.168.10.11

hostsに記載したレコードの逆引きを検証します。

dig @localhost -p 1053 +noall +ans -x 192.168.10.11
11.10.168.192.in-addr.arpa. 30  IN      PTR     a.example.com.

ワイルドカードの正引きを検証します。

dig @localhost -p 1053 +noall +ans test.apps.example.com
test.apps.example.com.  30      IN      A       192.168.10.10

期待した通り動作しましたね。

参考リンク