[linux][プライバシー][DNS] 広告やら追跡ネットワークを排除できるAdguard Homeを導入してみた。

2020/03/23 11:01AIX、UNIX、Linux,Container,Security,Softwareadguard,container,DNS,DNS over HTTPS,広告,追跡

はじめに

最近は盛んにプライバシーに関して色々と言われるご時世ですが、それよりも以前から頻繁に表示されるバナー広告などを除去するのも良く言われてきました(勿論、Webサイトを運用している方にとっての運用費にもつながるので一概に悪いわけではないですが)。

最近はAdguardが広告除去などを行う用のDNSサーバサービスなどを公開していますし、NExtDNSなども適用する広告ブロックリストを色々と選択したうえでセキュリティを高めることが出来るDNSサーバサービスなどを行っています。

家庭向けでもアプライアンスの形で提供されているものもあったりしますが、Adguardも構築するだけで広告ブロックDNSサーバを立てられるものを公開していました。

GitHub

対応プラットフォーム

2020年3月20日現在は以下のプラットフォームに対応しているようです。

  • Docker Hub
  • Beta builds
    • Raspberry Pi (32-bit ARMv6)
    • MacOS
    • Windows 64-bit
    • Windows 32-bit
    • Linux 64-bit
    • Linux 32-bit
    • FreeBSD 64-bit
    • Linux 64-bit ARM
    • Linux 32-bit ARMv5
    • MIPS
    • MIPSLE

導入方法

基本的には公式のWikiを参照するだけで出来ます。

binaryをダウンロードしてきて実行するのも良いですが、今回は用意されているDockerイメージを利用する形にしました。

実験環境

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"

$ docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b7f0
 Built:             Wed Mar 11 01:25:46 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b7f0
  Built:            Wed Mar 11 01:24:19 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
# ./AdGuardHome --version
AdGuardHome v0.101.0

手順

1.Dockerイメージを引っ張ってくる。

docker pull adguard/adguardhome

2. Dockerイメージにマウントする、data/config/のためのディレクトリをホスト側に作成する。

3. containerを実行する。

docker run --name adguardhome -v /my/own/workdir:/opt/adguardhome/work -v /my/own/confdir:/opt/adguardhome/conf -p 53:53/tcp -p 53:53/udp -p 67:67/udp -p 68:68/tcp -p 68:68/udp -p 80:80/tcp -p 443:443/tcp -p 853:853/tcp -p 3000:3000/tcp -d adguard/adguardhome
POINT

VPSなどで利用する場合は必要ないと思いますが、家庭内LANで且つDHCPサーバ機能を利用する場合は以下のように修正する必要があります。

docker run --name adguardhome --network host -v /my/own/workdir:/opt/adguardhome/work -v /my/own/confdir:/opt/adguardhome/conf -d adguard/adguardhome

--network host を付ける必要があります。

4. http://<adguardを実行しているサーバのIPアドレス>:3000にWebブラウザでアクセスする。

5. configのためのウィザードが始まるので設定していく。

  1. Admin Web InterfaceのためのListen Interface設定
  2. DNS ServerのためのListern Interface設定
  3. 管理コンソールにアクセスするためのユーザーとパスワードの設定

6. 設定が終わったら管理コンソールが表示されると思うので設定は完了。

DNS over HTTPSおよびDNS over TLSに対応するには

素の状態でのDNSサービスを利用するのでもまぁ構わないのですが、せっかく機能として持っているならDNS over HTTPSやDNS over TLSを利用できるように設定しましょう。

証明書を個別に用意できるのであればそれで構わないのですが、Let’s Encryptによる証明書でも問題ないです。設定について公式Wikiに用意されています。

ドメインを登録する

所有しているドメインで、今回使用するサーバのIPアドレスを紐づける形で登録する。AWS Route53やGoogle Cloud DNS、お名前ドットコムのDNSでもなんでも大丈夫です。

DNS-challengeを使用してSSL証明書を入手する

POINT

ちなみに、ここではDNS-challengeを使用しているだけで、http-challengeでも問題ないです。

1.以下のWebサイトを参考にCertbotをインストールする。

2.以下のコマンドを実行して証明書の発行を行う。
以下の場合だと、DNS-challengeを使用して、かつ提示される問答に応えることで採取的にSSL証明書の発行が出来ます。

sudo certbot certonly --manual --preferred-challenges=dns -d <発行するドメイン名> -m <メールアドレス> --agree-tos
POINT

  • -d DOMAINS :発行対象ドメインを指定
  • --agree-tos :ACMEサーバーの利用規約に同意する
  • -m EMAIL :重要な連絡の際のメールアドレス
  • --preferred-challenges :ACMEサーバを使用する際のチャレンジ構成を指定

3.最終的にどのドメインに対して発行されたか、その証明書はどのパスに保存されたかが出力されるのでメモしておく。

Adguard Homeに設定する

1.Webインターフェースにログインする。

2.[設定] – [暗号化設定] へ進む。

3.ページ最初の方にある「サーバ名」に使用するドメイン込みの名前を入力する。さらに真ん中から後半の証明書の項目で、ホストとcontainerで共有しているようなところに証明書と秘密鍵を置いてあると仮定し、それぞれをフルパスで指定する。

POINT

なお、内容をペーストすることでも設定できるが、証明書の更新の際に毎回コピペする羽目になるので、パスで指定する方が都合が良いと思う。

パスで指定した場合は同じ場所に新しい証明書を置くことでAdguard Home本体で自動的に再読み込みが行われるので手間が少ない。

いくつかのパラメータはWebUIからは設定できない

Webインターフェースからも大体のパラメータは設定できますが、公式Wikiを確認するといくつかのパラメータは設定ファイル(AdGuardHome.yaml)のみに存在しています。Adguard Home自体がまだ開発中ということですからそのうちにWebインターフェースに実装されるとは思いますが。

  • web_session_ttl :Webセッションの有効期限
  • blocked_response_ttl :デフォルト10秒だけど少し伸ばした方が負荷が減りそう
  • ratelimit_whitelist :自宅などからのアクセスは問題ないという仮定でratelimitの対象外にしている
  • cache_size DNSのキャッシュサイズを大きくすることで問い合わせの負荷を減らす。単位がbyteなのも要注意。

ブロックリストはどこにある?

日本語に対応していそうなブロックリストだと以下のものが有名どころ何でしょうか?

なんJ AdGuard部

280blocker

NextDNSが使用しているブロックリスト

NextDNSが使用しているブロックリストについての情報はGitHubにあります。

なんかおススメのブロックリストなんかありますかね。280blocker とか Steven Black 、 Energized Blu 、Disconnect関連は良さそうですが・・・。

その他

  • ユーザーとパスワードの初期化はWebインターフェースからは出来ない。またパスワード生成についても自前ではなくApache2のhtpasswdを使用する。
  • クエリログを取得することでどの問い合わせクエリをフィルタしたか確認しやすくなるが、大量のアクセスが想定される環境であれば大きな負荷ともなる。一旦状況が落ち着いたようであればクエリログの設定を無効にしても良いかもしれない。
  • ブロックフィルタールールはAdblockなどの記法も使えるのでそんなに困らないと思う。
  • DNS設定などにある、 上流DNSサーバやアクセス設定の許可されたクライアント、拒否するクライアントなどに大量のリストなどをWebインターフェースから入力し適用しようとするとプロセスが落ちる時がある。
    大量に設定する必要がある場合は面倒でも設定ファイルに設定した方が良い。

注意事項

CAUTION

家庭内LANで実験する場合はまだ良いですが、外部のVPSなどを利用してAdguard Homeを使用する場合は設定漏れによるオープンリゾルバや外部公開されることによるリスク(ハッキングなど)を理解した上で使用してください。

iptablesufwなどを使用してセキュリティを高めておく必要がある。

最後に

まだ開発版の位置づけだと思うので設定だったり安定性はまだだと思いますが、とりあえず家庭用として試す分は使えるかと思います。

あとARMなども対応プラットフォームに入っているので、そこも導入しやすい点でもあるかもしれません。

参考にしたWebサイト

この記事を書いた人
kometchtech

kometchtech
うつ病を患いながら、IT業界の末席にいるおっさんエンジニア。科学計算をしたことがないのに、HPC分野にお邪魔している。興味のある分野で学習したことをblogにまとめつつ、うつ病の経過症状のメモも置いておく日々。じつはRouterboard User Group JPの中の人でもある。
Amazon欲しいものリスト / Arm板を恵んでくれる人募集中

Buy Me A Coffee