はじめに
FreeBSD 12を使用した自宅サーバの構築を行った。FreeBSD 12はリリースされて間もない状態ですが、カーネルに標準でVIMAGEが取り込まれDNSの外向きと、内向きを別々のシステム(jail+VIMAGE)が同一ホストで構築できることから採用することにしました。その時の構築手順を備忘録の意味も含め、具体的にいくつかに渡り説明する。
-
基本システム編その1
- 背景
- 基本のインストール
- 日本語環境の設定
-
基本システム編その2
- セキュリティ
- ftpサーバ
-
基本システム編その3
- jail
- 基本システム編おわり
-
jail内基本システム編
- 基本の設定(jail1・jail2共通)
- 基本の設定(jail1・jail2共通)
-
DNS編(この記事)
- DNSの構築におけるこれまでの問題
- bind9インストール
- NTPサーバ
-
Let's Encrypt編
- Let's Encryptについて
- certbotのインストール
- 各種設定
- 証明書の取得
-
Webサーバ編
- インストール(apache2.4・webalizer・php7.3・postgresql11.2・mysql8.0)
- 設定
-
メールサーバ編
- インストール(cyrus-sasl・postfix・dovecot・procmail・pflogsumm・policyd-spf)
- 設定・起動
- spfレコード送信設定
-
ファイルサーバ編
- sambaの選択
- samba3のインストール
-
メールサーバ編その2
- 概要
- OpenDKIM
- OpenDMARC
- ClamAV (clamav-milter)
- Spamassasin (spamass-milter)
DNSの構築におけるこれまでの問題
DNSは、今回のサーバー再構築のトリガーになった機能である。従来からbind9を使用し今回も使用するが、従来は以下のような設定を行っていた。
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 *
* *
* *
* *
**********************************************************************
最初に使用宣言
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の前半のみに編集する。(後半はコメントになっているので特に編集はしなくてもよい。)
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できるようにする。
key "rndc-key" {
algorithm hmac-sha256;
secret "+RRgAOIR71bNy6wZ9YabcdefgihjzOepeEjzwiiZNyI=";
};
設定は、これまでの設定を分けるだけである。
jail1(外向き)の設定
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";
};
ゾーンファイル
$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サーバに設定する
search example.jp
nameserver 192.168.1.42
開始する。
jail1 /root # service named start
Starting named.
jail2(内向き)の設定
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 {};
};
ゾーンファイル
$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
$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.
$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
$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サーバに設定する
search example.jp
nameserver 192.168.1.42
開始する。
jail1 /root # service named start
Starting named.
NTPサーバ
時計がズレていることに気が付きログを調べると、以下のようなログが吐かれていた。
5 Apr 20:03:49 ntpd[93514]: 0.0.0.0 c618 08 no_sys_peer
5 Apr 20:03:57 ntpd[93514]: Soliciting pool server 2001:4860:4806::
5 Apr 20:04:15 ntpd[93514]: Soliciting pool server 2001:df0:232:eea0::fff4
5 Apr 20:04:19 ntpd[93514]: Soliciting pool server 210.173.160.57
5 Apr 20:05:03 ntpd[93514]: Soliciting pool server 2001:4860:4806:4::
5 Apr 20:05:19 ntpd[93514]: Soliciting pool server 2001:df0:232:eea0::fff3
5 Apr 20:05:26 ntpd[93514]: Soliciting pool server 210.173.160.27
5 Apr 20:06:09 ntpd[93514]: Soliciting pool server 2001:4860:4806:4::
5 Apr 20:06:25 ntpd[93514]: Soliciting pool server 2001:df0:232:eea0::fff3
5 Apr 20:06:32 ntpd[93514]: Soliciting pool server 210.173.160.87
5 Apr 20:07:15 ntpd[93514]: Soliciting pool server 2001:4860:4806:c::
5 Apr 20:07:32 ntpd[93514]: Soliciting pool server 2001:df0:232:eea0::fff4
5 Apr 20:07:36 ntpd[93514]: Soliciting pool server 210.173.160.57
5 Apr 20:07:40 ntpd[93514]: 0.0.0.0 c613 03 spike_detect +8.816487 s
5 Apr 20:13:16 ntpd[93514]: 0.0.0.0 c61c 0c clock_step +8.821064 s
5 Apr 20:13:16 ntpd[93514]: step-systime: Operation not permitted
5 Apr 20:13:16 ntpd[93514]: 0.0.0.0 c615 05 clock_sync
5 Apr 20:13:16 ntpd[93514]: local_clock: usr/src/contrib/ntp/ntpd/ntp_loopfilter.c line 818: ntp_adjtime: Operation not permitted
ntpサーバと接続しntpqでは正常に同期しているようだったが、実はjail内ではシステム時計を修正する権限がない様です。dateコマンドで修正もエラーが表示される。
そこで、ntpdはホスト側で実行することとし、ルータの設定も123ポートの振替先をホスト側のIPアドレスに変更し、外部の時計に同期するマスターサーバとそのマスターサーバと同期をかけるスレーブサーバに考え方を変え、jail内のntpd起動は行わないこととする(/etc/rc.confに設定されていてもOS起動時には自動起動がかからないようです)(2019/8/5)。
最初に使用宣言
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を指定すると起動直後はバースト上にパケットを送出し時刻同期を早める事ができる。
マスターサーバの設定
ローカルネットワークからの問い合わせに応答するよう以下の設定とする。
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
スレーブサーバの設定
ローカルネットワークからの問い合わせに応答するよう以下の設定とする。
server master.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.