Skip to content

ローカル検証用にDNSを立てる

   

自宅に検証環境を作っていると、中には FQDN を必要とする製品もあって DNS を手元で立てたくなることがあります。

今回はドメイン名を sugimura.home として解決できるようにしてみました。 当初は sugimura.local で作っていたのですが、.local ドメインは使用しないほうがいいようです。

用意したVM

DNS サーバを動かすために VM を一つ用意しました。

  • RHEL 8.3
  • IP アドレス: 192.168.0.93

これに dnsmasq を入れて設定していきます。

dnsmasq のインストール

dnsmasq は RHEL 8 のリポジトリ (rhel-8-for-x86_64-appstream-rpms) から普通にインストールできます。

# dnf install dnsmasq
# systemctl enable dnsmasq --now
Created symlink /etc/systemd/system/multi-user.target.wants/dnsmasq.service → /usr/lib/systemd/system/dnsmasq.service.
# systemctl status dnsmasq
● dnsmasq.service - DNS caching server.
   Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2021-03-10 15:19:48 JST; 19s ago
 Main PID: 5606 (dnsmasq)
    Tasks: 1 (limit: 23544)
   Memory: 1.8M
   CGroup: /system.slice/dnsmasq.service
           └─5606 /usr/sbin/dnsmasq -k

 3月 10 15:19:48 localhost.localdomain systemd[1]: Started DNS caching server..
 3月 10 15:19:48 localhost.localdomain dnsmasq[5606]: started, version 2.79 cachesize 150
 3月 10 15:19:48 localhost.localdomain dnsmasq[5606]: compile time options: IPv6 GNU-getopt DBus no-i18n IDN2 DHCP DHCPv6 no-Lua TFTP no-conntrack ipset auth DNSSEC >
 3月 10 15:19:48 localhost.localdomain dnsmasq[5606]: reading /etc/resolv.conf
 3月 10 15:19:48 localhost.localdomain dnsmasq[5606]: using nameserver 192.168.0.1#53
 3月 10 15:19:48 localhost.localdomain dnsmasq[5606]: using nameserver XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX#53
 3月 10 15:19:48 localhost.localdomain dnsmasq[5606]: read /etc/hosts - 2 addresses

dnsmasq の設定

/etc/dnsmasq.d/ 以下にファイルを置いて設定します。

  • ドメインは sugimura.home
  • 上位DNSは 192.168.0.1
  • *.api.sugimura.home のワイルドカードも解決してみる

ということでこのように設定してみました。

# cat sugimura.home.conf 
local=/sugimura.home/
domain=sugimura.home
server=192.168.0.1
expand-hosts

address=/api.sugimura.home/192.168.0.222

設定のチェックをします。

# dnsmasq --test
dnsmasq: syntax check OK.

問題なければ反映します。

# systemctl restart dnsmasq

ログも一応確認します。

# journalctl -e -u dnsmasq

問い合わせを受けられるように、firewall も開けておきます。

# firewall-cmd --add-service=dns --permanent
success

/etc/resolv.conf の書き込み保護を念のためしておきます。これはやらなくても大丈夫です。

# lsattr /etc/resolv.conf 
-------------------- /etc/resolv.conf
# chattr +i /etc/resolv.conf 
# lsattr /etc/resolv.conf 
----i--------------- /etc/resolv.conf

chattr +i を設定すると、owner であっても書き込みができなくなります。

# touch /etc/resolv.conf 
touch: '/etc/resolv.conf' のタイムスタンプを設定中です: 許可されていない操作です

レコードを定義

/etc/hosts に書きます。 dnsmasq の設定で expand-hosts を設定しているので、ドメイン名は自動的に補完されます。

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.0.93 dnsmasq
192.168.0.100 tower
192.168.0.101 db
192.168.0.102 automationhub

反映されるにはサービスを再起動します。

# systemctl restart dnsmasq
# journalctl -e -u dnsmasq

確認

まずはこの 192.168.0.93 上で参照できるかどうかを確認してみます。

# dig @localhost tower.sugimura.home

; <<>> DiG 9.11.20-RedHat-9.11.20-5.el8_3.1 <<>> @localhost tower.sugimura.home
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33732
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;tower.sugimura.home.		IN	A

;; ANSWER SECTION:
tower.sugimura.home.	0	IN	A	192.168.0.100

;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: 金  3月 12 09:59:27 JST 2021
;; MSG SIZE  rcvd: 64

正しく引けていました。次は他のクライアントから検索してみます。 これは mac からの例です。

$ dig @192.168.0.93 tower.sugimura.home

; <<>> DiG 9.10.6 <<>> @192.168.0.93 tower.sugimura.home
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62887
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;tower.sugimura.home.		IN	A

;; ANSWER SECTION:
tower.sugimura.home.	0	IN	A	192.168.0.100

;; Query time: 0 msec
;; SERVER: 192.168.0.93#53(192.168.0.93)
;; WHEN: Fri Mar 12 10:01:14 JST 2021
;; MSG SIZE  rcvd: 64

ワイルドカードも試してみます。正しく引けました。

$ dig @192.168.0.93 sample.api.sugimura.home

; <<>> DiG 9.10.6 <<>> @192.168.0.93 sample.api.sugimura.home
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29382
;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;sample.api.sugimura.home.	IN	A

;; ANSWER SECTION:
sample.api.sugimura.home. 0	IN	A	192.168.0.222

;; Query time: 1 msec
;; SERVER: 192.168.0.93#53(192.168.0.93)
;; WHEN: Fri Mar 12 10:02:09 JST 2021
;; MSG SIZE  rcvd: 58

逆引きも確認してみます。

$ dig @192.168.0.93 -x 192.168.0.100

; <<>> DiG 9.10.6 <<>> @192.168.0.93 -x 192.168.0.100
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33228
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;100.0.168.192.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
100.0.168.192.in-addr.arpa. 0	IN	PTR	tower.sugimura.home.

;; Query time: 1 msec
;; SERVER: 192.168.0.93#53(192.168.0.93)
;; WHEN: Fri Mar 12 10:15:48 JST 2021
;; MSG SIZE  rcvd: 88

管理

あとは必要に応じて /etc/hosts を書いてサービスを再起動するだけです。 ワイルドカードのときは /etc/dnsmasq.d/sugimura.home.conf に書きます。

mac での設定

mac のクライアントからは既存の設定を邪魔しないようにしたかったのでドメインごとに参照するDNSを分けたかったのですが、mac ではこのようにしてできました。 /etc/resolver/<ドメイン名> というファイルを作るといいそうです。

$ sudo vi /etc/resolver/sugimura.home
...
$ sudo cat /etc/resolver/sugimura.home
nameserver 192.168.0.93

ファイルを書いたら、scutil –dns コマンドで確認できます。

$ scutil --dns
DNS configuration

...

resolver #8
  domain   : sugimura.home
  nameserver[0] : 192.168.0.93
  flags    : Request A records
  reach    : 0x00020002 (Reachable,Directly Reachable Address)

あとは普通に使えます。

$ ping tower.sugimura.home
PING tower.sugimura.home (192.168.0.100): 56 data bytes
64 bytes from 192.168.0.100: icmp_seq=0 ttl=64 time=1.085 ms
64 bytes from 192.168.0.100: icmp_seq=1 ttl=64 time=0.682 ms