前回からの流れ
DNSクエリのロードバランシングソフトウェアであるPowerDNS dnsdistのダッシュボードからの簡単なクエリ処理動作を確認しました。今回はダイナミックルールの動作について確認していきます。
- PowerDNS DNSdist
- DNSdist documentation
実行環境、構成
- OS:WSL2 Ubuntu 22.04
- dnsdist:1.8.2-1
- powerdns:4.5.3-1
~その3~の本題の前に
私が特にDNSサーバ(※Bind, djbdns等)の管理業務を行っていた時期は、DNSキャッシュポイズニングやDNSアンプによる攻撃が騒がれ始めた頃なので、おそらくは10年より前になるのかなあと思います。
外部からのDoS攻撃(※DNSランダマイズ攻撃等)への対策としてdnsdistが有用であると判断した事と、日本語情報が少なくそこまで広く知られていないOSSかな?と感じたため本記事を書くにいたりました。
※dnsdistの公式ドキュメントは、設定サンプルやパラメータ仕様について細かく記載があり日本語翻訳で十分内容を確認できるためかもしれませんが:)
ダイナミックルールについて
ダイナミックルールでは、特定の条件に基づいてDNSクエリをリアルタイムでフィルタリングし、アクションを適用する事が可能な機能です。これにより、動的に変化するネットワーク状況に合わせてクエリの挙動(※ドロップ、応答の遅延、なりすまし応答等)を行う事が可能です。
- 存在しないレコード(NXDOMAIN)のクエリが多い送信元アドレスを一定期間ブロック
- SERVERFAILとなるクエリが多い送信元アドレスを一定期間ブロック
ダイナミックルールの追加
今回はdnsdist公式ドキュメントにある設定例を参考に、「過去10秒間で、20クエリ/秒を超過し、かつ、全クエリの応答がNXDOMAINであるホストに対して60秒ブロックを行う」場合の設定を追加し動作を検証します。
-- DynBlockRulesグループの設定
-- https://dnsdist.org/guides/dynblocks.html#dynblockrulesgroup
-- https://dnsdist.org/reference/config.html#DynBlockRulesGroup:setRCodeRate
local dbr = dynBlockRulesGroup()
dbr:setRCodeRate(DNSRCode.NXDOMAIN, 20, 10, "Exceeded NXD rate", 60)
function maintenance()
dbr:apply()
end
ダイナミックルールの動作確認
動作確認として、dnsperfまたはdigを記載したスクリプトを実行します。
※検証のため*.example.comのレコードを削除して実施しています。
- ダイナミックルール確認スクリプトを作成します。
- ※備考…秒間クエリ制限を20で設定しているため、スクリプトの微調整はdnsdistのダッシュボードを開きながら検証を実施しています
#!/bin/bash
# domain.listは存在しないhogehoge{1..10}.example.comを記載
DOMAIN_LIST="domain.list"
START_TIME=$(date +%s)
while [ $(( $(date +%s) - START_TIME )) -lt 20 ]; do
# https://www.gnu.org/software/parallel/
cat $DOMAIN_LIST | parallel -a - dig -p 10053 @172.26.2.3 +short +nocookie +norec
sleep 0.2
done
- 確認スクリプトの実行
# ./dnstest.sh
おわりに
今回の記事では、公式ドキュメントの設定例の一つよりダイナミックルールの動作確認を実施しました。実際のDoS攻撃への対策としては、その他ダイナミックルールの追加や大量ホストからのDoSを想定した上で動作検証を行う必要があるかと思いますが、次回は引き続きdnsdistで設定可能な各種設定について確認していきます。