Syn Flood攻撃の実験をしてみた のサムネイル

Syn Flood攻撃の実験をしてみた

⏱ 約 8 分 view 467 like 0 LOG_DATE:2025-11-06
目次 / TOC

SYN Flood 攻撃は、TCP 3-way ハンドシェイクを悪用した古典的な DoS 攻撃。本実験では仮想環境上の Kali Linux から、意図的に脆弱に作られた Metasploitable2 に対し hping3 で大量の SYN パケットを送り、サーバの SYN キューを枯渇させるまでを再現する。攻撃したのに最初は失敗した理由 (Kali カーネルが自動で RST を返していた) を突き止め、iptables で RST を抑止して再挑戦するまでの試行錯誤も含めて、TCP の仕組みと DoS の原理を実践的に理解する。

▸ 法的・倫理的注意 (実験前に必読)

SYN Flood は 他人のサーバや公開サービスに対して実行すると犯罪 (日本: 電子計算機損壊等業務妨害罪 / 電波法 / 不正アクセス禁止法、米国: CFAA)。自分が所有する仮想マシンの間でのみ実施可能。Metasploitable2 のような 意図的に脆弱に作られた練習用 VM を使い、両機をホストオンリーネットワークで隔離するのが最も安全。

01

SYN Flood 攻撃とは #

SYN Flood 攻撃は、TCP 接続確立のプロセス (3 ウェイハンドシェイク) を悪用した攻撃。

攻撃者は、接続要求の最初のパケットである SYN のみを大量に送りつける。サーバーは律儀に SYN/ACK を返信し、攻撃者からの最後の ACK を待つが、攻撃者は意図的に ACK を返さない。

これにより、サーバー側では「ACK 待ち」の状態 (SYN_RECV状態) の接続が大量に発生する。この **「ハーフオープン接続」**を保持するためのリソース (接続キュー) が枯渇すると、サーバーは新規の正規な接続を受け入れられなくなり、サービス拒否 (DoS) 状態に陥る。

▸ かみ砕いて言うと — レストランの予約電話を空ベルで埋め尽くす

SYN Flood は 「レストランに予約電話をかけまくり、人数や日時を言う前に切る」のと同じ手口。店員は 「次に話すのは○○さんだろう」と回線を確保したまま待つが、攻撃者は二度と話さない。これを 1 秒で数万回繰り返すと、店の電話回線がすべて「予約待ち」で埋まり、本物の客の電話が繋がらなくなる — これがハーフオープン接続によるリソース枯渇。サーバーの SYN キューは「予約電話の待機リスト」に相当する。

02

環境構築 #

両仮想マシンを「ホストオンリーアダプター」または「ブリッジアダプター」に設定し、同一ネットワークセグメントに参加させる。

役割 OS IP アドレス 備考
攻撃者 Kali Linux 192.168.2.175 hping3 を使用
被害者 Metasploitable2 192.168.2.177 Apache がデフォルト稼働

Metasploitable2 は起動するとデフォルトで Web サーバー (Apache) が稼働している。これらは、Web アプリケーションの脆弱性診断 (ペネトレーションテスト) の技術を学習・訓練するために、意図的に脆弱な設定や古いバージョン、脆弱なアプリケーションを含んだ状態で用意されている。

Metasploitable2 ログイン画面
Metasploitable2 Apache

被害者側 (Metasploitable2) の設定 #

1. SYN Cookies の無効化 (実験のため) — Linux には SYN Flood への耐性を持つ SYN Cookies 機能がある。この機能の有無を確認し、有効だった場合は実験の効果を明確にするため無効化する (1 なら有効、0 なら無効)。

# 現在の設定を確認
sysctl net.ipv4.tcp_syncookies

# 無効化する場合 (攻撃が効きやすくなる)
sudo sysctl -w net.ipv4.tcp_syncookies=0

2. リソースモニターの表示 (任意)top コマンドや vmstat などで、CPU やネットワークの負荷を監視しておくと、攻撃の影響が視覚的に分かりやすくなる。

▸ なぜ SYN Cookies を切るのか

本来 Linux カーネルには SYN Flood 緩和機能 (SYN Cookies) が標準搭載されている。これは 「サーバ側でハーフオープン接続を保持しない代わりに、暗号学的な番号で接続を識別する」仕組みで、SYN Flood に対して構造的に強い。これを有効にしたままだと攻撃が無効化されるため、実験の効果を確認する目的で意図的に切る。本番運用では 絶対に切ってはいけない (= デフォルト ON のままが正解)。

03

攻撃の実行と観測 #

攻撃者 (Kali Linux) 側で、パケットを観測する Wireshark と、攻撃を実行するターミナルを準備する。Wireshark では ip.addr == 192.168.2.177 などのフィルターをかけておく。

攻撃の実行 (1 回目) #

まず、hping3 を一つのプロセスで実行し、--flood オプションで可能な限りの速度で送信する。

なお、今回の攻撃はあくまで実験なので IP アドレスの偽装は行わない。SYN Flood 攻撃はレスポンスを受け取ることを前提としないので、実際の攻撃ではこの時点で IP アドレスを偽装して FW でのブロックやログの分析を逃れようとするのが一般的。

# -S (SYNフラグ), -p 80 (ポート80), --flood (最速送信)
sudo hping3 -S -p 80 --flood 192.168.2.177

観察結果 (1 回目) #

Wireshark には膨大な量の SYN パケットが観測され、Metasploitable2 のリソースモニターでも CPU やネットワーク使用率の上昇が確認できる。

Wireshark で SYN パケット観測

Metasploitable 2 で以下のコマンドを実行すると、現在の SYN_RECV 状態にある TCP 接続の総数が表示される。

# 現在、ACK待ちのハーフオープン接続が、合計でいくつあるか
netstat -nat | grep SYN_RECV | wc -l

これにより、通常時 (攻撃を受けていないとき) と比べて SYN_RECV の数が多くなっていることが観測できる。

・攻撃前

SYN_RECV 攻撃前

・攻撃後

SYN_RECV 攻撃後

しかし、ホスト OS のブラウザから http://192.168.2.177 にアクセスすると、多少の遅延は感じるものの、Web ページは表示されてしまった。

攻撃が失敗した原因の考察 #

Wireshark の観測結果をもう一度よく見てみる。

すると、Kali から Metasploitable 2 宛に SYN が送られた後、Metasploitable 2 からのレスポンスとして SYN/ACK が帰ってきている (TCP の 3 ウェイハンドシェイクの 2 段階目)。ここまでは想定内だが、この後 Kali が RST を返してしまっている

Wireshark で RST 観測
▸ なぜ Kali が勝手に RST を返すのか

おそらく hping3 が特殊な方法でパケットを生成しているため、Kali のカーネルは「自分が開始した正規の接続」として hping3 の通信を管理していない。カーネルから見ると 「身に覚えのない SYN/ACK が届いた」と判断し、「この通信は無効です」と伝えるために自動的に RST (リセット) パケットをサーバーに返信している。この動作のせいで Metasploitable 2 の方では SYN_RECV が溜まらず消費され続け、正常に動作できてしまった。「攻撃ツールが意図した動作と、カーネルの自動応答が衝突している」のがこの実験の見せ場。

攻撃の実行 (2 回目) #

そこで Kali が RST を返さないように以下の設定をする。

sudo iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP
# -A OUTPUT: 送信(OUTPUT)パケットのルールに追加
# -p tcp: TCPプロトコルを対象
# --tcp-flags RST RST: RSTフラグが立っているパケットを指定
# -j DROP: 上記の条件に一致するパケットを破棄(送信しない)

観察結果 (2 回目) #

先ほどと同じく SYN_RECV を確認してみると、Metasploitable 2 のデフォルトの SYN キューの最大値 (上限) である 256 に到達し、消費されることなく張り付いていることが分かる。

SYN_RECV が 256 で張り付き

この状態でホスト OS のブラウザからアクセスすると、Metasploitable2 からのレスポンスが一切なくなり、最終的にタイムアウトエラーとなった

ブラウザでタイムアウト

実験が終了したら以下のコマンドで設定を元に戻す (-A-D に変えるだけ)。

sudo iptables -D OUTPUT -p tcp --tcp-flags RST RST -j DROP
04

考察と対策 #

今回の実験では、SYN Flood 攻撃の成否に、攻撃側の OS カーネルの動作が大きく影響することが確認できた。

単に hping3 でパケットを送信するだけでは、OS が自動的に RST を返信してしまうため、サーバー側の SYN キュー が溜まらない。iptables を用いてこの自動応答を遮断することで、初めてサーバーのリソース (SYN キュー) を枯渇させることに成功した。

脅威・リスク #

  • サービス停止 — 正規のユーザーがサービスを利用できなくなり、ビジネス上の機会損失や信用の失墜に繋がる
  • 金銭的被害 — クラウドサービス (AWS, GCP など) 上でサーバーを運用している場合、攻撃によって発生した大量のトラフィック (データ転送量) に対しても課金が発生し、莫大な請求に繋がる可能性がある

対策・対処 #

SYN Flood は非常に古典的だが、今なお強力な攻撃手法。

対策層 内容
OS レベル SYN Cookies の有効化 (net.ipv4.tcp_syncookies=1)。最も基本的な対策で、SYN キューが溢れることを防ぐ。現代の Linux ではデフォルト ON
FW / IPS 単一 IP からの異常な SYN パケットを検知し、レート制限 (一定時間内の接続数を制限) や IP アドレスの遮断を行う
DDoS 保護サービス AWS Shield / Cloudflare / Akamai などの専門的な DDoS 対策サービスを利用するのが最も現実的かつ強力。巨大なネットワーク帯域幅で攻撃トラフィックを「洗浄」し、正常な通信のみをサーバーに届ける
▸ まとめ — 「攻撃 1 つで、防御を 3 段重ねる」

SYN Flood は 1996 年から知られている古典的な攻撃だが、今でも DDoS の典型的な構成要素として現役。SYN Cookies (OS) + Rate limit (FW) + 上流の DDoS 保護 (Cloudflare 等) の 3 段重ねで防ぐのが現代の標準形。「個人サイトでも Cloudflare 無料プラン」を前段に置くだけで、ほとんどの SYN Flood は受け流せる。「自分のサーバで全部受け止める」発想は捨て、上流に流すのが現代の DoS 対策の鉄則。

𝕏 ポスト B! はてブ
Post Share LINE B!

COMMENTS 0

まだコメントはありません。最初のコメントを投稿しよう。

コメントを投稿