薬味備忘録

Aonori Tech Diary

macOSXとDockerでdns鯖を立てる

2018年秋に24回分割払い手数料無料キャンペーンに引きつられ買ったものの、 もっぱら4Kモニタの隅っこで鎮座し続けているmac mini (2018)を有効活用すべく、 Dockerで何かしらの常駐鯖を立ててみることに。

DNS鯖を立てる

DNS鯖のLinuxディストリとしてBINDが有名ですが、色々と問題が指摘されているので、今回はNSDを選択。

初期ファイル構成は以下のようにしました。

├── docker-compose.yml
└── nsd
    └── Dockerfile

Dockerfileを書く

ここではhardware/nsd-dnssecをベースにセットアップ。

FROM hardware/nsd-dnssec
USER root

RUN addgroup -g 991 -S nsd
RUN adduser -G nsd -s /sbin/nologin -H -u 991 -S nsd
RUN chown nsd:nsd zones

docker-composeを書く

docker-composeを使えば複数コンテナの管理だけでなく、ボリュームマウント、ポートフォワードなども分かりやすく書けるので活用。

version: "3"
services:
        nsd:
                build: nsd
                restart: always
                container_name: nsd
                ports:
                        - "53:53"
                        - "53:53/udp"
                volumes:
                        - ./nsd/conf:/etc/nsd
                        - ./nsd/zones:/zones
                        - ./nsd/db:/var/db/nsd

起動して設定ファイルを編集

docker-compose.ymlが存在するディレクトリで以下のコマンドを実行。

$ docker-compose up -d 

コンテナを起動すると、nsdフォルダ以下にconf zones dbフォルダが作成されるので、設定ファイルを書いていきます。

conf/nsd.confの編集

nsdの設定については、例によってArchWikiを参照すると分かりやすい。

例えば、ドメインexample.comについて、192.168.0.***/24の範囲で解決するとき、 正引き・逆引きの両設定を書くので、実際のnsd.confは以下のような形に。

server:
  server-count: 1
  ip4-only: yes
  hide-version: yes
  identity: ""
  zonesdir: "/zones"

remote-control:
  control-enable: yes

zone:
  name: "example.com"
  zonefile: "example.com.zone"

zone:
  name: "0.168.192.in-addr.arpa"
  zonefile: "0.168.192.in-addr.arpa.zone"

zoneの編集

続いて先ほど指定したzoneファイルを実際に書いていきます。ここでは192.168.0.2をhostnameというホストに割り当てる設定で。

正引きのzoneファイル
@        IN  SOA dns.example.com.    root.example.com.   (
                2019040400  ; Serial
                3600        ; Refresh
                900     ; Retry
                604800     ; Expire (1week)
                3600 )      ; Negative Cache TTL

; Name Server
        IN  NS  dns.example.com.

; localhost
localhost   IN  A   127.0.0.1

; Servers
hostname        IN  A   192.168.0.2
逆引きのzoneファイル
@    IN  SOA dns.example.com.    root.example.com.   (
            2019040401  ; Serial
            3600        ; Refresh
            900     ; Retry
            604800     ; Expire (1week)
            3600       ; Negative Cache TTL
)

; Name Servers
@   IN  NS  dns.example.com
@   PTR example.com.
@   IN  A   255.255.255.0

2   IN  PTR hostname.example.com

起動

ここまで書けば最低限の設定は完了です。docker-compose up -d --buildで立ち上がればおわり。