【CentOS7】セカンダリサーバーをNSDにしてみた。

Linux

自社の権威DNSサーバーをBINDからNSDに変更した時のメモです。
プライマリサーバーはBINDを使用するため、NSDはセカンダリサーバーとして構築します。

インストール環境

以下の構成でインストールします。

・CentOS7.5
・NSD4.1.24
・firewalldあり

nsdのインストール

BINDと比べて脆弱性が少ないと言われているNSDですが、数年に1回ぐらいは
脆弱性が見つかっているようです。

JVN iPedia - 脆弱性対策情報データベース
脆弱性対策情報データベース

パッケージのアップデート待ちをしている間にDNSが落とされると困るので
今回はソースからインストールしたいと思います。

nsd用ユーザー追加

nsd起動用のユーザーを作成します。

#useradd -c nsd -s /sbin/nologin -d /var/empty/nsd -m -u 153 nsd

必要パッケージのインストール

本来であれば、nsdのクライアントツールはdrillですが、インストールが面倒なのでbind-utils(dig/nslookup)をインストールしています。
その他必要なパッケージもまとめてインストールしておきます。

#yum install -y openssl openssl-devel libevent libevent-devel gcc bind-utils

ダウンロード

公式サイトからダウンロードします。

#cd /tmp
#wget https://www.nlnetlabs.nl/downloads/nsd/nsd-4.1.24.tar.gz
#tar zxvf nsd-4.1.24.tar.gz ; cd nsd-4.1.24

コンパイル&インストール

以下の条件でコンパイルします。

  • –prefix=/usr/local/nsd-4.1.24 → インストール先です。chroot先となります。
  • –enable-ratelimit → DNSリフレクター攻撃対策として有効にしておきます。
  • –with-configdir=/usr/local/nsd-4.1.24/etc/nsd → configの保存先です。
  • –with-user=nsd → 実行ユーザーはnsd
  • –with-libevent → スレッドあたりの応答数を調整できるように有効にしておきます。
  • –with-ssl → DNSSECは使いませんが、一応有効にしておきます。
#./configure --prefix=/usr/local/nsd-4.1.24 --enable-ratelimit --with-configdir=/usr/local/nsd-4.1.24/etc/nsd \
--with-zonesdir=/usr/local/nsd-4.1.24/etc/nsd --with-user=nsd --with-libevent --with-ssl
#make
#make install

Configファイルの作成

こんな感じで作成しました。

#vi /usr/local/nsd-4.1.24/etc/nsd/nsd.conf

-----

#
# nsd.conf
# インストールフォルダ名をバージョンに合わせて変更すること!
# /usr/local/nsd-4.1.24 ←ココ
#プライマリDNSサーバー:192.168.0.100
#

server:
# 起動するサーバー数(CPUの数に合わせて変更)
server-count: 2
# 待受IPアドレス(プライマリDNSサーバーのIPを書く)
ip-address: 192.168.0.100
ip-address: 127.0.0.1
do-ip4: yes
username: nsd
chroot: "/usr/local/nsd-4.1.24"
zonesdir: "/usr/local/nsd-4.1.24/etc/nsd/"
zonelistfile: "/usr/local/nsd-4.1.24/var/db/nsd/zone.list"
database: "/usr/local/nsd-4.1.24/var/db/nsd/nsd.db"
pidfile: "/usr/local/nsd-4.1.24/var/run/nsd.pid"
xfrdfile: "/usr/local/nsd-4.1.24/var/db/nsd/xfrd.state"
xfrdir: "/usr/local/nsd-4.1.24/tmp"
hide-version: yes
round-robin: yes
minimal-responses: yes

remote-control:
control-enable: yes
control-interface: 127.0.0.1
control-port: 8952
server-key-file: "/usr/local/nsd-4.1.24/etc/nsd/nsd_server.key"
server-cert-file: "/usr/local/nsd-4.1.24/etc/nsd/nsd_server.pem"
control-key-file: "/usr/local/nsd-4.1.24/etc/nsd/nsd_control.key"
control-cert-file: "/usr/local/nsd-4.1.24/etc/nsd/nsd_control.pem"

#正引き指定
zone:
name: onevoice.jp
zonefile: onevoice.jp.zone
allow-notify: 192.168.0.100 NOKEY
request-xfr: 192.168.0.100 NOKEY
allow-axfr-fallback: yes
#自サーバーのIPを指定
outgoing-interface: 192.168.0.101

#逆引き指定

zone:
name: 0.168.192.in-addr.arpa
zonefile: 0.168.192.in-addr.arpa.zone
allow-notify: 192.168.0.100 NOKEY
request-xfr: 192.168.0.100 NOKEY
allow-axfr-fallback: yes
#自サーバーのIPを指定
outgoing-interface: 192.168.0.101

-----

必要フォルダを作成&オーナーの変更

#mkdir /usr/local/nsd-4.1.24/tmp
#mkdir /usr/local/nsd-4.1.24/var/run
#chown -R nsd:nsd /usr/local/nsd-4.1.24

シンボリックリンク作成

#cd /usr/local ; ln -s nsd-4.1.24 nsd

config確認

configが正しく作成できているか確認します。

#/usr/local/nsd-4.1.24/sbin/nsd-checkconf /usr/local/nsd-4.1.24/etc/nsd/nsd.conf

コントロールコマンド用キー作成

BINDでいうrndcコマンドですね。

#/usr/local/nsd-4.1.24/sbin/nsd-control-setup

起動

準備ができたので起動してみます。

#/usr/local/nsd-4.1.24/sbin/nsd-control start

起動しているか確認します。

#ps -aef | grep nsd | grep -v grep

nsd 7889 1 0 14:11 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf
nsd 7890 7889 0 14:11 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf
nsd 7891 7890 0 14:11 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf
nsd 7892 7890 0 14:11 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf

nsdの再起動&監視スクリプトの設定

nsdの監視スクリプトを作成して、crontabに登録します。
トラブルでnsdがダウンした場合に再起動させるためと、サーバー起動時の起動スクリプトも兼ねています。

シェルスクリプトの作成

#vi /root/cknsd.sh

----

#!/bin/sh
#
#
# cknsd.sh
#
# 変更したconfigを確認してnsdを再起動します。
# 引数cronでプロセス監視(落ちていたら再起動)します。
#

ARG=$1
ARG2=$2
DIR=/root

#引数ない場合は、ヘルプを出して終了
if [ "$ARG" = "" ]
then

cat << EOF

cknsd.sh [restart|cron]

例)nsd再起動
/root/cknsd.sh restart

EOF

exit 0

fi

#引数にrestartが入っている場合は再起動
if [ "$ARG" = "restart" ]
then

#nsd.conf確認
/usr/local/nsd/sbin/nsd-checkconf /usr/local/nsd/etc/nsd/nsd.conf

#構文エラーの場合はエラーを吐いて終了、OKな場合はzoneファイルのチェックへ進む
if [ $? -gt 0 ]
then

echo
echo "nsd.conf構文エラー!! コマンドを終了します。"
echo

exit 0

fi

echo
echo "nsd再起動しますか?[y/n]"
echo
read ANS

if [ "$ANS" = "y" ]
then

/usr/local/nsd/sbin/nsd-control stop
sleep 3
/usr/local/nsd/sbin/nsd-control start

exit 0

else

exit 0

fi

fi

#---------------------------------------------------------------

#引数cronの場合はnamedプロセスを監視して、落ちている時はnamed再起動
if [ "$ARG" = "cron" ]
then

date

#nsd起動していない場合は起動
if [ ! -e /usr/local/nsd/var/run/nsd.pid ]
then

/usr/local/nsd/sbin/nsd-control start
echo "nsd start"

else

echo "nsd already running"

fi

fi

exit 0


----

パーミッション変更

#chmod 700 /root/cknsd.sh

nsd-controlがあるフォルダにパスを通す。

#vi /root/.bashrc

----

PATH=/usr/local/nsd/sbin

----


#source /root/.bashrc

コマンドテスト

#cknsd.sh restart

nsd再起動しますか?[y/n]

y
ok
[2018-10-13 09:31:36.970] nsd[17422]: notice: nsd starting (NSD 4.1.24)

#ps -aef | grep nsd | grep -v grep

nsd 17423 1 0 09:31 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf
nsd 17424 17423 0 09:31 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf
nsd 17425 17424 0 09:31 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf
nsd 17426 17424 0 09:31 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf

crontabに登録

#crontab -e


----

#nsdの起動状態を確認して、落ちている場合は起動。
*/1 * * * * /root/cknsd.sh cron >> /root/cknsd.log

----

動作テスト

実際にnsdを落としてみて、1分後に自動復帰することを確認します。

#ps -aef | grep nsd | grep -v grep

nsd 17423 1 0 09:31 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf
nsd 17424 17423 0 09:31 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf
nsd 17425 17424 0 09:31 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf
nsd 17426 17424 0 09:31 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf

#kill 17423

#ps -aef | grep nsd | grep -v grep

何も出ない。



1分後起動していることを確認。

#ps -aef | grep nsd | grep -v grep

nsd 17460 1 1 09:34 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf
nsd 17461 17460 2 09:34 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf
nsd 17462 17461 0 09:34 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf
nsd 17463 17461 0 09:34 ? 00:00:00 nsd -c /usr/local/nsd-4.1.24/etc/nsd/nsd.conf

firewalldの設定

DNSのポートを開放します。

DNSを許可

#firewall-cmd --zone=public --add-service=dns --permanent

適用

#firewall-cmd --reload

確認

#firewall-cmd --list-all --permanent

public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh dns
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:

ローカルDNSで名前が引けるか確認。

設定したドメインが引けるか確認します。

コマンド結果の4-5行目あたりに

status: NOERROR

flags: aa

と出ていればOKです。

#dig www.onevoice.jp @127.0.0.1


; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> www.onevoice.jp @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40210
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.onevoice.jp. IN A

;; ANSWER SECTION:
www.onevoice.jp. 300 IN CNAME mail1.onevoice.jp.
mail1.onevoice.jp. 300 IN A 192.168.0.100

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: 日 11月 18 13:12:52 JST 2018
;; MSG SIZE rcvd: 80




#dig -x 192.168.0.100 @127.0.0.1

; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> -x 192.168.0.100 @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36538
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;100.0.168.192.in-addr.arpa. IN PTR

;; ANSWER SECTION:
100.0.168.192.in-addr.arpa. 300 IN PTR mail1.onevoice.jp.

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: 日 11月 18 13:14:03 JST 2018
;; MSG SIZE rcvd: 87

コメント