概要
目的: 普段はIPv6で通信したいが、特定のドメインの AAAA(IPv6)だけを返さないようにすることで、自動的に IPv4 へフォールバックさせたいというご相談を受けたので、検証してみました。
ポイントは、OpenWrt 標準の dnsmasq は 全ドメイン一律の --filter-AAAA は可能でも、ドメイン単位の AAAA 抑止は不可なようであるということ。そこで今回はドメインフィルタを目的として AdGuard Home(AGH) を OpenWrt 上で稼働させ、カスタムフィルタ $dnstype=AAAA でドメイン単位に AAAA をブロックします。
また、LAN内のクライアントは引き続きdnsmasqの制御下に置いておきたいので、今回はAGHを立ち上げた上でdnsmasqの上流リゾルバをAGHに向ける設定としていきます。
前提
今回の検証環境(例)
- OpenWrt: 24.10.2
- Model: GL.iNet GL‑MT6000
- 主要パッケージ:
adguardhome(opkg) - IPv6: ISP からの PD または ULA を LAN に配布済み
お困りごと例
- IPv6 + 未ログイン状態の環境において何故か YouTube が視聴不可となる
- (そして何故か IPv4 経由にすると視聴できる)
目標構成
(1) LANクライアント
│ DNS問い合わせ (例: youtube.com)
▼
(2) OpenWrt (dnsmasq :53)
│ 上流転送 (127.0.0.1#5353)
▼
(3) OpenWrt上の AdGuard Home (AGH :5353)
│ 外部リゾルバへ問い合わせ
▼
(4) インターネット上のDNSリゾルバ (例: Cloudflare 1.1.1.1, Quad9 9.9.9.9)
│ 応答
▲
(3') AGH がフィルタ・制御を実施
▲
(2') dnsmasq が LAN クライアントに応答
▲
(1') クライアントが結果を受け取る
設定手順
Step 1)AGH の導入・起動(OpenWrtシェル)
opkg update
opkg install adguardhome
/etc/init.d/adguardhome enable
/etc/init.d/adguardhome start
初期セットアップ UI:http://<ルータのLAN IP>:3000
3000番で何かアプリケーションを起動している場合、あらかじめ落としておきます。
Step 2)AGH の初期設定(Web UI)
http://<ルータのLAN IP>:3000へブラウザからアクセスし、初期セットアップ用のWebコンフィグを開きます。
今回は AGH をルータ内部専用にし、dnsmasq をフロントに据えます。
- 管理用ウェブインターフェイス
- 待ち受けインターフェイス: すべてのインターフェース
→ (構成に応じて適宜変更した方が安全です) - ポート: 3000
→ デフォルトで80が設定されていますが、80はLuciに占有させているので任意のものに変更します
- 待ち受けインターフェイス: すべてのインターフェース
- DNSサーバ
- 待ち受けインターフェイス: lo (127.0.0.1)
→ これで AGH はルータ内部からしか叩けなくなる(LAN から直参照不可) - ポート: 5353
→ デフォルトで53が設定されていますが、53はdnsmasqに占有させているので任意のものに変更します
- 待ち受けインターフェイス: lo (127.0.0.1)
- 管理用WebUIのユーザーID/pass
- 任意のもの
Step 3)AGH の詳細設定(Web UI)
設定ウィザードが完了すると、Step2で設定した管理用Webインターフェースに自動的にリダイレクトされます。ここからAGHの詳細な設定を行ったり、フィルタしたクエリのログを確認したりできます。
適切に設定が完了すると、下画像のようにクエリの件数が増えていきます。
1. 広告ブロックの無効化
まず、今回は広告ブロック目的ではなく名前解決制御を目的として導入しましたので
AGH WebUI → フィルタ → DNSブロックリスト から
- AdGuard DNS filter
- AdAway Default Blocklist
のフィルタどちらもチェックが外れるように変更します。(適用ボタンはなく、チェックを付け外しした時点で設定が適用されます)
2. ドメイン制御の追加
AGH WebUI → フィルタ → カスタム・フィルタリングルール に以下を追加 → 適用する:
-
設定例
||youtube.com^$dnstype=AAAA ||googlevideo.com^$dnstype=AAAA ||ytimg.com^$dnstype=AAAA
これで 対象ドメインの AAAA クエリのみ ブロックします。A は返るので、今回の設定であれば YouTube だけ IPv4 に自然フォールバックされるという仕組み。
3. 上流DNSリゾルバの設定(任意)
AGHから上流に向けての名前解決は基本的にDoHで行うようなのですが、これにはデフォルトでquad9というリゾルバが設定されており、このままでも問題なく動作します。私はCloudflareが好きなので以下のような設定を投入しました。
AGH WebUI → 設定 → DNS設定 に以下を反映 → 適用する(ページ中段):
-
アップストリームDNSサーバー:
https://cloudflare-dns.com/dns-query -
ブートストラップ DNS(DoH 先の初回解決用):
1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001
(適用するボタンの位置が少しだけわかり辛い)
Step 4)dnsmasqの上流リゾルバ設定(OpenWrtシェル)
uci set dhcp.@dnsmasq[0].noresolv='1'
uci add_list dhcp.@dnsmasq[0].server='127.0.0.1#5353'
uci commit dhcp
/etc/init.d/dnsmasq restart
これでdnsmasqからAGHへ名前解決が走るように設定されました。
元の構成に戻す場合、/etc/config/dhcpに追記された2行を削除すればOKです。
uci delete dhcp.@dnsmasq[0].server
uci set dhcp.@dnsmasq[0].noresolv='0'
uci commit dhcp
/etc/init.d/dnsmasq restart
検証
OpenWrt配下のクライアント端末(今回はWindows11)から
Resolve-DnsName youtube.com -Type AAAA
Resolve-DnsName youtube.com -Type A
と2つのコマンドを叩き、Aのみ結果が返されていれば成功です。
おわりに
dnsmasqで簡単に制御できると思ってたので、正直わざわざAGHを導入させられたのはちょっぴり残念。(設定方法知ってる人がいたら教えてください)でも細かい制御がわかりやすく記述できて、すぐ適用できるというのは良いですね。
結局今回ご相談いただいた方には母艦(Win)でAdguardHome立ち上げて一般的な家庭用ルータのDNS解決先をそこに向けてもらって解決したんですが、単体でこういう痒いところに手が届いたときにやっぱりOpenWrt使ってて良かったなぁと感じます。





