02. DNSサーバ構築 – unbound/nsd [さくらのVPS/CentOS7]

・DNSキャッシュサーバの構築

#-- unbound のインストール
yum install -y unbound

#-- unbound の起動
systemctl enable unbound
systemctl start unbound

#-- 再起動で resolv.conf が書き変わらないように設定変更
sed -i '/^\[main\]/a dns=none' /etc/NetworkManager/NetworkManager.conf
systemctl restart NetworkManager

#-- nameserverをunboundを優先して使用するように設定を変更
sed -i "1s/^/nameserver 127.0.0.1\n/" /etc/resolv.conf

・DNSコンテンツサーバの構築

#-- 変数に必要な値を代入
ZONE=masdon.life
IPV4=$(ip addr show eth0 | awk '/inet /{print $2}' | awk -F\/ '{print $1}')
IPV6=$(ip addr show eth0 | awk '/inet6 /&&/global/{print $2}' | awk -F\/ '{print $1}')

#-- nsd のインストールと設定
yum install -y nsd
cp -p /etc/nsd/nsd.conf{,.org}

#- zonefile の参照先を設定
cat <<_EOL_>> /etc/nsd/nsd.conf
zone:
  name: ${ZONE}
  zonefile: zone/${ZONE}.zone
_EOL_

#- global ip での bind を設定
sed -i -e "/^server/a\        ip-address: ${IPV4}"  /etc/nsd/nsd.conf
sed -i -e "/^server/a\        ip-address: ${IPV6}"  /etc/nsd/nsd.conf

#- zonefile を作成(PUBLICKKEYは、DKIMの共通鍵をメールサーバ構築時に入力する)
mkdir -p /etc/nsd/zone
cat <<_EOL_> /etc/nsd/zone/${ZONE}.zone
\$TTL 3600
@                       IN      SOA     ${ZONE}. root.${ZONE}. (
                                $(date +%Y%m%d00)      ; Serial
                                3600            ; Refresh
                                300             ; Retry
                                604800          ; Expire
                                86400           ; Minimum
                                )
@                       IN      NS      ns01.${ZONE}.
                        IN      NS      ns02.${ZONE}.
                        IN      A       ${IPV4}
                        IN      AAAA    ${IPV6}
                        IN      TXT     "v=spf1 +ip4:${IPV4} +ip6:${IPV6} -all"
                        IN      CAA     0 issue "letsencrypt.org"
                        IN      MX 100  ${ZONE}.
_dmarc                  IN      TXT     "v=DMARC1; p=reject; rua=mailto:root@${ZONE}"
_adsp._domainkey        IN      TXT     "dkim=discardable"
;default._domainkey      IN      TXT     "v=DKIM1; k=rsa; p=PUBLICKKEY"
autoconfig              IN      CNAME   ${ZONE}.
ns01                    IN      A       ${IPV4}
ns01                    IN      AAAA    ${IPV6}
ns02                    IN      A       ${IPV4}
ns02                    IN      AAAA    ${IPV6}
vps                     IN      A       ${IPV4}
vps                     IN      AAAA    ${IPV6}
_EOL_

#-- nsd の起動
systemctl enable nsd
systemctl start nsd

#-- 53/tcp,udp の port 解放
firewall-cmd --permanent --add-port=53/{tcp,udp}
firewall-cmd --reload

#-- ipv6 の global ip に疎通があるかを確認するスクリプトを作成
cat <<_EOL_> /usr/local/bin/ipv6upchk.sh
#!/bin/bash

PROC=\$1
IPV6=${IPV6}

for x in \$(seq 1 30)
do
  ping6 -c 1 -W 1 \${IPV6} >/dev/null 2>&1
  if [ $? -eq 0 ]
  then
    echo "\${PROC}: [\${IPV6}] is ready"
    sleep 2
    exit 0
  fi
  sleep 1
done

exit 1
_EOL_

chmod 755 /usr/local/bin/ipv6upchk.sh

#-- OS起動時に ipv6 の global ip に疎通があるかを事前に確認しないとGlobal IP での bind に失敗し nsd が起動してこないことがある為、チェックスクリプト ExecStartPreに登録する
sed -i '/^EnvironmentFile/a ExecStartPre=/usr/local/bin/ipv6upchk.sh nsd' /usr/lib/systemd/system/nsd.service
systemctl daemon-reload

#-- 設定したレコードがdigで引けるか確認する
dig @${IPV4} masdon.life soa +short
masdon.life. root.masdon.life. 2019010601 3600 300 604800 86400

さくらのVPSのコンソールで逆引きに vps.masdon.life を設定する

・お名前ドットコムで該当ドメインのNSの設定を ns0[12].masdon.life に変更する