いきなり大物です!dnsサーバを立ててみましょう。最近のdnsサーバはいろんな機能があるので、1回では済みそうにありません。以下のように分けて書いておこうと思います。
- 基本的な設定で構築し動作確認
- サーバ証明書取得機能追加
- 迷惑 (なりすまし) メール対応機能追加
- 権威dnsサーバのdnssec対応
基本的な設定で構築
インストールするソフトウェアは一般的なbindを使います。
また、パッケージによるchroot構成もできますが、今回は使いません。理由はSELinuxと同じで、使いにくい割に効果は今ひとつだからです。
bindは権限のないnamedユーザで起動するので、万が一bindがクラックされて侵入されたとしてもnamedユーザ権限の範囲でしかシステムをいじることができないでしょう。
[root@ace ~]# dnf install bind bind-utils
メタデータの期限切れの最終確認: 3:05:10 時間前の 2020年02月18日 20時41分25秒 に 実施しました。
依存関係が解決しました。
================================================================================
パッケージ Arch バージョン リポジトリー サイズ
================================================================================
インストール:
bind x86_64 32:9.11.4-26.P2.el8 AppStream 2.1 M
bind-utils x86_64 32:9.11.4-26.P2.el8 AppStream 436 k
依存関係のインストール:
bind-libs x86_64 32:9.11.4-26.P2.el8 AppStream 170 k
bind-libs-lite x86_64 32:9.11.4-26.P2.el8 AppStream 1.1 M
bind-license noarch 32:9.11.4-26.P2.el8 AppStream 99 k
python3-bind noarch 32:9.11.4-26.P2.el8 AppStream 146 k
トランザクションの概要
================================================================================
インストール 6 パッケージ
ダウンロードサイズの合計: 4.1 M
インストール済みのサイズ: 10 M
これでよろしいですか? [y/N]: y
:
省略
:
インストール済み:
bind-32:9.11.4-26.P2.el8.x86_64
bind-utils-32:9.11.4-26.P2.el8.x86_64
bind-libs-32:9.11.4-26.P2.el8.x86_64
bind-libs-lite-32:9.11.4-26.P2.el8.x86_64
bind-license-32:9.11.4-26.P2.el8.noarch
python3-bind-32:9.11.4-26.P2.el8.noarch
完了しました!
[root@ace ~]#
dnfコマンドでbindとbind-utilsのパッケージをインストールします。bind-utilsにはdns関連のコマンドが入っていたんじゃないかな。
さっそく、設定ファイルの編集です。
[root@ace ~]# cp -p /etc/named.conf /etc/named.conf.orig
[root@ace ~]# vi /etc/named.conf
[root@ace ~]#
[root@ace ~]# 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.
//
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
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";
secroots-file "/var/named/data/named.secroots";
recursing-file "/var/named/data/named.recursing";
allow-query { any; };
/*
- 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 no;
dnssec-enable yes;
dnssec-validation yes;
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
/* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
include "/etc/crypto-policies/back-ends/bind.config";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
channel query-log {
file "/var/log/named/query.log";
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
channel update-log {
file "/var/log/named/update.log";
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
channel xfer-log {
file "/var/log/named/xfer.log";
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
channel default-log {
file "/var/log/named/default.log";
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category queries { query-log; };
category update { update-log; };
category xfer-in { xfer-log; };
category xfer-out { xfer-log; };
category lame-servers { null; };
category default { default-log; };
};
include "/etc/named.root.key";
view "internal" {
match-clients { localhost; localnets; };
allow-query { localhost; localnets; };
allow-recursion { localhost; localnets; };
allow-query-cache { localhost; localnets; };
recursion yes;
zone "." IN {
type hint;
file "named.ca";
};
zone "zeke.ne.jp" {
type master;
file "internal/zeke.ne.jp.zone";
allow-transfer { localhost; localnets; };
};
zone "lo.zeke.ne.jp" {
type master;
file "internal/lo.zeke.ne.jp.zone";
allow-transfer { localhost; localnets; };
};
zone "0.0.a.c.3.0.d.c.0.c.2.0.1.0.0.2.ip6.arpa" {
type master;
file "internal/lo.zeke.ne.jp.rev6";
allow-transfer { localhost; localnets; };
};
zone "1.168.192.in-addr.arpa" {
type master;
file "internal/lo.zeke.ne.jp.rev";
allow-transfer { localhost; localnets; };
};
include "/etc/named.rfc1912.zones";
:
省略
:
};
view "external" {
match-clients { any; };
allow-query { any; };
allow-recursion { none; };
allow-query-cache { none; };
recursion no;
zone "zeke.ne.jp" {
type master;
file "external/zeke.ne.jp.zone";
allow-transfer { none; };
};
:
省略
:
};
[root@ace ~]#
optionsステートメントでは「listen-on port 53 { any; };」「listen-on-v6 port 53 { any; };」「allow-query { any; };」を変更してます。誰からでの問い合わせを受ける!
また「recursion no;」として、再帰問い合わせを行わないにしてます。yesだと自分で管理していないドメインに対してもIPアドレスを調べてくれるようになります。
デフフォルトでdnssecが有効になっています。これは、DNSキャッシュサーバとして他のドメインの問い合わせを行ったときに、証明書で正当なものかをチェックしてくれます。これはそのままにしておきます。
loggingステートメントではログをいっぱい出すように変更しました。chrootをかけてると/var/logにログをはけないと思います。
viewステートメントで、内部向けと外部向けの定義を分けています。これは内部向けにはプライベートIPアドレスを外部向けにはグローバルIPアドレスを返答するためです。IPv6みたいにみんなグローバルアドレスだったら分ける必要がないのに。面倒ですよね。
内部向けは「match-clients { localhost; localnets; };」で内部ネットワーク限定にして、「recursion yes;」再帰問い合わせ有り、「allow-query」「allow-recursion」「allow-query-cache」も許可にしてます。
また、各ゾーンファイルは以下の通り
[root@ace ~]# cat /var/named/internal/zeke.ne.jp.zone
$TTL 3600
@ IN SOA ns.zeke.ne.jp. root.ns.zeke.ne.jp. (
2020021701 ; Serial
3600 ; Refresh after 1 hour
600 ; Retry after 10 minute
1209600 ; Expire after 2 weeks
3600 ) ; Minimum TTL of 1 hour
;
IN NS ns.zeke.ne.jp.
IN NS joeker.zeke.ne.jp.
;
IN A 192.168.1.4
IN AAAA 2001:2c0:cd03:ca00::4
IN MX 10 mail.zeke.ne.jp.
;
ns IN A 192.168.1.4
IN AAAA 2001:2c0:cd03:ca00::4
IN MX 10 mail.zeke.ne.jp.
;
joeker IN A 192.168.1.4
IN AAAA 2001:2c0:cd03:ca00::4
IN MX 10 mail.zeke.ne.jp.
;
mail IN A 192.168.1.4
IN MX 10 mail.zeke.ne.jp.
;
www IN CNAME ns
irc IN CNAME ns
ftp IN CNAME ns
redh IN CNAME ns
shoot IN CNAME ns
blog IN CNAME ns
matomo IN CNAME ns
info IN CNAME ns
*.info IN CNAME ns
;
myhome IN A 192.168.1.4
IN AAAA 2001:2c0:cd03:ca00::4
IN MX 10 mail.zeke.ne.jp.
;
ace IN A 192.168.1.1
IN AAAA 2001:2c0:cd03:ca00::ace
IN MX 10 mail.zeke.ne.jp.
[root@ace ~]# cat /var/named/internal/lo.zeke.ne.jp.zone
$TTL 86400
@ IN SOA ns.lo.zeke.ne.jp. root.ns.lo.zeke.ne.jp. (
2020021701 ; Serial
3600 ; Refresh after 1 hour
600 ; Retry after 1 minute
1209600 ; Expire after 2 weeks
86400 ) ; Minimum TTL of 1 day
IN NS ns.lo.zeke.ne.jp.
;
IN A 192.168.1.4
IN AAAA 2001:2c0:cd03:ca00::4
IN MX 10 mail.zeke.ne.jp.
;
ns IN A 192.168.1.4
IN AAAA 2001:2c0:cd03:ca00::4
IN MX 10 mail.zeke.ne.jp.
;
mail IN A 192.168.1.4
IN MX 10 mail.zeke.ne.jp.
;
www IN CNAME ns
irc IN CNAME ns
ftp IN CNAME ns
redh IN CNAME ns
shoot IN CNAME ns
blog IN CNAME ns
matomo IN CNAME ns
info IN CNAME ns
*.info IN CNAME ns
;
ace IN A 192.168.1.1
IN AAAA 2001:2c0:cd03:ca00::ace
IN MX 10 mail.zeke.ne.jp.
;
vm IN A 192.168.1.2
IN AAAA 2001:2c0:cd03:ca00::2
IN MX 10 mail.zeke.ne.jp.
;
ara IN A 192.168.1.3
IN AAAA 2001:2c0:cd03:ca00::3
IN MX 10 mail.zeke.ne.jp.
;
myhome IN A 192.168.1.4
IN AAAA 2001:2c0:cd03:ca00::4
IN MX 10 mail.zeke.ne.jp.
[root@ace ~]# cat /var/named/internal/lo.zeke.ne.jp.rev
$TTL 86400
@ IN SOA ns.lo.zeke.ne.jp. root.ns.lo.zeke.ne.jp. (
2020021701 ; Serial
3600 ; Refresh after 1 hour
600 ; Retry after 1 minute
1209600 ; Expire after 1 weeks
86400 ) ; Minimum TTL of 1 day
IN NS ns.lo.zeke.ne.jp.
IN NS joeker.lo.zeke.ne.jp.
;
0 IN PTR lo.zeke.ne.jp.
1 IN PTR ace.lo.zeke.ne.jp.
2 IN PTR vm.lo.zeke.ne.jp.
3 IN PTR ara.lo.zeke.ne.jp.
4 IN PTR myhome.lo.zeke.ne.jp.
[root@ace ~]# cat /var/named/internal/lo.zeke.ne.jp.rev6
$TTL 86400
$ORIGIN 0.0.a.c.3.0.d.c.0.c.2.0.1.0.0.2.ip6.arpa.
@ IN SOA ns.lo.zeke.ne.jp. root.ns.lo.zeke.ne.jp. (
2019051801 ; Serial
3600 ; Refresh after 1 hour
600 ; Retry after 1 minute
1209600 ; Expire after 1 weeks
86400 ) ; Minimum TTL of 1 day
IN NS ns.lo.zeke.ne.jp.
IN NS joeker.lo.zeke.ne.jp.
;
$ORIGIN 0.0.0.0.0.0.0.0.0.0.0.0.0.0.a.c.3.0.d.c.0.c.2.0.1.0.0.2.ip6.arpa.
;
0.0.0.0 IN PTR lo.zeke.ne.jp.
e.c.a.0 IN PTR ace.lo.zeke.ne.jp.
2.0.0.0 IN PTR vm.lo.zeke.ne.jp.
3.0.0.0 IN PTR ara.lo.zeke.ne.jp.
4.0.0.0 IN PTR myhome.lo.zeke.ne.jp.
もっとたくさんホストは定義してありますが、省略です。ポイントとしてネームサーバとメールサーバはAレコードで明示的にIPアドレスを書いておかないといけなかったと思います。
内部向けは、ローカルな独自ドメインlo.zeke.ne.jpに逆引きの設定も入れてます。
viewセクションで外部向けは「match-clients { any; };」でどこからの問い合わせもOK!、「recursion no;」で再帰問い合わせなし、「allow-query」は許可、「allow-recursion」「allow-query-cache」は不許可にしてます。
[root@ace ~]# cat /var/named/external/zeke.ne.jp.zone
$TTL 3600
@ IN SOA ns.zeke.ne.jp. root.ns.zeke.ne.jp. (
2020021701 ; Serial
3600 ; Refresh after 1 hour
600 ; Retry after 10 minute
1209600 ; Expire after 2 weeks
3600 ) ; Minimum TTL of 1 hour
;
IN NS ns.zeke.ne.jp.
IN NS joeker.zeke.ne.jp.
;
IN A 203.152.220.46
IN AAAA 2001:2c0:cd03:ca00:0:0:0:4
IN MX 10 mail.zeke.ne.jp.
;
ns IN A 203.152.220.46
IN AAAA 2001:2c0:cd03:ca00:0:0:0:4
IN MX 10 mail.zeke.ne.jp.
;
joeker IN A 203.152.220.46
IN AAAA 2001:2c0:cd03:ca00:0:0:0:4
IN MX 10 mail.zeke.ne.jp.
;
mail IN A 203.152.220.46
IN MX 10 mail.zeke.ne.jp.
;
www IN CNAME ns
irc IN CNAME ns
ftp IN CNAME ns
redh IN CNAME ns
shoot IN CNAME ns
blog IN CNAME ns
matomo IN CNAME ns
info IN CNAME ns
*.info IN CNAME ns
;
myhome IN A 203.152.220.46
IN AAAA 2001:2c0:cd03:ca00:0:0:0:4
IN MX 10 mail.zeke.ne.jp.
;
ace IN AAAA 2001:2c0:cd03:ca00:0:0:0:ace
IN MX 10 mail.zeke.ne.jp.
再帰問い合わせなしなので、このゾーンの内容しか返答しません。
ディレクトリ、ファイルの権限変更
chrootを使わないので、各ファイルの権限はちゃんとチェックしておきましょう。
[root@ace ~]# ls -l /etc/named.conf
-rw-r----- 1 root named 4409 2月 19 20:48 /etc/named.conf
[root@ace ~]#
[root@ace ~]# ls -alR /var/named/internal/
/var/named/internal/:
合計 28
drwxr-x--- 2 root named 178 2月 19 01:10 .
drwxrwx--T 7 root named 159 2月 19 03:07 ..
-rw-r----- 1 root named 1535 2月 19 00:57 lo.zeke.ne.jp.rev
-rw-r----- 1 root named 964 2月 19 00:58 lo.zeke.ne.jp.rev6
-rw-r----- 1 root named 3230 2月 19 01:09 lo.zeke.ne.jp.zone
-rw-r----- 1 root named 880 2月 19 01:10 zeke.ne.jp.zone
:
[root@ace ~]#
[root@ace ~]# ls -alR /var/named/external/
/var/named/external/:
合計 16
drwxr-x--- 2 root named 101 2月 19 01:25 .
drwxrwx--T 7 root named 159 2月 19 03:07 ..
-rw-r----- 1 root named 1415 2月 19 01:24 zeke.ne.jp.zone
:
[root@ace ~]#
[root@ace ~]# ls -alR /var/log/named/
/var/log/named/:
合計 8
drwxr-xr-x 2 named named 56 2月 19 02:38 .
drwxr-xr-x 9 root root 4096 2月 19 00:38 ..
:
[root@ace ~]#
「/etc/named.conf」は秘密情報が入るので、rootは読み書きnamedユーザ読むだけにしています。ゾーンファイルやそのディレクトリは、公開情報しか書かれていませんが、同様にrootは読み書きnamedユーザ読むだけです。
ログディレクトリは、namedユーザで書き込めるようにしておきましょう。
動作確認
[root@ace ~]# named-checkconf /etc/named.conf
[root@ace ~]#
[root@ace ~]# named-checkzone "zeke.ne.jp" /var/named/internal/zeke.ne.jp.zone
zone zeke.ne.jp/IN: loaded serial 2020021701
OK
[root@ace ~]# named-checkzone "lo.zeke.ne.jp" /var/named/internal/lo.zeke.ne.jp.zone
zone lo.zeke.ne.jp/IN: loaded serial 2020021701
OK
[root@ace ~]# named-checkzone "lo.zeke.ne.jp" /var/named/internal/lo.zeke.ne.jp.zone
zone lo.zeke.ne.jp/IN: loaded serial 2020021701
OK
[root@ace ~]# named-checkzone "0.0.a.c.3.0.d.c.0.c.2.0.1.0.0.2.IP6.ARPA" /var/named/internal/lo.zeke.ne.jp.rev6
zone 0.0.a.c.3.0.d.c.0.c.2.0.1.0.0.2.IP6.ARPA/IN: loaded serial 2019051801
OK
[root@ace ~]# named-checkzone "1.168.192.IN-ADDR.ARPA" /var/named/internal/lo.zeke.ne.jp.rev
zone 1.168.192.IN-ADDR.ARPA/IN: loaded serial 2020021701
OK
[root@ace ~]# named-checkzone "zeke.ne.jp" /var/named/external/zeke.ne.jp.zone
zone zeke.ne.jp/IN: loaded serial 2020021701
OK
[root@ace ~]#
まずは、「/etc/named.conf」とゾーンファイルのチェックです。ほとんど現行からのコピーなので問題ありませんね。
[root@ace ~]# systemctl is-enabled named
disabled
[root@ace ~]# systemctl enable named
Created symlink /etc/systemd/system/multi-user.target.wants/named.service → /usr/lib/systemd/system/named.service.
[root@ace ~]# systemctl start named
[root@ace ~]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor prese>
Active: active (running) since Wed 2020-02-19 22:59:37 JST; 6s ago
Process: 1612 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (co>
Process: 1609 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "y>
Main PID: 1614 (named)
Tasks: 4 (limit: 25027)
Memory: 78.4M
CGroup: /system.slice/named.service
mq1614 /usr/sbin/named -u named -c /etc/named.conf
2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: automatic empty zone: view inte>
2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: automatic empty zone: view inte>
2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: none:103: 'max-cache-size 90%' >
2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: set up managed keys zone for vi>
2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: none:103: 'max-cache-size 90%' >
2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: configuring command channel fro>
2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: command channel listening on 12>
2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: configuring command channel fro>
2月 19 22:59:37 ace.lo.zeke.ne.jp named[1614]: command channel listening on ::>
2月 19 22:59:37 ace.lo.zeke.ne.jp systemd[1]: Started Berkeley Internet Name D>
[root@ace ~]#
「systemctl is-enabled named」コマンドで、自動起動が無効になっていることを確認したので、「systemctl enable named」コマンドで有効にしておきます。
「systemctl start named」コマンドでbindを起動、「systemctl status named」コマンドでステータスを確認。「active (running)」とあるので、無事起動しています。
[root@ace ~]# nslookup
> server 127.0.0.1
Default server: 127.0.0.1
Address: 127.0.0.1#53
> ns.zeke.ne.jp
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: ns.zeke.ne.jp
Address: 192.168.1.4
Name: ns.zeke.ne.jp
Address: 2001:2c0:cd03:ca00::4
> server ::1
Default server: ::1
Address: ::1#53
> ns.zeke.ne.jp
Server: ::1
Address: ::1#53
Name: ns.zeke.ne.jp
Address: 192.168.1.4
Name: ns.zeke.ne.jp
Address: 2001:2c0:cd03:ca00::4
> google.com
Server: ::1
Address: ::1#53
Non-authoritative answer:
Name: google.com
Address: 172.217.31.142
Name: google.com
Address: 2404:6800:4004:808::200e
> exit
[root@ace ~]#
「nslookup」コマンドで、ns.zeke.ne.jpのホスト名からIPアドレスが引けるかを確認します。IPv4&IPv6ともに大丈夫なようですね。
外部のドメイン google.comも引けるので、再帰問い合わせが有効であることも確認できました。
Firewallの設定変更
[root@ace ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@ace ~]#
[root@ace ~]# firewall-cmd --permanent --add-service=dns
success
[root@ace ~]#
[root@ace ~]# firewall-cmd --reload
success
[root@ace ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3
sources:
services: dns
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@ace ~]#
「firewall-cmd –permanent –add-service=dns」コマンドで、ファイヤーウォールにdnsサービスが疎通できるように穴を開けときます。ただし、まだルータの設定を変更していないので、外部からの問い合わせには答えられませんが。
お勧めのKindle本です!
コメント
はじめまして、
アリと申します。
お名前ドットコムで独自のドメイン取得し、自宅でDNSサーバを構築して、お名前ドットコムで取得したドメインを自宅のDNSサーバと連携して、メールサーバーやウェブサーバの構築したいですが、お名前ドットコムと自宅サーバでどのように設定する必要がありますか。
ISPから固定IPアドレスも取得しています。
当サイトに公開されたDNSサーバの構築参考にしてローカルで名前解決できるところまで
出来てます。
お手数をおかけしますが、ご教授いただければ幸いです。
よろしくお願いいたします。
コメントありがとうございます。
DNSサーバの設定ができているのなら、以下の2つが必要になります。
・自宅のDNSサーバを固定IPアドレスで外部に公開すること。
・お名前ドットコムで取得したドメインとDNSサーバのIPアドレスを紐付ける(権限の移譲)こと。
お名前ドットコムのヘルプで見ると、ここのページが参考になるかと思います。
https://help.onamae.com/answer/8075