自社の権威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
コメント