Pola PCE で SR 網の TE を体験してみよう!

はじめに

こんにちは、イノベーションセンターの竹中です。

本記事では、SR-TE を一元的に管理するためのソフトウェア実装である Pola PCE の概要や利用方法について紹介します。 Pola PCE は私と三島で実装し、現在 NTT Com より OSS 公開中です。

[Multi-AS Segment Routing 検証連載 #11] PCE 実装の検証 記事でも一部機能を紹介しましたが、本記事では Example を用いた試用環境の準備、ベンダールーターを用いての環境準備、また各機能について紹介します。

また、Go で開発したツールを OSS として公開する中で得た知見を NTT Communications Advent Calendar 2022 8日目で紹介しているので、こちらも是非ご覧ください。

目次

SR-TE や PCE に興味を持ち、簡潔な構成で Pola PCE の機能を試してみたい方は、まずは Docker 環境を用いた検証をお勧めします。

なお PCE とは何か、については下記記事にて紹介しているためこちらも併せて参考にしてください。

engineers.ntt.com

開発へのモチベーション

Pola PCE の紹介の前段として、開発に至ったモチベーションについて話します。

開発のモチベーションは大きく分けて 3 つあります。

1 つ目は、最新 RFC や Internet-Draft で議論中の PCE に関する機能を先行して実装し、検証したいという要求です。 自作の PCE を準備することで、RFC や Internet-Draft の更新に合わせてリアルタイムに実装状況を更新し、自作 PCE - 各社ベンダー製 PCC の相互接続検証を行いたいです。

2 つ目は、Multi-vendor 対応な PCE を利用したいという要求です。 Multi-AS Segment Routing 検証連載 で公開していますが、私たちは Multi-vendor 機器環境で Segment Routing の検証を行なっています。そのため、PCE についても Multi-vendor 対応な製品を利用したいです。

PCE の技術仕様に関しては RFC や Internet-Draft で未提案な部分もあり、PCC 機能にはベンダーごとに独自実装の部分も存在します。そのため、現状 Multi-vendor 環境において Color や Preference の情報などを含む PCEP の相互接続はまだできません。自作 PCE によってそのような問題の解決したいです。

3 つ目は、外部連携用の API を提供する軽量なツールが欲しいという要求です。 必要に応じて機能の分割や拡張などが行えるようにマイクロサービスアーキテクチャを目指し、機能ごとに分かれたコンポーネントを API で連携する仕組みを利用したいです。例えば SR Policy 投入機能は独立して動作させたり、トポロジーを描写するツールと連携させて利用したいです。

以上のモチベーションから Pola PCE を実装しました。

Pola PCE 概要

できること

Pola PCE では現在(v1.1.2)SR-MPLS で構成されるネットワークにおいて以下の機能が利用可能です。

  • PCC へ SR Policy の追加・更新
  • PCC で利用中の SR Policy の確認
  • GoBGP との連携による TED の取得
    • TED を保持することで経路計算が可能になり、Dynamic Path が利用可能
  • Multi-vendor 環境での利用
    • IOS XR、Junos、FRRouting を PCC として利用可能

マイクロサービスアーキテクチャに基づいた実装

Pola PCE はマイクロサービスアーキテクチャに基づいた実装となっており、それぞれのプロセス間の連携を gRPC が担っています。 そのため、各利用者の用途に応じて必要な機能のみを組み合わせて利用できます。

最小構成であれば Pola PCE 単体で SR Policy の管理や Explicit Path の追加や更新ができる簡素な SR Policy 管理ツールとして利用できます。

また Pola PCE のデーモンが gRPC インターフェースを提供しているため、デーモンを中核として、例えば以下のような高機能なネットワークコントローラを構築することも可能です。

構成

Pola PCE の構成は以下の通りです。 ツール単体は polad / pola CLI tool からなります。

polad は PCE デーモンであり、PCEP Session の管理や必要に応じたトポロジー情報の取得・管理、また、保持している情報を出力するための gRPC インターフェースを提供します。 pola CLI tool は polad の gRPC クライアントとなっており、入力したコマンドに応じて適切な gRPC リクエストを送信し polad の保持する情報を取得・更新します。

トポロジー情報の取得の必要があれば GoBGP と連携させたり、gRPC インターフェースを提供しているためユーザーが polad の gRPC クライアント機能をもつツールを用意することで Pola PCE を制御することも可能です。

実装予定の新機能

私たちはチームの取り組みとして SR-MPLS だけでなく SRv6 環境での検証も行っております。 SRv6 環境での利用も想定しているため、今後の直近のアップデート予定として PCEP の SRv6 対応を開発中です。プロトコル拡張自体がまだ Internet-Draft で議論中のため、各ベンダーの SRv6 PCC 機能の実装状況や独自実装の内容を把握しつつ、Multi-vendor で動作する SRv6 PCE へと拡張する予定です。

Docker 環境を用いた Explicit Path 機能の検証

公開中の example を用いて動作検証をします。検証環境の構築には OSS の Docker ベースなネットワークエミュレータである tinet を利用しているため、Docker が利用できる x86_64 CPU 機器が1台あれば手元で試せます。

検証環境

公開中の spec.yaml を用いて、tinet により以下のトポロジーを作成します。

SR-MPLS ドメインは FRRouting version:latest (2022年12月5日現在では v8.4.1) を用いて構築されます。

手順

Docker、tinet のインストールについては手順を省略します。

pola リポジトリの取得

GitHub から pola リポジトリを clone します。

user@server:~$ git clone https://github.com/nttcom/pola

トポロジーの構築・機器への config 投入

ディレクトリを sr-mpls_l3vpn へ変更したのちに tinet コマンドを 1 つ実行すると全環境構築が完了します。

user@server:~$ cd pola/examples/sr-mpls_l3vpn/
user@server:~/pola/examples/sr-mpls_l3vpn$ tinet upconf | sudo sh -x

docker ps でトポロジー図に記載してある、各機器名称に従ったコンテナが作成・起動していることが確認できます。

user@server:~/pola/examples/sr-mpls_l3vpn$ docker ps
CONTAINER ID   IMAGE                                   COMMAND                  CREATED          STATUS          PORTS                                                                  NAMES
fe439ecd0a78   host_ubuntu:latest                      "bash"                   25 minutes ago   Up 25 minutes                                                                          host02
0b17cd9386aa   host_ubuntu:latest                      "bash"                   25 minutes ago   Up 25 minutes                                                                          host01
f92da0d39aea   frr:latest                              "/sbin/tini -- /usr/…"   25 minutes ago   Up 25 minutes                                                                          p02
d5093e6fa5c1   frr:latest                              "/sbin/tini -- /usr/…"   25 minutes ago   Up 25 minutes                                                                          p01
8341a6836618   frr:latest                              "/sbin/tini -- /usr/…"   25 minutes ago   Up 25 minutes                                                                          pe02
a24a70528e1a   frr:latest                              "/sbin/tini -- /usr/…"   26 minutes ago   Up 25 minutes                                                                          pe01
25c3666b6f17   pola:latest                             "bash"                   26 minutes ago   Up 26 minutes                                                                          pola

なお、Pola PCE や FRRouting の初期設定は example の spec.yaml に記載しているため、気になる方はご確認ください。

PCEP Session の確認

pola session コマンドによって PCEP Session を確認します。docker exec で pola コンテナに入り、コマンドを実行します。

user@server:~/pola/examples/sr-mpls_l3vpn$ docker exec -it pola /bin/bash
root@pola:/# pola session
sessionAddr(0): 10.0.255.1

SR Policy の発行

SR Policy のパラメータ指定する yaml ファイルを作成し、pola sr-policy add コマンドで SR Policy を PCC に発行します。 本検証では、pe01 から pe02 への VPN 経路(color 1)に対して、pe01 -> p01 -> p02 -> pe02 を通るようにするための SR Policy を発行します。

作成する yaml ファイル

# policy1.yaml
srPolicy:
    name: "policy1"
    pcepSessionAddr: "10.0.255.1"
    srcAddr: "10.255.0.1"
    dstAddr: "10.255.0.3"
    color: 1
    segmentList:
        - sid: 16002
          nai: "10.255.0.2"
        - sid: 16004
          nai: "10.255.0.4"
        - sid: 16003
          nai: "10.255.0.3"

コマンド実行

root@pola:/# pola sr-policy add -f policy1.yaml --no-link-state
success!

作成した SR Policy は pola sr-policy list コマンドで確認ができます。

※ 現在 FRRouting で利用されている SR Policy の Color、Preference 項目は pola sr-policy list から確認できない状態です。FRRouting の PCEP RFC 対応が進むと確認できるようになります。

root@pola:/# pola sr-policy list
LSP(0):
  PcepSessionAddr: 10.0.255.1
  PolicyName: policy1
  SrcAddr: 10.0.255.1
  DstAddr: 10.255.0.3
  Color: 0
  Preference: 0
  DstAddr: 10.255.0.3
  SegmentList: 16002 -> 16004 -> 16003

経路と SR Policy の紐付け

FRRouting の route-map を用いて、SR Policy と BGP で広告される経路とを紐付けます。 pe01 コンテナに入り、route-map を適用する config を投入します。

user@server:~/pola/examples/sr-mpls_l3vpn$ docker exec -it pe01 /bin/bash
bash-5.1# vtysh -c 'conf t' -c 'router bgp 65000' -c 'address-family ipv4 vpn' -c 'neighbor 10.255.0.3 route-map color1 in'

疎通確認

疎通確認を行います。

まずは host01 から host02 へ ping が通ることを確認します。

user@server:~$ docker exec -it host01 ping -c 5 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=62 time=0.198 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=62 time=0.126 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=62 time=0.122 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=62 time=0.110 ms
64 bytes from 192.168.1.2: icmp_seq=5 ttl=62 time=0.112 ms

--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4098ms
rtt min/avg/max/mdev = 0.110/0.133/0.198/0.032 ms

また、host01 から host02 へ ping を打っている状態で pe01 の net0 interface を通るパケットをキャプチャします。 net0 interface から ping のパケットが出ていることと、SR Policy で指定した MPLS ラベルが積まれていることを確認できます。

host01

user@server:~$ docker exec -it host01 ping 192.168.1.2

pe01

user@server:~/pola/examples/sr-mpls_l3vpn$ docker exec -it pe01 tcpdump -i net0
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on net0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
11:24:48.358826 MPLS (label 16004, exp 0, ttl 63) (label 16003, exp 0, ttl 63) (label 80, exp 0, [S], ttl 63) IP 192.168.0.2 > 192.168.1.2: ICMP echo request, id 1067, seq 12, length 64
11:24:49.382800 MPLS (label 16004, exp 0, ttl 63) (label 16003, exp 0, ttl 63) (label 80, exp 0, [S], ttl 63) IP 192.168.0.2 > 192.168.1.2: ICMP echo request, id 1067, seq 13, length 64
11:24:49.957688 IP 10.0.0.2 > 224.0.0.5: OSPFv2, Hello, length 48
11:24:50.406778 MPLS (label 16004, exp 0, ttl 63) (label 16003, exp 0, ttl 63) (label 80, exp 0, [S], ttl 63) IP 192.168.0.2 > 192.168.1.2: ICMP echo request, id 1067, seq 14, length 64
11:24:51.430769 MPLS (label 16004, exp 0, ttl 63) (label 16003, exp 0, ttl 63) (label 80, exp 0, [S], ttl 63) IP 192.168.0.2 > 192.168.1.2: ICMP echo request, id 1067, seq 15, length 64
11:24:52.454779 MPLS (label 16004, exp 0, ttl 63) (label 16003, exp 0, ttl 63) (label 80, exp 0, [S], ttl 63) IP 192.168.0.2 > 192.168.1.2: ICMP echo request, id 1067, seq 16, length 64

Multi-vendor で構成されるネットワークを用いた Dynamic Path 機能の検証

GitHub から Pola PCE のバイナリファイルをダウンロードし、SR-MPLS を用いた Multi-vendor L3VPN 環境で検証します。

検証環境

以下のトポロジーを用いて検証します。

各ルーターの製品とバージョンは以下の通りです。

  • rt01: ASR9901(IOS XR 7.6.1)
  • rt02: MX204(Junos 22.1R1.10)
  • rt03: ASR9901(IOS XR 7.5.1)
  • rt04: MX204(Junos 21.4R1.12)
  • rt05: Cisco 8201(IOS XR 7.5.1)
  • rt06: PTX10001-36MR(Junos 21.2R1.15-EVO)
  • rt07: ASR9902(IOS XR 7.6.1)
  • rt08: MX204(Junos 21.4R1.12)

手順

本検証では Dynamic Path 機能を検証します。 Dynamic Path 検証にあたって、Pola PCE が経路計算に利用するトポロジー情報を取得する手段として GoBGP を利用します。SR-MPLS ドメインの任意のルーターと GoBGP で BGP-LS Session を確立し、かつ Pola PCE と連携することで Pola PCE が Traffic Engineering Database (TED) としてトポロジー情報を保持します。

そのため、本章では GoBGP を Pola PCE で扱うための方法についても説明します。

Pola PCE / GoBGP のバイナリダウンロード

Pola PCE と GoBGP のバイナリファイルをダウンロードします。

Pola PCE ダウンロード

user@pce:~$ wget https://github.com/nttcom/pola/releases/download/v1.1.2/pola_1.1.2_linux_amd64.tar.gz
user@pce:~$ tar -zxvf pola_1.1.2_linux_amd64.tar.gz
user@pce:~$ sudo install -t <path が通っているディレクトリ> polad
user@pce:~$ sudo install -t <path が通っているディレクトリ> pola

GoBGP ダウンロード

GoBGP は daemon (gobgpd) と CLI ツール (gobgp) の 2 つの実行ファイルから構成されますが、今回利用する実行ファイルは gobgpd のみになります。

user@pce:~$ wget https://github.com/osrg/gobgp/releases/download/v3.9.0/gobgp_3.9.0_linux_amd64.tar.gz
user@pce:~$ tar -zxvf gobgp_3.9.0_linux_amd64.tar.gz
user@pce:~$ sudo install -t <path が通っているディレクトリ> gobgpd

gobgpd の起動

gobgpd は toml (または yaml、json) 形式のファイルに config を記載し、実行します。

トポロジー情報を取得するため、gobgpd を起動して RR である rt03 / rt04 と BGP-LS の Session を確立します。

作成する toml ファイル

# gobgpd_cfg.toml
[global.config]
as = 65001
router-id = "10.99.0.254"

[[neighbors]]
[neighbors.config]
neighbor-address = "10.255.1.3"
peer-as = 65001

[[neighbors.afi-safis]]
[neighbors.afi-safis.config]
afi-safi-name = "ls"

[[neighbors]]
[neighbors.config]
neighbor-address = "10.255.1.4"
peer-as = 65001

[[neighbors.afi-safis]]
[neighbors.afi-safis.config]
afi-safi-name = "ls"

gobgpd 起動

user@pce:~$ sudo gobgpd -f gobgpd_cfg.toml -l debug
{"level":"info","msg":"gobgpd started","time":"2022-12-08T10:53:05Z"}
{"Topic":"Config","level":"info","msg":"Finished reading the config file","time":"2022-12-08T10:53:05Z"}
{"Key":"10.255.1.3","Topic":"config","level":"info","msg":"Add Peer","time":"2022-12-08T10:53:05Z"}
{"Key":"10.255.1.3","Topic":"Peer","level":"info","msg":"Add a peer configuration","time":"2022-12-08T10:53:05Z"}
{"Key":"10.255.1.4","Topic":"config","level":"info","msg":"Add Peer","time":"2022-12-08T10:53:05Z"}
{"Key":"10.255.1.4","Topic":"Peer","level":"info","msg":"Add a peer configuration","time":"2022-12-08T10:53:05Z"}
{"Duration":0,"Key":"10.255.1.3","Topic":"Peer","level":"debug","msg":"IdleHoldTimer expired","time":"2022-12-08T10:53:05Z"}
{"Duration":0,"Key":"10.255.1.4","Topic":"Peer","level":"debug","msg":"IdleHoldTimer expired","time":"2022-12-08T10:53:05Z"}
{"Key":"10.255.1.3","Topic":"Peer","level":"debug","msg":"state changed","new":"BGP_FSM_ACTIVE","old":"BGP_FSM_IDLE","reason":{"Type":7,"BGPNotification":null,"Data":null},"time":"2022-12-08T10:53:05Z"}
{"Key":"10.255.1.4","Topic":"Peer","level":"debug","msg":"state changed","new":"BGP_FSM_ACTIVE","old":"BGP_FSM_IDLE","reason":{"Type":7,"BGPNotification":null,"Data":null},"time":"2022-12-08T10:53:05Z"}

現時点では対向の rt03 / rt04 に BGP-LS Session を確立するための config が投入されていないため、BGP Session はまだ確立しません。

BGP-LS Session の確立

rt03 / rt04 に BGP-LS Session を確立するための config を投入します。 IOS XR / Junos 共に、BGP-LS Session を確立するための config を記載します。

IOS XR

router isis 1
 distribute link-state instance-id 32
 !
!
router bgp 65001
 address-family link-state link-state
 !
 neighbor-group pola
  remote-as 65001
  timers 10 30
  update-source Loopback0
  address-family link-state link-state
  !
 !
 neighbor 10.99.0.254
  use neighbor-group pola

BGP-LS Session の UP を確認します。

RP/0/RSP0/CPU0:rt03#show bgp link-state link-state summary
Thu Dec  8 20:25:17.394 JST
BGP router identifier 10.255.1.3, local AS number 65001
BGP generic scan interval 60 secs
Non-stop routing is enabled
BGP table state: Active
Table ID: 0x0   RD version: 221
BGP main routing table version 221
BGP NSR Initial initsync version 65 (Reached)
BGP NSR/ISSU Sync-Group versions 0/0
BGP scan interval 60 secs

BGP is operating in STANDALONE mode.


Process       RcvTblVer   bRIB/RIB   LabelVer  ImportVer  SendTblVer  StandbyVer
Speaker             221        221        221        221         221           0

Neighbor        Spk    AS MsgRcvd MsgSent   TblVer  InQ OutQ  Up/Down  St/PfxRcd
10.99.0.254       0 65001       7      51      221    0    0 00:00:59          0

Junos

set policy-options policy-statement TE term 1 from family traffic-engineering
set policy-options policy-statement TE term 1 then accept

set protocols bgp group pola type internal
set protocols bgp group pola local-address 10.255.1.4
set protocols bgp group pola family traffic-engineering unicast
set protocols bgp group pola export TE
set protocols bgp group pola neighbor 10.99.0.254

set protocols mpls traffic-engineering database import policy TE

BGP-LS Session の UP を確認します。

user@rt04> show bgp group pola
Group Type: Internal    AS: 65001                  Local AS: 65001
  Name: pola            Index: 2                   Flags: <Export Eval>
  Export: [ TE ]
  Options: <GracefulShutdownRcv>
  Holdtime: 90 Preference: 0
  Graceful Shutdown Receiver local-preference: 0
  Total peers: 1        Established: 1
  10.99.0.254+42121
  lsdist.0: 0/0/0/0

polad の起動

polad は yaml 形式のファイルに config を記載し、実行します。 トポロジー情報の利用を有効化して GoBGP からトポロジー情報を取得するための config を記載します。

PCEP に関しては、PCC と疎通性のあるアドレス、PCEP のデフォルトポートである 4189 を設定しています。 また、GoBGP は gRPC のデフォルトポートである 50051 で gRPC リクエストを待ち受けています。そのため以下の config では GoBGP の gRPC クライアントの接続先ポートを 50051 とし、Pola PCE が提供する gRPC サーバは 50052 で待ち受けるように設定しています。

作成する yaml ファイル

# polad_cfg.yaml
global:
  pcep:
    address: "10.99.0.254"
    port: 4189
  grpc-server:
    address: "127.0.0.1"
    port: 50052
  log:
    path: "./pola_log/"
    name: "polad.log"
  ted:
    enable: true
    source: "gobgp"
  gobgp:
    grpc-client:
      address: "127.0.0.1"
      port: 50051

polad 起動

user@pce:~$ mkdir pola_log
user@pce:~$ polad -f polad_cfg.yaml
2022-12-11T08:06:23.233Z    info    gRPC listen {"listenInfo": "127.0.0.1:50052", "server": "grpc"}
2022-12-11T08:06:23.233Z    info    PCEP listen {"listenInfo": "10.99.0.254:4189"}
2022-12-11T08:06:23.249Z    info    Request TED update  {"source": "GoBGP", "session": "127.0.0.1:50051"}
2022-12-11T08:06:23.249Z    info    Update TED

Update TED のログが出力されていれば、gobgpd との接続が完了し TED の更新が完了しています。

PCEP Session の確立

PCC とする rt01 / rt02 へ PCEP Session を確立するための config を投入します。 IOS XR / Junos 共に、PCEP Session を確立するための config を記載します。

IOS XR

segment-routing
 traffic-eng
  pcc
   source-address ipv4 10.255.1.1
   pce address ipv4 10.99.0.254
   !
  !
 !
!

PCEP Session が確立していることを rt01 で確認します。

RP/0/RSP0/CPU0:rt01#show segment-routing traffic-eng pcc ipv4 peer
Sun Dec 11 17:41:06.157 JST

PCC's peer database:
--------------------

Peer address: 10.99.0.254,
  Precedence: 255, (best PCE)
  State up
  Capabilities: Stateful, Update, Segment-Routing, Instantiation

Junos

set protocols mpls lsp-external-controller pccd
set protocols source-packet-routing lsp-external-controller pccd

set protocols pcep pce pola local-address 10.255.1.2
set protocols pcep pce pola destination-ipv4-address 10.99.0.254
set protocols pcep pce pola pce-type active
set protocols pcep pce pola pce-type stateful
set protocols pcep pce pola lsp-provisioning
set protocols pcep pce pola spring-capability

PCEP Session が 確立していることを rt02 で確認します。

user@rt02> show path-computation-client status

Session              Type                        Provisioning   Status         Uptime
  pola               Stateful Active             On             Up              102

LSP Summary
  Total number of LSPs        : 0
  Static LSPs                 : 0
  Externally controlled LSPs  : 0
  Externally provisioned LSPs : 0/16000 (current/limit)
  Orphaned LSPs               : 0

pola (main)
  Delegated              : 0
  Externally provisioned : 0

Pola PCE 各種情報の確認

PCC と PCEP Sessoin が確立できたため、Pola PCE の持つ各種情報を確認します。 Pola PCE の操作は pola CLI コマンドを用いて行います。

PCEP Session の確認

PCEP Session を確認します。

user@pce:~$ pola session -p 50052
sessionAddr(0): 10.255.1.1
sessionAddr(1): 10.255.1.2

TED の確認

gobgpd から取得したトポロジー情報を確認します。

user@pce:~$ pola ted -p 50052
Node: 1
  0000.0aff.0107
  Hostname: rt07
  ISIS Area ID: 49.0000
  SRGB: 16000 - 24000
  Prefixes:
    10.255.1.7/32
      index: 7
  Links:
    Local: 10.1.4.2 Remote: 10.1.4.1
      RemoteNode: 0000.0aff.0106
      Metrics:
        IGP: 10
        TE: 10
      Adj-SID: 24008
    Local: 10.1.12.2 Remote: 10.1.12.1
      RemoteNode: 0000.0aff.0105
      Metrics:
        IGP: 10
        TE: 10
      Adj-SID: 24002

<snip>

SR Policy の発行

SR Policy を表す yaml ファイルを作成し、pola sr-policy add コマンドで SR Policy を PCC に発行します。 本検証では、color 100 が付与されている rt01 から rt02 への VPN 経路・ rt02 から rt01 への VPN 経路それぞれに対して、TE メトリックに従った経路を通るための SR Policy を発行します。TE メトリックはトポロジー図に記載した設定をしているため、パケットはトポロジー図中青線の通りの経路を通ります。

作成する yaml ファイル

# policy_dynamic_rt01.yaml
asn: 65001
srPolicy:
    pcepSessionAddr: "10.255.1.1"
    name: "dynamic_rt01"
    srcRouterId: "0000.0aff.0101"
    dstRouterId: "0000.0aff.0102"
    color: 100
    type: "dynamic"
    metric: "te"
# policy_dynamic_rt02.yaml
asn: 65001
srPolicy:
    pcepSessionAddr: "10.255.1.2"
    name: "dynamic_rt02"
    srcRouterId: "0000.0aff.0102"
    dstRouterId: "0000.0aff.0101"
    color: 100
    type: "dynamic"
    metric: "te"

コマンド実行

user@pce:~$ pola sr-policy add -f policy_dynamic_rt01.yaml -p 50052
success!

user@pce:~$ pola sr-policy add -f policy_dynamic_rt02.yaml -p 50052
success!

作成した SR Policy は pola sr-policy list コマンドで確認ができます。

user@pce:~$ pola sr-policy list -p 50052
LSP(0):
  PcepSessionAddr: 10.255.1.1
  PolicyName: dynamic_rt01
  SrcAddr: 10.255.1.1
  DstAddr: 10.255.1.2
  Color: 100
  Preference: 100
  DstAddr: 10.255.1.2
  SegmentList: 16005 -> 16008 -> 16006 -> 16002

LSP(1):
  PcepSessionAddr: 10.255.1.2
  PolicyName: dynamic_rt02
  SrcAddr: 10.255.1.2
  DstAddr: 10.255.1.1
  Color: 100
  Preference: 100
  DstAddr: 10.255.1.1
  SegmentList: 16006 -> 16008 -> 16005 -> 16001

PCC で受けとった SR Policy の確認

各 PCC で受け取った経路が有効化されていることを確認します。

IOS XR

RP/0/RSP0/CPU0:rt01#show segment-routing traffic-eng policy
Mon Dec 12 07:41:10.566 JST

SR-TE policy database
---------------------

Color: 100, End-point: 10.255.1.2
  Name: srte_c_100_ep_10.255.1.2
  Status:
    Admin: up  Operational: up for 00:03:14 (since Dec 12 07:37:56.127)
  Candidate-paths:
    Preference: 100 (PCEP) (active)
      Name: dynamic_rt01
      Requested BSID: dynamic
      PCC info:
        Symbolic name: dynamic_rt01
        PLSP-ID: 3
        Protection Type: unprotected-preferred
        Maximum SID Depth: 10
      Dynamic (pce 10.99.0.254) (valid)
        Metric Type: TE,   Path Accumulated Metric: 0
          16005 [Prefix-SID, 10.255.1.5]
          16008 [Prefix-SID, 10.255.1.8]
          16006 [Prefix-SID, 10.255.1.6]
          16002 [Prefix-SID, 10.255.1.2]
  Attributes:
    Binding SID: 24012
    Forward Class: Not Configured
    Steering labeled-services disabled: no
    Steering BGP disabled: no
    IPv6 caps enable: yes
    Invalidation drop enabled: no
    Max Install Standby Candidate Paths: 0

Junos

user@rt02> show spring-traffic-engineering lsp detail
Name: dynamic_rt02
  Tunnel-source: Path computation element protocol(PCEP)
  Tunnel Forward Type: SRMPLS
  To: 10.255.1.1-100<c>
  State: Up
    Path Status: NA
    Outgoing interface: NA
    Auto-translate status: Disabled Auto-translate result: N/A
    BFD status: N/A BFD name: N/A
    Segment ID : 128
    ERO Valid: true
      SR-ERO hop count: 4
        Hop 1 (Strict):
          NAI: IPv4 Node ID, Node address: 10.255.1.6
          SID type: 20-bit label, Value: 16006
        Hop 2 (Strict):
          NAI: IPv4 Node ID, Node address: 10.255.1.8
          SID type: 20-bit label, Value: 16008
        Hop 3 (Strict):
          NAI: IPv4 Node ID, Node address: 10.255.1.5
          SID type: 20-bit label, Value: 16005
        Hop 4 (Strict):
          NAI: IPv4 Node ID, Node address: 10.255.1.1
          SID type: 20-bit label, Value: 16001


Total displayed LSPs: 1 (Up: 1, Down: 0)

本検証で発行した SR Policy は、BGP Color Extended Community の 100 が付加されている VPN 経路に対して適用されます。Color の付加方法は [Multi-AS Segment Routing 検証連載 #4] Color-Based Steering in Single-ASで紹介しているため、こちらの記事を参考にしてください。

疎通確認

疎通確認を行います。

rt01 の Customer ネットワークと rt02 の Customer ネットワークで相互に traceroute を行い、経路を確認します。

事情により rt06 を通る経路の traceroute は当該ホップの結果で * * * と表示されています。

rt01 -> rt02

RP/0/RSP0/CPU0:rt01#traceroute 192.168.1.254 vrf Customer
Mon Dec 12 08:30:46.261 JST

Type escape sequence to abort.
Tracing the route to 192.168.1.254

 1  10.1.1.2 [MPLS: Labels 16008/16006/16002/130 Exp 0] 26 msec  4 msec  4 msec
 2  10.1.5.2 [MPLS: Labels 16006/16002/130 Exp 0] 1 msec  1 msec  2 msec
 3   *  *  *
 4  192.168.1.254 1 msec  1 msec  1 msec

rt02 -> rt01

user@rt02> traceroute 192.168.0.254 routing-instance Customer no-resolve
traceroute to 192.168.0.254 (192.168.0.254), 30 hops max, 52 byte packets
 1  * * *
 2  10.1.11.2  0.906 ms  0.837 ms  1.177 ms
     MPLS Label=16005 CoS=0 TTL=1 S=0
     MPLS Label=16001 CoS=0 TTL=2 S=0
     MPLS Label=24013 CoS=0 TTL=2 S=1
 3  10.1.5.1  2.108 ms  2.132 ms  3.897 ms
     MPLS Label=16001 CoS=0 TTL=1 S=0
     MPLS Label=24013 CoS=0 TTL=3 S=1
 4  10.1.1.1  3.844 ms *  3.963 ms

トポロジー図に記載の通りの経路となっていることが確認できます。

まとめ

本記事では Pola PCE の概要と手元の Docker 環境・ Multi-vendor ネットワーク環境での利用方法について紹介しました。 気軽に試験環境を作成できるため是非お手元で試してみてください!

質問や気になった点、機能追加も大歓迎です。 ブログコメントや GitHub Issues/PRs を是非お願いします!

GitHub - nttcom/pola: PCEP Library and Stateful PCE Implementation with Go

© NTT Communications Corporation All Rights Reserved.