@@ -1,540 +1,541 @@
## はじめに
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/95ad3113202d111ee53c)(この記事)
- 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.
```
