Linuxにおけるsyncookiesの実装

あまりにも忙しいので、とりあえず。この記事は後で修正する!

サーバに大量のSYNを送りつけることで、サーバ側で接続待ち状態のコネクションを保持するキューをあふれ返させる(つまりそれ以降の接続要求は破棄される)ことで、接続をしにくくするのが、SYN Flood攻撃。
SYN cookiesとは、この「SYN Flood」攻撃への対策のための仕組みです。
というわけで以下、Linuxでのこの実装に関してコアな感じ。




syncookiesは、初期シーケンス番号や、MSS等をエンコードし、一方向ハッシュ関数でセキュリティを高めて、接続要求元に返すSYN/ACKパケットのシーケンス番号部分につっこんで、接続待ちキューを消費しなくて済むようにする仕組み。
syn queueがいっぱいになった場合,
syncookiesが無効であればdropしてしまうところを,
syn cookieつきのSYNACKを返し,queueには入れないことで,対応する.
つまり,SYN Floodを受けているときのみ有効になる.
かつ,最後にcookieを送ってから?,ある程度の時間までにcookieを受信しない限り,
dropしてしまうことで,適当に再利用できなくしてある.
/* syncookies: no recent synqueue overflow on this listening socket? */
static inline int tcp_synq_no_recent_overflow(const struct sock *sk)
{
unsigned long last_overflow = tcp_sk(sk)->rx_opt.ts_recent_stamp;
return time_after(jiffies, last_overflow + TCP_TIMEOUT_INIT);
}
この周辺にL7-DSRで必要な、SYN/ACKを返さずにコネクションオープン(TCPの仕様違反ですが)を実装すればいい感じな気がする・・・。