BAN対策としてのDNS TTL戦略——風俗グループのインフラを30分で切り替えるための設計
BAN対策としてのDNS TTL戦略
一般的なWebサービスでは、DNS TTLは深く考えることなく設定される。Route 53のデフォルトは300秒、多くのレジストラのデフォルトは3600秒か86400秒だ。「キャッシュが長いほどDNSサーバーへのクエリが減ってパフォーマンスが上がる」という理解で、長めに設定するケースも多い。
しかし私が担当する業界では、TTLは事業継続に直結する数字だ。
背景:なぜBAN対策がインフラ設計の中心になるのか
アダルト産業・風俗業界のWebシステムが直面する最大のリスクは、大手クラウドプロバイダーによる突然のアカウント凍結だ。
- AWS・GCP・Azure:利用規約でアダルトコンテンツを明示禁止
- Cloudflare:アダルトサイトのアカウント削除事例が多数ある
- DigitalOcean:Terms of Serviceに明示的な禁止条項がある
これらのサービスは、通常24〜72時間前後の猶予すら与えずにアカウントを凍結することがある。その瞬間からサービスは停止し、バックアップを取り出す手段も失われる可能性がある。
この前提に立つと、インフラ設計の優先順位が根本的に変わる。
一般的な設計の優先順位:
1. コスト最適化
2. パフォーマンス
3. スケーラビリティ
4. 可用性
BAN対策を前提にした設計の優先順位:
1. 移行可能性(Portability)
2. 復旧速度(RTO: Recovery Time Objective)
3. 可用性
4. コスト
TTLはこの「復旧速度」に直接影響する数値だ。
TTLとDNS伝播の仕組み
まず基本を整理する。
TTLとは何か
TTL(Time To Live)は、DNSレコードをキャッシュしてよい時間(秒単位)を指定する値だ。
grayzone.me. 300 IN A 152.42.194.21
^^^
TTL(秒)
この設定の意味は「このAレコードを300秒間キャッシュしてよい」ということだ。
キャッシュの連鎖
DNSクエリは以下の順で処理される。
ユーザーのブラウザ
↓
OSのDNSキャッシュ(stub resolver)
↓
ISPのDNSリゾルバー(フルサービスリゾルバー)
↓
権威DNSサーバー(NamecheapやRoute 53などのDNSサービス)
各レイヤーがTTLの時間だけキャッシュを保持する。TTLを300秒に設定すると、理論上は300秒後には全世界で新しいIPアドレスが参照されるが、実際には各リゾルバーのキャッシュタイミングがずれるため、完全な切り替えまで最大でTTL秒かかると考えておく必要がある。
切り替え時間の計算
BAN発生
↓
検知(監視ツール or 手動): 〜5分
↓
代替VPSへの環境デプロイ: 〜15分(Docker Composeがあれば)
↓
DNSのAレコードを新IPに変更: 1分
↓
TTL分の伝播待ち: TTL秒
↓
サービス復旧
合計 = 検知時間 + デプロイ時間 + TTL秒
TTLが86400秒(24時間)の場合、最悪24時間はサービスが停止する。TTLが300秒なら、伝播待ちはわずか5分になる。
実際の設定
私のインフラでは以下のTTLを設定している。
Namecheapでの設定
| Type | Host | Value | TTL |
|---|---|---|---|
| A | @ | 152.42.194.21 | 300 |
| A | www | 152.42.194.21 | 300 |
300秒(5分)が実用上の下限だ。多くのDNSプロバイダーは60秒や120秒も設定できるが、あまり短くするとDNSサーバーへの負荷が増加し、一部のリゾルバーが無視するケースもある。300秒がバランスの取れた数字だ。
設定変更のタイミング
重要なのは、BAN発生後にTTLを下げても遅いという点だ。
TTLを短くする効果は、変更前にキャッシュを保持しているリゾルバーが古いキャッシュを破棄した後にしか現れない。つまり:
現在のTTL: 86400秒
↓
TTLを300秒に変更
↓
でもキャッシュは残り86400秒で上書きされない
↓
最大86400秒後にようやく300秒TTLのキャッシュが使われ始める
TTLは平常時から短く保っておく必要がある。
Runbookとの組み合わせ
TTL戦略は単体では機能しない。30分以内の復旧を実現するには、以下がセットになっている必要がある。
1. 環境のコード化(IaC)
Docker Composeで環境を完全にコード化しておく。
# docker-compose.yml
services:
nginx:
image: nginx:1.25-alpine
wordpress:
image: wordpress:6.5-php8.2-fpm-alpine
mysql:
image: mysql:8.0
redis:
image: redis:7-alpine
certbot:
image: certbot/certbot:latest
新しいVPSに git clone して docker compose up -d するだけで環境が再現できる状態を保つ。
2. 代替VPSの事前契約
BAN発生後に代替VPSを契約しても、審査・起動に時間がかかる。以下のようなサービスを候補として把握しておく。
| サービス | 特徴 |
|---|---|
| FlokiNET | アイスランド・ルーマニア拠点。アダルトコンテンツ明示許可 |
| Hetzner | ドイツ・フィンランド拠点。コストパフォーマンスが高い |
| Vultr | 即時起動。世界各地にデータセンター |
理想は常時1台のホットスタンバイだが、コストが課題ならVPSの起動手順をRunbookに記録しておき5分で起動できる状態を維持するだけでも大きく違う。
3. バックアップの外部保存
BAN時はVPSのデータへのアクセスも失う可能性がある。DBバックアップはVPS外に保存する。
# docker-compose.ymlの一部
pgbackup:
image: prodrigestivill/postgres-backup-local:16
volumes:
- ./backups:/backups # ホスト側にマウント
environment:
SCHEDULE: "@daily"
BACKUP_KEEP_DAYS: 7
さらにバックアップをBunny.netやRcloneでオフサイトに同期しておくと安全だ。
4. 監視とアラート
BANの検知が遅れると復旧も遅れる。最低限のHTTP監視を入れておく。
# cronで5分ごとに監視する例
*/5 * * * * curl -sf https://grayzone.me/wp-json/ || \
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d "chat_id=${CHAT_ID}&text=🚨 grayzone.me が応答しません"
Telegram Botと組み合わせることで、障害発生から数分以内に通知が届く体制が作れる。
実際の切り替え手順(Runbook)
BAN発生時に実行する手順を事前に文書化しておく。
## BAN発生時の対応手順
### 検知(目標: 5分以内)
- [ ] Telegram通知を確認
- [ ] curl https://grayzone.me で応答確認
- [ ] DigitalOceanダッシュボードでアカウント状態確認
### 代替VPS起動(目標: 15分以内)
- [ ] FlokiNETで新規VPS起動(Ubuntu 22.04)
- [ ] SSHキー設定
- [ ] git clone https://github.com/grayzone-eng/infra-iac
- [ ] .envを設定(パスワードマネージャーから取得)
- [ ] docker compose up -d
- [ ] バックアップからDBをリストア
### DNS切り替え(目標: 1分)
- [ ] NamecheapでAレコードを新VPSのIPに変更
- [ ] TTLは300秒のまま維持
### 確認(TTL経過後)
- [ ] dig grayzone.me +short で新IPを確認
- [ ] https://grayzone.me でサービス確認
- [ ] Telegram通知が止まっていることを確認
TTLと証明書の注意点
DNS切り替え後、SSL証明書の再取得が必要になる。Let's Encryptのwebroot認証はDNSが新しいIPに向いていないと失敗するため、DNS伝播を確認してからCertbotを実行する手順にする必要がある。
# DNS伝播確認
dig grayzone.me +short
# 新しいIPが返ってきたら証明書取得
docker compose run --rm --entrypoint certbot certbot certonly \
--webroot --webroot-path=/var/www/certbot \
--email grayzone.eng@proton.me --agree-tos --no-eff-email \
-d grayzone.me -d www.grayzone.me
なお、Let's Encryptには**週あたり同一ドメインへの発行制限(5枚)**があるため、テストや練習は --staging フラグを使うこと。
まとめ
DNS TTLは「キャッシュの設定」ではなく「事業継続の設計」だ。
| 項目 | 推奨値 | 理由 |
|---|---|---|
| 通常運用時のTTL | 300秒 | 伝播速度と負荷のバランス |
| 最低TTL | 60秒 | 多くのリゾルバーが尊重する下限 |
| 変更のタイミング | 平常時 | BAN後では遅い |
TTLを短く保つのは単体では意味をなさない。Docker ComposeによるIaC・定期バックアップ・Runbook・監視との組み合わせで初めて「30分以内の復旧」という目標が現実になる。
この設計思想は、アダルト産業に限らず、クラウドプロバイダーのポリシーリスクを抱えるあらゆるサービスに応用できる。
関連リポジトリ: infra-iac
Discussion