wireguard+dnsmasqでadblockする

スポンサーリンク
iPad
スポンサーリンク
スポンサーリンク

これはなに

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は適当に変えて下さい。
./dnsmasq/conf/dnsmasq_resolv.conf
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の動画部分をダウンロードするサイトを利用する時に使っていて快適です。

コメント

タイトルとURLをコピーしました