DNSサーバーとして軽量かつ柔軟に使える「CoreDNS」
今回は、RHEL 9.2環境でCoreDNSをPodmanコンテナで構築し、systemd化して常駐サービス化する手順を紹介します。
以下の内容に沿って進めます。
- CoreDNSのイメージ取得(pull)
- Corefileとhostsファイルの準備
podman run
でのCoreDNS起動- 動作確認(dig)
- Podmanコンテナのsystemd化(永続運用)
1. 事前準備
PodmanはRHEL9.2に標準搭載されていますが、未導入の場合は以下のコマンドでインストールしてください。
$ sudo dnf install -y podman
また、確認用にbind-utils
(digコマンド含む)も入れておくと便利です。
$ sudo dnf install -y bind-utils
2. CoreDNSのイメージをpull
まずはCoreDNSのDockerイメージを取得します。
$ podman pull coredns/coredns:latest
podman images
で確認して、イメージが取得できていればOKです。
3. Corefileとhostsファイルの準備
CoreDNSの設定は「Corefile」で行います。今回は /opt/coredns
に設定ファイル類をまとめます。
$ sudo mkdir -p /opt/coredns
$ cd /opt/coredns
■ Corefile の例
$ sudo tee Corefile > /dev/null < $ sudo tee hosts > /dev/null < この構成では、 以下のようにCoreDNSコンテナを起動します。 $ sudo podman run -d \ podman run -d \ ポイントは以下の通り: 起動後の確認 $ podman ps 別ターミナルで以下のように $ dig @127.0.0.1 test.local $ dig @127.0.0.1 www.google.com Podmanの便利な機能として、コンテナをsystemdサービス化できます。 $ podman generate systemd –name coredns –files –restart-policy=always –container-prefix=coredns.service $ mkdir -p ~/.config/systemd/user $ systemctl –user daemon-reexec サービスの起動状態を確認: $ systemctl –user status coredns.service 再起動してもCoreDNSコンテナが自動起動されるようになりました。 CoreDNSがポート53でリッスンするため、Firewalld設定を確認しておきましょう。 $ sudo firewall-cmd –add-port=53/udp –permanent 今回の記事では、以下のような流れでCoreDNSの構築を行いました: RHEL9.2+Podman環境は、今後主流になる可能性が高いため、systemd連携を含めた構成は特に実務に活かせます。 /opt/coredns/ポート制限に注意(53番ポートは非rootではバインド不可)
rootlessでは、1024未満のポートはバインドできません。
そのため、Corefileで指定するポートを :1053 などに変更する必要があります。
例:Corefile(rootless用)■ hosts ファイルの例
test.local
や db.local
のような名前解決をローカルhostsで処理し、それ以外のドメインは 8.8.8.8
(Google DNS)へフォワードします。
4. PodmanでCoreDNSを起動
–name coredns \
–network host \
-v /opt/coredns/Corefile:/Corefile:ro \
-v /opt/coredns/hosts:/etc/coredns/hosts:ro \
coredns/coredns:latest -conf /Corefilerootlessの場合はポートマッピングも起動時に指定します。
–name coredns \
-p 1053:1053/udp -p 1053:1053/tcp \
-v $HOME/coredns/Corefile:/Corefile:ro \
-v $HOME/coredns/hosts:/etc/coredns/hosts:ro \
coredns/coredns:latest -conf /Corefile
--network host
:ホストのポート53を直接使う(NATなし)-v
で設定ファイルをコンテナにマウント-conf
オプションでCorefileのパスを指定
STATUSが「up」になっていることを確認します。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d5f3c7b2e8a9 docker.io/coredns/coredns:latest -conf /Corefile 10 seconds ago Up 10 seconds ago coredns
5. 動作確認(dig)
dig
で名前解決を試してみます。
text
コピーする
編集する
; <<>> DiG 9.16.23-RH <<>> @127.0.0.1 test.local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; QUESTION SECTION:
;test.local. IN A
;; ANSWER SECTION:
test.local. 0 IN A 10.1.1.100
;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Jul 13 12:00:00 JST 2025
;; MSG SIZE rcvd: 56
外部DNSへフォワードされる確認(Google DNS):
text
コピーする
編集する
; <<>> DiG 9.16.23-RH <<>> @127.0.0.1 www.google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 67890
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; QUESTION SECTION:
;www.google.com. IN A
;; ANSWER SECTION:
www.google.com. 300 IN A 142.250.196.100
;; Query time: 15 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Jul 13 12:01:00 JST 2025
;; MSG SIZE rcvd: 60
6. CoreDNSコンテナをsystemdで常駐化
このコマンドで
container-coredns.service
というsystemdユニットファイルが生成されます。
※ --container-prefix= を指定することで、サービス名が container-coredns.service ではなく coredns.service になります。
これで、カレントディレクトリに coredns.service が生成されます。
次にこのユニットファイルを、ユーザー用の systemd ディレクトリに移動します:
$ mv coredns.service ~/.config/systemd/user/systemctl --user でサービス有効化・起動
$ systemctl –user enable –now coredns.service
7. 補足:ファイアウォールのポート確認
$ sudo firewall-cmd –add-port=53/tcp –permanent
$ sudo firewall-cmd –reload
まとめ
おまけ:ファイル構成まとめ
├── Corefile # CoreDNS設定
└── hosts # ローカル名前解決
コメント