LoginSignup
1
0

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

Last updated at Posted at 2023-01-28

能書き

自宅サーバー構築譚:基本構想に基づく自宅サーバー構築、Ubuntu22.04LTSインストールのその後です。

以前も同じ内容を書きましたが、22.04になってどうも勝手が変わったようなので、改めて記事を立てます。

※DHCP サーバよりも先に DNS サーバを立てるべきです。

※22.04になってちょっと勝手が変わったような気がしますので、それに対応して参考文献を幾つか追加しました。

参考文献1:Set Up Unbound DNS Resolver on Ubuntu 22.04/20.04 Server参考文献2:第386回 Unboundでお手軽に家庭内DNSサーバーを作ろう - Ubuntu Weekly Recipe
参考文献3:俺様サーバー構築記 - LAN内DNSサーバー Unbound @デスクトップパソコン(BIOS)
参考文献4:Unbound - ArchWiki
参考文献5:自宅サーバを立てる際の家庭内名前解決の落とし穴
参考文献6:Ubuntu 18.04 の systemd-resolved で local DNS stub listener の利用をやめる
参考文献7:Ubuntuで指定されているDNSサーバ 127.0.0.53
参考文献8:ubuntu systemd-resolved で ローカルドメインの解決をする

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

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

準備

家庭内ドメイン

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

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

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

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

スナップショット

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

zfs snapshot tank/ROOT/ubuntu@$(date +%Y%m%d_%H%M%S)_before_Unbound
zfs snapshot tank/ROOT/ubuntu/var/lib/apt@$(date +%Y%m%d_%H%M%S)_before_Unbound
zfs snapshot tank/ROOT/ubuntu/var/lib/dpkg@$(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
?       unbound
M       zfs/zpool.cache

相変わらずな感じです。

  • 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"

systemd-resolved の設定を変更

こいつはDNSの名前解決をするsystemdサービスです。 IP アドレス 127.0.0.53 のポート 53 で待ち受けています。言いたい事は山程ありますが、それは置いときましょう。以前は放置で問題無かったと思うのですが、今回は放置してはダメでした。対策しないとUnboundが起動しません。

systemd-resolvedを止める方法もあります。

参考文献:Ubuntu 18.04 の systemd-resolved で local DNS stub listener の利用をやめる

ただ、止めなくても何とかなるようですな。

参考文献:Dnsmasq で おうち DNS on Ubuntu 20.04 LTS
参考文献:unbound.conf(5) - 日本Unboundユーザー会

とりあえず下記のように設定ファイルを修正しときます。

  • DNSサーバーとして 172.16.1.3 (現在いじっているサーバーマシン)を指定する
  • 家庭内ドメイン .home を自動で補う
sed -i -e"/^#DNS=/c DNS=172.16.1.3" -e"/^#Domains=/c Domains=home" /etc/systemd/resolved.conf
systemctl restart systemd-resolved

Unbound 設定ファイル

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

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

待ち受けるIPアドレスは、外部からの問い合わせも全部受けるなら0.0.0.0を指定するのが一般的です。が、これを指定するとsystemd-resolvedと衝突して起動に失敗します。そこで172.16.1.3(このマシンのIPアドレス)を指定する事にします。

もしIPアドレスを複数割り当てている場合には、その分だけinterface行を増やせば良いようです。

参考文献:unbound.conf(5) - 日本Unboundユーザー会

cd /etc/unbound/unbound.conf.d/
cat >home.conf <<___
server:
  username: unbound
  verbosity: 1
  interface: 172.16.1.3
  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"
  hide-identity: yes
  hide-version: yes
remote-control:
  control-enable: no
___
touch machines.list

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

(2023.05.24. 追加ここから)
どうやら家庭内LANのwifiルータ172.16.2.1を指定すると、思った通りには動かないようです。名前解決が時々できなくなってしまう模様。機種によるのかな?
プロバイダから指定されているDNSサーバーを指定したら上手くいった気がします。読者諸氏におかれましては御注意されたし。
(2023.05.24. 追加ここまで)

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

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

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

unbound-checkconf

起動

unbound の設定変更時には、systemctl reloadでは駄目でsystemctl restartが必要のようです。権限がどうとか。

systemctl enable unbound
systemctl restart unbound

起動を確認。

systemctl status unbound

外の名前解決を確認。

nslookup example.com

Subversion 登録

一応大丈夫そうなので/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"

設定:無線 LAN 親機

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

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

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

ウチは最近になって無線 LAN ルーターを買い替えました。とある有名なゲーミングルーターが安売りしてたので飛びついたのですが、ちょっと失敗だったかも知れません。良いと思っていた機能が無くなってしまったので。その内の一つが、DHCP の設定として DNS サーバーアドレスを指定する機能。残念。

仕方が無いのでクライアントマシン側で設定します。

しかも Windows は、Hyper-V を設定するとネットワーク環境は複雑怪奇になるんですな。しかもそれを解説した記事が出てきません。困った物です。

まずはタスクバー右端の wifi の電波マークを右クリックして、ポップアップメニューから「ネットワークとインターネットの設定を開く」

まずは Winキー>設定>ネットワークとインターネット

ネットワークとインターネット.png

画面左のメニュー>イーサネット>ネットワークと共有センター

イーサネット.png

画面右の接続>vEthernet (wifi)

ネットワークと共有センター.png

vEthernet (wifi)の状態ダイアログが表示されるので、プロパティボタンをクリック。

vEthernet(wifi)の状態.png

vEthernet (wifi)のプロパティダイアログで「インターネット プロトコル バージョン4 (TCP/IPv4)」を選択し、プロパティボタンをクリック。

vEthernet(wifi)のプロパティ.png

インターネット プロトコル バージョン 4 (TCP/IPv4)のプロパティダイアログが表示されます。「次の DNS サーバーのアドレスを使う」ラジオボタンを選択し、優先 DNS サーバーに、今回設定しているサーバーの IP アドレスを入力します。

インターネットプロトコルバージョン4(TCP/IPv4)のプロパティ.png

更にここから詳細設定ボタンをクリック。
TCP/IP 詳細設定ダイアログの「以下の DNS サフィックスを順に追加する」に home を追加すればOKです。

TCPIP詳細設定.png

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

なぜか上手くいきません。

DOSプロンプトからnslookupコマンドを打ってみたのですが、なぜか、名前解決してくれません。はこれで上手くいったんだけどなぁ。

第2引数としてDNSサーバーのIPアドレス 172.16.1.3 を与えると、きちんと名前解決します。従って問題はサーバー側ではなくてWindows側だと思われますが。

困った事にpingコマンドだと正しく名前解決してくれるんですよね。逆だと事例が溢れていますが、このケースは他に無さそうですな。困りました。

けど、ここに拘ってるといつまでも進まないので、放置する事にしました。

仕舞い

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

1
0
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
1
0