フローの構成要素の一つにアクションがあります。アクションとは、スイッチに入ってきたパケットをどう料理するか、という動詞にあたる部分です。よく「OpenFlow でパケットを書き換えて曲げる」などと言いますが、これらはすべてこのアクションで実現できることです。それでは、OpenFlow 1.0 ではどんなアクションが定義されているか見てみましょう。
アクションの種類
アクションは大きく分けて次の 4 種類があります。
- Forward: パケットを指定した宛先ポートに出す
- Modify-Field: パケットの中身を書き換える
- Drop: パケットを捨てる
- Enqueue: ポートごとに指定されたスイッチのキューに入れる。QoS 用。
アクションは動詞と同じく指定した順番に実行されます。「ごはんを作って、食べて、片付ける」といったふうに。たとえば、パケットを書き換えて指定した宛先に出したいときには、
[Modify-Field, Forward]
というアクションのリストを指定します。ここで、アクションは指定された順番に実行されることに注意してください。アクションの順番を変えてしまうと、違う結果が起こります。たとえば「ごはんを食べてから、ごはんを作る」と最後にごはんが残ってしまいます。同様に先ほどの例を逆にしてしまうと、先にパケットがフォワードされてしまうので Modify-Field は実行されなくなります。
# パケットを書き換える前にフォワードされてしまう。 [Forward, Modify-Field]
同じ動詞を複数指定することもできます。
[Modify-Field A, Modify-Field B, Forward A, Forward B]
この場合は、フィールド A と B を書き換えて、宛先 A と B にフォワードする、と読めます。このように、複数の箇所を書き換えたり複数の宛先にパケットを出したい場合には、アクションを複数連ねて指定します。
Drop は特殊なアクションで、実際には Drop アクションというものが具体的に定義されているわけではありません。アクションのリストに Forward アクションをひとつも入れなかった場合、そのパケットはどこにもフォワードされずに捨てられます。これを Drop アクションと呼んでいるわけです。
それでは、最もよく使われる Forward アクションと Modify-Field アクションで具体的に何が指定できるか見て行きましょう。
Forward アクション
Forward アクションでは指定した宛先ポートにパケットを転送します。宛先ポートはポート番号で指定することもできますが、いくつか論理的なポートが定義されています。
- ポート番号: パケットを指定した番号のポートに出す。
- IN_PORT: パケットを入ってきたポートに出す。
- ALL: パケットを入ってきたポート以外のすべてのポートに出す。
- FLOOD: パケットをスイッチの作ったスパニングツリーに沿って出す。スイッチが複数台ある場合にはループが起こらないので ALL よりも安全。
- CONTROLLER: パケットをコントローラに明示的に送り、Packet In を起こす。
- NORMAL: パケットをスイッチの機能を使って転送する。従来のスイッチの動作と同じ。
- LOCAL: パケットをスイッチのローカルポートに出す。ローカルポートを監視するアプリケーションに特殊な処理をさせたい場合に使う。あまり使われない。
Modify-Field アクション
Modify-Field アクションではパケットの様々なフィールドを書き換えることができます。書き換えできる項目は次のとおりです。
- VLAN ID: 指定された VLAN ID をセットする、または既存のものがあれば書き換える。
- VLAN プライオリティ: 指定された VLAN プライオリティをセットする、または既存のものがあれば書き換える。VLAN ID はゼロになる。
- VLAN ヘッダ: VLAN のヘッダを除去する。
- 送信元 MAC アドレス: 送信元の MAC アドレスを書き換える。
- 宛先 MAC アドレス: 宛先の MAC アドレスを書き換える。
- 送信元 IP アドレス: 送信元の IP アドレスを書き換える。
- 宛先 IP アドレス: 宛先の IP アドレスを書き換える。
- TCP/UDP 送信元ポート: TCP/UDP の送信元ポート番号を書き換える。
- TCP/UDP 宛先ポート: TCP/UDP の宛先ポート番号を書き換える。
- IP ToS bits: IP の ToS フィールドを書き換える。
まとめ
OpenFlow で使えるアクションを見てきました。どんなアクションが使えるかを押さえておくことで、届いたパケットを自由自在に処理できるようになります。みなさんもぜひいろいろと試してみてください。