能書き
自宅サーバー構築譚:基本構想に基づく自宅サーバー構築、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
はライブラリの場所のキャッシュ - アカウントとグループの追加(
group
とgshadow
とpasswd
とshadow
) - 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 に向けるように設定します。
- DHCPサーバから通知するDNSサーバアドレスを設定
- DNSルーティング設定とかいう機能で、家庭内で解決する名前のドメイン毎に、Unboundを立てたサーバのIPアドレスを設定
これは機種によって異なります。それぞれのマニュアルを確認して下さい。
ウチは最近になって無線 LAN ルーターを買い替えました。とある有名なゲーミングルーターが安売りしてたので飛びついたのですが、ちょっと失敗だったかも知れません。良いと思っていた機能が無くなってしまったので。その内の一つが、DHCP の設定として DNS サーバーアドレスを指定する機能。残念。
仕方が無いのでクライアントマシン側で設定します。
しかも Windows は、Hyper-V を設定するとネットワーク環境は複雑怪奇になるんですな。しかもそれを解説した記事が出てきません。困った物です。
まずはタスクバー右端の wifi の電波マークを右クリックして、ポップアップメニューから「ネットワークとインターネットの設定を開く」
まずは Winキー>設定>ネットワークとインターネット
画面左のメニュー>イーサネット>ネットワークと共有センター
画面右の接続>vEthernet (wifi)
vEthernet (wifi)の状態ダイアログが表示されるので、プロパティボタンをクリック。
vEthernet (wifi)のプロパティダイアログで「インターネット プロトコル バージョン4 (TCP/IPv4)」を選択し、プロパティボタンをクリック。
インターネット プロトコル バージョン 4 (TCP/IPv4)のプロパティダイアログが表示されます。「次の DNS サーバーのアドレスを使う」ラジオボタンを選択し、優先 DNS サーバーに、今回設定しているサーバーの IP アドレスを入力します。
更にここから詳細設定ボタンをクリック。
TCP/IP 詳細設定ダイアログの「以下の DNS サフィックスを順に追加する」に home を追加すればOKです。
こうして DNS サフィックスを設定しておけば、後で内向きDNSを設定した時に、secondary.home
ではなくてsecondary
だけで名前解決してくれるようになります。
なぜか上手くいきません。
DOSプロンプトからnslookup
コマンドを打ってみたのですが、なぜか、名前解決してくれません。前はこれで上手くいったんだけどなぁ。
第2引数としてDNSサーバーのIPアドレス 172.16.1.3 を与えると、きちんと名前解決します。従って問題はサーバー側ではなくてWindows側だと思われますが。
困った事にping
コマンドだと正しく名前解決してくれるんですよね。逆だと事例が溢れていますが、このケースは他に無さそうですな。困りました。
けど、ここに拘ってるといつまでも進まないので、放置する事にしました。
仕舞い
これで設定完了となります。やったね