泥沼のSYNフラッディングを読み解く:カーネル内部で何が起きているのか
深夜のNOC、監視アラートの咆哮と共に画面を埋め尽くす真っ赤なグラフ。それは単なるトラフィック急増ではない。tcpdumpが吐き出すパケットの羅列を見た瞬間、背筋が凍る。「またか」。SYNフラッディング攻撃だ。
多くの運用者は、攻撃を受けた瞬間に netstat や ss を叩く。だが、そこで見える SYN_RECV の山を「ただの攻撃」と断じるのは素人だ。我々インフラエンジニアが真に見るべきは、OSのTCPスタックが崩壊するその一歩手前の、痛々しいまでの悲鳴である。
1. SYN_RECV 状態が物語る「未完のハンドシェイク」
TCPの3ウェイハンドシェイクにおいて、SYNパケットを受け取ったサーバーは、そのコネクション情報を listen queue(より正確には SYN queue)に格納し、SYN-ACK を返す。この時、接続は SYN_RECV 状態となる。
通常、この状態はミリ秒単位で通過し、クライアントからの ACK を受けて ESTABLISHED へと昇華する。しかし、攻撃者はこの ACK を決して送らない。結果、サーバーの限られたメモリ空間にある SYN queue は、偽のコネクション情報で埋め尽くされる。
現場で叩くべきコマンド
単に接続数を数えるのではなく、バッファの溢れ具合を可視化せよ。
# SYN_RECVの状態にあるコネクションをカウントし、IPごとに集計する
# 攻撃元の特徴を掴むための第一歩
ss -nltp | grep SYN-RECV | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
# リッスン中のソケットのキューの状態を確認する
# Recv-Q が Listen-Q に近づいていたら、カーネルの許容量限界だ
ss -tln
ここで Recv-Q が溢れれば、正当なユーザーからのパケットは問答無用でドロップされる。これこそが、サーバーが完全に沈黙する瞬間のメカニズムだ。
2. カーネルチューニング:TCPスタックの守護神たち
この絶体絶命の状況下で、アプリケーション層のコードをいじっても無駄だ。OSのカーネルパラメータを最適化し、TCPスタックの防御力を引き上げる必要がある。
SYN Cookies の有効化
まず、net.ipv4.tcp_syncookies を有効にすること。これは、SYN queue が満杯になった際、コネクション情報をメモリに保持せず、暗号化されたハッシュ値を SYN-ACK のシーケンス番号としてクライアントに送り返す技術だ。これがあれば、正当なクライアントが ACK を返してきた時に初めてコネクションを確立できる。
# /etc/sysctl.conf に追記し、即時反映させる
# 攻撃の兆候があれば即座に起動する設定
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=4096 # キューの容量を拡大
sysctl -w net.ipv4.tcp_synack_retries=2 # SYN-ACKの再送回数を減らし、滞留を防ぐ
3. 次世代の防衛:ハンドシェイクの最適化とTLS 1.3
もし君のインフラがTLSを使用しているなら、さらに踏み込んだ最適化が可能だ。TCPのハンドシェイクが終わるのを待たずにデータを送る TCP Fast Open (TFO) や、RTT(Round Trip Time)を劇的に削減するTLS 1.3の活用が鍵となる。
特にTLS 1.3は、ハンドシェイクの往復回数を減らすことで、SYNフラッディングのようなリソース枯渇攻撃に対する「接続完了までの猶予」を短縮する。
TCPバッファのチューニング
高負荷環境では、tcp_rmem と tcp_wmem の最適化も欠かせない。
# 大規模なスループットを維持しつつ、メモリを枯渇させない設定
# min, default, max の順で指定する
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
4. 最後に:エンジニアとしての矜持
SYNフラッディングを「防ぐ」ことは難しい。IPアドレスを偽装されたパケットを完全に選別するのは不可能に近いからだ。しかし、攻撃を受けている最中に「どのIPが」「どのポートを」狙い、カーネルが「どこで悲鳴を上げているのか」を ss や tcpdump で正確に観測できるエンジニアは、たとえダウンタイムが発生しても、その時間を最短に留めることができる。
パケットは嘘をつかない。ツールが出力する無機質な数字の裏側に、プロトコルの熱い鼓動を感じ取れ。それが、真に現場を知る者の視座だ。
次にアラートが鳴った時、慌てて再起動ボタンに手を伸ばす前に、まずは ss -ntu を叩いてみてほしい。君のサーバーの「脳内」で、今何が起きているのかを直接その目で確認してほしいんだ。それが、インフラアーキテクトとしての最強の武器になるはずだから。
コメント