世界を動かす技術を、日本語で。

自宅での自分専用DNSサーバー – 第1部: IPv4

概要

  • DNS構築 とトラブルの多さに関する有名なミーム「It’s always DNS」の紹介
  • 自宅ネットワーク でのデジタル主権実現を目指し、BINDによるDNSサーバ構築手順を解説
  • 複数ネットワーク (192.168.1.0/24、172.16.0.0/16、10.88.0.0/16)対応の設定例
  • zoneファイルの作成 とBINDの主要設定ポイントの解説
  • 失敗しても影響が小さい 自宅ネットワークでのDNS学習のすすめ

「It’s always DNS」―自宅ネットワークでBINDサーバを構築する

  • DNSトラブル はネットワーク管理者の間でよくある問題として知られるミーム
  • DNS(Domain Name System) はホスト名(例:jan.wildeboer.net)をIPアドレスに変換する仕組み
  • 自宅ネットワークのデジタル主権 を目指し、インターネット接続がなくても動作するDNSサーバ構築に挑戦
  • Raspberry Pi 4 (Fedora 42)をインフラサーバとして利用し、BINDでDNSサービスを提供
  • Fritz Box 7490 をフォワーダーとして、外部解決もカバー

構成ネットワークとホスト

  • 192.168.1.0/24 :自宅IPv4ネットワーク
  • 172.16.0.0/16 :homelabサーバの2ndイーサネット用IPv4ネットワーク
  • 10.88.0.0/16 :Podmanコンテナ用仮想ネットワーク
  • inf01.homelab.jhw (192.168.1.10):Raspberry Pi 4(CAサーバも兼任)
  • hl01/hl02/hl03.homelab.jhw (192.168.1.11-13):ThinkCentre Tiny PC群(RHEL10)
  • Fritz Box 7490 (192.168.1.254):ルーター兼DNSフォワーダー

注意点:TLDの選択

  • .internal TLD の利用が推奨されるが、今回は独自判断で .jhw を使用
  • 将来的に .jhw TLD が公的に利用されるリスクがあるため、推奨はしない

BINDのインストールと基本設定

  • BINDとユーティリティのインストール
    • dnf install bind bind-utils
  • ファイアウォールの設定
    • firewall-cmd --add-service=dns --permanent

BIND主要設定ファイル

  • /etc/named.conf :BINDのメイン設定ファイル
    • どのネットワークでリッスンするか、どのゾーンを管理するかを記述
  • /var/named/forward.homelab.jhw :正引きゾーンファイル(ホスト名→IPアドレス)
  • /var/named/reverse.homelab.jhw :逆引きゾーン(192.168.1.0/24用、IPアドレス→ホスト名)
  • /var/named/reverse2.homelab.jhw :逆引きゾーン(172.16.0.0/16用)

/etc/named.confの主なポイント

  • listen-on port 53 :複数IPでDNSクエリを受け付ける設定
  • allow-query :許可するクライアントネットワークの指定
  • forwarders :外部問い合わせ時の転送先(Fritz Box 7490)
  • recursion yes :再帰問い合わせの許可
  • dnssec-validation no :DNSSECは今回は無効化
  • zone定義 :forwardゾーン(homelab.jhw)、reverseゾーン(1.168.192.in-addr.arpa、16.172.in-addr.arpa)

ゾーンファイルの基本

  • $TTL 3600 :デフォルトTTL(1時間)
  • SOAレコード :ゾーンの権威サーバと管理者メール
  • NSレコード :ネームサーバ指定
  • Aレコード :ホスト名→IPアドレスの正引き
  • CNAMEレコード :別名(例:ca.homelab.jhw→inf01.homelab.jhw)
  • 逆引きゾーン :PTRレコードでIPアドレス→ホスト名を対応付け

運用上の注意

  • ゾーンファイルのシリアル番号 は変更のたびに必ず増やすこと
  • シリアル番号を更新しないとキャッシュや同期の問題発生
  • 新しいホスト追加時はAレコード追加→シリアル更新→systemctl reload named

自宅ネットワークでDNSを学ぶメリット

  • 失敗しても影響範囲が限定的 なため、安心して試行錯誤可能
  • ネットワーク理解の深化 とトラブルシュート力の向上
  • 将来的なネットワーク拡張 や自動化にも応用可能

まとめ

  • BINDによるDNSサーバ構築 は設定ファイルやゾーンファイルの仕組みを理解すれば難しくない
  • 自宅ネットワーク での運用は、DNSのトラブルや挙動を安全に学ぶ最適な場
  • 公式TLDの選択やシリアル番号管理 など、運用上の注意点も押さえる必要あり
  • ネットワーク拡張や自動化 の第一歩として、自前DNS構築は大きな価値

Hackerたちの意見

家でunboundを使って権威あるネームサーバーを設定したんだけど、BINDの設定よりずっと簡単に感じる。でも、まだ完全には理解できてないかな。DNS(ネットワーク全般もだけど)はちょっと難しいよね。

NSDを試してみて。unboundとは違って、NSDはプロジェクトの実際の権威あるネームサーバーだよ。

90年代半ばから家でBINDを使ってる。ISDNの頃からだね。始めたときはO'Reillyの「DNS and BIND」本が頼りだった。

DNS(ネットワーク全般もだけど)はちょっと難しいよね。ダイナミックルーティングは楽しい :)

unboundはあまり間違えようがないし、めちゃくちゃ速くて軽いよ。BINDやPowerDNSで泣く男たちもいるけど、これらのサーバーはおもちゃ箱を丸ごと持ってるからね。BINDのデーモンをたくさん立ち上げたことがあるよ。昔、MySQLのレプリケートバックエンドを持つPDNSサーバーを2台運用してた。今は、インターネットに公開されていてかなり制限されたPDNSをACME DNS-01(Lets Encrypt)用に使ってる。CAコンソーシアムは、SSL証明書の有効期限を3年以内に40日程度に短縮するように求めてる。顧客のためにかなりの数のSSL証明書を管理してるよ。とにかく、ホームラボをやってるなら、Pi Holeを考えてみるのもいいかも(Piで動かす必要はないし、VMでも大丈夫)。もう少しハードコアな選択肢としては、https://technitium.com/dns/(ウェブGUI - やった!)もある。pfSenseにはunboundが組み込まれてるし、OPNSenseもそうだと思う。どちらもルーターとしてはいい選択肢だよ。OpenWRTにもunboundが入ってるはず。unboundはあまり間違えようがないって言ったけど、本当にそう思ってる。動けば、ほぼ確実に正しく設定されてるよ。

同じく、広告ブロックも使ってるよ。

私も家でunboundを使ってる。unboundの大きな利点は、ワイルドカードに対して何でも返せることだと思う。TLDのワイルドカードも含めてね。セイシェルのDNSは完全にハイジャックされてて、マルウェアしか提供してない?.sc全体を無効化しちゃう?いや、うちではそれは解決しないよ。などなど。だからunboundは、古いRaspberry Piでも、何十万行もあるブロックリストを使っても楽に動いてる。

DNSは実際かなり簡単なんだよね。問題は、Bindのゾーンファイルが本当に使いにくいインターフェースで、実際よりも10倍難しく感じさせること。あんまり不満はないけど(だってフリーソフトだし、あまり文句は言えないと思ってるから)、他のDNSソリューションと比べると、簡単さが雲泥の差だよね。例えば、WindowsのDNSサーバーを運用するのは(家でやることではないけど)すごく簡単で、Microsoftがユーザー体験を磨いてるからね。Linuxにももっと洗練された代替があると思うけど、どれがあるかよく知らないから、具体的な例を挙げられないんだ。

自分でdns4jを使ってコードを書いたよ。自分のドメインを提供するだけなら10行のコードで済むんだ。でも、すべてのドメインを提供しようとすると問題が出てくると思う。どのデータベースがベストなんだろう?単にMySQLでintから名前のテーブルを作る感じ?DNSの問題は、ポート53が開いている固定の外部IPが必要なことだよね。安く手に入れるのは簡単じゃない。

家にはOpenBSDのボックスがあって、ネットワークゲートウェイとしてunboundとnsdを動かしてる。unboundがキャッシュと再帰を担当して、nsdがローカルの名前解決をしてるんだ。小さなユーティリティ(2つのシェルスクリプトと1つのPythonスクリプトで構成されてる)を作って、/var/db/dhcpd.leasesの変更を監視して、変更を解析してnsd用のゾーンファイルを生成してる。追記: https://paste.rs/vgr7t.txt

スクリプトのアプローチはいいアイデアだね。私もあなたが言ってるようなOpenBSDのボックスを持ってるけど、ISC dhcpdとBINDを使ってる。これが古いスタイルのダイナミックDNSを実現する唯一の設定なんだ。DHCPサーバーがリースが発生したときにBINDにゾーンの更新を送るから。でも、BINDは嫌いだし、この設定はDHCPv6ともうまくいかない(理由はわからないけど、原則的にはできるはず…)だから、「リースを読み取ってゾーンファイルを生成するスクリプト」のアプローチに切り替えた方がいいかも。

個人的には、BINDは設定が本当にひどいDNSサーバーだと思う。ArchやGentooを設定するようなもので、たくさんの設定があって、システムのあらゆる部分について学べるけど、実際には触れるべきフィールドはほんの数個なんだ。私の選ぶDNSサーバーはPowerDNSだよ。certbotや利用可能なウェブUIとのAPIも使いやすいと思う。

Hacker Newsで議論の続きを見る