心当たりもないのにDNSにDDoSが来ていた。
はじめはDNS Ampという送り元IPを偽造して特定のサイトに大量のクエリ結果を投げる踏み台に使っているのかと思ったが、送り元IPアドレスは多数で、その目的ではないようだ。よく調べてみると、クエリを25回送付したら、ポート番号も変えている。これは単純なIPフィルタでは受付許否が出来ないようにしているのかも知れない。途中、何度か一斉に攻撃が停止したり、また同じように再開したりとC&Cを使ってボットをコントロールしているような振る舞いも見せていた。
踏み台として使うわけでもないし、DDoSでサイトを麻痺させた所でなんの利益もない場所にDDoSをしかける意味がわからない。
DDoSは、要は攻撃側のリソースが被害者・防御側のリソースを奪う攻撃なので、被害者・防御側のリソースが攻撃側のリソースに対し圧倒的に勝っている場合はDDoSの役目を果たさない。
こちらのネットワークおよびサーバ回りは、今回程度の攻撃に対しては十分な回線容量とサーバ能力があるので、深刻な問題は発生していない。そのままにしておいても特には障害がおこらないだろうレベルのトラフィック量およびクエリ量である。たまたまトラフィック量をチェックしてちょっと気になったので、チェックしたらDDoSを見つけた、というものであった。DDoSの形式をとってはいるが、DDoSの踏み台としても、ターゲットとしていても、あまり効果がない。何をしたいのか謎である。
謎すぎるので、とりあえずぐぐってみた。ぐぐると謎のDDoSはわりとあるみたいだ。そのブログ著者も何のためにやっているのかわからないというこちらと同じ結論に達していた。
対策
サーバへの通信に対してはiptablesで防ぐ方法が手っ取り早い。この手のDDoS攻撃にはhashlimitを使うのが定番だろう。
コマンドラインで書くと次のようになる。
# iptables -I INPUT -p udp –dport 53 -i eth0 -j DROP
# iptables -I INPUT -p udp -m state –state NEW –dport 53 -i eth0 \
-m hashlimit –hashlimit-burst 5 –hashlimit 1/m –hashlimit-mode srcip \
–hashlimit-htable-expire 120000 –hashlimit-name named-limit -j ACCEPT
オプションの説明
最初のiptables
- -I INPUT 入力にフィルタリングする
- -p udp プロトコルはUDP
- –dport 53 送り先ポート53(domain)
- -i eth0 インタフェースはeth0
- -j DROP すべて落とす
2行目のiptables
- -I INPUT
- -p udp
- -m state ステートモジュールを使う
- –state NEW
- –dport 53
- -i eth0
- -m hashlimit ハッシュリミットモジュールを使う
- –hashlimit-burst 5 (規定時間)5パケットが来たらリミットを効かせる
- –hashlimit 1/m リミット時、60秒に1パケットを上限
- –hashlimit-mode srcip ソースIPで状態を区別する
- –hashlimit-htable-expire 120000 リミットを決める規定時間
- –hashlimit-name named-limit hashlimitで区別に使う名前
- -j ACCEPT
ハッシュリミット(hashlimit)の機能は、規定時間内にどれだけのパケットを受理するかというものだ。これで通常のDNSへのアクセス頻度であるホストからのクエリ(パケット)は問題なく返し、通常とはいえないレベルのアクセス頻度であるホストからのクエリ(パケット)は、一定時間抑制することになる。
–hashlimit-htable-expire は、その時間を設定する。単位はミリ秒である。上の例だと12000ミリ秒=120秒=2分を設定している。この2分という時間が一定の区切りとなる規定時間(クォンタム)になる。
この2分間に同一のIPアドレス(同じホスト)から5パケット以上到着したら(DNSへのクエリが5回以上されたら)制限をかけ、その後は毎分1パケットのみ通過させ、あとは捨てるというということになる。2分が過ぎると、パケットのカウントは破棄され、また同じ繰り返しをする。
先ほどのiptablesで行ったフィルタの結果は次の用になっているはずである。
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp — anywhere anywhere state NEW udp dpt:domain limit: up to 1/min burst 5 mode srcip htable-expire 120000
DROP udp — anywhere anywhere udp dpt:domain
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
–hashlimit-name named-limit でつけた区別に使う名前は、/proc/net/ipt_hashlimit/named-limit で参照することができる。ここを見ると、ホスト(ソースIPアドレス)別に時間がカウントダウンされている様子がわかる。
その後の経過
フィルタリングしているのでDNSへの負荷は下がるが、実際にはDDoSパケットが到着していることにはかわりがない。DDoSの状況を契約しているISPに連絡し、現在はフィルタリングで対処しているが、DDoSパケットが増えてこちらで処理できなくなったら、ISPに対処をお願いするかも知れないと伝えてはおいた。
DDoSは数日毎にホストIPアドレスが段階的に減っていき、2週間のちにはゼロになった。とりあえずDDoSは収束した。
考察はここでは述べないが、たぶん謎のDNSへのDDoSを受けている人は、自分がそうだったように他にもいるはずである。また自分がそうだったように、ぐぐって同じような人をみつけて、自分だけがこんな変な攻撃を受けているのではないということがわかるはずである。自分が同様な内容のブログの記録が判断の役に立ったように、自分もまた、誰かの役にたてばと考え、ここに記録として残しておく。
以上