ECSを活用したAdGuard HomeとRouteDNSによる自宅サーバの名前解決

AdGuard Home の ECS (EDNS Client Subnet) 付与機能と RouteDNS を組み合わせることで、自宅サーバで起動している各アプリケーションに自宅内からも外出先からも同じドメイン名でアクセスできるようにした。

前提

解決したいこと

課題

単純に外出先からアクセスできるようにすると、自宅内のアプリケーションにアクセスするためにわざわざインターネットを経由することになるので、自宅内ではアプリケーションに直接アクセスできるようにしたい。

反対に、各サービスのプライベート IP アドレスを AdGuard Home に登録してしまうと、外部に公開しているアプリケーションに外出先からアクセスできなくなってしまう。

解決方法

名前解決要求に付与されている ECS が自宅ネットワーク外のものであれば外部の DNS サーバに問い合わせ、そうでなければ自宅サーバの IP アドレスを返すようにする。

これを、AdGuard Home の ECS 付与機能と RouteDNS を組み合わせて実現した。

ECS に基づいて名前解決の挙動を切り替える機能を持つ DNS サーバであれば、RouteDNS 以外のツールでも代用可能。

設定手順

1. Traefikで使用しているDockerネットワークのアドレスレンジを、AdGuard Homeの設定ファイル内の trusted_proxies に追加する

この設定は、AdGuard Home が接続元 IP アドレスを正しく認識するために重要となる。 Traefik を経由して AdGuard Home にアクセスする場合、デフォルトでは Traefik の IP アドレスが接続元として認識されてしまう。

trusted_proxies に Traefik が使用する Docker ネットワークのアドレスレンジを追加することで、AdGuard Home は本来のクライアント IP アドレスを認識し、ECS 付与機能が正しく動作するようになる。

以下は、Adguard Home の設定ファイルの該当部分。

dns:
  # 中略
  trusted_proxies:
    - 127.0.0.0/8
    - 172.16.0.0/12  # TraefikのDockerネットワークのアドレスレンジに合わせて変更
    - ::1/128

2. AdGuard HomeのGUI、または、設定ファイルでECSの付与機能を有効にする

AdGuard Home の ECS 付与機能を有効にすることで、DNS クエリにクライアントの IP アドレス情報(ECS)が付加されるようになる。 この情報に基づいて、RouteDNS が名前解決の挙動を切り替える。

3. RouteDNSをAdGuard Homeからアクセスできるように起動する

RouteDNS は、AdGuard Home からの DNS クエリを受け取り、ECS 情報に基づいて適切な IP アドレスを返す。RouteDNS を Docker コンテナとして起動し、AdGuard Home からアクセスできるように設定する。

私は、AdGuard Home と RouteDNS を同じ Docker ネットワークにしている。

4. AdGuard Homeで、example.com (各サービスへのアクセスに使用しているドメイン)の名前解決先をRouteDNSにする

AdGuard Home に対して、特定のドメイン名 (example.com) の名前解決を RouteDNS に委譲するように設定する。 これにより、AdGuard Home は、example.com に関する DNS クエリを RouteDNS に転送し、RouteDNS が ECS 情報に基づいて適切な IP アドレスを返す。

5. スマートフォンの名前解決先をAdGuard Homeにする

DoH (DNS over HTTPS) で名前解決できるようにするアプリをスマートフォンにインストールしておき、外出時にアプリを有効化する。

例: Android の場合、Intra、Rethink など。

Cloudflare を用いて AdGuard Home にアクセスできるようにしているため、アプリには Adguard Home の DoH の URL を設定している。

アプリは VPN 接続をすることで DoH を有効にしているが、 Tailscale よりもバッテリーの持ちが(体感で)よいと感じている。