PolarDNS をインストール

権威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
タイトルとURLをコピーしました