これはなに
dockerでwireguardを利用されている人は結構多いと思います。
その通信路でdnsに細工して広告をカットすることに成功しました。
この構成で通信を行うと、問答無用で広告アドレスを0.0.0.0に書き換えるのでiPhoneなどいちいちProxyを経由させる事無くネットが快適になります。
これの設定を公開したいと思います。
前提条件
- wireguardがdockerで動かせる人。
- dnsmasqに多少の知識がある人。
トリック
通常wireguardを普通に動かすとDNSをホストで名前解決することになります。
そこでDNS情報を独自のDNSを参照するようにしてそのDNSに細工をします。
具体的には広告アドレスを全て0.0.0.0で返すように仕組みます。
wireguard側は淡々と情報を返す形になりますので、まるでそのサイトの広告を見なかった事になります。
フックするアドレスはtxt形式にしてBlackListから特定のアドレスを抜いてあげれば「このサイトは広告サイトじゃないよ」とする事も可能なので運用しやすのではないでしょうか。
広告サイト一覧を作成する
適当なフォルダでgit cloneします。
git clone https://github.com/ohtorii/dnsmasq_adblock.git cd dnsmasq_adblock ./make_adblock_list.sh ad-block.conf (詳しい説明はREADME.mdを参照ください。)
これでad-block.confが作成されました。
各種ファイルの中身
以下のような構成の中に格納します。
docker-compose.yml
./dnsmasq
Dockerfile
./conf
ad-block.conf
dnsmasq.conf
dnsmasq.more.conf
dnsmasq_resolv.conf
hosts-dnsmasq
./wireguard
自動生成
./dnsmasq/Dockerfileを以下のように書き込みます。
FROM alpine:3.13.2
RUN apk update && \
apk upgrade && \
apk add bash dnsmasq bind-tools && \
rm -rf /var/cache/apk/* && \
mkdir -p /etc/default/ && \
echo -e "ENABLED=1\nIGNORE_RESOLVCONF=yes" > /etc/default/dnsmasq
CMD ["dnsmasq","--no-daemon"]
./dnsmasq/conf/dnsmasq.confを以下のようにします。
conf-file=/etc/dnsmasq.more.conf conf-file=/etc/ad-block.conf
./dnsmasq/conf/dnsmasq.more.confを以下のようにします。
port=53 no-hosts addn-hosts=/etc/hosts-dnsmasq expand-hosts domain=hogehoge.com domain-needed bogus-priv local=/hogehoge.com/ strict-order resolv-file=/etc/dnsmasq_resolv.conf hogehoge.comは適当に変えて下さい。
nameserver 172.16.0.7 nameserver 8.8.8.8 nameserver 8.8.4.4
./dnsmasq/conf/hosts-dnsmasq
#特に内側DNS変換をしている人以外は空でOK #例 #192.168.0.2 mail.hogehohe.com
docker-compose.yml
version: "3"
services:
wireguard:
image: linuxserver/wireguard
container_name: wgmasq
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=999
- PGID=999
- TZ=Asia/Tokyo
- SERVERURL=hogehoge.com #optional
- SERVERPORT=51821 #optional
- PEERS=6 #optional
- PEERDNS=172.20.0.7 #optional
- INTERNAL_SUBNET=10.20.0.0 #optional
- ALLOWEDIPS=0.0.0.0/0 #optional
volumes:
- ./wireguard/config:/config
- /lib/modules:/lib/modules
ports:
- 51821:51820/udp
dns:
- 172.20.0.7
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
restart: always
networks:
containers:
ipv4_address: 172.20.0.5
depends_on:
- dnsmasq
dnsmasq:
build: ./dnsmasq
container_name: dnsmasqad
image: dnsmasqad:latest
expose:
- 53
volumes:
- ./dnsmasq/conf/ad-block.conf:/etc/ad-block.conf
- ./dnsmasq/conf/dnsmasq.conf:/etc/dnsmasq.conf
- ./dnsmasq/conf/dnsmasq.more.conf:/etc/dnsmasq.more.conf
- ./dnsmasq/conf/dnsmasq_resolv.conf:/etc/dnsmasq_resolv.conf
- ./dnsmasq/conf/hosts-dnsmasq:/etc/hosts-dnsmasq
cap_add:
- NET_ADMIN
restart: unless-stopped
networks:
containers:
ipv4_address: 172.20.0.7
networks:
containers:
ipam:
config:
- subnet: 172.20.0.0/24
ミソは同一コンテナにdnsmasqを立ち上げ、wireguardのDNS参照先を変更してあげる事です。
起動
docker compose build docker compose up -d
で起動します。デフォルトのPort51820は通常用で取ってありますので51821をポート開放してあげて下さい。これで外部からwireguardに接続してあげればVPNを張ると自動的に広告カットされたサイト接続する形になります。
もっともゲームなどで広告を見ないと先に進めないサイトとかは動作不良で動きません。ご了承下さい。
私の使い方としてはXやinstagramの動画部分をダウンロードするサイトを利用する時に使っていて快適です。


コメント