Almalinuxでローカル環境におけるDDNSを構築してみた
はじめに
こんな環境を作るのに、踏台サーバ→各サーバへFQDNでログインしたいため、DDNSサーバを構築してみました。

DDNSサーバはDHCPがDNSサーバのAレコードのエントリを動的に変化させるようにしました。

DNSサーバの設定
named.confの設定
[root@ddns ~]# cat /etc/named.conf
acl internal-network {
10.255.255.0/24;
};
options {
listen-on port 53 { localhost; internal-network; };
directory "/var/named";
(略)
allow-query { localhost; internal-network; };
recursion yes;
dnssec-validation yes;
(略)
};
logging {
(略)
};
zone "pve.local" IN {
type master;
file "named.pve"; // 任意のファイル名
allow-update { localhost; internal-network; }; // アップデートを許可するアドレスを指定
};
ゾーンファイルの設定
named.confから「/var/named/named.pve」にあるとわかる。
一から作る場合、chownとchmodをする。
[root@ddns ~]# touch /var/named/named.pve
[root@ddns ~]# chown named:named /var/named/named.pve
[root@ddns ~]# chmod 644 /var/named/named.pve
[root@ddns ~]# ls -al /var/named/named.pve
-rw-r--r-- 1 named named 0 Dec 29 16:41 /var/named/named.pve
[root@ddns ~]# cat /var/named/named.pve
[root@ddns named]# cat named.pve
$TTL 1D
@ IN SOA @ ddns.pve.local. ( ; ネームサーバのFQDN
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS ddns.pve.local.
IN A 10.255.255.3
ddns IN A 10.255.255.3
dhcp IN A 10.255.255.1
jnlファイルの作成
nsupdateで適当なレコードを登録・削除することで、「named.pve.jnl」を作成する。
[root@ddns named]# pwd
/var/named
[root@ddns named]# ls
data dynamic named.ca named.empty named.localhost named.loopback named.pve slaves
[root@ddns named]# nsupdate
> server ddns.pve.local
> update add test.pve.local 86400 IN A 10.255.255.254
> update delete test.pve.local 86400 IN A 10.255.255.254
> send
> quit
[root@ddns named]# ls
data dynamic named.ca named.empty named.localhost named.loopback named.pve named.pve.jnl slaves
各クライアントの設定
hostnameを指定しておく必要がある。踏台サーバの場合下記のようにする。
#hostnamectl set-hostname fumidai.pve.local
DHCPサーバ
named.confの設定
#cat /etc/dhcp/dhcpd.conf
// DDNSの設定
ddns-updates on;
ddns-update-style interim;
ddns-domainname "ddns.pve.local";
ignore client-updates;
// ログの設定
log-facility local7;
subnet 10.255.255.0 netmask 255.255.255.0 {
range 10.255.255.10 10.255.255.254;
option domain-name "dhcp.pve.local";
option domain-name-servers 10.255.255.2;
option broadcast-address 10.255.255.255;
default-lease-time 600;
max-lease-time 7200;
// 更新先のDNSサーバを指定
zone pve.local. {
primary ddns.pve.local;
}
}
動作確認
DHCP
適当なサーバ(ntp.pve.local)を起動すると、DHCPサーバのログで、アドレスが払い出され、DNSサーバへ登録されていることが分かる
[root@dhcp ~]# tail -20 /var/log/messages
(略)
Dec 29 17:37:46 dhcp dhcpd[702]: DHCPREQUEST for 10.255.255.11 from bc:24:11:1a:99:b3 via ens19
Dec 29 17:37:47 dhcp dhcpd[702]: DHCPACK on 10.255.255.11 to bc:24:11:1a:99:b3 (ntp) via ens19
Dec 29 17:37:47 dhcp dhcpd[702]: Added new forward map from ntp.ddns.pve.local to 10.255.255.11
※失敗した場合は下記のよう「Unbale to add forward map」となる
Dec 29 17:25:07 dhcp dhcpd[702]: DHCPREQUEST for 10.255.255.229 from bc:24:11:33:10:a8 via ens19
Dec 29 17:25:07 dhcp dhcpd[702]: DHCPACK on 10.255.255.229 to bc:24:11:33:10:a8 (radius) via ens19
Dec 29 17:25:19 dhcp dhcpd[702]: DDNS: cleaning up lease pointer for a cancel cb=0x56106126bc90
Dec 29 17:25:19 dhcp dhcpd[702]: Unable to add forward map from radius.ddns.pve.local to 10.255.255.229: operation canceled
DNS
ntp 10.255.255.11が登録されていることが分かる。
[root@ddns named]# cat named.pve
$ORIGIN .
$TTL 86400 ; 1 day
pve.local IN SOA pve.local. ddns.pve.local. (
5 ; serial
86400 ; refresh (1 day)
3600 ; retry (1 hour)
604800 ; expire (1 week)
10800 ; minimum (3 hours)
)
NS ddns.pve.local.
A 10.255.255.3
$ORIGIN pve.local.
ddns A 10.255.255.3
$ORIGIN ddns.pve.local.
$TTL 300 ; 5 minutes
ntp A 10.255.255.11
TXT "311b47e9c32fe2957967eb2ce16093df2c"
$ORIGIN pve.local.
$TTL 86400 ; 1 day
dhcp A 10.255.255.1
DNSのゾーンの更新(named.pveへの反映)は15分間隔で行われる。(変え方が分からなかった)
省略なしの設定
named.conf
[root@ddns ~]# 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.
//
acl internal-network {
10.255.255.0/24;
};
options {
listen-on port 53 { localhost; internal-network; };
listen-on-v6 port 53 { none; };
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 { localhost; internal-network; };
/*
- 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 yes;
dnssec-validation yes;
managed-keys-directory "/var/named/dynamic";
geoip-directory "/usr/share/GeoIP";
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;
};
};
zone "pve.local" IN {
type master;
file "named.pve";
allow-update { localhost; internal-network; };
};
おわりに
複数のIFを持つ場合、DNSサーバを登録するIFに気を付ける必要があります。特に踏台サーバは作業用端末側で名前解決しようとしてしまうとFQDNで各サーバへ接続できません。