AdGuard Home で TXT/RRSIG 攻撃を Fail2Ban + ipset で自動防御する方法

AdGuard Home × Fail2Ban × ipset で TXT/RRSIG 攻撃を自動防御する

こんにちは、あうんです!
DNS を公開していると必ずと言っていいほど飛んでくる TXT レコード攻撃RRSIG(DNSSEC 署名)クエリ攻撃 を、 AdGuard Home × Fail2Ban × ipset でガッチリ自動防御する手順をまとめました。

🧨 なにが危ないの?

  • 特定ドメインに向けた 大量 TXT リクエスト
  • それに紛れた RRSIG クエリ爆撃
  • 放置すると 自分の DNS が踏み台 になり DDoS に加担するリスク💦

🛠 構成の流れ

AdGuard Home → querylog.json
        ↓
Fail2Ban(フィルタ & BAN)
        ↓
iptables + ipset(高速ブロック)

1️⃣ Fail2Ban の設定

🔎 フィルタ定義

/etc/fail2ban/filter.d/adguard-dns-abuse.conf

[Definition]
failregex = .*"QT":"TXT".*"IP":"<HOST>".*
            .*"QT":"RRSIG".*"IP":"<HOST>".*

🔐 Jail

/etc/fail2ban/jail.local

[adguard-dns-abuse]
enabled       = true
backend       = systemd
filter        = adguard-dns-abuse
journalmatch  = _SYSTEMD_UNIT=AdGuardHome.service
maxretry      = 1
findtime      = 10m
bantime       = 10m
banaction     = iptables-ipset-proto4[name=AG-DNS,protocol=udp,port=53,ipsettime=86400,blocktype=DROP]
ignoreip      = 127.0.0.1 192.168.0.0/24 10.0.0.5 ::1 fe80::/10

🚀 サービス起動

sudo iptables -I INPUT 1 -m set --match-set f2b-AG-DNS src \ -p udp --dport 53 -j DROP
sudo systemctl restart fail2ban
sudo fail2ban-client status adguard-dns-abuse

2️⃣ ipset の永続化 & 上限拡張(1 ユニットに統合)

★ 100 万件対応セットを初回だけ作成

sudo ipset create f2b-AG-DNS hash:ip maxelem 1048576 hashsize 2097152 timeout 86400
※ 何故か20万ぐらいであたまうちになるのでよろしくです・・・。

ipset-bootstrap ユニット(作成・復元・保存ぜんぶ担当)

/etc/systemd/system/ipset-bootstrap.service

# /etc/systemd/system/ipset-bootstrap.service
[Unit]
Description=ipset + iptables restore/save before/after Fail2Ban
DefaultDependencies=no
After=local-fs.target
Before=network-pre.target fail2ban.service

[Service]
Type=oneshot
RemainAfterExit=yes

# 起動時
ExecStartPre=/usr/sbin/ipset create -exist f2b-AG-DNS \
    hash:ip maxelem 1048576 hashsize 2097152 timeout 86400
ExecStartPre=-/usr/sbin/ipset flush f2b-AG-DNS
ExecStartPre=/bin/sh -c 'tail -n +2 /etc/ipset.conf | /usr/sbin/ipset restore -exist'
ExecStart=/bin/sh -c '/usr/sbin/iptables-restore < /etc/iptables.rules'

# シャットダウン時
ExecStop=/bin/sh -c '/usr/sbin/iptables-save > /etc/iptables.rules'
ExecStop=/bin/sh -c '/usr/sbin/ipset save > /etc/ipset.conf'

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now ipset-bootstrap.service
sudo systemctl status ipset-bootstrap.service   # active (exited) なら OK

✔️ ユニットの動き

タイミング動作内容
起動時create -exist でセット確保
flush で空に
restore(1 行目除外)でエントリ復元
Fail2Ban 起動後新たな BAN があれば ipset add で即反映
シャットダウン時ipset save > /etc/ipset.conf で最新状態を保存

🧪 動作テスト

# 追加
sudo ipset add f2b-AG-DNS 203.0.113.250 timeout 86400
# 保存される?
sudo systemctl stop ipset-bootstrap
grep 203.0.113.250 /etc/ipset.conf
# 復元される?
sudo systemctl start ipset-bootstrap
sudo ipset list f2b-AG-DNS | grep 203.0.113.250

🔚 おわりに

TXT と RRSIG の 2 種類のクエリをまとめて自動 BAN することで、DNS サーバが踏み台にされるリスクを大幅に軽減できます。
AdGuard Home の高機能ログ・Fail2Ban の柔軟なフィルタ・ipset の高速ハッシュセット——この 3 つを組み合わせ、鉄壁の防御を構築してみてください!

コメント

このブログの人気の投稿

ゲーム発展国++ のコツ

Nuro光 ONU F660A オススメ設定

Xperia XZ Premium に BlissRoms というカスタムROMを入れてみた