CentOS6などでdmesgにpossible SYN flooding on port(SYN flooding警告)が出た場合の対策方法を考えてみるテスト


以下のようなログがdmesgに出た場合の対処方法を考えてみるテスト。


【ログ内容と意味】
TCPv6: Possible SYN flooding on port 80. Sending cookies.
possible SYN flooding on port 80. Sending cookies.
または
TCPv6: Possible SYN flooding on port 80. Dropping request.


サーバーで受け付けられない(受け付けてない)SYNが大量に来た場合にサーバーがどうしたかを教えてくれている模様。
上記のログは80番ポートへの大量Webアクセスで、SYNがあふれたよお!というログで、大量の正常アクセス、またはDoS攻撃のどちらかが濃厚だけど、以下の設定で、Sending cookiesか、Dropping requestのどちらかを選べます。

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1ならsyncookies送信。0ならdrop。

どちらがいいのかについては参考として警察庁の資料を…



【対策案】

参考元:警察庁技術対策課「DOS/DDoS対策について」
https://www.npa.go.jp/cyberpolice/server/rd_env/pdf/DDoS_Inspection_2.pdf

この資料では、syncookiesを送った方が、サーバーはより多くのセッションを
さばけるとの結論に至ってます。でも真逆のブログも散見される状況。
結局は、それぞれの会社にて検証しなさい、ということですな。



【対策方法】

SYNステートを記憶する最大数の設定(デフォルト:1024)
net.ipv4.tcp_max_syn_backlog = xxx

SYNステートを記憶する最大数の設定(デフォルト:128 これを2倍した値)
backlogとsomaxconnとではsomaxconnの制限数が優先されるので、こちらを
大きくすること。なお設定値はMaxClientより多くしておくこと。
net.core.somaxconn = xxx

SYN/ACKの再送回数数の設定(デフォルト:5)
net.ipv4.tcp_synack_retries = xxx

過負荷時RSTパケットを送信しコネクションを切断してサーバーを守る(デフォルト:0)
net.ipv4.tcp_abort_on_overflow = xxx

確認方法は、netstatでsynをgrepしたり、インターフェイスのsynをdropした数を数える
などで確認できます。



【言葉】

syncookies(上記「DOS/DDoS対策について」より引用)…
TCPの3Way-Hand-Shakeにおいて、SYN/ACKのTCP初期シーケンス番号(ISN)を記憶せず、SYNの送信元のIPアドレス、ポート、シーケンスおよび時間によって変化する変数の値を基に一方向ハッシュ関数(MD5)を用いて算出した番号(これをクッキーと呼ぶ)を、TCP初期シーケンス番号(ISN)に設定したSYN/ACKパケットを送信する。
ACKパケットを受信すると、再び同様の方法でクッキーを算出し、その値に1を加えた値がACKパケットのACK番号に一致していればHand-Shake成功とみなす仕組み。