必要なもの
- 各Packageをインストールしたサーバー
- AdGuard Home
- Cloudflared
- Cloudflareで管理できる状態のドメイン(Freeプラン可)
AdGuard Homeの設定
オリジン証明書の取得
Cloudflareとの通信で使用する証明書を取得する
SSl/TLS -> オリジンサーバー -> オリジン証明書 -> 証明書を作成
を選択
オリジンのホスト名に*.[DOMAIN], [DOMAIN], doh.[DOMAIN]
を設定する. 有効期間は適当
作成したら証明書と秘密鍵を保存しておく
ルート証明書のインストール
Cloudflare Origin CAルート証明書をインストールする. インストール後は念の為再起動
curl -OL https://developers.cloudflare.com/ssl/static/origin_ca_ecc_root.pem
curl -OL https://developers.cloudflare.com/ssl/static/origin_ca_rsa_root.pem
sudo cp origin_ca_*.pem /etc/ssl/certs/
sudo cp origin_ca_*.pem /usr/local/share/ca-certificates/
オリジン証明書の設定
AdGuard Homeの暗号化設定を開き,証明書と秘密鍵を貼り付ける
Cloudflare Tunnelの設定
Cloudflare Tunnelを用いて自宅のAdGuard Homeを公開する
Tunnelを使うメリット
- 固定IP不要 & IP公開不要
- DDoS対策/WAF/Caching等便利な機能が使える
トンネルの作成
以下全てRoot
# ログイン
cloudflared tunnel login
# トンネルを追加
cloudflared tunnel create doh
# 設定ファイルを作成
touch ~/.cloudflared/config.yml
config.yml
tunnel: [UUID]
credentials-file: /root/.cloudflared/[UUID].json
ingress:
- hostname: doh.[DOMAIN]
path: ^/dns-query
service: https://[IP]
originRequest:
disableChunkedEncoding: false
noTLSVerify: true
- service: http_status:404
# DNSレコードを登録
cloudflared tunnel route dns doh doh.[DOMAIN]
サービス化
cloudflared service install
WAF設定の緩和(参考)
構成ルールでURI(https://doh.[DOMAIN]/dns-query
)に対して以下の設定を適用
- HTTPSの自動リライト: オン
- ブラウザ整合性チェック: オフ
- セキュリティレベル: "基本的にオフにする"
また,レート制限等も必要に応じて調整する
Cacheは無効化することをお勧めします...
テスト
DoHに対応したdnslookup
(https://github.com/ameshkov/dnslookup) というツールでテストしてみる.
scoop install dnslookup
❯ dnslookup example.com https://doh.[DOMAIN]/dns-query
dnslookup v1.11.1
Server: https://doh.[DOMAIN]/dns-query
dnslookup result (elapsed 622.2347ms):
;; opcode: QUERY, status: NOERROR, id: 9560
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 3600 IN A 93.184.215.14
現時点の問題点
- 自前のDoHサーバにアクセスしていることはNW管理者にバレる
- 最初にプレーンDNSでアドレス解決する(Bootstrap)
- 自分以外のユーザもクエリ可能
- これに関してはWAFの設定でどうにかするしかない
- Cloudflareによる中間者攻撃が(理論上)可能
- CFは暗号化を解除できるのでDNS応答の改ざん等やろうと思えばできてしまう
- AGH-CF間/CF-Client間の暗号化は別として処理される(CFで一旦復号する)
- 外部からアクセス可能なIPが無いので設定できるシステムが限られる
- 現時点ではiOS(DNSecure)とChromium系ブラウザで動作確認済み
- 直接アクセスせず別のDoHサーバ(CoreDNS等)を経由したほうが良いかもしれない
- 何らかの脆弱性で管理画面にアクセスされる可能性もゼロではない
- 管理画面のアクセス元制限的な設定が見当たらない...