DockerでWireGuardとAdGuardを構築し、VPN経由だけで広告ブロックDNSを使う方法
/ 4 min read
Table of Contents
はじめに
VPS上にWireGuardとAdGuard HomeをDockerで立てると、自宅外からでもVPN経由で広告ブロックDNSを使えるようになります。
ただし、Dockerで構築する場合に少しハマりやすいポイントがあります。
たとえば、AdGuard Homeコンテナに 172.20.0.3 のようなDocker内部IPを割り当てて、
http://172.20.0.3:3000/にアクセスしようとしても、通常はPCやスマホから直接アクセスできません。
これは 172.20.0.3 がDockerのbridgeネットワーク内のIPであり、VPNクライアントや外部ネットワークから見えるIPではないためです。
また、AdGuard Homeの管理画面やDNSポートをVPSのグローバルIPに公開してしまうと、管理画面やDNSサーバがインターネットに露出してしまう可能性があります。
そこで今回は、次の方針で構築します。
- インターネットに公開するのはWireGuardのUDP 51820番だけ
- AdGuard Homeの管理画面はVPN接続中だけ見えるようにする
- AdGuard HomeのDNSもVPN接続中だけ使えるようにする
- VPNクライアントからは
10.13.13.1をDNSサーバとして使う
最終的には、VPN接続中の端末から以下のようにアクセスできる状態を目指します。
http://10.13.13.1/DNSサーバとしても、VPNクライアント側では次を指定します。
10.13.13.1方法
1. Docker Composeを作成する
以下のような docker-compose.yml を作成します。
services: wireguard: image: lscr.io/linuxserver/wireguard:latest container_name: wireguard cap_add: - NET_ADMIN - SYS_MODULE environment: - PUID=1000 - PGID=1000 - TZ=Asia/Tokyo - SERVERURL=xxx.xxx.xxx.xxx # VPSのグローバルIPまたはドメインに置き換える - SERVERPORT=51820 - PEERS=client1,client2 - PEERDNS=10.13.13.1 - INTERNAL_SUBNET=10.13.13.0 - ALLOWEDIPS=0.0.0.0/0 - USE_COREDNS=false volumes: - ./config:/config - /lib/modules:/lib/modules ports: - 51820:51820/udp sysctls: - net.ipv4.conf.all.src_valid_mark=1 restart: unless-stopped
adguard: image: adguard/adguardhome:latest container_name: adguard network_mode: "service:wireguard" depends_on: - wireguard volumes: - ./adguard/work:/opt/adguardhome/work - ./adguard/conf:/opt/adguardhome/conf restart: unless-stoppedSERVERURL は自分のVPSのグローバルIPまたはドメインに置き換えます。
- SERVERURL=xxx.xxx.xxx.xxx # VPSのグローバルIPまたはドメインに置き換えるここで重要なのは、AdGuard Home側に ports: を書かないことです。
adguard: network_mode: "service:wireguard"とすることで、AdGuard HomeはWireGuardコンテナと同じネットワーク名前空間を使います。
その結果、VPNクライアントから見ると、AdGuard HomeはWireGuardサーバ側のVPN IPである 10.13.13.1 上で動いているように見えます。
まとめ
DockerでWireGuardとAdGuard Homeを組み合わせる場合、AdGuard Homeを単独コンテナとしてDocker内部IPで使おうとすると、VPNクライアントからの到達性でハマりやすくなります。 VPN経由だけでAdGuard Homeを使いたい場合は、AdGuard HomeをWireGuardコンテナのネットワーク名前空間に相乗りさせる構成がシンプルです。