0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SONiC-VM】frr-mgmt-frameworkでBGP Unnumbered

Posted at

はじめに

SONiCのfrr-mgmt-frameworkを使ってBGP Unnumberedの設定を行ったので、設定方法についてまとめます。

SONiCについて学習を始めたところ、routing-modeという概念があることを知りました。どうやらルーティングの中核であるFRRの設定の管理をどうするか、といことらしいです。

Community版SONiCのrouting-modeはデフォルトで unified になっており、FRRの設定はそのほかの設定と同様config_db.jsonから生成されます。
ただ、デフォルトのsonic-bgpcfgdはBGPのみサポートとなり、OSPF他のルーティングプロトコルはサポートされておらず、結果としてFRRの設定(frr.conf)を別に管理する split モードが主流になっているようです。
config_db.jsonfrr.confの両方を管理するのは面倒なので、config_db.jsonからFRRのすべての設定を管理しようというのが、今回触ってみたfrr-mgmt-frameworkになります。

この記事では、frr-mgmt-frameworkを使ったBGP Unnumberedの設定方法についての日本語記事が見当たらなかったので、自宅のGNS3環境で設定した内容についてまとめてみました。

環境

  • GNS3 2.2.53
  • SONiC
    SONiC Software Version: SONiC.master.0-e959d77be
    SONiC OS Version: 12
    Distribution: Debian 12.10
    Kernel: 6.1.0-22-2-amd64
    Build commit: e959d77be
    Build date: Sat Mar 15 15:40:46 UTC 2025
    Built by: ueda@ubuntu
    
    • SONiCのイメージは自身でビルドしたものを使用しています。

構成

トポロジ

シンプルで主流なCLOSトポロジとします。
serverは仮想ルータ想定でFRRを動かし、仮想マシンを想定した端末を接続します。

topology.png

アドレス

BGP Unnumberedのためスイッチ間のアドレスは設定せず、LoopbackアドレスとASNのみを設定します。

アドレス

  • loopback: 10.0.0.x/32
    • spine-0: 10.0.0.0/32
    • spine-1: 10.0.0.1/32
    • leaf-0: 10.0.1.0/32
    • leaf-1: 10.0.1.1/32
    • leaf-2: 10.0.1.2/32
    • leaf-3: 10.0.1.3/32
    • server-0: 10.1.0.0/32
    • server-1: 10.1.0.1/32
  • VM0: 192.168.0.1/24 (gw: .255)
  • VM1: 192.168.1.1/24 (gw: .255)

ASN

せっかくなので4byte ASNを使ってみることにしました。
spineは共通のASNを使用し、その他は固有のASNとします。

  • spine-0: 4200000000
  • spine-1: 4200000000
  • leaf-0: 4210000000
  • leaf-1: 4210000001
  • leaf-2: 4210000002
  • leaf-3: 4210000003
  • server-0: 4220000000
  • server-1: 4220000001

設定

デフォルト設定の削除

コミュニティ版SONiCを公式手順で普通にビルドした場合、デフォルトでBGP関連の設定がされいます。
いくつかの設定がされているので、これらを削除しておきます。
いちいちvimで設定を削除するのも面倒なので、適当にjqを使ってconfig_db.jsonを編集します。

# config_db.jsonの編集
cat /etc/sonic/config_db.json  | jq 'del(.INTERFACE, .BGP_NEIGHBOR, .LOOPBACK_INTERFACE, .DEVICE_METADATA.localhost.bgp_asn)' | sudo tee /etc/sonic/config_db.json
# 設定の再読み込み
sudo config reload -y

ルーティングモードの変更とfrr-mgmt-frameworkの有効化

SONiCのルーティングモードをunifiedに変更し、frr-mgmt-frameworkを有効化します。
こちらも同じくjqコマンドを使っていきます。便利。

cat /etc/sonic/config_db.json  | jq '.DEVICE_METADATA.localhost |= .+{"frr_mgmt_framework_config": "true"}' | jq '.DEVICE_METADATA.localhost |= .+{"docker_routing_config_mode ": "unified"}' | sudo tee /etc/sonic/config_db.json
# 設定の再読み込み
sudo config reload -y

各機器ごとの設定

ここからは各機器ごとの設定を行います。
といっても、ほとんど同じ設定をconfig_db.jsonに追記していくだけです。
コンフィグの設定項目やパラメータはfrr-mgmt-frameworkのHLDドキュメントと実際のYANGモデルを参考にしました。
YANGモデルの読み方に関してはAPRESIA社さんのSONiC YANGを使った設定パラメータの確認方法が分かりやすかったです。

また場合によってはfrr-mgmt-frameworkのソースコードも参考にしました。

spineとleafの設定

ホスト名とloopbackをCLIで設定しました。
config_db.jsonを編集しても良いのですが、CLIで設定した方が手軽なので。

sudo config hostname spine-0
sudo config interface ip add Loopback0 10.0.0.0/32
sudo config save -y

続いてconfig_db.jsonにBGP関連の設定を追記します。jqコマンドを使ったりviで編集するなり、お好きな方法で編集してください。

{
    "BGP_GLOBALS": {
        "default": {
            "router_id": "10.0.0.0",
            "local_asn": 4200000000,
            "load_balance_mp_relax": "true"
        }
    },
    "BGP_PEER_GROUP": {
        "default|FABRIC": {
            "peer_type": "external"
        }
    },
    "BGP_NEIGHBOR": {
        "default|Ethernet0": {
            "peer_group_name": "FABRIC"
        },
        "default|Ethernet4": {
            "peer_group_name": "FABRIC"
        },
        "default|Ethernet8": {
            "peer_group_name": "FABRIC"
        },
        "default|Ethernet12": {
            "peer_group_name": "FABRIC"
        }
    },
    "BGP_PEER_GROUP_AF": {
         "default|FABRIC|ipv4_unicast": {
              "admin_status": "true",
              "route_map_in": ["FABLIC-IN"],
              "route_map_out": ["FABLIC-OUT"]
          }
    },
    "ROUTE_MAP": {
        "FABLIC-IN|10": {
            "route_operation": "permit"
        },
        "FABLIC-OUT|10": {
            "route_operation": "permit"
        }
    },
    "ROUTE_REDISTRIBUTE": {
        "default|connected|bgp|ipv4": {}
    }
}

no bgp ebgp-requires-policyを設定するためのパラメータが作成時にはなかったため、
許可のみのルートマップを作成しています。

sudo config reload -yで設定を反映すれば、FRR上に以下のような設定が追加されるはずです。

admin@spine-0:~$ show runningconfiguration bgp
Building configuration...
Current configuration:
!
frr version 10.0.1
frr defaults traditional
hostname spine-0
log syslog informational
log facility local4
agentx
no service integrated-vtysh-config
!
password zebra
enable password zebra
!
router bgp 4200000000
 bgp router-id 10.0.0.0
 no bgp default ipv4-unicast
 bgp bestpath as-path multipath-relax
 neighbor FABRIC peer-group
 neighbor FABRIC remote-as external
 neighbor Ethernet0 interface peer-group FABRIC
 neighbor Ethernet4 interface peer-group FABRIC
 neighbor Ethernet8 interface peer-group FABRIC
 neighbor Ethernet12 interface peer-group FABRIC
 !
 address-family ipv4 unicast
  redistribute connected
  neighbor FABRIC activate
  neighbor FABRIC route-map FABLIC-IN in
  neighbor FABRIC route-map FABLIC-OUT out
 exit-address-family
exit
!
route-map FABLIC-IN permit 10
exit
!
route-map FABLIC-OUT permit 10
exit
!
end

以下、spine-1とleafに関してもほぼ同様(loopbackとASNのみ違うだけ)の設定になるため、気になる方は展開してください。

spine-1
sudo config hostname spine-1
sudo config interface ip add Loopback0 10.0.0.1/32
sudo config save -y
{
    "BGP_GLOBALS": {
        "default": {
            "router_id": "10.0.0.1",
            "local_asn": 4200000000,
            "load_balance_mp_relax": "true"
        }
    },
    "BGP_PEER_GROUP": {
        "default|FABRIC": {
            "peer_type": "external"
        }
    },
    "BGP_NEIGHBOR": {
        "default|Ethernet0": {
            "peer_group_name": "FABRIC"
        },
        "default|Ethernet4": {
            "peer_group_name": "FABRIC"
        },
        "default|Ethernet8": {
            "peer_group_name": "FABRIC"
        },
        "default|Ethernet12": {
            "peer_group_name": "FABRIC"
        }
    },
    "BGP_PEER_GROUP_AF": {
         "default|FABRIC|ipv4_unicast": {
              "admin_status": "true",
              "route_map_in": ["FABLIC-IN"],
              "route_map_out": ["FABLIC-OUT"]
          }
    },
    "ROUTE_MAP": {
        "FABLIC-IN|10": {
            "route_operation": "permit"
        },
        "FABLIC-OUT|10": {
            "route_operation": "permit"
        }
    },
    "ROUTE_REDISTRIBUTE": {
        "default|connected|bgp|ipv4": {}
    }
}
leaf-0
sudo config hostname leaf-0
sudo config interface ip add Loopback0 10.0.1.0/32
sudo config save -y
{
    "BGP_GLOBALS": {
        "default": {
            "router_id": "10.0.1.0",
            "local_asn": 4210000000,
            "load_balance_mp_relax": "true"
        }
    },
    "BGP_PEER_GROUP": {
        "default|FABRIC": {
            "peer_type": "external"
        }
    },
    "BGP_NEIGHBOR": {
        "default|Ethernet0": {
            "peer_group_name": "FABRIC"
        },
        "default|Ethernet4": {
            "peer_group_name": "FABRIC"
        },
        "default|Ethernet8": {
            "peer_group_name": "FABRIC"
        }
    },
    "BGP_PEER_GROUP_AF": {
         "default|FABRIC|ipv4_unicast": {
              "admin_status": "true",
              "route_map_in": ["FABLIC-IN"],
              "route_map_out": ["FABLIC-OUT"]
          }
    },
    "ROUTE_MAP": {
        "FABLIC-IN|10": {
            "route_operation": "permit"
        },
        "FABLIC-OUT|10": {
            "route_operation": "permit"
        }
    },
    "ROUTE_REDISTRIBUTE": {
        "default|connected|bgp|ipv4": {}
    }
}
leaf-1
sudo config hostname leaf-1
sudo config interface ip add Loopback0 10.0.1.1/32
sudo config save -y
{
    "BGP_GLOBALS": {
        "default": {
            "router_id": "10.0.1.1",
            "local_asn": 4210000001,
            "load_balance_mp_relax": "true"
        }
    },
    "BGP_PEER_GROUP": {
        "default|FABRIC": {
            "peer_type": "external"
        }
    },
    "BGP_NEIGHBOR": {
        "default|Ethernet0": {
            "peer_group_name": "FABRIC"
        },
        "default|Ethernet4": {
            "peer_group_name": "FABRIC"
        },
        "default|Ethernet8": {
            "peer_group_name": "FABRIC"
        }
    },
    "BGP_PEER_GROUP_AF": {
         "default|FABRIC|ipv4_unicast": {
              "admin_status": "true",
              "route_map_in": ["FABLIC-IN"],
              "route_map_out": ["FABLIC-OUT"]
          }
    },
    "ROUTE_MAP": {
        "FABLIC-IN|10": {
            "route_operation": "permit"
        },
        "FABLIC-OUT|10": {
            "route_operation": "permit"
        }
    },
    "ROUTE_REDISTRIBUTE": {
        "default|connected|bgp|ipv4": {}
    }
}
leaf-2
sudo config hostname leaf-2
sudo config interface ip add Loopback0 10.0.1.2/32
sudo config save -y
{
    "BGP_GLOBALS": {
        "default": {
            "router_id": "10.0.1.2",
            "local_asn": 4210000002,
            "load_balance_mp_relax": "true"
        }
    },
    "BGP_PEER_GROUP": {
        "default|FABRIC": {
            "peer_type": "external"
        }
    },
    "BGP_NEIGHBOR": {
        "default|Ethernet0": {
            "peer_group_name": "FABRIC"
        },
        "default|Ethernet4": {
            "peer_group_name": "FABRIC"
        },
        "default|Ethernet8": {
            "peer_group_name": "FABRIC"
        }
    },
    "BGP_PEER_GROUP_AF": {
         "default|FABRIC|ipv4_unicast": {
              "admin_status": "true",
              "route_map_in": ["FABLIC-IN"],
              "route_map_out": ["FABLIC-OUT"]
          }
    },
    "ROUTE_MAP": {
        "FABLIC-IN|10": {
            "route_operation": "permit"
        },
        "FABLIC-OUT|10": {
            "route_operation": "permit"
        }
    },
    "ROUTE_REDISTRIBUTE": {
        "default|connected|bgp|ipv4": {}
    }
}
leaf-3
sudo config hostname leaf-3
sudo config interface ip add Loopback0 10.0.1.3/32
sudo config save -y
{
    "BGP_GLOBALS": {
        "default": {
            "router_id": "10.0.1.3",
            "local_asn": 4210000003,
            "load_balance_mp_relax": "true"
        }
    },
    "BGP_PEER_GROUP": {
        "default|FABRIC": {
            "peer_type": "external"
        }
    },
    "BGP_NEIGHBOR": {
        "default|Ethernet0": {
            "peer_group_name": "FABRIC"
        },
        "default|Ethernet4": {
            "peer_group_name": "FABRIC"
        },
        "default|Ethernet8": {
            "peer_group_name": "FABRIC"
        }
    },
    "BGP_PEER_GROUP_AF": {
         "default|FABRIC|ipv4_unicast": {
              "admin_status": "true",
              "route_map_in": ["FABLIC-IN"],
              "route_map_out": ["FABLIC-OUT"]
          }
    },
    "ROUTE_MAP": {
        "FABLIC-IN|10": {
            "route_operation": "permit"
        },
        "FABLIC-OUT|10": {
            "route_operation": "permit"
        }
    },
    "ROUTE_REDISTRIBUTE": {
        "default|connected|bgp|ipv4": {}
    }
}

server(FRR)の設定

serverはFRRを利用します。
vtyshで設定していくだけで、内容的にはSONiCと大きな違いはありません。

設定は以下。

  • server-0
!
hostname server-0-FRR
!
interface eth0
 description To_leaf-0
 ipv6 nd ra-interval 10
 no ipv6 nd suppress-ra
 no shutdown
exit
!
interface eth1
 description To_Leaf-1
 ipv6 nd ra-interval 10
 no ipv6 nd suppress-ra
 no shutdown
exit
!
interface eth3
 ip address 192.168.0.254/24
 no shutdown
exit
!
interface lo
 ip address 10.1.0.0/32
 no shutdown
exit
!
router bgp 4220000000
 bgp router-id 10.1.0.0
 no bgp ebgp-requires-policy
 no bgp default ipv4-unicast
 bgp bestpath as-path multipath-relax
 neighbor FABRIC peer-group
 neighbor FABRIC remote-as external
 neighbor eth0 interface peer-group FABRIC
 neighbor eth0 capability extended-nexthop
 neighbor eth1 interface peer-group FABRIC
 neighbor eth1 capability extended-nexthop
 !
 address-family ipv4 unicast
  redistribute connected
  neighbor FABRIC activate
 exit-address-family
exit
!
ip nht resolve-via-default
!
ipv6 nht resolve-via-default
!
end
server-1
  • server-1
hostname server-1
!
interface eth3
 no shutdown
 ip address 192.168.1.254/24
exit
!
interface lo
 no shutdown
 ip address 10.1.0.1/32
exit
!
interface eth0
 no shutdown
exit
!
interface eth1
 no shutdown
exit
!
router bgp 4220000001
 bgp router-id 10.1.0.1
 no bgp default ipv4-unicast
 no bgp ebgp-requires-policy
 bgp bestpath as-path multipath-relax
 neighbor FABRIC peer-group
 neighbor FABRIC remote-as external
 neighbor FABRIC capability extended-nexthop
 neighbor eth0 capability extended-nexthop
 neighbor eth0 interface peer-group FABRIC
 neighbor eth1 capability extended-nexthop
 neighbor eth1 interface peer-group FABRIC
 !
 address-family ipv4 unicast
  redistribute connected
  neighbor FABRIC activate
 exit-address-family
exit
!
ip nht resolve-via-default
!
ipv6 nht resolve-via-default
!
end

再起動するとinterfaceがshutdownされたりno neighbor ethX capability extended-nexthopが勝手に設定されてたりするので注意してください。(なにか対処方法があるかもしれませんが、都度設定していました)

確認

各ノードでBGP状態やルーティングを確認し、
隣接関係が確立されていることと、ルーティングテーブルに必要なルートが登録されていることを確認します。
Unnumberedのため、Neighborはインタフェース、nexthopはIPv6 Link-Localアドレスとなります。

spine-0
admin@spine-0:~$ show ip bgp summary

IPv4 Unicast Summary:
BGP router identifier 10.0.0.0, local AS number 4200000000 vrf-id 0
BGP table version 21
RIB entries 17, using 2176 bytes of memory
Peers 4, using 82368 KiB of memory
Peer groups 1, using 64 bytes of memory


Neighbhor      V          AS    MsgRcvd    MsgSent    TblVer    InQ    OutQ  Up/Down      State/PfxRcd  NeighborName
-----------  ---  ----------  ---------  ---------  --------  -----  ------  ---------  --------------  --------------
Ethernet0      4  4210000000        427        418        21      0       0  06:36:35                3  NotAvailable
Ethernet4      4  4210000001        418        417        21      0       0  06:36:40                3  NotAvailable
Ethernet8      4  4210000002        428        418        21      0       0  06:36:34                3  NotAvailable
Ethernet12     4  4210000003        420        420        21      0       0  06:36:40                3  NotAvailable

Total number of neighbors 4
admin@spine-0:~$ show ip bgp network
BGP table version is 21, local router ID is 10.0.0.0, vrf id 0
Default local pref 100, local AS 4200000000
Status codes:  s suppressed, d damped, h history, u unsorted, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

    Network          Next Hop            Metric LocPrf Weight Path
 *> 10.0.0.0/32      0.0.0.0                  0         32768 ?
 *> 10.0.1.0/32      Ethernet0                0             0 4210000000 ?
 *> 10.0.1.1/32      Ethernet4                0             0 4210000001 ?
 *> 10.0.1.2/32      Ethernet8                0             0 4210000002 ?
 *> 10.0.1.3/32      Ethernet12               0             0 4210000003 ?
 *> 10.1.0.0/32      Ethernet0                              0 4210000000 4220000000 ?
 *=                  Ethernet4                              0 4210000001 4220000000 ?
 *> 10.1.0.1/32      Ethernet8                              0 4210000002 4220000001 ?
 *=                  Ethernet12                             0 4210000003 4220000001 ?
 *> 192.168.0.0/24   Ethernet0                              0 4210000000 4220000000 ?
 *=                  Ethernet4                              0 4210000001 4220000000 ?
 *> 192.168.1.0/24   Ethernet8                              0 4210000002 4220000001 ?
 *=                  Ethernet12                             0 4210000003 4220000001 ?

Displayed 9 routes and 13 total paths
admin@spine-0:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued route, r - rejected route

C>*10.0.0.0/32 is directly connected, Loopback0, 06:37:03
B>*10.0.1.0/32 [20/0] via fe80::2039:8aff:fedb:e3dd, Ethernet0, 06:36:44
B>*10.0.1.1/32 [20/0] via fe80::20bd:b3ff:fe9b:5c8f, Ethernet4, 06:36:50
B>*10.0.1.2/32 [20/0] via fe80::2037:8dff:fe17:ca80, Ethernet8, 06:36:44
B>*10.0.1.3/32 [20/0] via fe80::204b:bcff:fe55:7962, Ethernet12, 06:36:50
B>*10.1.0.0/32 [20/0] via fe80::2039:8aff:fedb:e3dd, Ethernet0, 00:07:46
  *                   via fe80::20bd:b3ff:fe9b:5c8f, Ethernet4, 00:07:46
B>*10.1.0.1/32 [20/0] via fe80::2037:8dff:fe17:ca80, Ethernet8, 00:06:48
  *                   via fe80::204b:bcff:fe55:7962, Ethernet12, 00:06:48
B>*192.168.0.0/24 [20/0] via fe80::2039:8aff:fedb:e3dd, Ethernet0, 00:07:46
  *                      via fe80::20bd:b3ff:fe9b:5c8f, Ethernet4, 00:07:46
B>*192.168.1.0/24 [20/0] via fe80::2037:8dff:fe17:ca80, Ethernet8, 00:06:48
  *                      via fe80::204b:bcff:fe55:7962, Ethernet12, 00:06:48
admin@spine-0:~$
leaf-0
admin@leaf-0:~$ show ip bgp summary

IPv4 Unicast Summary:
BGP router identifier 10.0.1.0, local AS number 4210000000 vrf-id 0
BGP table version 24
RIB entries 19, using 2432 bytes of memory
Peers 3, using 61776 KiB of memory
Peer groups 1, using 64 bytes of memory


Neighbhor      V          AS    MsgRcvd    MsgSent    TblVer    InQ    OutQ  Up/Down      State/PfxRcd  NeighborName
-----------  ---  ----------  ---------  ---------  --------  -----  ------  ---------  --------------  --------------
Ethernet0      4  4200000000        418        428        24      0       0  06:37:56                6  NotAvailable
Ethernet4      4  4200000000        427        421        24      0       0  06:37:51                6  NotAvailable
Ethernet8      4  4220000000        441        461        24      0       0  00:08:58                3  NotAvailable

Total number of neighbors 3
admin@leaf-0:~$ show ip bgp network
BGP table version is 24, local router ID is 10.0.1.0, vrf id 0
Default local pref 100, local AS 4210000000
Status codes:  s suppressed, d damped, h history, u unsorted, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

    Network          Next Hop            Metric LocPrf Weight Path
 *> 10.0.0.0/32      Ethernet0                0             0 4200000000 ?
 *> 10.0.0.1/32      Ethernet4                0             0 4200000000 ?
 *> 10.0.1.0/32      0.0.0.0                  0         32768 ?
 *> 10.0.1.1/32      Ethernet0                              0 4200000000 4210000001 ?
 *=                  Ethernet4                              0 4200000000 4210000001 ?
 *=                  Ethernet8                              0 4220000000 4210000001 ?
 *> 10.0.1.2/32      Ethernet0                              0 4200000000 4210000002 ?
 *=                  Ethernet4                              0 4200000000 4210000002 ?
 *> 10.0.1.3/32      Ethernet0                              0 4200000000 4210000003 ?
 *=                  Ethernet4                              0 4200000000 4210000003 ?
 *> 10.1.0.0/32      Ethernet8                0             0 4220000000 ?
 *> 10.1.0.1/32      Ethernet0                              0 4200000000 4210000002 4220000001 ?
 *=                  Ethernet4                              0 4200000000 4210000002 4220000001 ?
 *> 192.168.0.0/24   Ethernet8                0             0 4220000000 ?
 *> 192.168.1.0/24   Ethernet0                              0 4200000000 4210000002 4220000001 ?
 *=                  Ethernet4                              0 4200000000 4210000002 4220000001 ?

Displayed 10 routes and 16 total paths
admin@leaf-0:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued route, r - rejected route

B>*10.0.0.0/32 [20/0] via fe80::20ce:43ff:fe8f:761e, Ethernet0, 06:38:10
B>*10.0.0.1/32 [20/0] via fe80::2016:18ff:fec7:a84c, Ethernet4, 06:38:06
C>*10.0.1.0/32 is directly connected, Loopback0, 06:38:27
B>*10.0.1.1/32 [20/0] via fe80::e3e:88ff:fe2f:0, Ethernet8, 00:09:12
  *                   via fe80::2016:18ff:fec7:a84c, Ethernet4, 00:09:12
  *                   via fe80::20ce:43ff:fe8f:761e, Ethernet0, 00:09:12
B>*10.0.1.2/32 [20/0] via fe80::2016:18ff:fec7:a84c, Ethernet4, 06:38:06
  *                   via fe80::20ce:43ff:fe8f:761e, Ethernet0, 06:38:06
B>*10.0.1.3/32 [20/0] via fe80::2016:18ff:fec7:a84c, Ethernet4, 06:38:06
  *                   via fe80::20ce:43ff:fe8f:761e, Ethernet0, 06:38:06
B>*10.1.0.0/32 [20/0] via fe80::e3e:88ff:fe2f:0, Ethernet8, 00:09:12
B>*10.1.0.1/32 [20/0] via fe80::2016:18ff:fec7:a84c, Ethernet4, 00:08:14
  *                   via fe80::20ce:43ff:fe8f:761e, Ethernet0, 00:08:14
B>*192.168.0.0/24 [20/0] via fe80::e3e:88ff:fe2f:0, Ethernet8, 00:09:12
B>*192.168.1.0/24 [20/0] via fe80::2016:18ff:fec7:a84c, Ethernet4, 00:08:14
  *                      via fe80::20ce:43ff:fe8f:761e, Ethernet0, 00:08:14
admin@leaf-0:~$
server-0
server-0-FRR# show ip bgp
BGP table version is 31, local router ID is 10.1.0.0, vrf id 0
Default local pref 100, local AS 4220000000
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

   Network          Next Hop            Metric LocPrf Weight Path
*= 10.0.0.0/32      eth1                                   0 4210000001 4200000000 ?
*>                  eth0                                   0 4210000000 4200000000 ?
*= 10.0.0.1/32      eth1                                   0 4210000001 4200000000 ?
*>                  eth0                                   0 4210000000 4200000000 ?
*  10.0.1.0/32      eth1                                   0 4210000001 4200000000 4210000000 ?
*>                  eth0                     0             0 4210000000 ?
*> 10.0.1.1/32      eth1                     0             0 4210000001 ?
*                   eth0                                   0 4210000000 4200000000 4210000001 ?
*= 10.0.1.2/32      eth1                                   0 4210000001 4200000000 4210000002 ?
*>                  eth0                                   0 4210000000 4200000000 4210000002 ?
*= 10.0.1.3/32      eth1                                   0 4210000001 4200000000 4210000003 ?
*>                  eth0                                   0 4210000000 4200000000 4210000003 ?
*> 10.1.0.0/32      0.0.0.0                  0         32768 ?
*> 10.1.0.1/32      eth0                                   0 4210000000 4200000000 4210000002 4220000001 ?
*=                  eth1                                   0 4210000001 4200000000 4210000002 4220000001 ?
*> 192.168.0.0/24   0.0.0.0                  0         32768 ?
*> 192.168.1.0/24   eth0                                   0 4210000000 4200000000 4210000002 4220000001 ?
*=                  eth1                                   0 4210000001 4200000000 4210000002 4220000001 ?

Displayed  10 routes and 18 total paths
server-0-FRR#
server-0-FRR# show ip bgp summary

IPv4 Unicast Summary (VRF default):
BGP router identifier 10.1.0.0, local AS number 4220000000 vrf-id 0
BGP table version 31
RIB entries 19, using 3496 bytes of memory
Peers 2, using 1433 KiB of memory
Peer groups 1, using 64 bytes of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
eth0            4 4210000000       456       441        0    0    0 00:10:03            8       10 N/A
eth1            4 4210000001       446       445        0    0    0 00:10:03            8       10 N/A

Total number of neighbors 2
server-0-FRR#
server-0-FRR# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

B>* 10.0.0.0/32 [20/0] via fe80::2039:8aff:fedb:e3dd, eth0, weight 1, 00:10:05
  *                    via fe80::20bd:b3ff:fe9b:5c8f, eth1, weight 1, 00:10:05
B>* 10.0.0.1/32 [20/0] via fe80::2039:8aff:fedb:e3dd, eth0, weight 1, 00:10:05
  *                    via fe80::20bd:b3ff:fe9b:5c8f, eth1, weight 1, 00:10:05
B>* 10.0.1.0/32 [20/0] via fe80::2039:8aff:fedb:e3dd, eth0, weight 1, 00:10:05
B>* 10.0.1.1/32 [20/0] via fe80::20bd:b3ff:fe9b:5c8f, eth1, weight 1, 00:10:05
B>* 10.0.1.2/32 [20/0] via fe80::2039:8aff:fedb:e3dd, eth0, weight 1, 00:10:05
  *                    via fe80::20bd:b3ff:fe9b:5c8f, eth1, weight 1, 00:10:05
B>* 10.0.1.3/32 [20/0] via fe80::2039:8aff:fedb:e3dd, eth0, weight 1, 00:10:05
  *                    via fe80::20bd:b3ff:fe9b:5c8f, eth1, weight 1, 00:10:05
C>* 10.1.0.0/32 is directly connected, lo, 06:42:32
B>* 10.1.0.1/32 [20/0] via fe80::2039:8aff:fedb:e3dd, eth0, weight 1, 00:09:07
  *                    via fe80::20bd:b3ff:fe9b:5c8f, eth1, weight 1, 00:09:07
C>* 192.168.0.0/24 is directly connected, eth3, 06:42:32
B>* 192.168.1.0/24 [20/0] via fe80::2039:8aff:fedb:e3dd, eth0, weight 1, 00:09:07
  *                       via fe80::20bd:b3ff:fe9b:5c8f, eth1, weight 1, 00:09:07
server-0-FRR#

BGPセッションのパケットキャプチャも確認してみます。
OpenMessageではMultiprotocol extensionExtended Next HopSupport for 4-octet AS numberが確認できます。

cpa-openmsg.png

つづいてUpdateMessage。
MP_REACH_NLRIパス属性を確認すると、IPv4ネットワークのNexthopがIPv6 Link-Localアドレスであることがわかります。

cap-updatemsg.png

VM間の疎通確認もできて、無事にBGP Unnumberedの環境が構築できました。

ping.png

つまづき

以下、蛇足として当方のつまづきポイントになります。
もともとSONiCもBGPもほとんど経験がなかい中でわざわざfrr-mgmt-frameworkを使ったので、いろいろハマりました。

Neighborのアクティベートができない。

以下の設定でneighbor FABRIC activateを設定しようとしても反映されない問題が発生。

{
    "BGP_PEER_GROUP_AF": {
         "default|FABRIC|ipv4_unicast": {
              "admin_status": "true"
          }
    }
}

デフォルトでno bgp default ipv4-unicastが入っているため、activateを設定しないとNeighborが張れません。
かといってno bgp default ipv4-unicastを削除しようとconfig_db.jsonのi"BGP_GROBALS""default_ipv4_unicast": "true"を追加したところ、
今度はno neighbor FABRIC activateが入っちゃって、絶対にActivateさせないという強い意思を感じます。

どうやらYANGモデルとfrr-mgmt-frameworkのソースコードに不整合(YANGモデル上はtrue/falseなのにソースコードではup/downの選択)があるようで、気づいたときにはすでにプルリクが上がっていました。
マージされたバージョンを利用することで解決。

show intコマンドの不具合

参考にしていた記事と同様の事象です。

SONiC と FRR -- sonic-frr-mgmt-framework 編 不具合

構築当時は同様の事象が確認できましたが、途中でアップデートしたところ、問題なく動作するようになりました。

ルートマップが想定通りに動かない

最初に、以下のようにルートマップを設定しました。

{
    "BGP_PEER_GROUP_AF": {
         "default|FABRIC|ipv4_unicast": {
              "admin_status": "true",
              "route_map_in": "FABLIC-IN",
              "route_map_out": "FABLIC-OUT"
          }
    }
}

出力されたFRRのコンフィグがこちら。

 address-family ipv4 unicast
  neighbor FABRIC activate
  neighbor FABRIC route-map N in
  neighbor FABRIC route-map T out
 exit-address-family
exit

一文字しかない。。。
こちら、YANGモデルをちゃんと確認したところLISTで指定しないといけないっぽいことがわかりました。
https://github.com/sonic-net/sonic-buildimage/blob/master/src/sonic-yang-models/yang-models/sonic-bgp-common.yang#L385-L399
https://github.com/sonic-net/sonic-buildimage/blob/master/src/sonic-yang-models/yang-models/sonic-route-map.yang#L125-L134

yang_bgp-common_rm.png
yang_rm.png

でもHLDを見た感じだと普通に文字列で指定のように思うんですよね......HLDを実装に合わせるべきなんでしょうか......
https://github.com/sonic-net/SONiC/blob/master/doc/mgmt/SONiC_Design_Doc_Unified_FRR_Mgmt_Interface.md#3219-bgp_peer_group_af

hld_rm.png

時間があるときに最新のCommitを確認してみたいと思います。

まとめ

そのほかにもいろいろハマってはいますが、なんとかBGP Unnumberedの環境を構築できました。
frr-mgmt-framework自体はまだ開発途中という印象でしたが、構築中も日々アップデートされてバグが解消されており、SONiC自体も含めてスピード感におどきました。
FRRを触らずに済むメリットはかなり大きそうですね。sonic-cli-genを利用すればCLIで設定できたりもするみたいなので、試してみたいです。
各ドキュメント、ソースコードを確認しながらの作業はハードル高めに感じましたが、最悪コードを読めばなんとかなるというのは強味に感じています。

次はこのままfrr-mgmt-frameworkを使って、BGP EVPNの環境を構築してみたいと思います。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?