DDos (DNS) named

2014年の終わり頃から、当方管理のDNSにDDoSが来襲。

当初は、IPを偽造して特定のサイトに大量のクエリを投げる踏み台にするように仕掛けてたいような感じ。
幸いにして踏み台にはなっていなかったが、それをさせるようなDNSの設定になっていたのは事実。
これはnamed.confの設定が甘かった(?)当方のミスだ。
すぐに修正して、自らが管理するドメイン以外のクエリー(応答要求)は無視するように修正。
これで取り敢えずは、攻撃は回避。(のハズだった。)
しかし、トラフィックの嵐は止まず。
且つ、送り元IPアドレスは多数で、踏み台にするのが目的ではないようだ。
調べてみると、クエリを10~30回送付したら、ポート番号も変えている。
これは単純なIPフィルタでは受付許否が出来ないようにしているのかも知れない。
途中、何度か一斉に攻撃が停止したり、再開したり。
う~ん、厄介なヤツじゃ。

踏み台として使うわけでもないし、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分が過ぎると、パケットのカウントは破棄され、また同じ繰り返しをする。

 

これで、namedへの負荷は徐々に減っていく事を期待するわけですが、上記の対処でサーバーに届くパケットを減らす事はできません。
相手に「無駄な事は止めよう」と思わせるしかないのです。
(T_T)
しかし、/var/log/messages への書き込み量は激減しています。

で、大事なのが上記のコマンドラインを
/etc/sysconfig/iptables
に反映させる事。
そのままでは、マシンを再起動させるなどした場合きれいさっぱり消えてしまいます。
まずは、現在のiptables の設定を保存しておきましょう。
# iptables-save > /etc/sysconfig/iptables_sav001
# iptables-save > /etc/sysconfig/iptables

と、いう事で、皆さんGood Luck!