設定 - Bind(SUSE)
概要
DNSサーバ(BIND)は、suse.comというドメイン名からIPアドレスを返したり、IPアドレスからドメイン名を返すサーバである。
内部向けDNSサーバは、LANにあるサーバまたはクライアントPCにアクセスする時、IPアドレスではなくsuse.com等のドメイン名を入力してアクセスできるようにするDNSサーバである。
外部向けDNSサーバは、WANにあるサーバまたはクライアントPCにアクセスする時、自ドメイン名からIPアドレスへの変換(名前解決)を行なうようにするDNSサーバである。
例えば、外部向けDNSサーバの設定により、自宅サーバが稼動中にも係わらず、
ダイナミックDNSサービス側が保守やトラブル等でサービスが停止したことにより、ドメイン名でサーバにアクセスできなくなるということがなくなる。
※注意
固定IPアドレスの場合は独自ドメイン取得済であること。
外部向けDNSサーバは固定IPアドレス環境の場合のみ。
DNSのレコード
レコードタイプ | 説明 | DNS定義ファイル等での定義例 |
---|---|---|
Aレコード | A(Address)レコードは、IPv4でホスト名とIPアドレスの関連付けを定義するレコードである。 | <ドメイン名> IN NS dns.sub.example.com.
|
AAAAレコード | AAAAレコードは、IPv6でホスト名とIPアドレスの関連付けを定義するレコードである。 | - |
CNAMEレコード | CNAMEレコードは、正規ホスト名に対する別名を定義するレコードである。 特定のホスト名のDNSレコードについて、別のホスト名のレコードを参照させる時に利用する。 |
www IN CNAME backup1.example.com.
|
MXレコード | MXレコードは、対象ドメイン宛のメールの配送先(メールサーバ)のホスト名を定義するレコードである。 | <ドメイン名> IN MX 10 mail.example.com.
|
NSレコード | NSレコードとは、ゾーン情報を管理するネームサーバのサーバ名を定義するレコードである。 | <ドメイン名> IN NS dns.sub.example.com.
|
TXT(SPF)レコード | TXTレコードは、ホスト名に関連付けるテキスト情報(文字列)を定義するレコードである。 送信ドメイン認証の認証情報等を記述する。 |
www IN TXT "Please Dont Touch Me"
|
BINDのインストール
DNSサーバを構築するため、BINDをインストールする。
# 内部向けDNSサーバを構築する場合 sudo zypper install bind bind-utils # 外部向けDNSサーバを構築する場合 sudo zypper install bind bind-utils bind-chrootenv
BINDの設定 : 内部向けDNSの場合
内部向けDNSサーバ全体の設定
BINDの設定ファイルを編集する。
sudo vi /etc/named.conf
options { ...略 # 内部向けDNSサーバの管理外の問合せ先 #forwarders { 192.0.2.1; 192.0.2.2; }; forwarders { 192.168.1.1; }; ...略 # 全てListenする場合 (未設定でもよい) #listen-on port 53 { 127.0.0.1; }; listen-on port 53 { any; }; # IPv6を使用しない場合 #listen-on-v6 { any; }; listen-on-v6 { none; }; ...略 # 問い合わせを許可する範囲を指定 # 以下の例では、LAN(192.168.1.*)からのみ問い合わせを許可している #allow-query { 127.0.0.1; }; allow-query { 127.0.0.1; 192.168.1.0/24; }; ...略 }; ...略 # コメントアウトする #include "/etc/named.conf.include"; ...略 # 内部向けDNSサーバのゾーンの設定 (追加) # 192.168.1.* の正引き zone "suse.com" { type master; file "suse.db"; }; # 192.168.1.* の逆引き zone "1.168.192.in-addr.arpa" { type master; file "1.168.192.in-addr.arpa.db"; };
内部向け正引きゾーンデータベースの作成 (ドメイン名からIPアドレス)
この設定を有効にするには、外部向けDNSサーバを静的IPアドレスにする必要がある。
内部向けDNSサーバの正引きゾーンデータベースを作成する。
以下の例に記述しているXXやYY等のIPアドレスを、該当するクライアントPCのIPアドレスに変更すること。
sudo vi /var/lib/named/suse.db
# /var/lib/named/suse.dbファイル $TTL 86400 ; SOAレコード(権威DNSサーバが担当しているゾーン(管理する範囲)に関する情報) @ IN SOA ns.suse.com. root.suse.com. ( 2022041001 ; シリアル番号 例. 作成年月日 + 01(連番)を記述する 28800 ; 更新チェックの間隔 14400 ; リトライ間隔 3600000 ; 問い合わせを諦める間隔 86400 ; ネガティブキャッシュの有効期限 ) ; NSレコード(管理の委託先のDNSサーバ名) ; 記述方法 : <対象のドメイン名> IN NS <対象のドメイン名を管理しているDNSサーバ名> ; メールサーバを指定する場合は、MXレコードを記述する @ IN NS ns.suse.com. ; Aレコード(ドメイン名に対応するIPアドレス) ns IN A 192.168.1.XX ; 内部向けDNSサーバのIPアドレス pc1 IN A 192.168.1.YY ; クライアントPC 1 pc2 IN A 192.168.1.ZZ ; クライアントPC 2 pc3 IN A 192.168.1.AA ; クライアントPC 3 ; CNAMEレコード(ドメイン名に別名を付ける) ; 記述方法 : <別名> IN CNAME <元のドメイン名> subpc1 IN CNAME pc1 ; DNSレコードは他にも、AAAAレコード、PTRレコード、HINFOレコード、WKSレコード、TXTレコード等がある
内部向け逆引きゾーンデータベースの作成 (IPアドレスからドメイン名)
この設定を有効にするには、外部向けDNSサーバを静的IPアドレスにする必要がある。
内部向けDNSサーバの逆引きゾーンデータベースを作成する。
以下の例に記述しているXXやYY等のIPアドレスを、該当するクライアントPCのIPアドレスに変更すること。
sudo vi /var/lib/named/1.168.192.in-addr.arpa.db
# /var/lib/named/1.168.192.in-addr.arpa.dbファイル $TTL 86400 ; @ IN SOA ns.suse.com. root.suse.com. ( 2022041001 ; Serial 例. 作成年月日 + 01(連番)を記述する 3H ; Refresh 1H ; Retry 1W ; Expire 1D ) ; Minimum IN NS ns.suse.com. ; IN PTR suse.com. ; IN A 255.255.255.0 ; XX IN PTR ns.suse.com. ; 内部向けDNSサーバのIPアドレス YY IN PTR pc1.suse.com. ; クライアントPC 1 ZZ IN PTR pc2.suse.com. ; クライアントPC 2 AA IN PTR pc3.suse.com. ; クライアントPC 3
設定ファイルが正常に記述されているかどうかを確認する。
sudo named-checkconf
内部向けDNSサーバの起動
内部向けDNSサーバを起動する。
併せて、ファイアーウォールのポート開放も行う。
sudo systemctl start named.service sudo firewall-cmd --permanent --add-service=dns sudo firewall-cmd --reload
内部向けDNSサーバの停止
内部向けDNSサーバを停止する。
併せて、ファイアーウォールのポートも閉じる。
sudo systemctl stop named.service sudo firewall-cmd --permanent --remove-service=dns sudo firewall-cmd --reload
クライアントPCの設定
まず、ドメイン検索の設定を行う。
- KDEを使用している場合
- [KDEシステム設定]を起動して、[接続]を選択する。
- [接続]画面左の接続名を選択して、[接続]画面右の[IPv4]タブ - [DNSサーバ:]項目に内部向けDNSサーバのIPアドレスを追加する。
- 同様に、[接続]画面右の[IPv4]タブ - [検索ドメイン:]項目に内部向けDNSサーバのドメイン名を入力する。
例えば、DNSサーバ名がns.suse.com
の場合、suse.com
と入力する。
- リゾルバファイルを編集する場合
- /etc/resolv.confファイルにおいて、内部向けDNSサーバのドメイン名を入力する。
- 例えば、DNSサーバ名が
ns.suse.com
の場合、suse.com
と入力する。 sudo vi /etc/resolv.conf
domain suse.com
- または
search suse.com
次に、クライアントPCのネットワークを再起動する。
systemctl
コマンドを使用する場合sudo systemctl restart NetworkManager
nmcli
コマンドを使用する場合- NetworkManagerの全てのインターフェイスを停止した後、それらを起動する。
sudo nmcli networking off && sudo nmcli networking on
- Linuxを再起動する場合
sudo shutdown -r now
ドメイン名の正引きおよび逆引きの確認
内部向けDNSサーバと各クライアントPCの正引きおよび逆引きができるかどうかを確認する。
nslookup ns.suse.com # 内部向けDNSサーバの正引き nslookup pc1.suse.com # クライアントPC 1の正引き nslookup pc2.suse.com # クライアントPC 2の正引き nslookup pc3.suse.com # クライアントPC 3の正引き nslookup 192.168.1.XX # 内部向けDNSサーバの逆引き nslookup 192.168.1.YY # クライアントPC 1の逆引き nslookup 192.168.1.ZZ # クライアントPC 2の逆引き nslookup 192.168.1.AA # クライアントPC 3の逆引き # 再帰問い合わせが無効の場合(recursion項目がnoの場合) dig @<該当PCのIPアドレス> <該当PCのドメイン名> 例1. dig @192.168.10.5 ns.suse.net 例2. dig @192.168.10.6 pc01.suse.net
BINDの設定 : 外部向けDNSの場合
ルートゾーンの更新と自動更新設定
ルートゾーンは、世界に13台しかないトップレベルドメインを管理するDNSサーバのIPアドレスを管理しているファイルである。
まず、ルートゾーン(named.ca)を更新する。
dig . ns @198.41.0.4 +bufsize=1024 > /var/lib/named/chroot/var/named/named.ca
また、各月で、ルートゾーンが最新かどうか確認し、更新されていればルートゾーンの更新およびBINDの再起動を自動的に行うようにするため、
ルートゾーンの自動更新スクリプトを作成する。
※ルートゾーンが更新されていた場合のみ、新旧ルートゾーン情報及び、新旧ルートゾーンの差分情報をroot宛にメールする。
sudo vi named.root_update
#!/bin/bash
new=`mktemp`
errors=`mktemp`
dig . ns @198.41.0.4 +bufsize=1024 > $new 2> $errors
if [ $? -eq 0 ]; then
sort_new=`mktemp`
sort_old=`mktemp`
diff_out=`mktemp`
sort $new > $sort_new
sort /var/named/chroot/var/named/named.ca > $sort_old
diff --ignore-matching-lines=^\; $sort_new $sort_old > $diff_out
if [ $? -ne 0 ]; then
(
echo '-------------------- old named.root --------------------'
cat /var/named/chroot/var/named/named.ca
echo
echo '-------------------- new named.root --------------------'
cat $new
echo '---------------------- difference ----------------------'
cat $diff_out
) | mail -s 'named.root updated' root
cp -f $new /var/named/chroot/var/named/named.ca
chown named. /var/named/chroot/var/named/named.ca
chmod 644 /var/named/chroot/var/named/named.ca
which systemctl > /dev/null 2>&1
if [ $? -eq 0 ]; then
systemctl restart named-chroot > /dev/null
else
/etc/rc.d/init.d/named restart > /dev/null
fi
fi
rm -f $sort_new $sort_old $diff_out
else
cat $errors | mail -s 'named.root update check error' root
fi
rm -f $new $errors
ルートゾーンの更新スクリプトに実行権限を付加する。
sudo chmod 700 named.root_update
ルートゾーンの更新スクリプトを毎月自動実行されるディレクトリに移動する。
sudo mv named.root_update /etc/cron.monthly/
外部向け正引きゾーンデータベースの作成 (ドメイン名からIPアドレス)
この設定を有効にするには、外部向けDNSサーバを静的IPアドレスにする必要がある。
外部向けDNSサーバの正引きゾーンデータベースを作成する。
sudo vi /var/lib/named/suse.com.db.wan
$TTL 86400 @ IN SOA ns1.suse.com. root.suse.com.( 2020010101 ; Serial 7200 ; Refresh 7200 ; Retry 2419200 ; Expire 86400 ) ; Minimum IN NS ns1.suse.com. ; ネームサーバ名 IN MX 10 suse.com. ; MXホスト名(メールサーバを構築する場合のみ) ns1 IN A XXX.XXX.XXX.XXX ; サーバのグローバルIPアドレスを指定(ns1.suse.com用) @ IN A XXX.XXX.XXX.XXX ; サーバのグローバルIPアドレスを指定(suse.com用) www IN A XXX.XXX.XXX.XXX ; サーバのグローバルIPアドレスを指定(www.suse.com用) ftp IN A XXX.XXX.XXX.XXX ; サーバのグローバルIPアドレスを指定(ftp.suse.com用) mail IN A XXX.XXX.XXX.XXX ; サーバのグローバルIPアドレスを指定(mail.suse.com用) suse.com. IN TXT "v=spf1 ip4:XXX.XXX.XXX.XXX ~all" ;サーバのグローバルIPアドレスを指定(メールサーバを構築する場合のみ)
外部向け逆引きゾーンデータベースの作成(IPアドレスからドメイン名)
この設定を有効にするには、外部向けDNSサーバを静的IPアドレスにして、プロバイダから逆引き権限を委譲されている必要がある。
外部向け逆引きゾーンデータベースを作成する。
sudo vi /var/lib/named/xxx.xxx.xxx.xxx.in-addr.arpa.db.wan
$TTL 86400 @ IN SOA ns1.suse.com. root.suse.com.( 2020010101 ; Serial 7200 ; Refresh 7200 ; Retry 2419200 ; Expire 86400 ) ; Minimum IN NS ns1.suse.com. xxx IN PTR suse.com. ; サーバIPアドレス最下位部(xxx.xxx.xxx.xxx)とドメイン名を指定
※注意
ゾーン情報の変更時は、Serial行を年月日と通番2桁(yyyymmddxx)のようにして、必ず、変更前よりも大きな値に変更すること。
例えば、変更前のSerialが2020010101なら、変更後のSerialは2020010102にする。
これにより、後述するセカンダリ側へのゾーン情報の変更が正しく行われるようになる。
外部向けDNSサーバの起動
外部向けDNSサーバを起動する。
併せて、ファイアーウォールのポート開放も行う。
sudo systemctl start named-chroot sudo firewall-cmd --add-service=dns --parmanent sudo firewall-cmd --reload
外部向けDNSサーバの停止
外部向けDNSサーバを停止する。
併せて、ファイアーウォールのポートも閉じる。
sudo systemctl stop named-chroot sudo firewall-cmd --parmanent --remove-service=dns sudo firewall-cmd --reload
ルータのポート開放
ルータ側の設定で、TCP53番ポートおよびUDP53番ポートへのアクセスを外部向けDNSサーバに転送するように設定する。
※注意
ルータのポート開放の設定は、各ルータのマニュアルを参照すること。