LoginSignup
6
4

自宅サーバー構築譚:LAN内DNSサーバー Unbound

Last updated at Posted at 2022-03-27

(R5.2023.05.05 追記・ここから)
Ubuntu22.04LTSになって少々勝手が変わったようです。そのため記事を書き直しています。新しい記事をご参照ください
(R5.2023.05.05 追記・ここまで)

自宅サーバー構築譚:基本構想に基づく自宅サーバー構築、dhcpサーバに続く作業になります。IP繋がりという事と、Kerberos をインストールしようとすると DNS が必須らしいので、今回は LAN 内 DNS サーバにしました。

※やってみてわかりましたが、DHCP サーバよりも先に DNS サーバを立てるべきでした。まぁいいか。

以前同じ事をやりましたが、今回はUbuntuでやり直します。

参考文献1:第386回 Unboundでお手軽に家庭内DNSサーバーを作ろう - Ubuntu Weekly Recipe
参考文献2:俺様サーバー構築記 - LAN内DNSサーバー Unbound @デスクトップパソコン(BIOS)
参考文献3:Unbound - ArchWiki
参考文献4:自宅サーバを立てる際の家庭内名前解決の落とし穴

余談。こんな事もあった模様。

参考文献5:Ubuntu 20.04 その64 - Unboundにアンプ攻撃やDoSの脆弱性・アップデートを -
kledgeb

準備

家庭内ドメイン

いよいよです。

自分ちのドメイン名、何にしますか?

一番正しいのはお金を出して買う事です。維持費も掛かります。しかし月に缶ジュース1~2本分も出せば、結構良い奴を維持できます。

ただ、家庭内限定ならロハで .home とかでも良さそうです。会社だったら .corp でしょうか。外部には公開できませんが、家庭内ですし。
我が家は .home に決めました。

因みに .local はやめましょう。

参考文献:TLDにおける名前衝突 (Name Collision)問題 - JPNIC

スナップショット

インストール前にスナップショットを撮りましょう。

zfs snapshot tank/main/ubuntu@$(date +%Y%m%d_%H%M%S)_before_Unbound

起動

インストール

下記コマンドを実行。

# apt install -y unbound

インストールできたら/etcをバージョン管理します。

cd /etc
svn st

こうなりました。

# cd /etc
# svn st
?       apparmor.d/local/usr.sbin.unbound
?       apparmor.d/usr/sbin/unbound
M       group
M       gshadow
?       init.d/unbound
?       insserv.conf.d
M       ld.so.cache
M       passwd
?       rc0.d/K01unbound
?       rc1.d/K01unbound
?       rc2.d/K01unbound
?       rc3.d/K01unbound
?       rc4.d/K01unbound
?       rc5.d/K01unbound
?       rc6.d/K01unbound
?       resolvconf
M       shadow
?       systemd/system/multi-user.target.wants/unbound.service
?       systemd/system/unbound.service.wants
?       unbound

相変わらずな感じです。

  • apparmorはウイルス対策ソフトの一種と思われる
  • ld.so.cacheはライブラリの場所のキャッシュ
  • アカウントとグループの追加(groupgshadowpasswdshadow
  • init.d 関連と systemd 関連
  • unboundは設定ファイルのディレクトリと思われる
  • resolvconfは何でしょう?

取り敢えず全部追加して更新。

svn st | grep "^?" | cut -b9- | xargs -I{} find {} -type f -or -type d -or -type l | xargs -rt svn add

ちょっと警告が出ます(already under version control)が、こいつは無視して下さい。心配ならsvn stで全部追加されてる事を確認すればOKです。

それからcommitします。

svn ci -m"installed Unbound"

設定ファイル

参考文献や上述の/etcに追加されたディレクトリなどから判断して、主な設定ファイルは/etc/unbound/unbound.confです。この中身はinclude: "/etc/unbound/unbound.conf.d/*.conf"というだけの恐ろしく単純な1行、及び英語のコメント。従ってオレオレ設定は/etc/unbound/unbound.conf.dに適当なファイル名で置けば良いのでしょう。

今回は下記のように修正しました。

待ち受けるIPアドレスは、外部からの問い合わせも全部受けるなら0.0.0.0を指定するのが一般的です。

cd /etc/unbound/unbound.conf.d/
cat >home.conf <<___
server:
  verbosity: 1
  interface: 0.0.0.0
  access-control: 172.16.0.0/16 allow
  root-hints: "/etc/unbound/unbound.conf.d/parent.hints"
  include: "/etc/unbound/unbound.conf.d/machines.list"
___
touch machines.list

ルートヒントは、世界的に使用されているグローバル標準 https://www.internic.net/domain/named.cache がある訳ですが。家庭内LANなのでプロバイダが指定してくる物を上位DNSとすれば十分かなと。という訳で、ルートヒントは家庭内LANのルータ172.16.0.1を指定するだけのファイルを用意しました。定期的な更新なんかも不要ですしね。

cat >parent.hints <<___
.            3600000 NS ROUTER.HOME.
ROUTER.HOME. 3600000 A  172.16.0.1
___

Unbound の設定ファイルを修正したら、文法チェックのツールを実行しておきましょう。

参考文献:unbound-checkconf(8) - 日本Unboundユーザー会

unbound-checkconf

設定:無線 LAN 親機

通常の家庭の場合、無線 LAN の親機がルータや DHCP 等の設定も持っているでしょう。この内 DNS を、我が家で言えば 172.16.0.3 に向けるように設定します。

  1. DHCPサーバから通知するDNSサーバアドレスを設定
  2. DNSルーティング設定とかいう機能で、家庭内で解決する名前のドメイン毎に、Unboundを立てたサーバのIPアドレスを設定

これは機種によって異なります。それぞれのマニュアルを確認して下さい。

無線 LAN 側に設定が無ければクライアント側で設定します。OS によって異なりますが、例えばWindows10ならネットの海を漂えば設定方法は簡単に見つかるでしょう。

更に言うと、我が家の無線 LAN ルータには DNS ドメイン(サフィックスドメイン) home を DHCP 配布するような設定がありませんでした。まぁ home 程度ならマシン名を検索する度に打っても大した手間ではありませんが、ちょっと悔しい。どうしても省略したいならクライアント側で設定しましょう。例えば Windows10 なら、下図ダイアログの「以下の DNS サフィックスを順に追加する」に home を追加すればOKです。

TCPIP詳細設定.png

こうしておけば、後で内向きDNSを設定した時に、secondary.homeではなくてsecondaryだけで名前解決してくれるようになります。

systemd-resolved について

こいつはDNSの名前解決をするsystemdサービスです。 IP アドレス 127.0.0.53 のポート 53 で待ち受けています。言いたい事は山程ありますが、それは置いときましょう。

参考文献: systemd-resolved - ArchWiki

色々試行錯誤しましたが、これは放置で問題ありません。ネット上には止める記事が沢山見つかりますが、止める必要はありませんでした。そのまま動かし続けて大丈夫です。

起動

systemd-resolved を止める必要はありませんが、マシン起動時に Unbound が起動しない現象は確かにあります。その原因はリトライ回数不足です。どうやら Unbound はちょっと遅めに起動した方が良い模様(多分何か条件が足りてないのではないかと推測)ですが、起動できる時点に達する前にリトライを止めてエラー扱いにしてしまうようです。

この辺の事情はマシン起動後にsystemctl status unboundコマンドを実行して、エラーメッセージを丁寧に読むと理解できます。

対処方法は下記。StartLimitBurstを適当に大き目の値にして下さい。

参考文献:Linux: systemdのstart request repeated too quickly for xxx.service - Narrow Escape

cd /etc/systemd/system/
mkdir unbound.service.d
cd unbound.service.d
cat >dropin.conf <<___
[Service]
StartLimitBurst=30
___

(2023/01/03 追記ここから)
ドロップインファイルを追加したら下記コマンドを実行します。

systemctl daemon-reload

(2023/01/03 追記ここまで)

これが出来たら起動。unbound の設定変更時には、systemctl reloadでは駄目でsystemctl restartが必要のようです。権限がどうとか。

systemctl enable unbound
systemctl restart unbound

まだ新しい名前を設定してないので、この段階での確認はsystemctl statusだけですな。

systemctl status unbound

後処理

一応大丈夫そうなので/etcをコミットしましょう。

cd /etc
svn st | grep "^?" | cut -b9- | xargs -rt svn add
svn ci -m"Unbound initial settings"

内向きDNS

これです。この為に、家庭内名前解決とか面倒臭い事をするんです。

設定

マシン名は/etc/unbound/unbound.conf.d/machines.listに追加します。正引きと逆引きの両方が必要です。後は好きに設定して下さい。

参考文献:2.5 内向きDNS - 2 Unboundのインストール - Unboundで内向きDNSを建てる - 純規の暇人趣味ブログ

cd /etc/unbound/unbound.conf.d/
cat >>machines.list <<___
local-data: "secondary.home. 3600000 IN A 172.16.1.3"
local-data-ptr: "172.16.1.3 3600000 secondary.home."
___
unbound-checkconf

確認

設定ファイルを読み込みます。

systemctl restart unbound

ちょっと確認。別のマシンからnslookupコマンドを実行してみます。

nslookup secondary.home

外部のドメイン名 example.com 等も、引き続ききちんと名前解決できる事を確認します。

nslookup example.com

設定保存

cd /etc
svn ci -m"DNS setting: secondary"

これで設定完了となります。やったね:thumbsup_tone2:

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4