フローの構成要素の一つにマッチングルールがあります。マッチングルールとは、OpenFlow スイッチがパケットを受け取ったときにアクションを起こすかどうか決める条件です。たとえば「パケットの宛先が http サーバだったら」とか「パケットの送信元がローカルネットワークだったら」などという条件に適合したパケットにだけ、スイッチがアクションを起こすというわけです。
「マッチングルール」という用語について
なお余談ですが、OpenFlow 1.0 の仕様ではマッチングルールの表記にゆれがあり、
- OpenFlow 12 タプル
- ヘッダフィールド
などとも記述されています。ここはよく混乱しがちですので以降では “マッチングルール” で統一します。
その理由は、この “マッチングルール” という名前が「パケットが来たときにルールに従ってマッチする」という役割を最もすなおに表現していてわかりやすい名前だからです。”OpenFlow 12 タプル” は OpenFlow 1.1 では 15 タプルになりますし、この先どこまで増えるかわかりません。つまりいつまで使えるかわからない名前です。また “ヘッダフィールド” だと、何をするものか名前からはわかりづらいですし、変に難しそうに聞こえます。
マッチングルールの中身
OpenFlow 1.0 では次の 12 種類の条件がマッチングルールに使えます。見ればわかるとおり、これらの条件はイーサネットや TCP/UDP でよく使われる値です。
名前 | 説明 | レイヤ |
Ingress Port | スイッチの物理ポート番号 | L1 |
Ether src | 送信元 MAC アドレス | L2 |
Ether dst | 宛先 MAC アドレス | L2 |
Ether type | イーサネットの種別 | L2 |
VLAN id | VLAN ID | L2 |
VLAN priority | VLAN PCP の値 (CoS) | L2 |
IP src | 送信元 IP アドレス | L3 |
IP dst | 宛先 IP アドレス | L3 |
IP proto | IP のプロトコル種別 | L3 |
IP ToS bits | IP の ToS 情報 | L3 |
TCP/UDP src port | TCP/UDP の送信元ポート番号 | L4 |
TCP/UDP dst port | TCP/UDP の宛先ポート番号 | L4 |
これらの条件をネットワークレイヤの視点で整理すると、レイヤ 1 からレイヤ 4 までの情報を使うことができることがわかります。
マッチングルールの使い方
OpenFlow の世界では、マッチングルールで指定できる条件を自由に組み合わせて通信を制御します。つまり、レイヤや宛先のような従来の枠組みではなく、たとえば、
- スイッチの物理ポート 1 番から届く、宛先が TCP 80 番 (= HTTP) のパケットを書き換える
- MAC アドレスが 02:27:e4:fd:a3:5dで宛先の IP アドレスが 192.168.0.0/24 のものは遮断する
というふうに自由に複数の条件を組み合わせることができるのです。
これに対して従来のネットワーク機器では、ネットワークの各レイヤに対応した個々のネットワーク機器が、そのレイヤで処理を行うのが当然でした。たとえばレイヤ 2 スイッチは宛先の MAC アドレスを用いてスイッチが転送先の物理ポートを特定し、そのポートにパケットを送ります。レイヤ 3 スイッチであれば、宛先の IP アドレスを使って同様の動きをします。こうした制限を無くし、ひとつのレイヤにとらわれない制御をするのが OpenFlow の特徴の一つと言えます。
まとめ
OpenFlow ではレイヤ 1 から 4 までの条件を組み合わせたマッチングルールを作り、マッチしたパケットに対してアクションを実行し制御できます。このマッチングルールを使ってどんな楽しいことができるかは、後々紹介していきたいと思います。