Changes in title
+FreeBSD 12で自宅サーバの構築 DNS編
Changes in tags
@@ -0,0 +1,540 @@
+## はじめに
+FreeBSD 12を使用した自宅サーバの構築を行った。FreeBSD 12はリリースされて間もない状態ですが、カーネルに標準でVIMAGEが取り込まれDNSの外向きと、内向きを別々のシステム(jail+VIMAGE)が同一ホストで構築できることから採用することにしました。その時の構築手順を備忘録の意味も含め、具体的にいくつかに渡り説明する。
+
+* [基本システム編その1](https://qiita.com/Chun3/items/2f891e5993c91b58ae5c)
+ - 背景
+ - 基本のインストール
+ - 日本語環境の設定
+* [基本システム編その2](https://qiita.com/Chun3/items/1e8fe5071c4a78d37e66)
+ - セキュリティ
+ - ftpサーバ
+* [基本システム編その3](https://qiita.com/Chun3/items/e5cc6a69542153649dc0)
+ - jail
+ - 基本システム編おわり
+* [jail内基本システム編](https://qiita.com/Chun3/items/4b11b9acdd080ecdab6c)
+ - 基本の設定(jail1・jail2共通)
+ - 基本の設定(jail1・jail2共通)
+* [DNS編](https://qiita.com/Chun3/items/)(この記事)
+ - DNSの構築におけるこれまでの問題
+ - bind9インストール
+ - NTPサーバ
+* Let's Encrypt編
+* Webサーバ編
+* メールサーバ編
+* ファイルサーバ編
+
+## DNSの構築におけるこれまでの問題
+DNSは、今回のサーバー再構築のトリガーになった機能である。従来からbind9を使用し今回も使用するが、従来は以下のような設定を行っていた。
+
+```/usr/local/etc/namedb/named.conf
+include "/usr/local/etc/namedb/rndc.key";
+controls {
+ inet 127.0.0.1 port 953 allow {127.0.0.1;} keys {"rndc-key";};
+};
+
+acl localnet {
+ 192.168.1.0/24;
+ 127.0.0.1;
+};
+
+options {
+ directory "/usr/local/etc/namedb";
+ pid-file "/var/run/named/pid";
+ dump-file "/var/dump/named_dump.db";
+ statistics-file "/var/stats/named.stats";
+ listen-on-v6 { none; };
+ allow-transfer { localhost; localnet; };
+};
+
+// lan側の設定
+view "internal" {
+ match-clients { localnet; };
+ recursion yes;
+ // ルートのゾーンファイル
+ zone "." {
+ type hint;
+ file "/usr/local/etc/namedb/named.root";
+ };
+ // localhost正引き
+ zone "localhost" {
+ type master;
+ file "/usr/local/etc/namedb/master/localhost.zone";
+ };
+ // localhost逆引き
+ zone "0.0.127.in-addr.arpa" {
+ type master;
+ file "/usr/local/etc/namedb/master/0.0.127.rev";
+ };
+ // 自ドメイン正引き
+ zone "example.jp" {
+ type master;
+ file "/usr/local/etc/namedb/master/example.jp.local.zone";
+ };
+ // 自ドメイン逆引き
+ zone "1.168.192.in-addr.arpa" {
+ type master;
+ file "/usr/local/etc/namedb/master/1.168.192.rev";
+ };
+};
+
+// wan側の設定
+view "external" {
+ match-clients {any;};
+ recursion no;
+ // 自ドメイン正引き
+ zone "example.jp" {
+ type master;
+ file "/usr/local/etc/namedb/master/example.jp.zone";
+ };
+};
+```
+
+この設定で外部へのドメイン情報の提供と、内部へのドメイ情報の提供を同居して運用ですることができた。
+問題が発生したのは、固定IPアドレスを2個取得し、セカンダリDNSを運用したときである。
+セカンダリとマスタはローカルネットで接続されている(ルータの関係で外部アドレスでの接続ができない)状態で、ゾーンファイル情報をマスタからセカンダリに提供した時である。
+セカンダリでは、外部向けexample.jpと内部向けexample.jpのゾーンファイル情報がどちらも内部向けになってしまった。
+予想では、ローカルネットで接続されているためセカンダリからマスタに要求したときは内部向けも、外部向けも要求元(セカンダリ)が内部から接続しているため、内部ゾーンファイル情報が送られたためと思われる。
+解決策が見つからなかったので、手動でドメイン情報をコピーして運用していた。
+次に発生した問題はlet's encryptの認証にDNSを使用したときである。同様の理由で外部向けのTXTレコードを設定できなかった。
+これもゾーンファイルをリンクするなどして回避できたが、最終的な解決策は、外部向けと内部向けのDNSを分けることと考え、今回のサーバ再構築となった。
+
+## bind9インストール
+###jail1・jail2共通
+前置きが長くなったがbind9をインストールする。
+ネットワークの前提条件を以下に示す。(IPアドレスは有り得ない値に設定しています)なお、静的NAT設定はルータのwan-IPアドレスに届いたパケットをlan-IPアドレスに割り当てることとする。
+
+| 項目 | 内容 | 静的NAT設定 wan → lan|
+|:-:|:-:|:-:|
+|ドメイン名|example.jp| |
+|lan側のネットワークアドレス|192.168.1.0/24| |
+|IPアドレス1|111.222.333.100| 192.168.1.41 |
+|IPアドレス2|111.222.333.200| 192.168.1.43 |
+
+```
+jail1 /root # pkg install bind913
+Updating FreeBSD repository catalogue...
+FreeBSD repository is up to date.
+All repositories are up to date.
+Updating database digests format: 100%
+The following 11 package(s) will be affected (of 0 checked):
+
+New packages to be INSTALLED:
+ bind913: 9.13.6_3
+ libxml2: 2.9.8
+ python27: 2.7.15
+ readline: 7.0.5
+ gettext-runtime: 0.19.8.1_2
+ libidn2: 2.1.1
+ libunistring: 0.9.10_1
+ py27-ply: 3.11
+ py27-setuptools: 40.8.0
+ json-c: 0.13.1
+ lmdb: 0.9.23,1
+
+Number of packages to be installed: 11
+
+The process will require 137 MiB more space.
+20 MiB to be downloaded.
+[jail1] [1/11] Fetching bind913-9.13.6_3.txz: 100% 7 MiB 188.6kB/s 00:38
+[jail1] [2/11] Fetching libxml2-2.9.8.txz: 100% 818 KiB 167.6kB/s 00:05
+[jail1] [3/11] Fetching python27-2.7.15.txz: 100% 11 MiB 201.1kB/s 00:55
+[jail1] [4/11] Fetching readline-7.0.5.txz: 100% 332 KiB 170.2kB/s 00:02
+[jail1] [5/11] Fetching gettext-runtime-0.19.8.1_2.txz: 100% 149 KiB 153.0kB/s 00:01
+[jail1] [6/11] Fetching libidn2-2.1.1.txz: 100% 104 KiB 106.9kB/s 00:01
+[jail1] [7/11] Fetching libunistring-0.9.10_1.txz: 100% 522 KiB 133.6kB/s 00:04
+[jail1] [8/11] Fetching py27-ply-3.11.txz: 100% 127 KiB 129.8kB/s 00:01
+[jail1] [9/11] Fetching py27-setuptools-40.8.0.txz: 100% 476 KiB 243.5kB/s 00:02
+[jail1] [10/11] Fetching json-c-0.13.1.txz: 100% 56 KiB 57.4kB/s 00:01
+[jail1] [11/11] Fetching lmdb-0.9.23,1.txz: 100% 94 KiB 95.9kB/s 00:01
+Checking integrity... done (0 conflicting)
+[jail1] [1/11] Installing readline-7.0.5...
+[jail1] [1/11] Extracting readline-7.0.5: 100%
+[jail1] [2/11] Installing gettext-runtime-0.19.8.1_2...
+[jail1] [2/11] Extracting gettext-runtime-0.19.8.1_2: 100%
+[jail1] [3/11] Installing python27-2.7.15...
+[jail1] [3/11] Extracting python27-2.7.15: 100%
+[jail1] [4/11] Installing libunistring-0.9.10_1...
+[jail1] [4/11] Extracting libunistring-0.9.10_1: 100%
+[jail1] [5/11] Installing py27-setuptools-40.8.0...
+[jail1] [5/11] Extracting py27-setuptools-40.8.0: 100%
+[jail1] [6/11] Installing libxml2-2.9.8...
+[jail1] [6/11] Extracting libxml2-2.9.8: 100%
+[jail1] [7/11] Installing libidn2-2.1.1...
+[jail1] [7/11] Extracting libidn2-2.1.1: 100%
+[jail1] [8/11] Installing py27-ply-3.11...
+[jail1] [8/11] Extracting py27-ply-3.11: 100%
+[jail1] [9/11] Installing json-c-0.13.1...
+[jail1] [9/11] Extracting json-c-0.13.1: 100%
+[jail1] [10/11] Installing lmdb-0.9.23,1...
+[jail1] [10/11] Extracting lmdb-0.9.23,1: 100%
+[jail1] [11/11] Installing bind913-9.13.6_3...
+[jail1] [11/11] Extracting bind913-9.13.6_3: 100%
+Message from python27-2.7.15:
+
+===========================================================================
+
+Note that some standard Python modules are provided as separate ports
+as they require additional dependencies. They are available as:
+
+bsddb databases/py-bsddb
+gdbm databases/py-gdbm
+sqlite3 databases/py-sqlite3
+tkinter x11-toolkits/py-tkinter
+
+===========================================================================
+Message from bind913-9.13.6_3:
+
+**********************************************************************
+* _ _____ _____ _____ _ _ _____ ___ ___ _ _ *
+* / \|_ _|_ _| ____| \ | |_ _|_ _/ _ \| \ | | *
+* / _ \ | | | | | _| | \| | | | | | | | | \| | *
+* / ___ \| | | | | |___| |\ | | | | | |_| | |\ | *
+* /_/ \_\_| |_| |_____|_| \_| |_| |___\___/|_| \_| *
+* *
+* BIND requires configuration of rndc, including a "secret" key. *
+* The easiest, and most secure way to configure rndc is to run *
+* 'rndc-confgen -a' to generate the proper conf file, with a new *
+* random key, and appropriate file permissions. *
+* *
+* The /usr/local/etc/rc.d/named script will do that for you. *
+* *
+* If using syslog to log the BIND9 activity, and using a *
+* chroot'ed installation, you will need to tell syslog to *
+* install a log socket in the BIND9 chroot by running: *
+* *
+* # sysrc altlog_proglist+=named *
+* *
+* And then restarting syslogd with: service syslogd restart *
+* *
+* *
+* THIS IS A DEVELOPMENT VERSION OF BIND, IT MAY EAT YOUR DATA *
+* *
+* *
+* *
+**********************************************************************
+```
+
+最初に使用宣言
+
+```sh:/etc/rc.conf
+named_enable="YES"
+```
+
+rndcの設定
+
+```
+jail1 /root # cd /usr/local/etc/namedb
+jail1 /usr/local/etc/namedb # rndc-confgen >rndc.conf
+jail1 /usr/local/etc/namedb # cp rndc.conf rndc_key
+```
+
+rndc.confの前半のみに編集する。(後半はコメントになっているので特に編集はしなくてもよい。)
+```/usr/local/etc/namedb/rndc.conf
+key "rndc-key" {
+ algorithm hmac-sha256;
+ secret "+RRgAOIR71bNy6wZ9YabcdefgihjzOepeEjzwiiZNyI=";
+};
+
+options {
+ default-key "rndc-key";
+ default-server 127.0.0.1;
+ default-port 953;
+};
+```
+
+rndc_keyは後半のkey部分のみを取り出してnamed.confにincludeできるようにする。
+
+```sh:/usr/local/etc/namedb/rndc_key
+key "rndc-key" {
+ algorithm hmac-sha256;
+ secret "+RRgAOIR71bNy6wZ9YabcdefgihjzOepeEjzwiiZNyI=";
+};
+```
+
+設定は、これまでの設定を分けるだけである。
+### jail1(外向き)の設定
+
+```/usr/local/etc/namedb/named.conf
+include "/usr/local/etc/namedb/rndc_key";
+controls {
+ inet 127.0.0.1 port 953 allow {127.0.0.1;} keys {"rndc-key";};
+};
+
+options {
+ directory "/usr/local/etc/namedb/working";
+ pid-file "/var/run/named/pid";
+ dump-file "/var/dump/named_dump.db";
+ statistics-file "/var/stats/named.stats";
+ listen-on-v6 { none; };
+ allow-transfer { 192.168.1.0/24; };
+};
+
+// wan側の設定
+// 自ドメイン正引き
+zone "example.jp" {
+ type master;
+ file "/usr/local/etc/namedb/master/example.jp.zone";
+};
+```
+
+ゾーンファイル
+
+```/usr/local/etc/namedb/master/example.jp.zone
+$TTL 3600
+
+@ IN SOA ns1.example.jp. root.example.jp. (
+ 20190020101 ; Serial
+ 3600 ; Refresh
+ 900 ; Retry
+ 3600000 ; Expire
+ 3600 ; Minimum
+ )
+ IN NS ns1.example.jp.
+ IN NS ns2.example.jp.
+ IN MX 10 mail.example.jp.
+ IN A 111.222.333.100
+ns1 IN A 111.222.333.100
+ns2 IN A 111.222.333.200
+mail IN A 111.222.333.100
+www IN CNAME ns1.example.jp.
+www2 IN CNAME ns2.example.jp.
+ftp IN CNAME ns1.example.jp.
+```
+
+リゾルバの設定は、内部DNSサーバに設定する
+
+```/etc/resolv.conf
+search example.jp
+nameserver 192.168.1.42
+```
+
+開始する。
+
+```
+jail1 /root # service named start
+Starting named.
+```
+
+### jail2(内向き)の設定
+
+```/usr/local/etc/namedb/named.conf
+include "/usr/local/etc/namedb/rndc_key";
+controls {
+ inet 127.0.0.1 port 953 allow {127.0.0.1;} keys {"rndc-key";};
+};
+
+options {
+ directory "/usr/local/etc/namedb/working";
+ pid-file "/var/run/named/pid";
+ dump-file "/var/dump/named_dump.db";
+ statistics-file "/var/stats/named.stats";
+ listen-on-v6 { none; };
+ allow-transfer { 192.168.1.0/24; };
+ forwarders { 192.168.1.41; };
+ forward only;
+};
+
+// lan側の設定
+// localhost正引き
+zone "localhost" {
+ type master;
+ file "/usr/local/etc/namedb/master/localhost.zone";
+ forwarders {};
+};
+// localhost逆引き
+zone "0.0.127.in-addr.arpa" {
+ type master;
+ file "/usr/local/etc/namedb/master/0.0.127.rev";
+ forwarders {};
+};
+// 自ドメイン正引き
+zone "example.jp" {
+ type master;
+ file "/usr/local/etc/namedb/master/example.jp.local.zone";
+ forwarders {};
+};
+// 自ドメイン逆引き
+zone "1.168.192.in-addr.arpa" {
+ type master;
+ file "/usr/local/etc/namedb/master/1.168.192.rev";
+ forwarders {};
+};
+```
+
+ゾーンファイル
+
+```/usr/local/etc/namedb/master/localhost.zone
+$TTL 3600
+
+@ IN SOA ns1.example.jp. root.localhost. (
+ 2019020101 ; Serial
+ 3600 ; Refresh
+ 900 ; Retry
+ 3600000 ; Expire
+ 3600 ) ; Minimum
+ IN NS localhost.
+ IN A 127.0.0.1
+```
+
+```/usr/local/etc/namedb/master/0.0.127.rev
+$TTL 3600
+
+@ IN SOA ns1.example.jp. root.example.jp. (
+ 2019020101 ; Serial
+ 3600 ; Refresh
+ 900 ; Retry
+ 3600000 ; Expire
+ 3600 ) ; Minimum
+ IN NS localhost.
+1 IN PTR localhost.
+```
+
+```/usr/local/etc/namedb/master/example.jp.local.zone
+$TTL 3600
+
+@ IN SOA ns1.example.jp. root.example.jp. (
+ 2019020101 ; Serial
+ 3600 ; Refresh
+ 900 ; Retry
+ 3600000 ; Expire
+ 3600 ) ; Minimum
+ IN NS ns1.example.jp.
+ IN NS ns2.example.jp.
+ IN MX 10 mail.example.jp.
+ IN A 192.168.1.41
+router IN A 192.168.1.1
+ns1 IN A 192.168.1.41
+ns2 IN A 192.168.1.43
+mail IN A 192.168.1.41
+server1 IN A 192.168.1.32
+server2 IN A 192.168.1.33
+jail1 IN A 192.168.1.41
+jail2 IN A 192.168.1.42
+jail3 IN A 192.168.1.43
+jail4 IN A 192.168.1.44
+www IN CNAME jail1.example.jp.
+www2 IN CNAME jail3.example.jp.
+hoge1 IN A 192.168.1.101
+hoge2 IN A 192.168.1.102
+```
+
+```/usr/local/etc/namedb/master/1.168.192.rev
+$TTL 3600
+
+@ IN SOA ns1.example.jp. root.example.jp. (
+ 2019020101 ; Serial
+ 3600 ; Refresh
+ 900 ; Retry
+ 3600000 ; Expire
+ 3600 ) ; Minimum
+ IN NS ns1.example.jp.
+1 IN PTR router.example.jp.
+32 IN PTR server1.example.jp.
+33 IN PTR server2.example.jp.
+41 IN PTR jail1.example.jp.
+42 IN PTR jail2.example.jp.
+43 IN PTR jail3.example.jp.
+44 IN PTR jail4.example.jp.
+101 IN PTR hoge1.example.jp.
+102 IN PTR hoge2.example.jp.
+```
+
+リゾルバの設定は、内部DNSサーバに設定する
+
+```/etc/resolv.conf
+search chun.jp
+nameserver 192.168.1.42
+```
+
+開始する。
+
+```
+jail1 /root # service named start
+Starting named.
+```
+
+## NTPサーバ
+最初に使用宣言
+
+```sh:/etc/rc.conf
+ntpd_enable="YES"
+```
+
+設定ファイルの編集
+時計を合わせるサーバの指定
+
+```
+pool ntp.nict.jp
+```
+
+以下のように個別指定と同様である
+
+```
+server ntp-a2.nict.go.jp
+server ntp-a3.nict.go.jp
+server ntp-b2.nict.go.jp
+server ntp-b3.nict.go.jp
+```
+
+加えて、ホスト名の後にオプションを指定できiburstを指定すると起動直後はバースト上にパケットを送出し時刻同期を早める事ができる。
+
+### jail1の設定
+ローカルネットワークからの問い合わせに応答するよう以下の設定とする。
+
+```sh:/etc/ntp.conf
+pool ntp.nict.jp iburst
+pool ntp.jst.mfeed.ad.jp iburst
+pool time.google.com iburst
+
+logfile /var/log/ntpd.log
+logconfig =syncstatus +sysevents +clockall
+
+restrict default noquery nomodify notrap
+restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
+restrict 127.0.0.1
+```
+
+起動する。
+
+```
+# service ntpd start
+Starting ntpd.
+```
+
+同期の状況確認以下でできる。ntp.jst.nfeed.ad.jpが見えなくなった?
+
+```
+# ntpq -p
+ remote refid st t when poll reach delay offset jitter
+==============================================================================
+ ntp.nict.jp .POOL. 16 p - 64 0 0.000 0.000 0.000
+ ntp.jst.mfeed.a .POOL. 16 p - 64 0 0.000 0.000 0.000
+ time.google.com .POOL. 16 p - 64 0 0.000 0.000 0.000
+*ntp-a2.nict.go. .NICT. 1 u 241 1024 377 16.236 0.954 0.667
++ntp-a3.nict.go. .NICT. 1 u 255 1024 377 15.284 0.703 1.166
++ntp-b2.nict.go. .NICT. 1 u 468 1024 377 17.810 1.577 1.211
++ntp-b3.nict.go. .NICT. 1 u 201 1024 377 16.306 0.470 1.152
++time1.google.co .GOOG. 1 u 238 1024 377 49.762 -0.123 0.928
++time2.google.co .GOOG. 1 u 1044 1024 377 82.096 0.910 0.574
++time4.google.co .GOOG. 1 u 204 1024 377 142.249 -0.551 1.466
+```
+
+### jail2の設定
+ローカルネットワークからの問い合わせに応答するよう以下の設定とする。
+
+```sh:/etc/ntp.conf
+server jail1.example.jp iburst
+logfile /var/log/ntpd.log
+logconfig =syncstatus +sysevents +clockall
+
+restrict default noquery nomodify nopeer notrap
+restrict 192.168.1.0 mask 255.255.255.0 nomodify nopeer notrap
+restrict 127.0.0.1
+```
+
+起動する。
+
+```
+# service ntpd start
+Starting ntpd.
+```
