DoS対策

6/13のトラフィック
なにやらトラフィック表示がおかしなことになっています。Twitterのタイムラインもどどんとふが落ちたという投稿がたくさん。
というわけで、色々調べてみた結果、muninのnginxコネクション数がとんでもないことになっていました。

dmesgにも「TCP: Possible SYN flooding on port 443. Sending cookies」がチラホラ。そして、keepalivedがふらついたり、muninが通信できずに死んでたりしています。どう見ても、SynFloodです。本当にありがとうございました。

しかし、個人の自宅鯖攻撃して何が楽しいんでしょうね。といいつつもやられっぱなしは嫌なので、対策を色々と実施しました。
といっても、keepalivedのふらつき以外は、普通にDoSの攻撃能力よりサーバーの処理能力のほうが高かったようで、攻撃が止んだらすんなり復活していたので、大してすることはありません。

まずは、Mirotik wikiのDoS attack protectionを参考に、ルーター側でブロック。これだけだと不安なので、ログも取得するように設定しています。


/ip firewall filter
add action=jump chain=forward comment=”SYN Flood protect” connection-state=new \
in-interface=pppoe-out1 jump-target=SYN-Protect protocol=tcp tcp-flags=syn
add chain=SYN-Protect connection-state=new limit=100,100:packet \
protocol=tcp tcp-flags=syn
add action=drop chain=SYN-Protect connection-state=new log=yes \
log-prefix=SynFlood protocol=tcp tcp-flags=syn

さらに、dmesg中の「TCP: Possible SYN flooding on port 443. Sending cookies」を検知してそのときのnetstat -tnを取得するスクリプトを1分毎に設定。keepalivedもばたつかないように監視スクリプトの監視間隔とタイムアウト値を見直しました。
もちろん、「net.ipv4.tcp_syncookies=1」とかはとっくに設定していますし、カーネル周りのDoSやSynFlood対策はすでに実施済みだったので、それ以上の設定見直しは、とりあえずしばらく様子を見ます。