能書き
おうちサーバー構築報告:予告からのおうちサーバー構築の続きです。
Unboundは以前も何度か取り扱っている訳ですが、今回はUbuntu24.04LTSにシェルスクリプトで自動的に導入します。対象が1マシンだけなのでAnsibleは止めました。
目標
Unboundで家庭内DNSサーバーを実現します。
参考文献
少し調べました。mDNS用には.local
が予約されているとか。情報源がWikipediaというのは感心しませんが。
準備
家庭内ドメイン
能書きは以前の記事に任せて、端的に要点だけ書いときます。
- 公開するサーバーを立てるつもりなら、きちんと年間予算を捻出してドメインを買おう
- 家庭内限定ドメインという事で、今回はお手軽に
.local
にする- 本当は家庭内の非公開サーバーでも購入したドメインを使う方が良い(けど今回はゴニョゴニョ)
スナップショット
対象コンテナの名前はnetwork
、IPアドレスは172.16.1.101
です。
該当コンテナのスナップショットを撮ります。ProxmoxVEはGUIでスナップショットを撮れます。分かり易いので手順の詳細は省略。
念の為に該当コンテナをシャットダウンして、それからスナップショットを撮り、その後開始しておきます。
インストールと基本設定
踏み台サーバーとして172.16.1.100
を使用します。
ssh ansible@172.16.1.100
ssh root@172.16.1.101
今回は手順をシェルスクリプトにまとめました。
cd
cat <<___ >install_unbound.sh
SUBNET=\$1
IPADDR=\$2
PARENT=\$3
apt update
apt upgrade -y
apt install -y unbound
cd /etc
svn st | grep "^?" | cut -b9- | xargs -I{} find {} -type f -or -type d -or -type l | xargs -r svn add
svn ci -m"installed Unbound"
sed -i -e"/^#DNS=/c DNS=\$IPADDR" -e"/^#Domains=/c Domains=local" /etc/systemd/resolved.conf
systemctl restart systemd-resolved
svn ci -m"setting systemd-resolved"
cd /etc/unbound/unbound.conf.d/
cat >local.conf <<___A
server:
username: unbound
verbosity: 1
interface: \$IPADDR
access-control: \$SUBNET allow
root-hints: "/etc/unbound/unbound.conf.d/parent.hints"
include: "/etc/unbound/unbound.conf.d/machines.list"
hide-identity: yes
hide-version: yes
remote-control:
control-enable: no
___A
touch machines.list
cat >parent.hints <<___B
. 3600000 NS ROUTER.LOCAL.
ROUTER.LOCAL. 3600000 A \$PARENT
___B
systemctl enable unbound
systemctl restart unbound
cd /etc
svn st | grep "^?" | cut -b9- | sudo xargs -rt svn add
svn ci -m"Unbound initial settings"
___
chmod 755 install_unbound.sh
./install_unbound.sh 172.16.0.0/16 172.16.1.101 172.16.2.1
内向きDNS
設定
マシン名は/etc/unbound/unbound.conf.d/machines.list
に追加します。正引きと逆引きの両方が必要です。構築したコンテナと仮想マシンの名前とIPアドレスをまとめて全部設定しておきます。
cd /etc/unbound/unbound.conf.d/
cat >>machines.list <<___
local-data: "network.local. 3600000 IN A 172.16.1.101"
local-data-ptr: "172.16.1.101 3600000 network.local."
local-data: "mail.local. 3600000 IN A 172.16.1.102"
local-data-ptr: "172.16.1.102 3600000 mail.local."
local-data: "proxy.local. 3600000 IN A 172.16.1.103"
local-data-ptr: "172.16.1.103 3600000 proxy.local."
local-data: "docker.local. 3600000 IN A 172.16.1.104"
local-data-ptr: "172.16.1.104 3600000 docker.local."
___
文法チェックします。
unbound-checkconf
確認
設定ファイルを読み込みます。
systemctl restart unbound
ちょっと確認。別のマシンからnslookupコマンドを実行してみます。
nslookup network.local 172.16.1.101
nslookup mail.local 172.16.1.101
nslookup proxy.local 172.16.1.101
nslookup docker.local 172.16.1.101
外部のドメイン名(example.com等)も、引き続き名前解決できる事を確認します。
nslookup example.com 172.16.1.101
設定保存
うまくいったらSubversionコミットしておきます。
cd /etc
svn st | grep "^?" | cut -b9- | sudo xargs -rt svn add
svn ci -m"DNS setting: network,mail,proxy,docker"
その他の設定
無線LAN親機など
通常の家庭の場合、無線LANの親機がルータやDHCP等の設定も持っているでしょう。この内DNSを、我が家で言えば172.16.1.101
に向けるように設定します。
- DHCPサーバから通知するDNSサーバアドレスを設定
- DNSルーティング設定とかいう機能で、家庭内で解決する名前のドメイン毎に、Unboundを立てたサーバのIPアドレスを設定
これは機種によって異なります。それぞれのマニュアルを確認して下さい。
但し。我が家のマシン NUC13ANHI5000 はどういう訳か不安定で、電源を数日入れっ放しにしておくと、意味不明なエラーが発生します。たまに再インストールを余儀なくされます。余りにも不安定なので、我が家ではこの設定はしません。家人に不評なので。私のクライアントマシンに手作業で設定する事にします。
起動失敗は今回は発生せず
前回問題になった起動失敗は、今回は発生しませんでした。コンテナにしたからでしょうか。
と言う訳で起動失敗への対応は実施しません。
仕舞い
これで家庭内の名前解決が出来るようになりました。