権威DNSサーバとして利用可能なPolarDNS をインストールしたときの手順を以下に示します。
※ PolarDNS の使用方法については PolarDNSを使ってみた を参照。
※ここでは実際に設定、動作したものを掲載していますが、内容について保証するものではありません。流用される場合は各自の責任でお願いします。
インストール方法は2とおり。(インストールに関するドキュメントについては PolarDNS を参照)
- Python3.11以降を用意し、必要なファイルを配置する
- Dockerでコンテナを構築する
インストール方法1:Python3.11以降を用意し、必要なファイルを配置する
インストール前の環境情報
# uname -a
Linux polardns 4.18.0-372.9.1.el8.x86_64 #1 SMP Tue May 10 14:48:47 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/redhat-release
Rocky Linux release 8.10 (Green Obsidian)
# python3 -V
Python 3.6.8
1. PolarDNSは python3.11 以降が必要らしいのでインストールする。
手順については、Python 3.11 をインストール を参照。
2. PolarDNSに必要なファイル(polardns.py, polardns.toml, modules/*.toml)を PolarDNS からダウンロードし配置する。
# mkdir -p polardns/modules
# cd polardns
# ls -l
total 76
drwxr-xr-x. 2 root root 4096 Oct 19 13:13 modules
-rw-r--r--. 1 root root 69220 Oct 19 14:01 polardns.py
-rw-r--r--. 1 root root 542 Oct 19 14:15 polardns.toml
# tree -if modules
modules
modules/afuzz1.toml
modules/afuzz2.toml
modules/alias.toml
modules/badcompress1.toml
…
modules/svloop.toml
modules/timeout.toml
0 directories, 105 files
3. コンフィグ(polardns.toml)を編集し、domain と ns の IPアドレスを自分の環境に合わせて変更する。(default:yourdomain.com,127.0.0.1 → example.com,172.18.1.30)
# cp polardns.toml polardns.toml.org
# vi polardns.toml
# diff polardns.toml.org polardns.toml
2,4c2,4
< domain = 'yourdomain.com'
< ns1 = '127.0.0.1'
< ns2 = '127.0.0.1'
---
> domain = 'example.com'
> ns1 = '172.18.1.30'
> ns2 = '172.18.1.30'
4. PolarDNSを起動する。(停止はCtrl-C)
# python3 polardns.py
1729314675.8916300 | PolarDNS v1.5.0 server starting up
1729314675.8928206 | Starting listener at tcp://0.0.0.0:53
1729314675.8943138 | Starting listener at udp://0.0.0.0:53
5. (PolarDNSがフロントエンドで稼働しているため)別端末から疎通確認。
# dig @127.1 always.example.com
; <<>> DiG 9.11.36-RedHat-9.11.36-16.el8_10.2 <<>> @127.1 always.example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21962
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;always.example.com. IN A
;; ANSWER SECTION:
always.example.com. 60 IN A 2.3.4.5
;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Oct 19 14:32:48 JST 2024
;; MSG SIZE rcvd: 52
インストール方法2:Dockerでコンテナを構築する
Docker の環境情報(Docker は既にインストールされているものとする)
# uname -a
Linux docker 4.18.0-372.9.1.el8.x86_64 #1 SMP Tue May 10 14:48:47 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/redhat-release
Rocky Linux release 8.10 (Green Obsidian)
# docker -v
Docker version 26.1.3, build b72abbb
1. 必要なファイル(Dockerfile, polardns.py, polardns.toml, modules/*.toml)を PolarDNS からダウンロードし配置する。
# mkdir -p polardns/modules
# cd polardns
# ls -l
合計 80
-rw-r--r--. 1 root root 475 10月 19 14:40 Dockerfile
drwxr-xr-x. 2 root root 4096 10月 19 14:40 modules
-rw-r--r--. 1 root root 69220 10月 19 14:30 polardns.py
-rw-r--r--. 1 root root 542 10月 19 14:31 polardns.toml
# tree -if modules
modules
modules/afuzz1.toml
modules/afuzz2.toml
modules/alias.toml
modules/badcompress1.toml
…
modules/svloop.toml
modules/timeout.toml
0 directories, 105 files
2. Dockerfile を編集する。デフォルトでは必要なモジュール(modules/*.toml)がコンテナイメージにコピーされないのでコピー処理を追加する。
※ 本稿では Dockerfile の FROM で指定された元イメージを ”Dockerイメージ”、Dockerfile を元に生成されたイメージを”コンテナイメージ”と用語を使い分ける。この表現が正しいかは確認していない。
# cp Dockerfile Dockerfile.org
# vi Dockerfile
# diff Dockerfile.org Dockerfile
10a11,14
> # add modules
> RUN mkdir /usr/src/app/modules
> COPY ./modules/*.toml ./modules
>
3. コンテナイメージを作成。
# docker build -t polar_dns .
[+] Building 44.3s (9/9) FINISHED
…
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
polar_dns latest da01a0675288 About a minute ago 1.01GB
…
4. コンテナを起動。
# docker run -d --name polar_dns --net=net01 --ip=172.18.1.40 polar_dns
e357825d6dc9713064b27c08b4da62159d7281b99f69b0aa2ac0e4b237bff6a1
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e357825d6dc9 polar_dns "python polardns.py" 5 seconds ago Up 4 seconds 53/tcp, 53/udp polar_dns
…
※ 外部にポート53を公開するならば以下のコマンドでコンテナを起動する。
docker run -d --name polar_dns -p 53:53/tcp -p 53:53/udp --net=net01 --ip=172.18.1.40 polar_dns
※ 本環境では別途ネットワーク(net01, 172.18.1.0/24)を作成済みだったためそこに接続した。--net/--ipを指定しなければデフォルトのネットワークに接続され、そのネットワークのIPアドレスが自動的に割り当てられる。
5. コンテナの情報を確認。
# docker exec -it polar_dns cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
# docker exec -it polar_dns hostname -i
fd00::2 172.18.1.40
6. PolarDNS にホスト名でアクセスできるように hosts に登録する。
# grep polardns /etc/hosts
172.18.1.40 polardns
7. PolarDNS で名前を解決できることを確認する。
# dig @polardns always.yourdomain.com
; <<>> DiG 9.11.36-RedHat-9.11.36-16.el8_10.2 <<>> @polardns always.yourdomain.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31072
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;always.yourdomain.com. IN A
;; ANSWER SECTION:
always.yourdomain.com. 60 IN A 2.3.4.5
;; Query time: 1 msec
;; SERVER: 172.18.1.40#53(172.18.1.40)
;; WHEN: Sat Oct 19 15:50:19 JST 2024
;; MSG SIZE rcvd: 55
コンフィグの設定について
PolarDNS の domain と ns のIPアドレスを自分の環境に合わせるために変更するには、コンフィグ(polardns.toml)を編集する必要があるが、PolarDNS の Dockerイメージ(Dockerfile の FROM に指定されている python:3.13-alpine3.21)では、vi が使えないため、起動している PolarDNS コンテナにログインしてのコンフィグ編集は行えない。
# docker exec -it polar_dns bash
root@e357825d6dc9:/usr/src/app# ls -l
total 364
drwxr-xr-x. 1 root root 4096 Oct 19 05:41 modules
-rw-r--r--. 1 root root 69220 Oct 19 05:30 polardns.py
-rw-r--r--. 1 root root 542 Oct 19 05:31 polardns.toml
-rw-r--r--. 1 root root 294851 Oct 19 05:52 polardns_real.py
root@e357825d6dc9:/usr/src/app# ls modules | wc -l
105
root@e357825d6dc9:/usr/src/app# vi polardns.toml
bash: vi: command not found
root@e357825d6dc9:/usr/src/app#
exit
コンテナイメージ作成前にコンフィグ(polardns.toml)を編集しておけば、作成されたコンテナイメージに同コンフィグがコピーされるが、今回、コンテナ起動後に コンフィグ設定を変更する方法を確認したかったため、あえて domain や ns の設定を後回しにした。
8. PolarDNS の domain と ns のIPアドレスを自分の環境用に設定するため、コンフィグ(Dockerイメージにコピーされた polardns.toml のコピー元)を編集する。(default:yourdomain.com,127.0.0.1 → example.com,172.18.1.40)
# ls -l
合計 84
-rw-r--r--. 1 root root 475 10月 19 14:40 Dockerfile
-rw-r--r--. 1 root root 397 10月 19 14:47 Dockerfile.org
drwxr-xr-x. 2 root root 4096 10月 19 14:40 modules
-rw-r--r--. 1 root root 69220 10月 19 14:30 polardns.py
-rw-r--r--. 1 root root 542 10月 19 14:31 polardns.toml
# cp polardns.toml polardns.toml.org
# vi polardns.toml
# diff polardns.toml.org polardns.toml
2,4c2,4
< domain = 'yourdomain.com'
< ns1 = '127.0.0.1'
< ns2 = '127.0.0.1'
---
> domain = 'example.com'
> ns1 = '172.18.1.40'
> ns2 = '172.18.1.40'
9. 編集したコンフィグ(polardns.toml)をコンテナ内のコンフィグに上書きする。
※ コンフィグの上書きは起動中のコンテナに対するものであるため、イメージからコンテナを再起動する場合は、コンフィグが上書き前の状態に戻るため注意。コンテナイメージに反映させるためには、コンテナイメージ作成前にコンフィグを書き換える必要がある。
# docker cp ./polardns.toml polar_dns:/usr/src/app
Successfully copied 2.56kB to polar_dns:/usr/src/app
10. コンテナ(PolarDNS)を再起動。
# docker restart polar_dns
polar_dns
11. 新たなドメイン(example.com)で疎通確認。
# dig @polardns always.example.com
; <<>> DiG 9.11.36-RedHat-9.11.36-16.el8_10.2 <<>> @polardns always.example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4422
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;always.example.com. IN A
;; ANSWER SECTION:
always.example.com. 60 IN A 2.3.4.5
;; Query time: 3 msec
;; SERVER: 172.18.1.40#53(172.18.1.40)
;; WHEN: Sat Oct 19 16:21:58 JST 2024
;; MSG SIZE rcvd: 52