Service Function Chaining (SFC) は、 ポリシーベースルーティング (PBR) の Software-defined networking (SDN) 版と言われています。他にも様々な機能がありますが、多くの場合 SFC はセキュリティーと関連性があります。
基本的には、 SFC は、宛先 IP アドレスを使ってパケットを転送する従来のルーティングではなく、パケットを 1 つ以上のサービス機能 (service function) 群を順に通過させます。サービス機能群は、本質的には、互いにケーブルで接続される物理ネットワークデバイスのつながりをエミュレートするものです。
SFC の基本的な例としては、パケットをある場所から別の場所へ、従来のルーティングで言うところの「ネクストホップ」 IP アドレスを持たないファイアウォールを経由して転送する例があります。もっと複雑な例としては、複数のサービス機能の列を順番に通すケースで、それぞれのサービス機能は複数のインスタンス (VM) を使って実装されているというものです。パケットは各ホップで必ず 1 つのインスタンスを経由し、複数のインスタンスがある場合は各ホップにおいてハッシュアルゴリズムを使ってそれらのインスタンスに分散されます。
すべての OpenStack Networking サービスと OpenStack Compute インスタンスは、ポートを経由して仮想ネットワークに接続されます。このため、ポートだけを使ってサービスチェイニング用のトラフィックステアリングのモデルを作成できます。ポートチェインにこれらのポートを含めることで、サービス機能を提供する 1 つ以上のインスタンスを経由するようにトラフィックをステアリングできます。
ポートチェイン、すなわちサービス機能パス、は以下から構成されます。
サービス機能の列を定義するポートの集合。
チェインに入るトラフィックフローを指定する Flow Classifier の集合。
サービス機能がポートペアを持つ場合、最初のポートはサービス機能の入力ポートとして機能し、 2 つ目のポートは出力ポートとして機能します。両方のポートが同じ値の場合、これららは 1 つの双方向の仮想ポートとして動作します。
ポートチェインは単方向のサービスチェインです。最初のポートはサービス機能チェインの先頭となり、2 つ目のポートはサービス機能チェインの末尾となります。双方向のサービス機能チェインは 2 つの単方向のポートチェインで構成されます。
1 つの Flow Classifier が所属できるポートチェインは 1 つだけです。これは、フローのパケットをどのチェインが処理するかを判定する際の曖昧さを避けるためです。チェック機構があり、このような曖昧さを防止できます。一方で、複数の Flow Classifier を 1 つのポートチェインに関連付けできます。これは、複数のフローを同じサービス機能パスを通すためです。
現時点では、 SFC は、複数のプロジェクトに属するサービス機能を扱うことはできません。
ポートチェインプラグインは、OVS ドライバーや各種 SDN コントローラードライバーなど、さまざまなサービスプロバイダーに対応しています。共通ドライバー API により、それぞれのドライバーがサービスチェインパスの異なる方法で実装できるようになっています。
詳しい情報は、 開発者ドキュメント を参照してください。
id
- ポートチェイン ID
tenant_id
- プロジェクト ID
name
- 分かりやすい名前
description
- 分かりやすい説明
port_pair_groups
- ポートペアグループ ID のリスト
flow_classifiers
- flow classifier ID のリスト
chain_parameters
- チェインパラメーターの dict
ポートチェインは、ポートペアグループの列で構成されます。各ポートペアグループは、そのポートチェインでの各ホップに対応します。ポートペアのグループは、等価な機能を提供するサービス機能を表現します。例えば、ファイアウォールのサービス機能のグループなどです。
Flow Classifier はフローを特定します。ポートチェインには複数の Flow Classifier を含めることができます。 Flow Classifier を指定しなかった場合、そのポートチェインによるトラフィックのステアリング (steering) は実際には行われません。
chain_parameters
属性は、ポートチェインに関連するパラメーターが 1 つ以上含まれます。現時点では、 correlation (関連付け) パラメーターだけがサポートされています。このパラメーターのデフォルト値は、 Open vSwitch (OVS) の機能との互換性を考慮いて mpls
になっています。将来予定されている correlation パラメーターとしては、ネットワークサービスヘッダー (NSH) などがあります。
id
- ポートペアグループ ID
tenant_id
- プロジェクト ID
name
- 分かりやすい名前
description
- 分かりやすい説明
port_pairs
- サービス機能のポートペアのリスト
ポートペアグループには、ポートペアが 1 つ以上含まれます。複数のポートペアを指定すると、機能的に等価なサービス機能集合間で負荷分散が行われます。
id
- ポートペア ID
tenant_id
- プロジェクト ID
name
- 分かりやすい名前
description
- 分かりやすい説明
ingress
- 入力ポート
egress
- 出力ポート
service_function_parameters
- サービス機能パラメーターの dict
ポートペアは、入力ポートと出力ポートを持つサービス機能を表現します。入出力の両方向のポートを持つサービス機能の場合は、入力ポートと出力ポートとして同じポートを指定します。
service_function_parameters
属性は、サービス機能に関連するパラメーターが 1 つ以上含まれます。現時点では、パケットをチェインに関連付ける correlation (関連付け) パラメーターのみがサポートされています。 NSH などのチェインへの関連付けに対応していない従来のサービス機能では、このパラメーターのデフォルト値は none
になります。 none
に設定する場合、データプレーンの実装でサービス機能のプロキシー機能が提供されている必要があります。
id
- Flow Classifier ID
tenant_id
- プロジェクト ID
name
- 分かりやすい名前
description
- 分かりやすい説明
ethertype
- Ethernet タイプ (IPv4/IPv6)
protocol
- IP プロトコル
source_port_range_min
- 送信元プロトコルポートの最小値
source_port_range_max
- 送信元プロトコルポートの最大値
destination_port_range_min
- 宛先プロトコルポートの最小値
destination_port_range_max
- 宛先プロトコルポートの最大値
source_ip_prefix
- 送信元 IP アドレスもしくはプレフィックス
destination_ip_prefix
- 宛先 IP アドレスもしくはプレフィックス
logical_source_port
- 送信元ポート
logical_destination_port
- 宛先ポート
l7_parameters
- L7 パラメーターの dict
“source” 関連の属性の組み合わせで、フローの入力元が定義されます。 “destination” 関連の属性の組み合わせで、フローの宛先が定義されます。 l7_parameters
属性は、URL などのレイヤー 7 のフィールドを使ったフロー分類をサポートする際に使用するための予約場所です。 logical_source_port
と logical_destination_port
属性は、指定されなかった場合はデフォルトで none``になります。 ``ethertype
属性のデフォルトは IPv4
で、それ以外の属性のデフォルト値はすべてワイルドカード値です。
以下の例では neutron
コマンドラインインターフェース (CLI) を使って、 3 つのサービス機能インスタンスから構成されるポートチェインを作成し、 192.168.1.11:1000 から 192.168.2.11:80 への HTTP (TCP) トラフィックフローを処理します。
インスタンス 1
名前: vm1
機能: ファイアウォール
ポートペア: [p1, p2]
インスタンス 2
名前: vm2
機能: ファイアウォール
ポートペア: [p3, p4]
インスタンス 3
名前: vm3
機能: 侵入検知システム (IDS)
ポートペア: [p5, p6]
注釈
サンプルのネットワーク net1
は、そのネットワークにポートを作成する前に存在している必要があります。
ネットワーク net1
を所有するプロジェクトの認証情報を読み込みます。
ネットワーク net1
にポートを作成し、その UUID 値を記録しておきます。
$ neutron port-create --name p1 net1
$ neutron port-create --name p2 net1
$ neutron port-create --name p3 net1
$ neutron port-create --name p4 net1
$ neutron port-create --name p5 net1
$ neutron port-create --name p6 net1
サービス機能インスタンス vm1
をポート p1
と p2
を使って作成します。 vm2
をポート p3
と p4
を使って作成します。 vm3
をポート p5
と p6
を使って作成します。
$ openstack server create --nic port-id=P1_ID --nic port-id=P2_ID vm1
$ openstack server create --nic port-id=P3_ID --nic port-id=P4_ID vm2
$ openstack server create --nic port-id=P5_ID --nic port-id=P6_ID vm3
P1_ID
, P2_ID
, P3_ID
, P4_ID
, P5_ID
, P6_ID
は、それぞれのポートの UUID に置き換えてください。
注釈
インスタンスを正常に起動するには、他のパラメーターも必要です。詳しい情報は CLI リファレンス を参照してください。
ネットワークインターフェース 1 つで各インスタンスを起動し、後で追加のポートを接続することもできます。
必要なパケットヘッダーに一致する Flow Classifier FC1
を作成します。
$ neutron flow-classifier-create \
--description "HTTP traffic from 192.168.1.11 to 192.168.2.11" \
--ethertype IPv4 \
--source-ip-prefix 192.168.1.11/32 \
--destination-ip-prefix 192.168.2.11/32 \
--protocol tcp \
--source-port 1000:1000 \
--destination-port 80:80 FC1
ポート p1
と p2
でポートペア PP1
を作成します。同様に、ポート p3
と p4
でポートペア PP2
を、ポート p5
と p6
でポートペア PP3
を作成します。
$ neutron port-pair-create \
--description "Firewall SF instance 1" \
--ingress p1 \
--egress p2 PP1
$ neutron port-pair-create \
--description "Firewall SF instance 2" \
--ingress p3 \
--egress p4 PP2
$ neutron port-pair-create \
--description "IDS SF instance" \
--ingress p5 \
--egress p6 PP3
ポートペア PP1
と PP2
でポートペアグループ PPG1
を作成します。また、ポートペア PP3
でポートペアグループ PPG2
を作成します。
$ neutron port-pair-group-create \
--port-pair PP1 --port-pair PP2 PPG1
$ neutron port-pair-group-create \
--port-pair PP3 PPG2
注釈
--port-pair
オプションを複数指定することで、機能的に等価なサービス機能のポートペアを複数追加できます。
ポートペアグループ PPG1
, PPG2
と Flow Classifier FC1
を使って、ポートチェイン PC1
を作成します。
$ neutron port-chain-create \
--port-pair-group PPG1 --port-pair-group PPG2 \
--flow-classifier FC1 PC1
注釈
--port-pair-group
オプションを複数個指定することで、ポートチェインに追加のポートペアグループを指定できます。 1 つのポートチェインには、少なくとも 1 つポートペアグループを含める必要があります。
--flow-classifier
オプションを複数個指定することで、 1 つのポートチェインに複数の Flow Classifier を指定できます。各 Flow Classifier でフローが特定されます。
Use the neutron port-chain-update command to dynamically add or remove port pair groups or flow classifiers on a port chain.
例えば、ポートペアグループ PPG3
をポートチェイン PC1
に追加します。
$ neutron port-chain-update \
--port-pair-group PPG1 --port-pair-group PPG2 --port-pair-group PPG3 \
--flow-classifier FC1 PC1
例えば、 Flow Classifier FC2
をポートチェイン PC1
に追加します。
$ neutron port-chain-update \
--port-pair-group PPG1 --port-pair-group PPG2 \
--flow-classifier FC1 --flow-classifier FC2 PC1
SFC は、追加された Flow Classifier に一致したトラフィックを、ポートチェインのポートペアグループに転送します。
Use the neutron port-pair-group-update command to perform dynamic scale-out or scale-in operations by adding or removing port pairs on a port pair group.
$ neutron port-pair-group-update \
--port-pair PP1 --port-pair PP2 --port-pair PP4 PPG1
SFC は、ポートペアグループに新たに追加されたサービス機能に負荷の分散を行います。
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.