skip to content
barorin&

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-stopped

SERVERURL は自分の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コンテナのネットワーク名前空間に相乗りさせる構成がシンプルです。