UnboundでDNSリゾルバーを構築:プライバシーを確保しLinuxネットワークを高速化する

Network tutorial - IT technology blog
Network tutorial - IT technology blog

5分で完了:Unboundの基本インストール

「借り物」のDNS設定を使う代わりに、自分専用のDNSを構築しましょう。この手順はUbuntu/Debianを前提としていますが、CentOSやFedoraを使用している場合は aptdnf に読み替えればOKです。

# システムの更新とUnboundのインストール
sudo apt update
sudo apt install unbound -y

# ルートヒント(Unboundがルートサーバを見つけるための地図)をダウンロード
wget https://www.internic.net/domain/named.cache -O /etc/unbound/root.hints

# 最小限の設定ファイルを作成
sudo nano /etc/unbound/unbound.conf.d/pi-hole.conf

以下の設定内容をファイルに貼り付けてください。これは基本的な構成ですが、ほとんどの用途には十分です:

server:
    interface: 127.0.0.1
    port: 53
    do-ip4: yes
    do-udp: yes
    do-tcp: yes
    root-hints: "/etc/unbound/root.hints"
    access-control: 127.0.0.0/8 allow
    auto-trust-anchor-file: "/var/lib/unbound/root.key"

サービスを有効化して、成果を確認しましょう:

sudo systemctl restart unbound
dig google.com @127.0.0.1

出力の中に status: NOERROR という行があれば、自分専用のローカルDNSリゾルバーが正常に動作しています。

GoogleやCloudflareが便利な中、なぜ自分でDNSを構築するのか?

8.8.8.8や1.1.1.1を使えば手軽ですが、その代償はプライバシーです。ブラウザでURLを入力してEnterを押すたびに、テック大手はあなたが何をしているかを知ることになります。Unboundを自作することで、この追跡を断ち切ることができます。

さらに深刻なのがDNSハイジャックです。多くのISPは、エラーになったDNSリクエストを「不当に」広告ページへリダイレクトしたり、偽のIPを使って特定のサイトをブロックしたりすることがあります。Unboundは、中間業者を一切介さずルートサーバから直接再帰的に問い合わせを行うため、この問題を根本的に解決します。

私の経験談: DNSは混雑時のネットワークの安定性に直結します。DNSのレスポンスが遅いと、回線が数百Mbpsあってもブラウジングは非常にストレスフルになります。ローカルにキャッシュを持つUnboundを導入すれば、2回目以降のアクセスでは遅延が150msからほぼ0msへと劇的に改善されます。

動作の仕組み:代理で聞くのではなく「再帰」で解決

再帰リゾルバー(Recursive)vs フォワーダー(Forwarder)

一般的に使われているDNSの多くはフォワーダーです。彼らが代わりに問い合わせを行い、その結果を返します。対してUnboundは真の再帰リゾルバーです。そのプロセスは、以下のような対話形式で行われます:

  1. あなた:「itfromzero.comはどこ?」
  2. Unboundがルートサーバ(”.”)に聞く:「.comの管理者は誰?」
  3. ルートサーバがTLDサーバ(”.com”)を指し示す。
  4. UnboundがTLDサーバに聞く:「itfromzero.comのアドレスはどこ?」
  5. 最後に、権威サーバ(Authoritative Server)からIPを取得し、あなたに回答します。

DNSSECによる鉄壁のセキュリティ

DNSSECは、DNSデータに対する「封印」のようなものです。Unboundはデフォルトでこの電子署名を検証します。もしドメインのIPが偽装(DNSポイズニング)された場合、Unboundは署名の不一致を検知して即座に結果をブロックし、フィッシングサイトからあなたを守ります。

高度な設定:ハイスペックサーバ向けの最適化

サーバのリソースに余裕があるなら、Unboundのパフォーマンスをさらに引き出すための調整を行いましょう。設定ファイルに以下の行を追加してください:

server:
    num-threads: 2 # CPUのコア数に合わせて調整してください

    # キャッシュフラグメンテーションの最適化
    msg-cache-slabs: 4
    rrset-cache-slabs: 4
    infra-cache-slabs: 4
    key-cache-slabs: 4

    # レスポンス向上のためのキャッシュ容量拡大
    rrset-cache-size: 100m
    msg-cache-size: 50m

    # 匿名化設定
    hide-identity: yes
    hide-version: yes
    prefetch: yes # 期限が切れる前にキャッシュを自動更新する

DNS over TLS (DoT) の威力

Cloudflareにリクエストを転送したいけれど、ISPの監視が気になる?DoTがその解決策です。外部へのクエリをすべて暗号化するために、以下のセクションを追加します:

forward-zone:
    name: "."
    forward-addr: 1.1.1.1@853#cloudflare-dns.com
    forward-addr: 1.0.0.1@853#cloudflare-dns.com
    forward-ssl-upstream: yes

実際の運用における注意点

Unbound의 導入では、時として些細なネットワーク接続問題で時間を浪費することがあります。以下のポイントを心に留めておいてください:

  • ポート53の競合: Ubuntuでは systemd-resolved がポート53を占有していることがよくあります。sudo systemctl disable --now systemd-resolved で停止させましょう。
  • root.keyの権限: ログに「permission denied」と表示される場合は、unbound ユーザーに /var/lib/unbound/root.key への書き込み権限を付与してください。
  • ファイアウォールの設定: LAN内の他のデバイスからも利用する場合は、ファイアウォールでポート53(UDPおよびTCP)を開放するのを忘れないでください。

小技:dig コマンドを2回実行してみてください。2回目は Query time が0 msecになり、キャッシュが完璧に動作していることが実感できるはずです。

# 1回目:150〜200 msecかかる場合があります
dig itfromzero.com @127.0.0.1 | grep "Query time"

# 2回目:0 msec。これぞ光速!
dig itfromzero.com @127.0.0.1 | grep "Query time"

DNSを自律させることは、単なる速度の問題ではなく、インターネットインフラをより深く理解するための第一歩です。もし途中で困ったことがあれば、コメント欄で教えてください。一緒に解決しましょう。

Share: