Service Function Chaining

Service Function Chaining

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 により、それぞれのドライバーがサービスチェインパスの異なる方法で実装できるようになっています。

Port chain architecture Port chain model

詳しい情報は、 開発者ドキュメント を参照してください。

リソース

ポートチェイン (port chain)

  • 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) などがあります。

ポートペアグループ (port pair group)

  • id - ポートペアグループ ID

  • tenant_id - プロジェクト ID

  • name - 分かりやすい名前

  • description - 分かりやすい説明

  • port_pairs - サービス機能のポートペアのリスト

ポートペアグループには、ポートペアが 1 つ以上含まれます。複数のポートペアを指定すると、機能的に等価なサービス機能集合間で負荷分散が行われます。

ポートペア (port_pair)

  • id - ポートペア ID

  • tenant_id - プロジェクト ID

  • name - 分かりやすい名前

  • description - 分かりやすい説明

  • ingress - 入力ポート

  • egress - 出力ポート

  • service_function_parameters - サービス機能パラメーターの dict

ポートペアは、入力ポートと出力ポートを持つサービス機能を表現します。入出力の両方向のポートを持つサービス機能の場合は、入力ポートと出力ポートとして同じポートを指定します。

service_function_parameters 属性は、サービス機能に関連するパラメーターが 1 つ以上含まれます。現時点では、パケットをチェインに関連付ける correlation (関連付け) パラメーターのみがサポートされています。 NSH などのチェインへの関連付けに対応していない従来のサービス機能では、このパラメーターのデフォルト値は none になります。 none に設定する場合、データプレーンの実装でサービス機能のプロキシー機能が提供されている必要があります。

Flow Classifier

  • 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_portlogical_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 は、そのネットワークにポートを作成する前に存在している必要があります。

  1. ネットワーク net1 を所有するプロジェクトの認証情報を読み込みます。

  2. ネットワーク 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
    
  3. サービス機能インスタンス vm1 をポート p1p2 を使って作成します。 vm2 をポート p3p4 を使って作成します。 vm3 をポート p5p6 を使って作成します。

    $ 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 つで各インスタンスを起動し、後で追加のポートを接続することもできます。

  4. 必要なパケットヘッダーに一致する 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
    
  5. ポート p1p2 でポートペア PP1 を作成します。同様に、ポート p3p4 でポートペア PP2 を、ポート p5p6 でポートペア 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
    
  6. ポートペア PP1PP2 でポートペアグループ 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 オプションを複数指定することで、機能的に等価なサービス機能のポートペアを複数追加できます。

  7. ポートペアグループ 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 は、ポートペアグループに新たに追加されたサービス機能に負荷の分散を行います。

Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.