SDN と OpenFlow:制御/データ分離の原理
各スイッチに散らばっていた経路判断を1か所のソフトウェアに集めると、網全体を一望して思いどおりに制御できる理由が腑に落ちる。フローテーブルと OpenFlow のメッセージ、北行/南行 API までさかのぼって理解できる。
- 1.SDN はコントロールプレーン(経路をどう決めるか)をデータプレーン(パケットをどう転送するか)から切り離し、論理的に集中化したコントローラへ移す。各スイッチは自律判断をやめ、与えられたフローテーブルどおりに転送するだけになる。
- 2.OpenFlow はコントローラとスイッチ間の南行 API の一実装で、TCP/TLS 上のメッセージで match/action 形式のフローエントリを書き込む。マッチは複数ヘッダフィールドの組、アクションは転送・書き換え・破棄などで、優先度つきで照合される。
- 3.アプリは北行 API(REST など)でコントローラに意図を伝え、コントローラがそれを南行 API のフロールールへ変換する。ネットワークがソフトウェアのプログラム対象になることが SDN の本質。
コントロールプレーンとデータプレーンを切り離す
従来のルータ/スイッチは、1台の箱の中に2つの役割を同居させています。データプレーンは実際にパケットを受け取り、転送表を引いて出力ポートへ送り出す高速な部分です。コントロールプレーンはその転送表を作る頭脳で、OSPF や BGP といったルーティングプロトコルを各機器が自分で走らせ、隣接機器と情報交換しながら経路を計算します。つまり経路判断のロジックが網の全機器に分散して埋め込まれているわけです。
この分散モデルは堅牢ですが、網全体の挙動を一貫して制御するのが難しいという弱点があります。各機器が自分のローカルな視点でプロトコルどおりに動くため、「このフローだけ別経路へ」「この区間だけ帯域を絞る」といった全体最適の意図を直接書き下せず、プロトコルのパラメータを間接的にいじって誘導するしかありません。
SDN(Software-Defined Networking) はここを反転させます。コントロールプレーンを各機器から引き剥がし、論理的に集中化したコントローラへ移します。スイッチは経路を自分で考えるのをやめ、コントローラから配られた転送ルール(フローテーブル)どおりにパケットを動かす単純な実行体になります。判断はソフトウェア1か所に集まり、そこから網全体を一望してプログラムできる——これが SDN の一行要約です。
集中化はあくまで論理的なものです。物理的には可用性のためコントローラを複数台のクラスタで冗長化し、状態を共有します。重要なのは「経路を決める頭脳が網の各所に分散していない」という点で、物理1台という意味ではありません。コントローラ障害時にスイッチがどう振る舞うか(既存フローを維持するフェイルスタンドアロン等)も設計上の論点になります。
フローテーブル:マッチとアクション
SDN スイッチの中核は フローテーブルです。これは従来の宛先 IP だけを見るロンゲストプレフィックスマッチの転送表よりも一般化されており、各エントリ(フローエントリ)が マッチ条件とアクションの組で表されます。
マッチ条件は単一フィールドではなく、複数のヘッダフィールドの組み合わせで指定できます。入力ポート、送信元/宛先 MAC、VLAN、EtherType、送信元/宛先 IP、IP プロトコル番号、TCP/UDP ポートなどを横断的に条件にでき、各フィールドはワイルドカード(任意)も許します。これにより L2 から L4 までをまたいだ粒度で「どのパケット群か」を切り出せます。
アクションはマッチしたパケットへの処理で、代表的には次のものです。
| アクション | 意味 | 用途の例 |
|---|---|---|
| Output(port) | 指定ポートへ転送 | 通常のフォワーディング |
| Drop | 破棄(アクション省略=破棄) | フィルタ・ファイアウォール |
| Set-Field | ヘッダ書き換え(MAC/IP/VLAN等) | NAT・VLAN 付与・ルーティング |
| Push/Pop | タグの挿入/除去 | VLAN・MPLS ラベル操作 |
| Group | グループテーブルへ委譲 | マルチパス・冗長・マルチキャスト |
| Output(CONTROLLER) | コントローラへ送る(Packet-In) | 未知フローの判断委譲 |
アクションにはMPLS ラベルや VLAN タグの Push/Pop も含まれ、L2/L3 をまたいだ転送やトンネル処理を1つのテーブルで表現できます。複数エントリが同時にマッチし得るため、各エントリには 優先度(priority) があり、最も優先度の高いものが選ばれます。完全一致のエントリを高優先度、ワイルドカード混じりの包括的なエントリを低優先度に置く、という階層化が定石です。各エントリはパケット数・バイト数のカウンタも持ち、コントローラはこれを統計として吸い上げられます。
OpenFlow 1.1 以降はフローテーブルが複数段に分かれ、あるテーブルの Goto-Table アクションで次段へ進むパイプラインを構成できます。L2 転送・ACL・ルーティングをテーブルごとに分担させると、エントリ数の組み合わせ爆発を避けられます。1段目でメタデータを付け、後段がそれを見て分岐する、という設計が可能です。
OpenFlow のメッセージ
OpenFlow は、コントローラとスイッチの間でこのフローテーブルを操作するためのプロトコルです。SDN の概念を実装する南行 API(southbound API) の代表例で、両者は TCP(通常 6653 番、保護に TLS)でコネクションを張り、定義済みのメッセージを交換します。主要なメッセージは次のように分類できます。
| 種別 | メッセージ例 | 向き | 役割 |
|---|---|---|---|
| Controller→Switch | Flow-Mod | 下り | フローエントリの追加・変更・削除 |
| Controller→Switch | Packet-Out | 下り | スイッチに特定パケットを送出させる |
| Controller→Switch | Features/Stats-Request | 下り | 能力・統計の問い合わせ |
| Asynchronous | Packet-In | 上り | 未知フローのパケットをコントローラへ |
| Asynchronous | Flow-Removed | 上り | タイムアウト等でエントリ削除を通知 |
| Asynchronous | Port-Status | 上り | リンク UP/DOWN の通知 |
| Symmetric | Hello / Echo | 双方向 | 接続確立・死活監視 |
動作の典型は リアクティブな流れです。スイッチに該当エントリのないパケットが届くと、テーブルミス時の既定動作として Packet-In でそのパケット(または先頭部分)がコントローラへ上がります。コントローラは網全体の視点で経路を決め、Flow-Mod で経路上の各スイッチへフローエントリを書き込み、必要なら Packet-Out で当該パケット自身も送り出します。以降の同一フローはスイッチ内で完結し、コントローラは介在しません。
リアクティブなフロー確立(最初の1パケット):
新規フロー着弾
│ テーブルミス
▼
[Switch] ──Packet-In──▶ [Controller] 先頭パケットを判断委譲
│ 経路計算
◀──Flow-Mod───────────┘ 経路上の各スイッチへエントリ投入
◀──Packet-Out───────── 当該パケットを送出
│
▼
以降の同一フロー:スイッチ内で完結(コントローラ不介在)
対照的に プロアクティブな方式では、コントローラが事前にフローエントリを全スイッチへ配っておき、Packet-In をほぼ発生させません。初回遅延がなくコントローラへの負荷集中も避けられるため、本番網ではプロアクティブが基本で、リアクティブは例外処理に限る設計が一般的です。
すべての新規フローをリアクティブに処理すると、Packet-In がコントローラへ集中し、初回パケットの遅延と制御チャネルの輻輳を招きます。さらに大量の未知フロー(スキャンや DoS)をそのまま上げると、コントローラが攻撃面になります。テーブルミスの既定動作や、上げる量・レートの制限は設計上の必須項目です。
北行 API:意図をルールへ翻訳する
南行 API がコントローラとスイッチをつなぐのに対し、北行 API(northbound API) はコントローラとその上で動くアプリケーションをつなぎます。経路制御・ロードバランサ・ファイアウォール・ネットワーク仮想化といったアプリは、低レベルなフローエントリを直接書くのではなく、「テナント A の通信を分離せよ」「この2台を疎通させよ」といった意図を北行 API(多くは REST/JSON、gRPC など)でコントローラへ伝えます。
コントローラはその意図を、網のトポロジ情報と突き合わせて具体的なフロールールの集合へ翻訳し、南行 API で各スイッチへ展開します。北行 API には OpenFlow のような単一の標準が定まっておらず、コントローラ実装(OpenDaylight、ONOS など)ごとに API が異なるのが実情です。
| 観点 | 南行 API | 北行 API |
|---|---|---|
| つなぐ相手 | コントローラ ↔ スイッチ | コントローラ ↔ アプリ |
| 代表例 | OpenFlow・OVSDB・P4Runtime・NETCONF | REST/JSON・gRPC(実装依存) |
| 抽象度 | 低(match/action のルール) | 高(ネットワークの意図・ポリシー) |
| 標準化 | OpenFlow 等で比較的進む | 事実上コントローラ依存 |
この二層構造が SDN の価値の源泉です。アプリは個々のスイッチの実装やベンダを意識せず、コントローラの抽象モデルに対してプログラムを書けます。コントローラは網全体の単一の論理ビュー(集中したトポロジと状態)を提供し、その上で経路や分離をソフトウェアとして組み立てられます。物理配線をまたいだ論理ネットワークを作るVXLAN オーバーレイのような仮想化も、こうしたコントローラ主導の制御と組み合わせて運用されます。
(1)SDN の核はコントロールプレーンとデータプレーンの分離+制御の論理的集中。(2)フローエントリ=match(複数フィールドの組+優先度)+action(Output/Drop/Set-Field/Group など)。(3)OpenFlow は南行 API の一実装。Packet-In=スイッチ→コントローラ、Flow-Mod=コントローラ→スイッチ。(4)リアクティブ(初回 Packet-In)とプロアクティブ(事前配布)の対比。(5)北行 API は標準が定まらずコントローラ依存、抽象度が高い。
まとめ
SDN は、各機器に分散していたコントロールプレーンを引き剥がして論理的に集中したコントローラへ移し、データプレーンとの分離を徹底する考え方です。スイッチは自律判断をやめ、コントローラから配られたフローテーブルどおりにパケットを動かします。フローエントリは複数ヘッダフィールドの match と Output/Set-Field/Group などの action の組で、優先度つきに照合されます。OpenFlow はこの制御を担う南行 API の代表で、Packet-In でスイッチが判断を委譲し、Flow-Mod でコントローラがルールを書き込みます。リアクティブとプロアクティブの使い分け、Packet-In 集中の回避が実装の勘所です。さらに上位の北行 API がアプリの意図を受け取り、コントローラがそれをフロールールへ翻訳する——ネットワークがソフトウェアのプログラム対象になること、これこそが制御/データ分離の狙いそのものです。
ネットワーク Article
SDN と OpenFlow:制御/データ分離の原理を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
SDN
比較で見る軸
難易度: advanced / カテゴリ: ネットワーク / タグ数: 5
導入後に効く点
OpenFlow はコントローラとスイッチ間の南行 API の一実装で、TCP/TLS 上のメッセージで match/action 形式のフローエントリを書き込む。マッチは複数ヘッダフィールドの組、アクションは転送・書き換え・破棄などで、優先度つきで照合される。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ネットワーク
- タグ数
- 5
判断チェックリスト
- 自社の用途が「SDN / OpenFlow」に近いか確認する。
- 強みである「SDN はコントロールプレーン(経路をどう決めるか)をデータプレーン(パケットをどう転送するか)から切り離し、論理的に集中化したコントローラへ移す。各スイッチは自律判断をやめ、与えられたフローテーブルどおりに転送するだけになる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。