モチベーション
- オープンソースのソフトウェアを利用してSR-MPLSとEVPNをやってみたい
- パケットキャプチャしてSR-MPLS+EVPN利用時のMPLSラベルやMP-BGPのやりとりをみてみたい
調べた中で、オープンソースのfreeRouerを使えばSR-MPLSとEVPNができそうだったので、EVE-NG上でやってみました。
環境準備
EVE-NGのインストール
こちらのページがわかりやすく説明されています!
EVE-NGでfreeRouterを使えるようにする
- freeRouter のダウンロード
freeRouerのページからqcow2形式のイメージファイルをダウンロード - EVE-NGにfreeRouterイメージを取り込み
- イメージファイルをSCP等でEVE-NGのサーバにアップロード
- EVE-NGにSSHログイン
- 今回EVE-NG上でLinuxサーバイメージで利用するために、以下のディレクトリを作成
mkdir /opt/unetlab/addons/qemu/linux-freertr/
- 上記ディレクトリにfreeRouterイメージを移動させて、ファイル名を「rtr.qcow2」から「virtioa.qcow2」に変更
- EVE-NGで利用できるように以下のコマンドを実施する
/opt/unetlab/wrappers/unl_wrapper -a fixpermissions
これでfreeRouterイメージの追加は完了です。
EVE-NG上でノード追加
- ブラウザからEVE-NGにログインしノードを以下の設定で追加する
- EVE-NG上で以下の画像のようにfreeRouterとクライアントになるVPCを設定
コンフィグ
EVE-NG上のインターフェース番号とFreeRouter上のインターフェース番号が異なるので注意が必要になります。
EVE-NG上の「e0」が、freeRouter上のコンフィグでは「ethernet1」になります。
freeRouterのCLI設定はCiscoのIOSライクな設定になります。
今回実施した最終的なコンフィグを記載します。
FreeRTR-PE-01
hostname FreeRTR-PE-01
buggy
!
!
bridge 1
description BRIDGE_EVPN_L2VPN_01
rd 1:1
rt-import 1:1
rt-export 1:1
mac-learn
exit
!
bridge 2
description BRIDGE_EVPN_L2VPN_02
rd 1:2
rt-import 1:2
rt-export 1:2
mac-learn
exit
!
vrf definition host
exit
!
vrf definition vrf_default
description VRF_DEFAULT
rd 1:1
exit
!
vrf definition vrf_l2vpn01
description VRF_EVPN_L2VPN_01
rd 1:1
exit
!
vrf definition vrf_l2vpn02
description VRF_EVPN_L2VPN_02
rd 1:2
exit
!
router ospf4 1
vrf vrf_default
router-id 10.0.0.1
traffeng-id 0.0.0.0
segrout 10 base 100
area 0 enable
area 0 segrout
redistribute connected
exit
!
interface loopback1
vrf forwarding vrf_default
ipv4 address 10.0.0.1 255.255.255.255
router ospf4 1 enable
router ospf4 1 area 0
router ospf4 1 segrout index 1
router ospf4 1 segrout node
no shutdown
no log-link-change
exit
!
interface bvi1
no shutdown
no log-link-change
exit
!
interface bvi2
no shutdown
no log-link-change
exit
!
interface ethernet1
description TO_FreeRTR-P-01
vrf forwarding vrf_default
ipv4 address 10.10.1.2 255.255.255.252
mpls enable
router ospf4 1 enable
router ospf4 1 area 0
no shutdown
no log-link-change
exit
!
interface ethernet2
description TO_VPC1-1(L2VPN_01)
bridge-group 1
no shutdown
no log-link-change
exit
!
interface ethernet20001
no shutdown
no log-link-change
exit
!
interface ethernet3
description TO_VPC2-1(L2VPN_02)
bridge-group 2
no shutdown
no log-link-change
exit
!
interface ethernet4
no shutdown
no log-link-change
exit
!
router bgp4 65001
vrf vrf_default
local-as 65001
router-id 10.0.0.1
address-family evpn
neighbor 10.0.0.2 remote-as 65001
neighbor 10.0.0.2 description FreeRTR-PE-02
neighbor 10.0.0.2 local-as 65001
neighbor 10.0.0.2 address-family evpn
neighbor 10.0.0.2 distance 200
neighbor 10.0.0.2 update-source loopback1
neighbor 10.0.0.2 pmsitun
neighbor 10.0.0.2 segrout
neighbor 10.0.0.2 send-community standard extended
afi-evpn 5001 bridge-group 1
afi-evpn 5001 bmac 5001.0000.0001
afi-evpn 5001 encapsulation cmac
afi-evpn 5001 update-source loopback1
afi-evpn 5002 bridge-group 2
afi-evpn 5002 bmac 5002.0000.0001
afi-evpn 5002 encapsulation cmac
afi-evpn 5002 update-source loopback1
exit
!
line tty1
no exec authorization
no login authentication
exit
!
!
!
!
!
end
FreeRTR-PE-02
hostname FreeRTR-PE-02
buggy
!
!
bridge 1
description BRIDGE_EVPN_L2VPN_01
rd 1:1
rt-import 1:1
rt-export 1:1
mac-learn
exit
!
bridge 2
description BRIDGE_EVPN_L2VPN_02
rd 1:2
rt-import 1:2
rt-export 1:2
mac-learn
exit
!
vrf definition host
exit
!
vrf definition vrf_default
description VRF_DEFAULT
rd 1:1
exit
!
vrf definition vrf_l2vpn01
description VRF_EVPN_L2VPN_01
rd 1:1
exit
!
vrf definition vrf_l2vpn02
description VRF_EVPN_L2VPN_02
rd 1:2
exit
!
router ospf4 1
vrf vrf_default
router-id 10.0.0.2
traffeng-id 0.0.0.0
segrout 10 base 100
area 0 enable
area 0 segrout
redistribute connected
exit
!
interface loopback1
vrf forwarding vrf_default
ipv4 address 10.0.0.2 255.255.255.255
router ospf4 1 enable
router ospf4 1 area 0
router ospf4 1 segrout index 2
router ospf4 1 segrout node
no shutdown
no log-link-change
exit
!
interface bvi1
no shutdown
no log-link-change
exit
!
interface bvi2
no shutdown
no log-link-change
exit
!
interface ethernet1
description TO_FreeRTR-P-01
vrf forwarding vrf_default
ipv4 address 10.10.2.2 255.255.255.252
mpls enable
router ospf4 1 enable
router ospf4 1 area 0
no shutdown
no log-link-change
exit
!
interface ethernet2
description TO_VPC1-2(L2VPN_01)
bridge-group 1
no shutdown
no log-link-change
exit
!
interface ethernet20001
no shutdown
no log-link-change
exit
!
interface ethernet3
description TO_VPC2-2(L2VPN_02)
bridge-group 2
no shutdown
no log-link-change
exit
!
interface ethernet4
no shutdown
no log-link-change
exit
!
router bgp4 65001
vrf vrf_default
local-as 65001
router-id 10.0.0.2
address-family evpn
neighbor 10.0.0.1 remote-as 65001
neighbor 10.0.0.1 description FreeRTR-PE-01
neighbor 10.0.0.1 local-as 65001
neighbor 10.0.0.1 address-family evpn
neighbor 10.0.0.1 distance 200
neighbor 10.0.0.1 update-source loopback1
neighbor 10.0.0.1 pmsitun
neighbor 10.0.0.1 segrout
neighbor 10.0.0.1 send-community standard extended
afi-evpn 5001 bridge-group 1
afi-evpn 5001 bmac 5001.0000.0002
afi-evpn 5001 encapsulation cmac
afi-evpn 5001 update-source loopback1
afi-evpn 5002 bridge-group 2
afi-evpn 5002 bmac 5002.0000.0002
afi-evpn 5002 encapsulation cmac
afi-evpn 5002 update-source loopback1
exit
!
line tty1
no exec authorization
no login authentication
exit
!
!
!
!
!
end
FreeRTR-P-01
hostname FreeRTR-P-01
buggy
!
!
vrf definition host
exit
!
vrf definition vrf_default
description VRF_DEFAULT
rd 1:1
exit
!
router ospf4 1
vrf vrf_default
router-id 10.0.0.99
traffeng-id 0.0.0.0
segrout 10 base 100
area 0 enable
area 0 segrout
redistribute connected
exit
!
interface loopback1
vrf forwarding vrf_default
ipv4 address 10.0.0.99 255.255.255.255
router ospf4 1 enable
router ospf4 1 area 0
router ospf4 1 segrout index 9
router ospf4 1 segrout node
no shutdown
no log-link-change
exit
!
interface ethernet1
description TO_FreeRTR-PE-01
vrf forwarding vrf_default
ipv4 address 10.10.1.1 255.255.255.252
mpls enable
router ospf4 1 enable
router ospf4 1 area 0
no shutdown
no log-link-change
exit
!
interface ethernet2
description TO_FreeRTR-PE-02
vrf forwarding vrf_default
ipv4 address 10.10.2.1 255.255.255.252
mpls enable
router ospf4 1 enable
router ospf4 1 area 0
no shutdown
no log-link-change
exit
!
interface ethernet20001
no shutdown
no log-link-change
exit
!
interface ethernet3
no shutdown
no log-link-change
exit
!
interface ethernet4
no shutdown
no log-link-change
exit
!
line tty1
no exec authorization
no login authentication
exit
!
!
!
!
!
end
設定内容(SR-MPLS+EVPN部分)
SR-MPLS部分
今回はOSPFを利用してSR-MPLSの設定を行います。各ルータのNode SIDは以下の画像のとおりに設定。
-
OSPF設定
ルータ間でOSPF設定、SE-MPLSを有効にしMPLSのラベルを交換するためのSRGB(Segment Routing Global Block)の設定を行う。
今回は100を基準に10個までの100~109の範囲で設定。該当部分のコンフィグ抜粋 (FreeRTR-PE-01)router ospf4 1 area 0 segrout segrout 10 base 100
-
Node SIDの設定
loopbackにNode SIDを設定。機器でユニークである必要があるのでindex部分はルータごとに変える必要があります。該当部分のコンフィグ抜粋 (FreeRTR-PE-01)interface loopback1 router ospf4 1 segrout node router ospf4 1 segrout index 1
-
MPLSの設定
PE~Pルータ間でMPLSを利用するため、接続インターフェースにMPLSを有効化。該当部分のコンフィグ抜粋 (FreeRTR-PE-01)interface ethernet1 mpls enable
ここまでで、各ルータ間でSR-MPLSでラベル交換ができるようになります。
EVPN部分
今回はEVPNで2つのL2ネットワークを作ります。お互いのL2ネットワークをVRF設定してMP-BGPで情報交換します。
- L2ネットワーク用のブリッジ設定
2つのL2ネットワーク用のブリッジ設定とクライアント側のIFの割り当てを行う - VRF設定
2つのネットワーク分のVRFを作成 - BGP設定
対向のPEルータとBGPネイバー設定と、2つのL2ネットワーク(bridge-group)のMP-BGP設定を行う
1. ブリッジ設定部分のコンフィグ抜粋 (FreeRTR-PE-01)
! ----------------
! L2ネットワーク-1
! ----------------
bridge 1
rd 1:1
rt-import 1:1
rt-export 1:1
mac-learn
exit
!
interface ethernet2
bridge-group 1
exit
!
! ----------------
! L2ネットワーク-2
! ----------------
bridge 2
rd 1:2
rt-import 1:2
rt-export 1:2
mac-learn
exit
!
interface ethernet3
bridge-group 2
exit
2. VRF設定部分のコンフィグ抜粋 (FreeRTR-PE-01)
! ----------------
! L2ネットワーク-1
! ----------------
vrf definition vrf_l2vpn01
description VRF_EVPN_L2VPN_01
rd 1:1
exit
!
! ----------------
! L2ネットワーク-2
! ----------------
vrf definition vrf_l2vpn02
description VRF_EVPN_L2VPN_02
rd 1:2
exit
!
3. BGP設定部分のコンフィグ抜粋 (FreeRTR-PE-01)
router bgp4 65001
vrf vrf_default
local-as 65001
router-id 10.0.0.1
address-family evpn
neighbor 10.0.0.2 remote-as 65001
neighbor 10.0.0.2 description FreeRTR-PE-02
neighbor 10.0.0.2 local-as 65001
neighbor 10.0.0.2 address-family evpn
neighbor 10.0.0.2 distance 200
neighbor 10.0.0.2 update-source loopback1
neighbor 10.0.0.2 pmsitun
neighbor 10.0.0.2 segrout
neighbor 10.0.0.2 send-community standard extended
afi-evpn 5001 bridge-group 1
afi-evpn 5001 bmac 5001.0000.0001
afi-evpn 5001 encapsulation cmac
afi-evpn 5001 update-source loopback1
afi-evpn 5002 bridge-group 2
afi-evpn 5002 bmac 5002.0000.0001
afi-evpn 5002 encapsulation cmac
afi-evpn 5002 update-source loopback1
exit
!
動作確認
クライアントになるVPCからpingを打ち、画像のように同一のL2VPN間でのみping疎通することが確認できました。
PE~Pルータ間のIFでパケットキャプチャしてMPLSラベルが2つついていることや、クライアントのMACアドレスについてMP-BGPで交換していることを確認できました。
最後に、ルータにログインしてshowコマンドで確認した結果を参考に記載します。
FreeRTR-PE-01にshowコマンド確認
FreeRTR-PE-01#show mpls forwarding
label vrf iface hop label targets bytes
100 null null null unlabelled 0
101 vrf_default:4 null null unlabelled local 2965
102 vrf_default:4 ethernet1 10.10.1.1 102 0
103 null null null unlabelled 0
104 null null null unlabelled 0
105 null null null unlabelled 0
106 null null null unlabelled 0
107 null null null unlabelled 0
108 null null null unlabelled 0
109 vrf_default:4 ethernet1 10.10.1.1 109 0
43148 vrf_l2vpn01:4 null null unlabelled local 0
103283 vrf_l2vpn02:4 null null unlabelled local 0
135226 vrf_default:4 null null unlabelled local 0
151291 vrf_default:4 null null unlabelled pwe 618
253702 vrf_default:4 ethernet1 10.10.1.1 3 0
255801 vrf_default:4 null null unlabelled local 0
350743 vrf_l2vpn01:4 null null unlabelled local 0
523467 vrf_l2vpn02:4 null null unlabelled local 0
529964 host:6 null null unlabelled local 0
535053 vrf_default:6 null null unlabelled local 0
535922 vrf_l2vpn02:6 null null unlabelled local 0
591001 host:4 null null unlabelled local 0
632595 vrf_l2vpn01:6 null null unlabelled local 0
657188 host:4 null null unlabelled local 0
776749 host:4 null null unlabelled local 0
798381 vrf_default:6 null null unlabelled local 0
802683 host:6 null null unlabelled local 0
813152 host:6 null null unlabelled local 0
847951 vrf_default:4 null null unlabelled pwe 618
897970 vrf_l2vpn01:6 null null unlabelled local 0
920830 vrf_default:4 null null unlabelled pwe 0
925683 vrf_l2vpn02:6 null null unlabelled local 0
946922 vrf_default:4 null null unlabelled pwe 0
FreeRTR-PE-01#
FreeRTR-PE-01#
FreeRTR-PE-01#show bridge 1
packet byte
iface fwd phys tx rx drop tx rx drop grp
brprt bvi
ethernet2 true true 6 7 0 482 534 0
evpn 10.0.0.2 5001 true false 2 0 0 104 0 0
evpn 10.0.0.2 5001 true false 6 6 0 482 482 0
packet byte
addr iface static time tx rx drop tx rx drop
0050.7966.6805 ethernet2 false 00:02:41 6 7 0 482 534 0
0050.7966.6806 evpn 10.0.0.2 5001 false 00:02:41 5 6 0 430 482 0
FreeRTR-PE-01#
FreeRTR-PE-01#
FreeRTR-PE-01#show bridge 2
packet byte
iface fwd phys tx rx drop tx rx drop grp
brprt bvi
ethernet3 true true 6 8 0 482 586 0
evpn 10.0.0.2 5002 true false 3 0 0 156 0 0
evpn 10.0.0.2 5002 true false 6 6 0 482 482 0
packet byte
addr iface static time tx rx drop tx rx drop
0050.7966.6807 ethernet3 false 00:00:44 6 8 0 482 586 0
0050.7966.6808 evpn 10.0.0.2 5002 false 00:00:44 5 6 0 430 482 0
FreeRTR-PE-01#
FreeRTR-PE-01#
FreeRTR-PE-01#show ipv4 bgp 65001 evpn database
prefix hop metric aspath
200:0:1389::50:7966:6805#:: 1:1 10.0.0.1 0/0/0/0
200:0:1389::50:7966:6806#:: 1:1 10.0.0.2 200/100/0/0
300:0:1389::#10.0.0.2 1:1 10.0.0.2 200/100/0/0
300:0:1389::#10.0.0.1 1:1 10.0.0.1 0/0/0/0
200:0:138a::50:7966:6807#:: 1:2 10.0.0.1 0/0/0/0
200:0:138a::50:7966:6808#:: 1:2 10.0.0.2 200/100/0/0
300:0:138a::#10.0.0.2 1:2 10.0.0.2 200/100/0/0
300:0:138a::#10.0.0.1 1:2 10.0.0.1 0/0/0/0
FreeRTR-PE-01#
FreeRTR-PE-01#
FreeRTR-PE-01#show ipv4 bgp 65001 evpn database 200:0:1389::50:7966:6806#:: 1:1
id category value
vrf vrf_default:4
ipver 4
rd 1:1
original rd 0:0
prefix 200:0:1389::50:7966:6806/128
prefix network 200:0:1389::50:7966:6806
prefix broadcast ::
prefix wildcard ::
prefix netmask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
nlri n/a
alternates 1
alternate #0 candidate=true best=true
alt0 type bgp4 65001
alt0 source 10.0.0.2
alt0 validity 0
alt0 only to customer 0
alt0 segrout index 0
alt0 segrout old base 0
alt0 segrout base 0
alt0 segrout size 0
alt0 segrout offset 0
alt0 segrout prefix null
alt0 bier index 0
alt0 bier old base 0
alt0 bier base 0
alt0 bier range 0
alt0 bier size 0-32
alt0 updated 2023-0X-XX XX:XX:XX (00:00:47 ago)
alt0 version 18
alt0 distance 200
alt0 metric 0
alt0 ident 0
alt0 hops 0
alt0 interface null
alt0 table null
alt0 nexthop 10.0.0.2
alt0 original nexthop null
alt0 tag 0
alt0 origin type 0
alt0 local preference 100
alt0 evpn label*16 2697953
alt0 attribute as 0
alt0 attribute value n/a
alt0 tunnel type 0
alt0 tunnel value n/a
alt0 link state n/a
alt0 pmsi type 0
alt0 pmsi label*16 0
alt0 pmsi tunnel n/a
alt0 accumulated igp 0
alt0 bandwidth 0
alt0 atomic aggregator false
alt0 aggregator as 0
alt0 aggregator router null
alt0 originator null
alt0 cluster list
alt0 aspath
alt0 path length 0
alt0 standard community
alt0 extended community 2:1:1
alt0 large community
alt0 internal source 1
alt0 local label null
alt0 remote label
counter tx=0(0) rx=0(0) drp=0(0)
lastio input never ago, output never ago, drop never ago
hardware counter null
FreeRTR-PE-01#
FreeRTR-PE-01#
FreeRTR-PE-01#show ipv4 bgp 65001 evpn database 200:0:138a::50:7966:6808#:: 1:2
id category value
vrf vrf_default:4
ipver 4
rd 1:2
original rd 0:0
prefix 200:0:138a::50:7966:6808/128
prefix network 200:0:138a::50:7966:6808
prefix broadcast ::
prefix wildcard ::
prefix netmask ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
nlri n/a
alternates 1
alternate #0 candidate=true best=true
alt0 type bgp4 65001
alt0 source 10.0.0.2
alt0 validity 0
alt0 only to customer 0
alt0 segrout index 0
alt0 segrout old base 0
alt0 segrout base 0
alt0 segrout size 0
alt0 segrout offset 0
alt0 segrout prefix null
alt0 bier index 0
alt0 bier old base 0
alt0 bier base 0
alt0 bier range 0
alt0 bier size 0-32
alt0 updated 2023-0X-XX XX:XX:XX (00:00:47 ago)
alt0 version 20
alt0 distance 200
alt0 metric 0
alt0 ident 0
alt0 hops 0
alt0 interface null
alt0 table null
alt0 nexthop 10.0.0.2
alt0 original nexthop null
alt0 tag 0
alt0 origin type 0
alt0 local preference 100
alt0 evpn label*16 10705169
alt0 attribute as 0
alt0 attribute value n/a
alt0 tunnel type 0
alt0 tunnel value n/a
alt0 link state n/a
alt0 pmsi type 0
alt0 pmsi label*16 0
alt0 pmsi tunnel n/a
alt0 accumulated igp 0
alt0 bandwidth 0
alt0 atomic aggregator false
alt0 aggregator as 0
alt0 aggregator router null
alt0 originator null
alt0 cluster list
alt0 aspath
alt0 path length 0
alt0 standard community
alt0 extended community 2:1:2
alt0 large community
alt0 internal source 1
alt0 local label null
alt0 remote label
counter tx=0(0) rx=0(0) drp=0(0)
lastio input never ago, output never ago, drop never ago
hardware counter null
FreeRTR-PE-01#
FreeRTR-PE-01#
最後に
オープンソースのfreeRouterを利用してSR-MPLSとEVPNの動作を確認しました。
freeRouterはそれほどリソースを喰わないのでスペックが低いPCでもルータを複数台立ち上げて動作確認をすることができて良かったです。
SRv6とかもやってみたい。