TailscaleでAdGuard Homeを導入して広告ブロック環境を構築する

前回の記事「TailscaleでVPN環境を構築する」では、OCI上にTailscaleのExitNodeを構築しました。今回はその続きとして、同じサーバ上にAdGuard Homeを導入し、VPN経由でアクセスする端末の広告を効果的にブロックする環境を構築していきます。

AdGuard Homeとは

AdGuard Homeは、ネットワーク全体の広告とトラッカーをブロックするオープンソースのDNSサーバーです。

主な特徴

  • DNS レベルでの広告ブロック: アプリケーションレベルではなく、DNS解決時点で広告やトラッカーをブロック
  • 詳細なクエリログと統計: リアルタイムでDNSクエリを監視し、詳細な統計情報を提供
  • 豊富なフィルタリスト対応: EasyList、AdGuard filters、Pi-hole listsなど多様なフィルタリストをサポート
  • モダンなWeb管理画面: 直感的で使いやすいWebベースの管理インターフェース
  • 暗号化DNS対応: DNS-over-HTTPS (DoH)とDNS-over-TLS (DoT)をサポート
  • ペアレンタルコントロール: 成人向けコンテンツのブロック機能
  • セーフブラウジング: フィッシングサイトやマルウェアサイトの検出・ブロック

今回の構成

前回構築したTailscale ExitNodeに、AdGuard Homeをコンテナとして追加します。Tailscaleコンテナとネットワークを共有することで、VPN経由でのみアクセス可能なDNSサーバーを構築できます。

サーバーセットアップ手順

前提条件

  • 前回の記事で構築したTailscale環境が動作していること
  • Docker と Docker Compose がインストールされていること
  • サーバーへのSSHアクセスが可能であること

1. 作業環境の準備

まず、AdGuard Home用の作業ディレクトリを作成し、必要なディレクトリ構造を準備します:

# 作業ディレクトリの作成
mkdir -p ~/docker/docker-tailscale-adguard
cd ~/docker/docker-tailscale-adguard

# 必要なディレクトリの作成
mkdir -p adguard_config adguard_data tailscale_var_lib

# ディレクトリの権限設定(AdGuard Homeが書き込み可能にする)
chmod 755 adguard_config adguard_data

Docker Composeファイルの作成

cat > docker-compose.yml << 'EOF'
services:
  tailscale:
    hostname: adguard-hosted              # Tailscaleデバイス名
    image: tailscale/tailscale:latest
    volumes:
      - "./tailscale_var_lib:/var/lib"        # Tailscale設定データの永続化
      - "/dev/net/tun:/dev/net/tun"           # VPN接続に必要
    cap_add:                                    
      - net_admin                             # ネットワーク管理権限
      - sys_module                            # カーネルモジュール操作権限
    environment:
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_EXTRA_ARGS=--accept-routes --accept-dns=false
    restart: unless-stopped

  adguardhome:
    restart: unless-stopped
    volumes:
      - './adguard_data:/opt/adguardhome/work'   # 作業ディレクトリ
      - './adguard_config:/opt/adguardhome/conf' # 設定ディレクトリ
    image: adguard/adguardhome
    network_mode: service:tailscale              # Tailscaleとネットワーク共有
EOF

3. コンテナの起動

# バックグラウンドで起動
docker compose up -d

# 起動状況の確認
docker compose ps

# ログの確認(必要に応じて)
docker compose logs -f

4. Tailscaleの認証

初回起動時は、Tailscaleの認証が必要です:

# 認証URLの確認
docker compose logs tailscale | grep "To authenticate"

# 表示されたURLにアクセスしてログイン
# 例: https://login.tailscale.com/a/XXXXXXXX

認証完了後、Tailscale管理画面のMachinesページで新しいノードが表示されることを確認してください。

Docker Composeでの構築詳細

ディレクトリ構成

最終的なディレクトリ構成は以下のようになります:

~/docker/docker-adguard-tailscale/
├── docker-compose.yml
├── adguard_config/          # AdGuard Home設定ファイル
├── adguard_data/            # AdGuard Home作業データ
└── tailscale_var_lib/       # Tailscale状態データ
    └── tailscale/
        └── tailscaled.state # Tailscale接続状態

設定パラメータの詳細解説

Tailscaleコンテナ設定:

  • hostname: adguard-hosted: Tailscaleネットワークで表示されるデバイス名
  • volumes:
    • ./tailscale_var_lib:/var/lib: 認証情報などの永続化
    • /dev/net/tun:/dev/net/tun: TUNインターフェースへのアクセス(VPN必須)
  • cap_add:
    • net_admin: ネットワーク設定変更権限
    • sys_module: カーネルモジュール操作権限
  • TS_EXTRA_ARGS=--accept-routes --accept-dns=false:
    • --accept-routes: 他のTailscaleノードが広告するルートを受け入れます
    • --accept-dns=false: TailscaleのDNS設定を無効にし、AdGuard HomeのDNSを優先させます(この設定により、AdGuard Home自体がTailscaleのDNSを使用しないようになります)

AdGuard Homeコンテナ設定:

  • network_mode: service:tailscale: Tailscaleコンテナとネットワークスタックを共有
  • volumes:
    • ./adguard_data:/opt/adguardhome/work: クエリログや統計データの保存
    • ./adguard_config:/opt/adguardhome/conf: 設定ファイルの保存

重要なポイント

network_mode: service:tailscale: この設定により、AdGuard HomeはTailscaleコンテナとネットワークスタックを共有します。これにより:

  • AdGuard HomeはTailscaleのIPアドレスでアクセス可能になります
  • 外部からの直接アクセスは不可能で、VPN経由でのみアクセス可能です
  • セキュリティが向上します

セットアップ手順

Tailscaleの管理画面で、作成したノードのIPアドレスを確認し、ブラウザでアクセスします:

http://[TailscaleノードのIP]:3000

初期設定ウィザードが表示されるので、以下の手順で設定します:

  1. 管理画面のポート設定
    • Admin Web Interface: 3000 (デフォルト)
    • DNS Server: 53 (デフォルト)
  2. 管理者アカウント作成
    • ユーザー名とパスワードを設定
  3. DNS設定
    • アップストリームDNSサーバーを設定
    • 推奨: 1.1.1.18.8.8.8

2. Tailscale管理画面でのDNS設定

AdGuard Homeが起動したら、Tailscale管理画面でDNSサーバーとして設定します。この設定により、VPNに接続したすべてのデバイスでAdGuard Homeの広告ブロック機能が有効になります。

DNS設定手順

  1. AdGuard HomeのTailscale IPアドレスを確認

    bash

     docker compose exec tailscale tailscale ip -4
    
  2. Tailscale管理画面でDNS設定

    • DNS設定ページにアクセス
    • Global nameserversセクションで「Add nameserver」をクリック
    • 「Custom」を選択し、AdGuard HomeのTailscale IPアドレス(例:100.x.y.z)を入力
    • Override local DNSトグルを有効化(重要:これにより全デバイスでTailnet DNS設定が強制適用されます)

画像を表示

設定のポイント

Override local DNS の有効化: この設定により、Tailscaleに接続したデバイスがローカルDNS設定を無視し、AdGuard Homeを強制的に使用するようになります。これは重要な設定で、これを有効にしないと一部のデバイスでAdGuard Homeが使用されない可能性があります。

3. キー期限切れの無効化

DNS中断を避けるため、AdGuard Homeノードのキー期限切れを無効化することを推奨します:

  1. MachinesページでAdGuard Homeノードを選択
  2. Disable key expiryを有効化

画像を表示

フィルタリスト設定

AdGuard Homeの管理画面にログイン後、「Filters」→「DNS blocklists」で以下の推奨フィルタを追加します:

  • AdGuard DNS filter: 基本的な広告ブロック
  • EasyList: 広告ブロックの標準リスト
  • EasyPrivacy: トラッカーブロック
  • 日本語フィルタ: 日本語サイトの広告対応

動作確認

DNS動作確認

# クライアントマシンから
nslookup doubleclick.net [AdGuard HomeのIP]

# ブロックされていれば 0.0.0.0 が返される

まとめ

TailscaleとAdGuard Homeを組み合わせることで、セキュアで効果的な広告ブロック環境を構築できました。

この構成により、すべてのTailscaleデバイスで自動的に広告がブロックされ、一貫したフィルタリング体験を提供できます。ExitNodeが必要な場合は、別のノードを設定することで、DNS機能と出口機能を分離した運用が可能です。

参考リンク