SYNとは何か:TCPハンドシェイクから攻撃・対策まで詳解(初心者〜運用者向け)

概要:SYNとは何か

SYNは、ネットワークプロトコルTCP(Transmission Control Protocol)における制御フラグの一つで、接続の開始を示します。TCPは信頼性の高い通信を提供するために、3ウェイ・ハンドシェイク(three-way handshake)という手順で接続を確立します。その最初のパケットがSYNフラグを立てたTCPセグメントです。

TCPの3ウェイ・ハンドシェイク(詳細)

3ウェイ・ハンドシェイクは次の3つのステップで構成されます。

  • クライアント → サーバ:SYN — クライアントは初期シーケンス番号(ISN)を指定したTCPセグメントのSYNビットを1にして送信する。
  • サーバ → クライアント:SYN/ACK — サーバは受け取ったISNに基づく確認応答(ACK)と自身のISNを含むSYNを返す(SYNとACK両方のフラグが1)。
  • クライアント → サーバ:ACK — クライアントがサーバのISNを確認し、応答のACKを送ると接続は確立(ESTABLISHED)する。

この手順により両端はお互いの初期シーケンス番号を確認し、パケットの受信順序や再送制御に必要な状態を構築します。相手のISNはTCPセッションの同期に重要で、予測されにくいランダムなISNを使うことでセッションハイジャックのリスクを低減します。

SYNパケットの役割と中身

SYNパケットは通常ペイロード(データ)を伴わないことが多く、TCPヘッダにISNやウィンドウサイズ、オプション(MSS、ウィンドウスケール、SACK許可、タイムスタンプなど)が含まれます。SYNが立っているパケットはコネクションの初期ネゴシエーションに使われ、オプションのやり取りで両端が今後の通信パラメータを決めます。

TCP状態遷移とSYN

  • LISTEN — サーバが接続要求(SYN)を待っている状態。
  • SYN_RECEIVED — サーバがSYNを受け取り、SYN/ACKを送り初期接続情報を保持している状態(まだ確立前)。この状態は半開き(half-open)とも呼ばれ、リソースを消費する。
  • ESTABLISHED — 3ウェイ完了後の確立状態。

SYNを受け取った段階(特にSYN_RECEIVED)では、サーバは接続に関するエントリ(ソケット、バッファ、タイマなど)を保持します。多数のSYNが来るとこれらのリソースが枯渇し、正当な接続の受け入れが出来なくなる可能性があります(SYNフラッド)。

SYNフラッド攻撃(SYN Flood)

SYNフラッドは、サーバに大量のSYNを送り続けて半開きの接続を蓄積させ、リソースを枯渇させるDDoS(あるいはDoS)の代表的手法です。攻撃者は送信元IPを偽装(IPスプーフィング)することが多く、サーバが返すSYN/ACKに対するACKが返らないため、SYN_RECEIVEDのまま状態が残ります。

影響:

  • 接続キュー(backlog)の枯渇
  • CPU/メモリ/ソケット資源の消費
  • 正当なユーザーからの接続拒否(サービス不能)

SYNフラッドの検出方法

  • ネットワーク監視ツールでSYNパケットの急増を検出(例:tshark/tcpdump で tcp[tcpflags] & tcp-syn != 0 のカウント)
  • サーバ上でのソケット状態確認:ss -s, ss -tan | grep SYN_RECV, netstat -an | grep SYN_RECV
  • IDS/IPSログ(SYN率の急増や送信元IPの偏り)

対策(運用/設計レベル)

SYN攻撃対策は複数レイヤで行うのが効果的です。以下は主要な手法です。

  • SYN cookies(サーバ側のスタック実装)

    SYN cookiesは、SYN_RECEIVED状態で接続情報を大量に保持する代わりに、ISNに情報を埋め込んで一時的に状態を保持しない手法です。クライアントがACKして戻ってきたときにISNを検証して接続を復元します。これによりSYNによるリソース消費を回避できます。ただし一部TCPオプションのネゴシエーションが制限される場合があります。

  • バックログやタイムアウトの調整

    カーネルパラメータ(Linuxならnet.ipv4.tcp_max_syn_backlog, somaxconn, tcp_synack_retriesなど)を調整して短期の負荷に耐える設定にします。ただし無制限に増やすとメモリ消費や他の影響が出るため、慎重なチューニングが必要です。

  • ネットワークレベルでのフィルタリング

    ファイアウォール(iptables/nftables)で短時間に多数のSYNを送るIPをレート制限する、あるいは疑わしい送信元をブロックする。外部のDDoS保護サービスを利用するのも有効です。

  • SYNプロキシ・SYNキャッシュ

    一部のロードバランサや専用機はSYNプロキシを使い、クライアントとサーバの間でSYNハンドシェイクを代理してサーバを保護します。SYNキャッシュは短期的にSYNを効率よく管理するメカニズムです。

  • ネットワーク設計の冗長化

    ロードバランサ、複数のエンドポイント、クラウドベースの分散防御を組み合わせ可用性を高めます。

実践的な防御設定例(概要)

  • LinuxでSYN cookiesを有効化:sysctl -w net.ipv4.tcp_syncookies=1
  • バックログ増加:sysctl -w net.ipv4.tcp_max_syn_backlog=4096(環境により調整)
  • iptablesで簡単なレート制限:iptables -A INPUT -p tcp --syn -m limit --limit 25/min --limit-burst 100 -j ACCEPT(注:環境依存のため本番投入前に検証すること)
  • ロードバランサでSYNプロキシを有効にする(F5、NGINXなどの製品やクラウドL7/L4サービス)

関連するセキュリティ注意点

  • ISNのランダム性 — ISNが予測可能だとTCPセッション乗っ取り(ハイジャック)やリセット攻撃に使われる。現代の実装はランダム化を強化している。
  • IPスプーフィング — SYNフラッドではよく行われる。受信側での接続の妥当性確認やネットワーク境界でのフィルタリング(ルートフィルタリングやBCP 38準拠)で緩和可能。
  • ログとメトリクス — SYNの異常増加は早期検出が可能。SYN/ACK再送やSYN_RECVの蓄積などのメトリクスを監視する。

診断とトラブルシューティングの実践例

問題発生時に取るべき代表的なステップ:

  • ネットワークトラフィック確認:tcpdump -n -i 'tcp[tcpflags] & (tcp-syn) != 0' でSYNの発生を観察
  • ソケット状態:ss -tan | awk '{print $1,$2,$3,$4,$5}' | grep SYN_RECV や ss -s で概要を確認
  • システムログ、ファイアウォールログを参照して異常IPやパターンを検出
  • 一時的にSYN cookiesを有効化し、効果を評価

SYN以外の関連技術トピック

  • TCP Fast Open(TFO) — パフォーマンス向上のために、クライアントが事前にTFOクッキーを持っていれば最初のSYNにデータを載せて送ることができる。これによりラウンドトリップが1回分削減される場合があるが、セキュリティ・インタロップの検討が必要。
  • TCPオプション(SACK、ウィンドウスケール、タイムスタンプ) — これらはSYN時にネゴシエートされる。SYN cookies使用時には一部オプションが利用不可になるケースがあるため影響を理解しておく。

まとめ(運用者への提言)

SYNはTCP接続の基礎であり、その理解はネットワーク設計・運用・セキュリティ対策の出発点です。SYNフラッドは依然として実用的な攻撃手法の一つですが、適切なカーネル設定、SYN cookiesやプロキシ、ネットワークレベルでのレート制限やクラウド防御を組み合わせることで十分に緩和できます。監視とログの自動化、そしてテスト環境での対策検証を必ず行ってください。

参考文献