2012年11月14日

オープンDNSリゾルバのDoS対策メモ

「Android/iPhoneスマホのroot不要な広告除去法」http://causeless.seesaa.net/article/289244107.html
で書いたように自宅サーバで、広告避けオープンDNSリゾルバを運用しているが、DoS攻撃と思われるクエリがよく来ている。

ほとんどがripe.netやisc.orgへのANYクエリで、特定のソースIPから短時間に多量の連続したアクセスがある。偽装されたソースIPへのトラフィック集中を目的としているらしく、DNS Ampによる回線飽和DDoS攻撃が実行中と思われる。

自分の回線やサーバーへの負荷は大したことは無いが、DoSの片棒を担がされているのは気に入らないのでフィルタ方法を考えてみた。


REFUSEする
自分のリゾルバは広告除去目的の限定的なオープンリゾルバなので、今回利用されたドメインへのクエリを一時的に禁止してみる。
zone "ripe.net" IN {
type master;
file "block.db;
allow-query {none;};
};
DNSリゾルバにセカンダリを正しく設定してあればそっちに問い合わせするので問題ない。高々最初のアクセスのレスポンスが1秒ほど遅くなるだけ。


REFUSEDをドロップする
BIND9にはunboundのdenyに相当する設定が無いので、refusedを返さず無視することが出来ない。仕方ないのでiptablesルールで何とかする。
コードが5=REFUSEDなレスポンスをDROPするルールを追記して対応
-A OUTPUT -p udp -m udp --sport 53 -m u32 --u32 "0>>22&0x3C@8&0x0F=5" -j DROP


hashlimitをかける
上の2つで弾けているはずが、なかなかDoSのクエリがとまらなかったので、テストを兼ねてhashlimitルールでINPUT側をフィルタしてみた

-A INPUT -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -m state --state NEW -j ACCEPT
だったものを
-N DNSCHECKIN
-A INPUT -p udp -m udp --dport 53 -m state --state NEW -j DNSCHECKIN
-A INPUT -p tcp -m tcp --dport 53 -m state --state NEW -j DNSCHECKIN
-A DNSCHECKIN -m hashlimit --hashlimit-upto 1/s --hashlimit-burst 50 --hashlimit-mode srcip --hashlimit-name DNSDENY --hashlimit-htable-expire 300000 -j ACCEPT
-A DNSCHECKIN -j DROP
に置き換え。これでほとんどDROPできた。
最初に50クエリまで許可して、以後1クエリ/sに制限。リゾルバのキャッシュが正しく効いてる普通のユーザーなら問題は無いはず。NATで複数人が回線共有していた場合残念なことになるが、そもそんな状況の人はオープンリゾルバ使わないだろうから「NATの中の人などいない」と割り切る。
(3G回線の人ならroot化済みでhostsでブロックしてるだろうし)


ということで対策してみた広告除去用オープンリゾルバ。101.111.213.2
セカンダリにはGoogle提供の8.8.8.8あたりをどうぞ。
公開停止しました。

posted by ko-zu at 20:28| Comment(0) | TrackBack(0) | セキュリティ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。