前回まで
自宅にあるサーバ類を、ipv6で外部公開しようと思うが、PUBLICに公開するのではなく、セキュアな自分専用のDNSを作り上げたい。
PLAN:ゾーン転送
- VPSをDNSのスレーブとし、自宅DNSをマスタとして構成する。平文のゾーン情報を起きたくないのもあるけど、今仕事でやっていることなので、POCも兼ねて。
- 自宅はipv6プラスで、PORT53を公開することができないので、許可範囲内の別PORTを使う。
- 外部のDNSは、DNS問合はデフォルトポート(53)とし、ゾーン転送は上記の53ではないPORT(本事例では、11111)で行う。
PLAN:bind設定
- VPSにあるslaveのDNSは、キャッシュサーバとして動作させるとともに、自分勝手ドメインの未公認権威サーバ(slave)とする。
- 自分勝手ドメインのmasterは、前述の通り自宅DNS。
設定例
- master側のDNS
- slave側のDNS
- 自宅HOME-GWのNAPT(ポートフォワード)
- その他ハマりポイント
- ゾーン情報の更新
1.master側
# master側(ipv6+のHGW内部)
options {
listen-on port 11111 { any; };
zone "myzone" {
type master;
file "/etc/named/db.myzone";
allow-transfer { www.xxx.yyy.zzz; };
also-notify { www.xxx.yyy.zzz; };
};
- 11111は、ipv6のHOMW-GWで割り当てられている、NAPTのPORTに合わせる
- www.xxx.yyy.zzzはスレーブ(VPS)のIPアドレス
2.slave側
# slave側(VPSサーバ)
options {
listen-on port 53 { any; };
zone "myzone" {
type slave;
file "/var/named/slaves/sv.myzone";
masters PORT 11111 { aaa.bbb.ccc.ddd; };
allow-transfer { none; }; // 再転送は禁止
};
- aaa.bbb.ccc.dddはmaster(自宅HOME-GWのグローバルアドレス)のIPアドレス
3.HOME-GWの設定
masterで公開するPORT(上記例では 11111)のフォワード先を、自宅DNS(プライベートアドレス)に設定する。tcp,udpの両方を設定。
4.その他ハマりポイント
直接のDNS設定ではないが、ハマったこと。
- fiewalld. 特にmaster側(自宅DNS)はデフォルトではないPORTを開けるので。
- FWの許可。HOME-GWの後ろに置いたFWの許可もれ。
- slave側のゾーンファイルの置き場所。bindのログ(named.run)を見たら、permisson deniedとかになっていた。ディレクトリ権限を設定したもだめ。結局、ディレクトリを変更しOK。
-
/etc/named/sv.myzone
はゾーン転送がNG。スレーブ側のデフォルト/var/named/slaves/sv.myzone
に変更したらOKになった。
5.ゾーン情報の更新
マスタ側でゾーン情報を変更し、スレーブと同期する。
ゾーン「myzone」を更新する例
(1). ゾーン情報の更新
ゾーン情報を更新する。SOAのSerialを更新(増加)すること。
@ IN SOA ns0.myzone. postmaster.myzone. (
2019102701 ; Serial
24h ; Refresh スレーブサーバが更新の有無をチェックする周期
(2). 更新したゾーン情報をリロード:マスタ
# rndc reload myzone
(3). マスタ側から更新
マスタからスレーブに更新を通知し、同期する。
# rndc notify myzone
(4). スレーブ側から更新
スレーブ側からゾーン情報を取得し、同期する。
# rndc retransfer myzone
ゾーン転送のシーケンス
master側からnotifyをしてゾーン転送する際の、通信プロトコルを調べた結果。自宅側はゾーン転送に使うPORTを、tcp,udpとも開ける必要がある。
master側から nofity した場合
master 自宅 |
direction | slave VPS |
what |
---|---|---|---|
*/tcp | -> | 53/tcp | notify |
*/tcp | <- | 53/tcp | notify*- |
11111/udp | <- | **/udp | |
11111/udp | -> | **/udp | |
11111/tcp | <- | ****/tcp | SYN |
11111/tcp | -> | ****/tcp | SYN+ACK |
11111/tcp | <- | ****/tcp | ACK |
11111/tcp | <-> | ****/tcp | 転送 |
slave側から retransfer した場合
master 自宅 |
direction | slave VPS |
what |
---|---|---|---|
11111/udp | <- | **/udp | |
11111/udp | -> | **/udp | |
11111/tcp | <- | ****/tcp | SYN |
11111/tcp | -> | ****/tcp | SYN+ACK |
11111/tcp | <- | ****/tcp | ACK |
11111/tcp | <-> | ****/tcp | 転送 |
ただのDNS-query(クライアント〜リゾルバ)
client | direction | DNS-server | what |
---|---|---|---|
*/udp | -> | 53/udp | A? query.fqdn.jp. |
*/udp | <- | 53/udp | A www.xxx.yyy.zzz |
この時、リゾルははルートから再帰問合をガツガツやっている。
slave-DNSをキャッシュサーバとして動作させる設定
#
recursion yes;
allow-recursion { any; };
#
forward only;
forwarders { 8.8.8.8; };
resursion yes
●キャッシュサーバとして動作させるので、yes
forward only
●only : キャッシュサーバとするが、自分では何もせず他に任せたい。フォワーダから回答できないときは、エラー
○first : フォワーダから回答がない場合は、自分で反復問合をする。?