AdGuard Home で TXT/RRSIG 攻撃を Fail2Ban + ipset で自動防御する方法
こんにちは、あうんです!
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 つを組み合わせ、鉄壁の防御を構築してみてください!
コメント
コメントを投稿