9.2 BINDの基本設定
/etc/named.conf
- ゾーンファイル
cat /etc/named.conf
cat: /etc/named.conf: No such file or directory
bindパッケージを入れるとついてくる
yum provides /etc/named.conf
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: ty1.mirror.newmediaexpress.com
* epel: d2lzkl7pfhq30w.cloudfront.net
* extras: ty1.mirror.newmediaexpress.com
* updates: ty1.mirror.newmediaexpress.com
32:bind-9.11.4-26.P2.el7.x86_64 : The Berkeley Internet Name Domain (BIND) DNS (Domain
: Name System) server
Repo : base
Matched from:
Filename : /etc/named.conf
32:bind-9.11.4-26.P2.el7_9.2.x86_64 : The Berkeley Internet Name Domain (BIND) DNS
: (Domain Name System) server
Repo : updates
Matched from:
Filename : /etc/named.conf
32:bind-9.11.4-26.P2.el7_9.3.x86_64 : The Berkeley Internet Name Domain (BIND) DNS
: (Domain Name System) server
Repo : updates
Matched from:
Filename : /etc/named.conf
sudo yum install -y bind
ls -l /etc/named.conf
-rw-r-----. 1 root named 1806 Dec 15 16:33 /etc/named.conf
9.2.1 /etc/named.confの設定
sudo cat /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html
options {
listen-on port 53 { 127.0.0.1; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { localhost; };
/*
- If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
- If you are building a RECURSIVE (caching) DNS server, you need to enable
recursion.
- If your recursive DNS server has a public IP address, you MUST enable access
control to limit queries to your legitimate users. Failing to do so will
cause your server to become part of large scale DNS amplification
attacks. Implementing BCP38 within your network would greatly
reduce such attack surface
*/
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.root.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
//
や/* ... */
がコメント
aclステートメント
Access Control List
設定例
acl locals {
192.168.120.0/24;
192.168.121.0/24;
};
locals
という名前で設定している
定義済みACL:
- any
- none
- localhost
- localnets
includeステートメント
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
外部ファイル読み込み
sudo cat /etc/named.rfc1912.zones
// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
// and http://www.ietf.org/internet-drafts/draft-ietf-dnsop-default-local-zones-02.txt
// (c)2007 R W Franks
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
zone "localhost.localdomain" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "localhost" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "0.in-addr.arpa" IN {
type master;
file "named.empty";
allow-update { none; };
};
optionsステートメント
namedの動作に関する詳細なオプション
https://linuxjm.osdn.jp/html/bind/man5/named.conf.5.html
options {
listen-on port 53 { 127.0.0.1; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { localhost; };
/*
- If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
- If you are building a RECURSIVE (caching) DNS server, you need to enable
recursion.
- If your recursive DNS server has a public IP address, you MUST enable access
control to limit queries to your legitimate users. Failing to do so will
cause your server to become part of large scale DNS amplification
attacks. Implementing BCP38 within your network would greatly
reduce such attack surface
*/
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.root.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
重要なもの抜粋
-
directory "/var/named";
- ゾーンファイルの格納先
- 後述の
zone
ステートメントのfile
設定で指定のファイルの格納先
-
recursion yes;
- 再帰的問い合わせを受けつけるかどうか
- フルリゾルバならyes、権威サーバならnoにする
-
recursive-clients クライアント数;
- 再帰問い合わせの同時接続数
-
max-cache-size キャッシュサイズ;
- キャッシュサイズ(バイト単位)
forward first|only;
-
forwarders { IPアドレス;... };
- フォワーダーとして動かすときに設定する
- 自身がゾーン情報を保有せず、キャッシュにも存在しない問い合わせを別のDNSサーバにたらい回しする機能
- ホームルーターとかに搭載されている
first
: まずフォワード、失敗したら自身で再帰問い合わせonly
: フォワードだけ
-
bindkeys-file "/etc/named.root.key";
- DNSSECで使う鍵
controlsステートメント
namedを操作できるホストのIPアドレスやポート番号
設定例
controls {
inet 127.0.0.1 allow { localhost; };
};
後で実際にアクセス制限してみる
zoneステートメント
options
ステートメントのdirectory
設定から、zone
ステートメントのfile
設定は/var/named/
のファイルを参照する
sudo ls -l /var/named
total 16
drwxrwx---. 2 named named 6 Dec 15 16:32 data
drwxrwx---. 2 named named 6 Dec 15 16:32 dynamic
-rw-r-----. 1 root named 2253 Apr 5 2018 named.ca
-rw-r-----. 1 root named 152 Dec 15 2009 named.empty
-rw-r-----. 1 root named 152 Jun 21 2007 named.localhost
-rw-r-----. 1 root named 168 Dec 15 2009 named.loopback
drwxrwx---. 2 named named 6 Dec 15 16:32 slaves
hint
ヒントファイル: ルートDNSサーバを指定
zone "." IN {
type hint;
file "named.ca";
};
- 教科書的には
named.root
sudo cat /var/named/named.ca
; <<>> DiG 9.11.3-RedHat-9.11.3-3.fc27 <<>> +bufsize=1200 +norec @a.root-servers.net
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46900
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;. IN NS
;; ANSWER SECTION:
. 518400 IN NS a.root-servers.net.
. 518400 IN NS b.root-servers.net.
. 518400 IN NS c.root-servers.net.
. 518400 IN NS d.root-servers.net.
. 518400 IN NS e.root-servers.net.
. 518400 IN NS f.root-servers.net.
. 518400 IN NS g.root-servers.net.
. 518400 IN NS h.root-servers.net.
. 518400 IN NS i.root-servers.net.
. 518400 IN NS j.root-servers.net.
. 518400 IN NS k.root-servers.net.
. 518400 IN NS l.root-servers.net.
. 518400 IN NS m.root-servers.net.
;; ADDITIONAL SECTION:
a.root-servers.net. 518400 IN A 198.41.0.4
b.root-servers.net. 518400 IN A 199.9.14.201
c.root-servers.net. 518400 IN A 192.33.4.12
d.root-servers.net. 518400 IN A 199.7.91.13
e.root-servers.net. 518400 IN A 192.203.230.10
f.root-servers.net. 518400 IN A 192.5.5.241
g.root-servers.net. 518400 IN A 192.112.36.4
h.root-servers.net. 518400 IN A 198.97.190.53
i.root-servers.net. 518400 IN A 192.36.148.17
j.root-servers.net. 518400 IN A 192.58.128.30
k.root-servers.net. 518400 IN A 193.0.14.129
l.root-servers.net. 518400 IN A 199.7.83.42
m.root-servers.net. 518400 IN A 202.12.27.33
a.root-servers.net. 518400 IN AAAA 2001:503:ba3e::2:30
b.root-servers.net. 518400 IN AAAA 2001:500:200::b
c.root-servers.net. 518400 IN AAAA 2001:500:2::c
d.root-servers.net. 518400 IN AAAA 2001:500:2d::d
e.root-servers.net. 518400 IN AAAA 2001:500:a8::e
f.root-servers.net. 518400 IN AAAA 2001:500:2f::f
g.root-servers.net. 518400 IN AAAA 2001:500:12::d0d
h.root-servers.net. 518400 IN AAAA 2001:500:1::53
i.root-servers.net. 518400 IN AAAA 2001:7fe::53
j.root-servers.net. 518400 IN AAAA 2001:503:c27::2:30
k.root-servers.net. 518400 IN AAAA 2001:7fd::1
l.root-servers.net. 518400 IN AAAA 2001:500:9f::42
m.root-servers.net. 518400 IN AAAA 2001:dc3::35
;; Query time: 24 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Thu Apr 05 15:57:34 CEST 2018
;; MSG SIZE rcvd: 811
-
【補】internicが配布しているファイルから仕入れて更新する
- ちょくちょく変わる
- https://www.internic.net/domain/named.root
- 下記コマンドでも更新可能
# dig @m.root-servers.net. ns > /var/named/named.root
master/slave
指定のゾーンに対してマスター/スレーブDNSサーバである
zone "localhost.localdomain" IN {
type master;
file "named.localhost";
allow-update { none; };
};
fileでゾーンファイル指定
sudo cat /var/named/named.localhost
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
スレーブの場合はゾーン転送されてきたデータがバイナリで書き込まれるらしい
人間が読むには、named-compilezone
コマンドで変換する
named.confの設定例
設定変更したらnamed-checkconf
で構文チェック
sudo named-checkconf
(出力なし)
構文に誤りがある場合
cat named.conf
denyディレクティブなんて存在しない
...
controls {
inet 127.0.0.1 deny {localhost;};
};
sudo named-checkconf /etc/named.conf
間違っている箇所を教えてくれる
/etc/named.conf:63: expected 'allow' near 'deny'
間違っている状態で設定再読込するとエラーが出る
sudo rndc reload
rndc: 'reload' failed: unexpected token
HUPシグナル自体は通っちゃうので注意する
sudo systemctl reload named
(出力なし)
9.2.2 rndcコマンド
rndc: remote name daemon control
sudo rndc status
version: BIND 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 (Extended Support Version) <id:7107deb>
running on lpic2-study-1: Linux x86_64 3.10.0-1127.19.1.el7.x86_64 #1 SMP Tue Aug 25 17:23:54 UTC 2020
boot time: Wed, 30 Dec 2020 11:13:03 GMT
last configured: Wed, 30 Dec 2020 11:13:03 GMT
configuration file: /etc/named.conf
CPUs found: 2
worker threads: 2
UDP listeners per interface: 1
number of zones: 103 (97 automatic)
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/900/1000
tcp clients: 2/150
server is up and running
アクセスコントロール
-
リモートで設定可能
- ローカルでも127.0.0.1越し
- controlsステートメントでallow noneを設定して接続拒否してみる
sudo tee -a /etc/named.conf <<EOL
> controls {
> inet 127.0.0.1 allow { none; };
> };
> EOL
設定確認
sudo tail -n 10 /etc/named.conf
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
controls {
inet 127.0.0.1 allow { none; };
};
構文チェックして設定再読込
sudo named-checkconf /etc/named.conf
sudo rndc reload
server reload successful
ちゃんと接続拒否されること確認
sudo rndc status
rndc: recv failed: connection reset
OK
戻しておく
rndc reload
すら通らないのでHUPシグナルを送る
sudo head -n -3 /etc/named.conf | sudo tee /etc/named.conf
pkill -1 named
sudo rndc status
version: BIND 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 (Extended Support Version) <id:7107deb>
running on lpic2-study-1: Linux x86_64 3.10.0-1127.19.1.el7.x86_64 #1 SMP Tue Aug 25 17:23:54 UTC 2020
boot time: Wed, 30 Dec 2020 11:13:03 GMT
last configured: Wed, 30 Dec 2020 11:40:45 GMT
configuration file: /etc/named.conf
CPUs found: 2
worker threads: 2
UDP listeners per interface: 1
number of zones: 103 (97 automatic)
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/900/1000
tcp clients: 2/150
server is up and running
9.3 ゾーンファイルの管理
- hint情報ファイル
- 正引きファイル
- 逆引きファイル
こういうやつ(これは正引きファイル)
sudo cat /var/named/named.localhost
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
9.3.1 リソースレコード
RRs: Resource Record set
-
$TTL 1D
- TTLのデフォルト値を1日に設定している
$TTL 86400
と同義
-
@
- そのドメイン自身
-
rname.invalid.
- 末尾の
.
が重要 - ない場合、
$ORIGIN
の値が補われる
- 末尾の
-
$ORIGIN ドメイン名
- 末尾が
.
のドメイン名
- 末尾が
SOAレコード
https://jprs.jp/glossary/index.php?ID=0194
SOA: Start of Authority
ゾーンの管理情報を指定
dig soa google.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> soa google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39951
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com. IN SOA
;; ANSWER SECTION:
google.com. 59 IN SOA ns1.google.com. dns-admin.google.com. 349398142 900 900 1800 60
;; Query time: 92 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Wed Dec 30 13:06:04 UTC 2020
;; MSG SIZE rcvd: 89
設定ファイルはこういう形になってる
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
ns1.google.com.
: ホスト名-
dns-admin.google.com.
: 管理者メールアドレス@
はホスト名に置換されてしまうので.
に置き換えて書く
-
serial: ゾーン転送用のシリアル番号
- ゾーン転送時、マスターのシリアル番号が進んでいたらスレーブは内容更新
- 日付+2桁の管理番号を用いるのが典型的
-
refresh
- スレーブがマスターのゾーン情報をポーリングする間隔
-
retry
- スレーブがマスターにアクセスできなかったときの再試行までの時間
-
expire
- スレーブがマスターにアクセスできなかったときのゾーン情報破棄までの時間
- 権威サーバーとしての仕事は果たせなくなるが、古すぎる情報を提供し続けるよりはマシ
-
minimum
- ネガティブキャッシュのTTL
NSレコード
DNSサーバを指定
設定はこんな形
NS @
dig ns google.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> ns google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16799
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com. IN NS
;; ANSWER SECTION:
google.com. 21599 IN NS ns2.google.com.
google.com. 21599 IN NS ns4.google.com.
google.com. 21599 IN NS ns3.google.com.
google.com. 21599 IN NS ns1.google.com.
;; Query time: 89 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Wed Dec 30 13:15:40 UTC 2020
;; MSG SIZE rcvd: 111
冗長化している場合、複数
- 外から見てどれがマスターという区別はない
- RRsの設定上もない
;; ANSWER SECTION:
google.com. 21599 IN NS ns2.google.com.
google.com. 21599 IN NS ns4.google.com.
google.com. 21599 IN NS ns3.google.com.
google.com. 21599 IN NS ns1.google.com.
MXレコード
正引きゾーンファイルでのみ使用
メールサーバがメールを送る時に参照するレコード
dig mx google.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> mx google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10335
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com. IN MX
;; ANSWER SECTION:
google.com. 599 IN MX 40 alt3.aspmx.l.google.com.
google.com. 599 IN MX 50 alt4.aspmx.l.google.com.
google.com. 599 IN MX 10 aspmx.l.google.com.
google.com. 599 IN MX 20 alt1.aspmx.l.google.com.
google.com. 599 IN MX 30 alt2.aspmx.l.google.com.
;; Query time: 89 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Wed Dec 30 13:17:58 UTC 2020
;; MSG SIZE rcvd: 147
- (NXとは異なり) プリファレンス値(優先度)を設定する
- 小さい順。この例では
aspmx.l.google.com.
が最優先
;; ANSWER SECTION:
google.com. 599 IN MX 40 alt3.aspmx.l.google.com.
google.com. 599 IN MX 50 alt4.aspmx.l.google.com.
google.com. 599 IN MX 10 aspmx.l.google.com.
google.com. 599 IN MX 20 alt1.aspmx.l.google.com.
google.com. 599 IN MX 30 alt2.aspmx.l.google.com.
あとで割り込みやすいように10刻みにしておくのが慣例
Aレコード/AAAAレコード
正引きゾーンファイルでのみ使用
A 127.0.0.1
AAAA ::1
IPv4/v6アドレス設定
- 【補】AAAAはIPv4アドレス(A)が32ビットなのに対してIPv6アドレスが4倍の128ビットであることに由来するとかなんとか
CNAMEレコード
Canonical Name
host2.example.net. IN CNAME host1.example.net.
ホストの別名定義
他のRRと同居できないので注意: https://tools.ietf.org/html/rfc1912
こういうのは駄目:
podunk.xx. IN NS ns1
IN NS ns2
IN CNAME mary
mary IN A 1.2.3.4
PTRレコード
逆引きゾーンファイルでのみ使用
dig -x 216.58.197.238
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> -x 216.58.197.238
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32877
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;238.197.58.216.in-addr.arpa. IN PTR
;; ANSWER SECTION:
238.197.58.216.in-addr.arpa. 21599 IN PTR nrt13s49-in-f238.1e100.net.
238.197.58.216.in-addr.arpa. 21599 IN PTR nrt13s49-in-f14.1e100.net.
;; Query time: 87 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Wed Dec 30 13:31:30 UTC 2020
;; MSG SIZE rcvd: 126
dig -x 2404:6800:4004:813::200e
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> -x 2404:6800:4004:813::200e
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45818
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;e.0.0.2.0.0.0.0.0.0.0.0.0.0.0.0.3.1.8.0.4.0.0.4.0.0.8.6.4.0.4.2.ip6.arpa. IN PTR
;; ANSWER SECTION:
e.0.0.2.0.0.0.0.0.0.0.0.0.0.0.0.3.1.8.0.4.0.0.4.0.0.8.6.4.0.4.2.ip6.arpa. 21599 IN PTR nrt20s17-in-x0e.1e100.net.
;; Query time: 144 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Wed Dec 30 13:32:06 UTC 2020
;; MSG SIZE rcvd: 140
この部分:
238.197.58.216.in-addr.arpa. 21599 IN PTR nrt13s49-in-f238.1e100.net.
238.197.58.216.in-addr.arpa. 21599 IN PTR nrt13s49-in-f14.1e100.net.
e.0.0.2.0.0.0.0.0.0.0.0.0.0.0.0.3.1.8.0.4.0.0.4.0.0.8.6.4.0.4.2.ip6.arpa. 21599 IN PTR nrt20s17-in-x0e.1e100.net.
- IPv4アドレス: オクテットごとにひっくり返して
.in-addr.arpa.
をつける - IPv6アドレス: 0の省略記法を展開し、ニブルごとにひっくり返して、
.ip6.arpa.
をつける
ゾーンファイルの実例
略
構文チェック: named-checkzone
sudo named-checkzone -w /var/named $(hostname -d) named.localhost
zone asia-northeast1-b.c.lpic2-study.internal/IN: loaded serial 0
OK