さて、Linuxネタなんですが、今回は内部向けDNSサーバのお話。

筆者宅には現在5台のLinuxサーバが常時稼働しています。
(※WEBサーバ、WEB予備サーバ、WEBDBサーバ、WEBDB予備サーバ、ビットコインデータ収集DBサーバ)
これらのサーバに対して複数台あるPCでIP直撃ちでアクセスするのもだんだんと手間になってきました。

一台で、全サーバへsshするだけならば、そのPCでsshconfigを設定してしまえば良いのですが、
筆者の場合、ノートPCだけでなく、タブレットやiPadからアクセスしたりと、複数環境から
アクセスしますし、その手元の環境が頻繁にOSを再インストールしたりするのもあり、
毎回設定が面倒です。

そこで、上記の課題を解決するために内向きのDNSサーバを構築することにしました。

今回はWEBDB予備サーバとして稼働しているAlterLinuxに環境を構築しました。

AlterLinuxは国内の有志により開発されたArchiLinux系列のLinuxです。

これもローリングアップデートにより、一度インストールしてしまえば、バージョンという概念がないOSです。

筆者の環境ではAsusのEeePC1005HA(※実はこれ初代Hackintoshマシンです)にAlterLinuxをインストールしています。
32BitCPUを積んだPCですが、AlterLinuxのおかげでまだ現役で使えています。


今回はDNSサーバはunboundを使います。

DNSサーバとしては他にはBINDが有名ですが、脆弱性が多いのが難点。
最近ではPowerDNSが管理画面やapi連携も充実して良さそうなイメージですが、
家庭内DNSでそこまで高機能は必要ないのでunboundにしました。

以下コマンドでAlterLinuxへインストール。

$ sudo pacman -S unbound

インストール後の設定ファイル(/etc/unbound/unbound.conf)は以下のようになっていました。


server:
	verbosity: 1
	trust-anchor-file: /etc/unbound/trusted-key.key
python:
dynlib:
remote-control:

この中のtrusted-key.keyファイルは/etc/unbound/以下には存在しなかったため、
以下コマンドでキーを取得します。

$ sudo unbound-anchor -a "/etc/unbound/trusted-key.key"

さらに設定ファイルを自分の環境に合わせて修正して筆者は以下のようにしました。


server:
	verbosity: 1
	interface: 127.0.0.1
	interface: 192.168.1.xxx
	do-ip4: yes
	do-ip6: yes
	do-udp: yes
	do-tcp: yes
	access-control: 192.168.1.0/24 allow
	trust-anchor-file: /etc/unbound/trusted-key.key
python:
dynlib:
remote-control:

これで内部向けDNSサーバとしては設定完了です。

まずは動作することを確認してみます。

いざ動作確認(その1)

そのためにこのDNSサーバを使うよう設定にして確認する必要があります。
そこで、今回は自ホストから確認ということでAlterLinuxマシン上で、
以下の設定ファイルを修正します。

/etc/resolv.conf

# Generated by NetworkManager
nameserver 192.168.1.xx

次に/etc/systemd/resolved.confのファイルも以下に修正します。
(※127.0.0.1は自ホストのIPです。)

[Resolve]
DNS=127.0.0.1
Domains=home

これで自ホストがDNSサーバになりました。
まずは外部ホストの名前解決ができるかを確認です。

unboundをインストールするとdrillというコマンドが使えるようになります。
確認のために、drill www.google.comと打ち込んでみます。

;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 42979
;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 
;; QUESTION SECTION:
;; www.google.com.	IN	A

;; ANSWER SECTION:
www.google.com.	300	IN	A	142.251.42.132

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 45 msec
;; SERVER: 192.168.1.xx
;; WHEN: Sat Oct 23 19:56:52 2021
;; MSG SIZE  rcvd: 48

この最後のサーバIPが自ホストのIPになっていれば動作していることになります。

動作確認ができたら次は内部サーバのIPを登録していきます。

内部サーバのIPを登録する

以下の内容で/etc/unbound/直下にserver.confを作成します。


server:
#
local-zone:"local." transparent
#
local-data:"web1.local. 3600000 IN A 192.168.1.xx"
local-data:"web2.local. 3600000 IN A 192.168.1.xx"
local-data:"db1.local. 3600000 IN A 192.168.1.xx"
local-data:"db2.local. 3600000 IN A 192.168.1.xx"
local-data:"bitcoin.local. 3600000 IN A 192.168.1.1xx"
#
local-data-ptr:"192.168.1.xx 3600000 web1.local."
local-data-ptr:"192.168.1.xx 3600000 web2.local."
local-data-ptr:"192.168.1.xx 3600000 db1.local."
local-data-ptr:"192.168.1.xx 3600000 db2.local."
local-data-ptr:"192.168.1.xx 3600000 bitcoin.local."

作成後は「/etc/unbound/unbound.conf」の設定ファイルの最終行に以下1行を追記します。

include: "/etc/unbound/server.conf"

これであとは各種PCのDNSサーバを変更することで内部サーバにIP直打ちでなく、
ホスト名でアクセスできるようになります。

いざ動作確認(その2)

今度はローカルのサーバホスト名を問合せしてみます。

;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 41305
;; flags: qr aa rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 
;; QUESTION SECTION:
;; web1.local.	IN	A

;; ANSWER SECTION:
web1.local.	3600000	IN	A	192.168.1.xx

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 0 msec
;; SERVER: 192.168.1.xx
;; WHEN: Sat Oct 23 20:23:11 2021
;; MSG SIZE  rcvd: 47

はい、無事に確認できました。

これでpingもsshもwebでも同一ホスト名で確認ができるようになります。

ローカルドメインに「local」は使わない方がいいみたいなので、もし設定する場合はお好みで。

自身の保有するドメインで行う場合は、サブドメイン部分を
別で管理するDNSサーバの名称と重複しないように気を付けましょう。