さくらのアドブロッカー ライト

月額数百円で利用できる「さくらのレンタルサーバ ライト」を活用して、自分専用の広告ブロック機能付き DoH (DNS-over-HTTPS) サーバを構築してみた話です。

ライトプランは安価ですが、SSH が使えず、PHPCGI モードで動作するなど制約があります。しかし、今回開発した軽量な PHP 製 DoH プロキシ「Dohmasq」を使えば、この環境でも十分に実用的なアドブロッカーが作れます。

Dohmasq

Dohmasq は、Dnsmasq にインスパイアされた、次の特徴を持つ軽量な PHPDNS-over-HTTPS (DoH) プロキシです。

  • hosts ファイル形式のブラックリストを使って広告ドメインNXDOMAIN (存在しない) として返す
  • URL にトークンを含めることで、自分だけが使えるセキュアなサーバになる
  • データベースが不要で PHP さえ動けば動作する
  • ドメインリストの有効期限が切れるとバックグラウンドで自動更新する

さくらのレンタルサーバ ライト

「さくらのレンタルサーバ ライト」は、月額換算で約 165 円〜(年間一括払い時)と非常に安価です。 しかし、以下の制約があります。

  • SSH 接続が禁止されているため、コマンドラインcomposer install したり、cron を設定したりできない
  • PHPCGI モードなので、モジュールモードに比べてプロセス起動のオーバーヘッドがある

Dohmasq はこれらの制約をうまく回避できます。また、リクエストをトリガーにしたリスト自動更新機能があるため、cron がなくても最新の広告ブロックリストを維持できます。

構築手順

SSH が使えないため、「ローカルで準備して FTP でアップロード」という古き良き手法をとります。

1. ローカル環境で準備

まず、手元の PC でファイルを準備します。PHP と Composer が入っている環境で、リポジトリをクローンし、依存関係をインストールします。

git clone https://github.com/asannou/dohmasq.git
cd dohmasq
composer install --no-dev --optimize-autoloader
2. 設定ファイルの編集

自分だけがアクセスできるように、tokens.php に推測されにくいトークンを設定します。

return [
    'BXl4ANTWVL6rf7rVv8fCEsCn6yet6Ry01ZZGxTKz',
];

generate-domains.phphttps://example.com/hosts の部分を強力なブロックリストの URL に書き換えます。

$sourceUrls = [
    'https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts',
];
3. 初期ドメインリストの生成

サーバにアップロードする前に、一度ローカルでリストを生成しておきます。

php generate-domains.php

これで domains.php が生成されます。

4. アップロード

FTP クライアントを使って、さくらのサーバにアップロードします。例えば、公開フォルダーが www の場合、そこに全てのファイルをアップロードします。

DoH の設定

各種 OS やブラウザで、DNS サーバとして以下の URL を設定してください。

https://[あなたのドメイン]/[設定したトークン]/dns-query.php

iPhone / Mac への設定

Dohmasq には、Apple 製品向けの構成プロファイルを生成する機能があります。 Safari で以下の URL にアクセスしてください。

https://[あなたのドメイン]/[設定したトークン]/mobileconfig.php

画面の指示に従ってプロファイルをインストールすれば、そのデバイスDNS 通信は全てこのサーバ経由になり、広告がブロックされるようになります。

自動更新について

Dohmasq には、DNS クエリを受け取った際に domains.php が古くなっている(デフォルト 24 時間)と、バックグラウンドで generate-domains.php を実行してリストを更新する機能が含まれています。 これにより、SSH で入って cron を設定できないライトプランでも、常に最新のブロックリストを維持できます。

速度について

CGI モードなので、リクエストごとに PHP プロセスが立ち上がります。通常の DNS に比べれば遅延はありますが、ウェブブラウジング程度であれば、そこまで気にならないレベルで動作します。