なぜ内部インフラにTechnitium DNS Serverを選んだのか?
10以上のプロジェクトでセキュリティ監査を行った結果、見落とされがちな脆弱性に気づきました。それがDNSです。多くの人はプロバイダーのデフォルトDNSや8.8.8.8などのパブリックDNSをそのまま使っています。しかし、UDPポート53経由の純粋なDNSクエリは全く暗号化されていません。これは、途中で誰にでも中身を覗き見られるハガキを送っているようなもので、中間者攻撃(MitM)やプロバイダーによる閲覧履歴の監視のリスクを招きます。
以前はPi-holeやAdGuard Homeを使っていました。それらも素晴らしいツールですが、システムが複雑になるにつれ、BINDのような深いZone管理能力を持ちつつ、使いやすい本物のDNSサーバーが必要になりました。その答えがTechnitium DNS Serverです。これは.NET上で動作するオープンソースのソリューションで、DNS-over-HTTPS (DoH) や DNS-over-TLS (DoT) といった現代的なプロトコルを標準でサポートしています。
独自のDNSサーバーを構築することには、2つの大きなメリットがあります。1つ目は、ローカルキャッシュメカニズムによるドメイン名解決の圧倒的な速さです。2つ目は、ネットワークの「入り口」で広告やトラッカーを遮断できることです。デバイスごとに広告ブロックアプリを入れる代わりに、自宅やオフィスの全デバイスに対して一度設定するだけで済みます。
LinuxへのTechnitium DNS Serverのインストール
TechnitiumはDockerウェルでもスムーズに動作しますが、本番環境で最高のパフォーマンスと最低の遅延を実現するために、Ubuntu Server 22.04または24.04への直接インストールを推奨します。
ステップ1:システムの準備
まずは、基本パッケージのクリーンアップと更新から始めましょう:
sudo apt update && sudo apt upgrade -y
sudo apt install curl wget apt-transport-https -y
ステップ2:自動スクリプトによるデプロイ
Technitiumの開発チームは、非常に優れたインストールスクリプトを提供しています。.NETランタイムの構成からサービスの設定まで、自動で行ってくれます:
curl -sSL https://download.technitium.com/dns/install.sh | sudo bash
このプロセスは通常2分もかかりません。完了すると、Web UIがポート5380で待機していることが通知されます。
ステップ3:ポート53の解放
最新のLinuxディストリビューションでは、systemd-resolvedがポート53を「占有」していることが多く、DNSサーバーが動作しません。設定ファイルを修正して解放する必要があります:
sudo sed -i 's/#DNSStubListener=yes/DNSStubListener=no/' /etc/systemd/resolved.conf
sudo systemctl restart systemd-resolved
ヒント:Stub Listenerを無効にした後、/etc/resolv.confのリンクが切れることがあります。サーバー自身もTechnitiumの恩恵を受けられるよう、localhostを向くように設定しましょう:
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
実践的な設定:セキュリティと広告ブロック
http://<IP-Server>:5380 にアクセスして開始します。最初に行うべきことは、管理者パスワードの設定です。DNS管理画面は非常に機密性の高い場所ですので、油断しないでください。
DNS-over-HTTPS (DoH) によるクエリの暗号化
これはプライバシーを保護するための重要なステップです。リクエストを平文で送信する代わりに、HTTPSトンネル内にカプセル化します。
- Settings -> Proxy タブを開きます。
- Forwarders に、速度を最適化するために信頼できるDoHサーバーを入力します:
https://dns.cloudflare.com/dns-query
https://dns.google/dns-query
Protocol で DNS-over-HTTPS を選択します。これで、ネットワークからのすべてのDNSリクエストはプロバイダーの監視から「不可視」になります。
広告ブロックフィルターの設定
Technitiumでは、膨大なブロックリストを読み込むことができます。有効にするには:
- Settings -> Blocking に移動します。
- Add Block List をクリックし、信頼できるソースのリンクを貼り付けます。
- 例:StevenBlackのリストには10万以上の悪意のあるドメインが含まれています:
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
経験上のアドバイス:重複するリストを大量に追加しすぎないでください。メモリ(RAM)を圧迫するだけでなく、誤検知(false positive)が発生しやすくなり、通常のウェブサイトにアクセスできなくなる原因になります。
内部ドメイン管理(ローカルDNS)
もし、192.168.1.50 のようなサービスIPを覚えるのに疲れたら、Zone機能を活用しましょう:
- Zones -> Create Zone を選択します(例:
homelab.local)。 dev.homelab.localを目的のIPに向けるAレコードを追加します。
これで、内部サービスへのアクセスがこれまで以上にプロフェッショナルで迅速になります。
テストとパフォーマンスの最適化
個人のPCのDNSをTechnitiumサーバーのIPに変更して試してみましょう。dig コマンドを使って確認します:
dig @<IP-Server-Technitium> vnexpress.net
2回目のクエリで Query time が50msから0-1msに短縮されていれば、キャッシュは完璧に動作しています。
システムの状態監視
Technitiumのダッシュボードは見た目だけではありません。Cache Hit Ratio に注目してください。この比率が高いほど、ネットワーク内のユーザーのブラウジング体験はスムーズになります。また、Blocked Queries 項目では、システムがどれだけの「ゴミ」をフィルタリングしてくれたか、驚くべき数字を確認できます。
Raspberry Piや低スペックのVPSを使っている方への注意点:Settingsで Cache TTL を増やしてください。これにより、サーバーが一般的なドメインを何度も問い合わせる必要がなくなり、CPUの負荷を軽減できます。
独自のDNSサーバーの構築には15分ほどの設定時間がかかりますが、セキュリティとクリーンなネットワーク環境という価値は計り知れません。

