APRESIA Technical Blog

「SRv6でサービスチェイニングをやってみた」の全configを載せてみた(前半)

最初に

JANOG43 (2019/1/23)にて「SRv6でサービスチェイニングをやってみた」という題名でプレゼンおよびデモを実施いたしました。
https://www.janog.gr.jp/meeting/janog43/program/sc
このデモではSpine 2台、Leaf 4台のLeaf/SpineのIP CLOS Fabricを組み、その中のトラフィック制御(サービスチェイニング)をSRv6によりコントロールできることを示しました。ここで、サービスチェイニングは以下の思想で行いました。
  • SIDのprefixをBGPで配布
  • SIDの配置はおよびサービスチェインはコントローラから中央集権的に設定
そこで今回は、前者のサービスチェイニングのための「SIDのprefixをBGPで配布」について、実際に使用したコンフィグも交えて説明いたします。

環境準備および設定ルール

デモ環境

このデモは以下の環境で実施しています。
  • GNS3の仮想ネットワーク上で試験環境を構築
  • ルータはUbuntu18.04 + Kernel 4.15 + FRR 6.0 stable
FRR のコードおよびビルド方法は以下を参照いただくとして、ここでは説明を省きます。
https://github.com/frrouting/frr

IPv6アドレスおよびSIDルール

このデモでは、fd00:ffff::/32をSRv6のSID(Segment ID)用のprefixとして、fd00:0::/32を各装置のインタフェースに設定するIPv6アドレスのprefixとして使用しました。また、Leaf1~4については、Leaf番号を用いて、fd00:0:0:::/64、fd00:ffff:0:::/64とprefixを付与しました。さらに各Leafに接続される端末に対して、fd00:ffff or 0::::/80というprefixを用いるルールとしました。(例:Service1の場合、fd00:ffff:0:2:1::/80)

SRv6のSIDの割当ルール

このデモでは、SRv6のSIDを以下のように配置しました。(詳細は後半編で説明します)                                                                              
装置SRv6 functionSID
Service1Endfd00:ffff:0:2:1::1:1
Service2Endfd00:ffff:0:2:2::1:1
Leaf3End.DX6fd00:ffff:0:3::2:1
Leaf4End.DX6fd00:ffff:0:4::2:1
Leaf4End.DX6fd00:ffff:0:4::2:2

これらのSIDは、Leaf1がT.Encapsを実行する際に、ルーティング可能である必要があります。そのため、これらのSIDのprefixを全てBGPにより配布したいと思います。そこで、図1のように接続し、また各装置のAS番号を配置しました。

図1 装置接続とBGPのAS番号割当

FRR設定例

上記の図をもとに、各装置のFRRに以下の設定を行いました。
  • Leaf1
  • hostname Leaf1
    !
    interface ens4
     ipv6 address fd00:0:0:18::1/64
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface ens5
     ipv6 address fd00:0:0:19::1/64
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface ens6
     ipv6 address fd00::1:1:0:0:1/80
    !
    interface ens7
     ipv6 address fd00::1:2:0:0:1/80
    !
    router bgp 65100
     bgp router-id 1.1.1.1
     no bgp default ipv4-unicast
     bgp bestpath as-path multipath-relax
     neighbor FABRIC peer-group
     neighbor FABRIC remote-as external
     neighbor FABRIC capability extended-nexthop
     neighbor ens4 interface peer-group FABRIC
     neighbor ens5 interface peer-group FABRIC
     !
     address-family ipv6 unicast
      redistribute connected
      neighbor FABRIC activate
     exit-address-family
    !
    
  • Leaf2
  • hostname Leaf2
    !
    interface ens4
     ipv6 address fd00:0:0:28::2/64
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface ens5
     ipv6 address fd00:0:0:29::2/64
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface ens6
     ipv6 address fd00::2:1:0:0:1/80
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface ens7
     ipv6 address fd00::2:2:0:0:1/80
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface ens8
     ipv6 address fd00::2:3:0:0:1/80
    !
    router bgp 65200
     bgp router-id 2.2.2.2
     no bgp default ipv4-unicast
     bgp bestpath as-path multipath-relax
     neighbor FABRIC peer-group
     neighbor FABRIC remote-as external
     neighbor FABRIC capability extended-nexthop
     neighbor ens4 interface peer-group FABRIC
     neighbor ens5 interface peer-group FABRIC
     neighbor ens6 interface peer-group FABRIC
     neighbor ens7 interface peer-group FABRIC
     !
     address-family ipv6 unicast
      redistribute connected
      neighbor FABRIC activate
     exit-address-family
    !
    
  • Leaf3
  • hostname Leaf3
    !
    interface ens4
     ipv6 address fd00:0:0:38::3/64
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface ens5
     ipv6 address fd00:0:0:39::3/64
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface ens6
     ipv6 address fd00:0:0:3::1/64
    !
    interface lo
     ipv6 address fd00:ffff:0:3::1/64
    !
    router bgp 65300
     bgp router-id 3.3.3.3
     no bgp default ipv4-unicast
     bgp bestpath as-path multipath-relax
     neighbor FABRIC peer-group
     neighbor FABRIC remote-as external
     neighbor FABRIC capability extended-nexthop
     neighbor ens4 interface peer-group FABRIC
     neighbor ens5 interface peer-group FABRIC
     !
     address-family ipv6 unicast
      redistribute connected
      neighbor FABRIC activate
     exit-address-family
    !
    
  • Leaf4
  • hostname Leaf4
    !
    interface ens4
     ipv6 address fd00:0:0:48::4/64
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface ens5
     ipv6 address fd00:0:0:49::4/64
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface ens6
     ipv6 address fd00::4:1:0:0:1/80
    !
    interface ens7
     ipv6 address fd00::4:2:0:0:1/80
    !
    interface lo
     ipv6 address fd00:ffff:0:4::1/64
    !
    router bgp 65400
     bgp router-id 4.4.4.4
     no bgp default ipv4-unicast
     bgp bestpath as-path multipath-relax
     neighbor FABRIC peer-group
     neighbor FABRIC remote-as external
     neighbor FABRIC capability extended-nexthop
     neighbor ens4 interface peer-group FABRIC
     neighbor ens5 interface peer-group FABRIC
     !
     address-family ipv6 unicast
      redistribute connected
      neighbor FABRIC activate
     exit-address-family
    !
    
  • Spine1
  • hostname Spine1
    !
    interface ens4
     ipv6 address fd00:0:0:89::8/64
    !
    interface ens5
     ipv6 address fd00:0:0:18::8/64
    !
    interface ens6
     ipv6 address fd00:0:0:28::8/64
    !
    interface ens7
     ipv6 address fd00:0:0:38::8/64
    !
    interface ens8
     ipv6 address fd00:0:0:48::8/64
    !
    router bgp 65000
     bgp router-id 8.8.8.8
     no bgp default ipv4-unicast
     bgp bestpath as-path multipath-relax
     neighbor FABRIC peer-group
     neighbor FABRIC remote-as external
     neighbor FABRIC capability extended-nexthop
     neighbor ens4 interface peer-group FABRIC
     neighbor ens5 interface peer-group FABRIC
     neighbor ens6 interface peer-group FABRIC
     neighbor ens7 interface peer-group FABRIC
     neighbor ens8 interface peer-group FABRIC
     !
     address-family ipv6 unicast
      redistribute connected
      neighbor FABRIC activate
     exit-address-family
    !
    
  • Spine2
  • hostname Spine2
    !
    interface ens4
     ipv6 address fd00:0:0:89::9/64
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface ens5
     ipv6 address fd00:0:0:19::9/64
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface ens6
     ipv6 address fd00:0:0:29::9/64
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface ens7
     ipv6 address fd00:0:0:39::9/64
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface ens8
     ipv6 address fd00:0:0:49::9/64
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    router bgp 65000
     bgp router-id 9.9.9.9
     no bgp default ipv4-unicast
     bgp bestpath as-path multipath-relax
     neighbor FABRIC peer-group
     neighbor FABRIC remote-as external
     neighbor FABRIC capability extended-nexthop
     neighbor ens4 interface peer-group FABRIC
     neighbor ens5 interface peer-group FABRIC
     neighbor ens6 interface peer-group FABRIC
     neighbor ens7 interface peer-group FABRIC
     neighbor ens8 interface peer-group FABRIC
     !
     address-family ipv6 unicast
      redistribute connected
      neighbor FABRIC activate
     exit-address-family
    !
    
  • Service1
  • hostname Service1
    !
    interface ens4
     ipv6 address fd00::2:1:0:0:11/80
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface lo
     ipv6 address fd00:ffff:0:2:1::1/80
    !
    router bgp 65210
     bgp router-id 2.1.1.1
     no bgp default ipv4-unicast
     bgp bestpath as-path multipath-relax
     neighbor FABRIC peer-group
     neighbor FABRIC remote-as external
     neighbor FABRIC capability extended-nexthop
     neighbor ens4 interface peer-group FABRIC
     !
     address-family ipv6 unicast
      redistribute connected
      neighbor FABRIC activate
     exit-address-family
    !
    
  • Service2
  • hostname Service2
    !
    interface ens4
     ipv6 address fd00::2:2:0:0:11/80
     ipv6 nd ra-interval 10
     no ipv6 nd suppress-ra
    !
    interface lo
     ipv6 address fd00:ffff:0:2:2::1/80
    !
    router bgp 65220
     bgp router-id 2.1.2.2
     no bgp default ipv4-unicast
     bgp bestpath as-path multipath-relax
     neighbor FABRIC peer-group
     neighbor FABRIC remote-as external
     neighbor FABRIC capability extended-nexthop
     neighbor ens4 interface peer-group FABRIC
     !
     address-family ipv6 unicast
      redistribute connected
      neighbor FABRIC activate
     exit-address-family
    !
    
ここで、Service 1, 2はEndに割り当てるSID(FD00:FFFF:0:2:1::/80およびFD00:FFFF:0:2:2::/80)のルーティング情報を配布する必要があります。ですので、Service 1, 2でも、BGPを動かして自装置のルーティング情報を広告させるようにしました。

設定のポイント

BGP Unnumberedの使用

今回はBGP Unnumberedを使用しましたので、peeringのneighborのアドレスを明示的に指定する必要はありません。例えば、Leaf1のBGPの設定は以下の通りです。
router bgp 65100
 bgp router-id 1.1.1.1
 no bgp default ipv4-unicast
 bgp bestpath as-path multipath-relax
 neighbor FABRIC peer-group
 neighbor FABRIC remote-as external
 neighbor FABRIC capability extended-nexthop
 neighbor ens4 interface peer-group FABRIC
 neighbor ens5 interface peer-group FABRIC
 !
 address-family ipv6 unicast
  redistribute connected
  neighbor FABRIC activate
 exit-address-family
!
そのため、各装置に対して以下を変えて同様にBGPの設定をすれば良いことになります。
  • AS番号
  • router id
  • peeringを実施するインタフェース

BGPルーティングの配布方法

BGPによるnetworkの配布については、"redistribute connected"を使用しました。これによって、自装置のインタフェースに設定したアドレスのprefixもBGPによるルーティング情報の配布対象になります。例えば、Leaf4には以下の通り、ens6(App2に接続), ens7(App3に接続)、lo(SIDのprefixの配布用)にアドレスを設定することで、BGPにてこれらのnetworkのprefixが配布されます。
interface ens6
 ipv6 address fd00::4:1:0:0:1/80
interface ens7
 ipv6 address fd00::4:2:0:0:1/80
interface lo
 ipv6 address fd00:ffff:0:4::1/64  ★SIDのprefixを広告するためにloopbackインタフェースに設定

BGPルーティングの確認

このように設定することで、Leaf1側でIPv6のルーティングの情報を確認すると以下の通りとなります。
Leaf1# show ipv6 route
Codes: K - kernel route, C - connected, S - static, R - RIPng,
       O - OSPFv3, I - IS-IS, B - BGP, N - NHRP, T - Table,
       v - VNC, V - VNC-Direct, A - Babel, D - SHARP, F - PBR,
       > - selected route, * - FIB route

C>* fd00:0:0:1:1::/80 is directly connected, ens6, 00:57:29
C>* fd00:0:0:1:2::/80 is directly connected, ens7, 00:57:28
B>* fd00:0:0:2:1::/80 [20/0] via fe80::eeb:d2ff:fe81:9f02, ens5, 00:57:26
  *                          via fe80::eeb:d2ff:fe75:2302, ens4, 00:57:26
B>* fd00:0:0:2:2::/80 [20/0] via fe80::eeb:d2ff:fe81:9f02, ens5, 00:57:26
  *                          via fe80::eeb:d2ff:fe75:2302, ens4, 00:57:26
B>* fd00:0:0:2:3::/80 [20/0] via fe80::eeb:d2ff:fe81:9f02, ens5, 00:57:26
  *                          via fe80::eeb:d2ff:fe75:2302, ens4, 00:57:26
B>* fd00:0:0:3::/64 [20/0] via fe80::eeb:d2ff:fe81:9f02, ens5, 00:57:26
  *                        via fe80::eeb:d2ff:fe75:2302, ens4, 00:57:26
B>* fd00:0:0:4:1::/80 [20/0] via fe80::eeb:d2ff:fe81:9f02, ens5, 00:57:26
  *                          via fe80::eeb:d2ff:fe75:2302, ens4, 00:57:26
B>* fd00:0:0:4:2::/80 [20/0] via fe80::eeb:d2ff:fe81:9f02, ens5, 00:57:26
  *                          via fe80::eeb:d2ff:fe75:2302, ens4, 00:57:26
C>* fd00:0:0:18::/64 is directly connected, ens4, 00:57:28
C>* fd00:0:0:19::/64 is directly connected, ens5, 00:57:28
B>* fd00:0:0:28::/64 [20/0] via fe80::eeb:d2ff:fe75:2302, ens4, 00:57:26
B>* fd00:0:0:29::/64 [20/0] via fe80::eeb:d2ff:fe81:9f02, ens5, 00:57:27
B>* fd00:0:0:38::/64 [20/0] via fe80::eeb:d2ff:fe75:2302, ens4, 00:57:26
B>* fd00:0:0:39::/64 [20/0] via fe80::eeb:d2ff:fe81:9f02, ens5, 00:57:27
B>* fd00:0:0:48::/64 [20/0] via fe80::eeb:d2ff:fe75:2302, ens4, 00:57:26
B>* fd00:0:0:49::/64 [20/0] via fe80::eeb:d2ff:fe81:9f02, ens5, 00:57:27
B>* fd00:0:0:89::/64 [20/0] via fe80::eeb:d2ff:fe81:9f02, ens5, 00:57:26
  *                         via fe80::eeb:d2ff:fe75:2302, ens4, 00:57:26
B>* fd00:ffff:0:2:1::/80 [20/0] via fe80::eeb:d2ff:fe81:9f02, ens5, 00:57:26
  *                             via fe80::eeb:d2ff:fe75:2302, ens4, 00:57:26
B>* fd00:ffff:0:2:2::/80 [20/0] via fe80::eeb:d2ff:fe81:9f02, ens5, 00:57:26
  *                             via fe80::eeb:d2ff:fe75:2302, ens4, 00:57:26
B>* fd00:ffff:0:3::/64 [20/0] via fe80::eeb:d2ff:fe81:9f02, ens5, 00:57:26
  *                           via fe80::eeb:d2ff:fe75:2302, ens4, 00:57:26
B>* fd00:ffff:0:4::/64 [20/0] via fe80::eeb:d2ff:fe81:9f02, ens5, 00:57:26
  *                           via fe80::eeb:d2ff:fe75:2302, ens4, 00:57:26
C * fe80::/64 is directly connected, ens4, 00:57:28
C * fe80::/64 is directly connected, ens6, 00:57:28
C * fe80::/64 is directly connected, ens5, 00:57:28
C * fe80::/64 is directly connected, ens7, 00:57:29
C>* fe80::/64 is directly connected, ens3, 00:57:32
特に、以下のSRv6用のprefixがBGPにより広告されていることがポイントとなります。
  • fd00:ffff:0:2:1::/80 Service1
  • fd00:ffff:0:2:2::/80 Service2
  • fd00:ffff:0:3::/64 Leaf3
  • fd00:ffff:0:4::/64 Leaf4
試しにpingを実施すると、以下の通り、Leaf1から各装置のSRv6用のprefixを持ったアドレスに対して疎通することが確認できます。
Leaf1# ping fd00:ffff:0:2:1::1
PING fd00:ffff:0:2:1::1(fd00:ffff:0:2:1::1) 56 data bytes
64 bytes from fd00:ffff:0:2:1::1: icmp_seq=1 ttl=62 time=0.684 ms

Leaf1# ping fd00:ffff:0:2:2::1
PING fd00:ffff:0:2:2::1(fd00:ffff:0:2:2::1) 56 data bytes
64 bytes from fd00:ffff:0:2:2::1: icmp_seq=1 ttl=62 time=0.661 ms

Leaf1# ping fd00:ffff:0:3::1
PING fd00:ffff:0:3::1(fd00:ffff:0:3::1) 56 data bytes
64 bytes from fd00:ffff:0:3::1: icmp_seq=1 ttl=63 time=0.573 ms

Leaf1# ping fd00:ffff:0:4::1
PING fd00:ffff:0:4::1(fd00:ffff:0:4::1) 56 data bytes
64 bytes from fd00:ffff:0:4::1: icmp_seq=1 ttl=63 time=0.597 ms
しかし、SIDに割り当てるIPv6アドレスは各装置のインタフェースには設定しておりません。ですので、例えばService1に配置するEndのfd00:ffff:0:2:1::1:1に対してpingを実施しても反応はありませんので注意が必要です。
Leaf1:~$ ping fd00:ffff:0:2:1::1:1
PING fd00:ffff:0:2:1::1:1(fd00:ffff:0:2:1:0:1:1) 56 data bytes

--- fd00:ffff:0:2:1::1:1 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4082ms

Leaf1:~$
これで、SRv6によるサービスチェイニングを実施するための、BGPルーティングの準備が完了しました。

最後に

今回は、SRv6によるサービスチェイニングを実施するにあたり、前段階としてのBGPの設定について説明いたしました。SIDの割当と、SRv6のサービスチェイニングの実験方法については、次回に説明いたします。