情報漏洩を阻止:Gluetunを中央集権的なDocker VPNゲートウェイとして活用する

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

二度と受け取りたくない「警告メール」

HomeLabを運用していると、qBittorrent、Transmission、Sabnzbdなどのダウンローダーを実行することがよくあります。これらのツールは自動化には最適ですが、保護されていない状態ではプライバシーの悪夢となり得ます。トラフィックを通常の家庭用回線経由でルーティングすると、ISP(プロバイダー)はすべてのパケットを監視できてしまいます。多くの場合、これが原因で帯域制限を受けたり、著作権者から自動送信される法的通知を受け取ることになります。

私はこれを身をもって学びました。数年前、qBittorrentコンテナ内に直接VPNを設定しました。1週間ほどは完璧に動作していましたが、ある日、VPNクライアントが静かにクラッシュした一方で、コンテナ自体は動作し続けていました。キルスイッチがなかったため、接続はデフォルトの自宅IPに切り替わりました。3日後に失敗に気づいたときには、私の実IPはすでに数千のピアに公開されていました。この「サイレント・フェイル(静かな失敗)」こそ、セルフホスト初心者が無防備な状態で摘発される最も一般的な原因です。

現在のVPN設定でIPが漏洩している可能性が高い理由

Dockerのネットワーキングは諸刃の剣です。デフォルトでは、コンテナは仮想 NATの背後にある「ブリッジ」ネットワークを使用します。これは便利ですが、VPNトンネルがダウンした際にトラフィックが簡単にトンネルを回避し、ホストの物理ネットワークインターフェースから流出してしまうという脆さも抱えています。

HomeLabにおける漏洩のほとんどは、以下の3つの欠陥に起因します。

  • キルスイッチの欠如: 標準的なアプリコンテナは、ネットワークインターフェースが消失したときにトラフィックを停止するように設計されていません。単に次に利用可能なルートを探すだけです。
  • メンテナンスの疲弊: 5つの異なるコンテナでWireguardの設定やOpenVPNの認証情報を手動で更新するのは、ミスの元です。最終的に、他のコンテナは正常でも、1つのコンテナの設定だけが期限切れになってしまうといった事態が起こります。
  • DNSスヌーピング: トラフィックが暗号化されていても、DNSクエリがISPのサーバーに漏洩することがよくあります。これにより、どのトラッカーやインデクサーにアクセスしているかがプロバイダーに筒抜けになります。

代替案の検討

トラフィックを確実に固定する方法を見つける前に、いくつかの構成をテストしました。

ルーターレベルのVPN

家全体の通信をpfSenseやOPNsense経由でVPN接続するのは、いわば「牛刀をもって鶏を割く」ようなアプローチです。効果はありますが、過剰です。1Gbpsの光回線が劇的に遅くなり、オンラインゲームのレイテンシ(遅延)は20msから150ms以上に跳ね上がるでしょう。さらに、NetflixにIPがフラグを立てられ、お気に入りの番組がブロックされる可能性もあります。

オールインワンのVPNイメージ

binhex/arch-qbittorrentvpnのようなコンテナは人気があります。これらはうまく機能しますが、特定のイメージに縛られてしまいます。プリビルドされたVPN版が存在しないマイナーなダウンローダーやプライベートスクレイパーを使いたい場合、また振り出しに戻ってしまいます。

中央集権型ゲートウェイ (Gluetun)

これがHomeLabのプライバシーにおける「ゴールドスタンダード」です。トンネルを管理するために、Gluetunという専用コンテナを1つ実行します。他のコンテナはGluetunのネットワークに「相乗り(piggyback)」します。Gluetunがダウンすると、接続されているすべてのコンテナのネットワークも即座に消滅します。ネットワークがなければ、漏洩もありません。非常にシンプルです。

ネットワークハブとしてGluetunを実装する

GluetunはGo言語で書かれた軽量なVPNクライアントです. Mullvad、ProtonVPN、NordVPNなど、主要なプロバイダーのほぼすべてをサポートしています。私のテストでは、個別のコンテナでOpenVPNクライアントを実行する場合と比較して、GluetunとWireguardを組み合わせることでCPUのオーバーヘッドを約40%削減できました。

ステップ1:認証情報の収集

コードを触る前に、VPNプロバイダーの詳細情報が必要です。Wireguardを使用する場合は、秘密鍵(private key)と割り当てられた内部IPアドレスを用意してください。WireguardはOpenVPNよりも大幅に高速です。OpenVPNが120Mbpsで苦戦していた最新のCPUでも、Wireguardなら500Mbps以上のダウンロードを処理できることを確認しています。

ステップ2:Docker Composeの設定

以下のdocker-compose.ymlは、Gluetunをプライマリゲートウェイとして設定します。qBittorrentサービスのnetwork_modeディレクティブに注目してください。ここが魔法の核心です。

services:
  gluetun:
    image: qmcgaw/gluetun
    container_name: gluetun
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    ports:
      - 8080:8080 # qBittorrentのWeb UIをここにマッピング
      - 6881:6881 # Torrentのリスニングポート
      - 6881:6881/udp
    environment:
      - VPN_SERVICE_PROVIDER=mullvad
      - VPN_TYPE=wireguard
      - WIREGUARD_PRIVATE_KEY=ここに秘密鍵を入力
      - WIREGUARD_ADDRESSES=10.64.123.45/32
      - SERVER_CITIES=Stockholm
    restart: always

  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    container_name: qbittorrent
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=UTC
      - WEBUI_PORT=8080
    volumes:
      - /opt/appdata/qbittorrent:/config
      - /mnt/storage/downloads:/downloads
    network_mode: "service:gluetun"
    depends_on:
      gluetun:
        condition: service_healthy
    restart: always

ステップ3:共有ネットワーキングの重要性

ports(ポート)がqBittorrentではなく、gluetunの下で定義されていることに注意してください。これはよくある落とし穴です。network_mode: "service:gluetun"を使用すると、qBittorrentコンテナはローカルネットワーク上で独自のIPアドレスを持たなくなります。代わりにGluetunのネットワークスタックを共有します。qBittorrentのWeb UIにアクセスするには、Gluetunコンテナに対して通信する必要があります。

これにより、ハードウェアレベルのキルスイッチが構築されます。Gluetunコンテナが停止すると、qBittorrentのネットワークインターフェースは文字通り消失します。代替ルートはなく、漏洩の可能性もゼロになります。

ステップ4:検証

docker-compose up -dでスタックを起動します。まず、ログを確認してハンドシェイクが成功したか確かめます。

docker logs -f gluetun

VPN healthy!というステータスを探してください。100%確実にするために、アプリコンテナ内からcurlコマンドを実行し、外部からどのIPで見えているかを確認します。

docker exec qbittorrent curl https://ifconfig.me

結果は自宅のIPアドレスではなく、VPNの出口ノードのIPと一致するはずです。

複数のサービスへの拡張

このセットアップの拡張は非常に簡単です。Prowlarrやプライベートブラウザを追加したい場合は、同じYAMLファイルに追記し、network_modeservice:gluetunに設定するだけです。現在、私は4つの異なるサービスを1つのGluetunインスタンス経由でルーティングしていますが、安定性の問題は全くありません。

長期安定運用のためのプロのコツ

  • ヘルスチェックは必須: depends_onブロックでservice_healthy条件を使用してください。これにより、VPNトンネルが完全に確立される前にダウンローダーが起動するのを防ぎます。
  • ポートフォワーディング: ProtonVPNやAirVPNなど、ポートフォワーディングを許可しているプロバイダーを使用している場合は、VPN_PORT_FORWARDING=on変数を追加してください。これにより、ピア数とアップロード速度が大幅に向上します。
  • CPU使用率に注意: Raspberry Pi 4などを使用する場合、Wireguardは不可欠です。OpenVPNの暗号化オーバーヘッドは、低電力なARMハードウェアでは100Mbpsの通信のボトルネックになりやすいです。

中央集権的なゲートウェイの設定には20分ほどの作業が必要ですが、それによって将来にわたるプライバシーの不安から解放されます。ネットワークセキュリティをアプリケーションから切り離すことで、回復力が高く、真にプライベートなHomeLabを構築できるのです。

Share: