SONiCで設定するFRRouting

 SONiCで設定するFRRouting

SONiCでは、Quaggaをベースに改良が続けられているRouting softwareであるFRRoutingを利用してBGPの機能を実現しています。本資料では、SONiCの設定によりFRRoutingをどのように制御しているかの概要について解説します。

Fab252f33476e4b269b402cbcb6d4db2?s=128

Masaru OKI

June 28, 2019
Tweet

Transcript

  1. SONiCで設定する FRRouting June 28, 2019 Masaru OKI @masaru0714

  2. FRRouting? • https://frrouting.org/ • Quaggaを基にした IP routing protocol suite •

    BGP, IS-IS, LDP, OSPF, PIM, RIPに対応。 • 対応OSはLinux, FreeBSD, NetBDS, OpenBSD. • 最新バージョンは7.1 (2019年6月18日リリース) 2
  3. SONiCで使われるFRRouting • SONiC自体は、複数のRouting softwareから任意のものを選択できる。 ◦ Quagga ◦ FRRouting ◦ goBGP

    • ビルド時に決定されるため、配布されるバイナリはいずれか一つを含む。 • 2019年5月に、無指定時のRouting softwareがFRRoutingに切り替わった。 ◦ 以前はQuaggaだった • 2019年6月25日時点で、SONiCで使われているFRRoutingのバージョンは7.0.1 3
  4. configコマンドとshowコマンド • config bgpコマンドがあるが、セッションの start, stopを指定するのみ。 • 設定更新はconfig_db.jsonへ記述してconfig reload •

    参照はいろいろ ◦ show bgp ◦ show ip route ◦ show ip protocol ◦ show runningconfiguration bgp 4
  5. SONiCにおけるBGP初期設定フロー 1. JSON形式の設定を読み込みSONiCのConfig DBにデータを格納する 2. テンプレート内の変数をDB内のデータに置き換え、結果を bgpd.confとして出力する 3. FRR bgpdがbgpd.confを読む

    Config DB config_db.json bgpd.conf.j2 sonic-cfggen bgpd.conf 5
  6. JSON形式設定とbgpd.confの関係 JSON “DEVICE_METADATA”: { “localhost”: { “bgp_asn”: “ 65100” }

    }, “BGP_NEIGHBOR”: { “10.0.0.1”: { “asn”: “65200”, “name”: “Tokyo”, “keepalive”: 30, “holdtime”: 120” } bgpd.conf router bgp 65100 neighbor 10.0.0.1 remote-as 65200 neighbor 10.0.0.1 description “ Tokyo” neighbor 10.0.0.1 timers 30 120 自分のASN neighborのASN 6
  7. 参照されるJSONキー一覧 • DEVICE_METADATA-localhost ◦ hostname ◦ bgp_asn ◦ type -

    ToRRouterかその他 ◦ default_bgp_status - upかdown ◦ deployment_id ◦ docker_routing_config_mode • LOOPBACK_INTERFACE-Loopback0 ◦ IP address • VLAN_INTERFACE-(vlanX) ◦ IP address • BGP_NEIGHBOR-(neighbor_address) ◦ asn ◦ name ◦ keepalive ◦ holdtime ◦ admin_status - upかdown ◦ rrclient ◦ nhopself • BGP_PEER_RANGE-(group) ◦ name ◦ peer_asn ◦ src_address ◦ ip_range 7
  8. bgpd.conf.j2 • Jinja2テンプレートフォーマットで書かれている。 • SONiCが動いているホストだと ◦ bgp docker の /usr/share/sonic/templates/bgp.conf.j2

    • ソースコード ◦ sonic-buildimage/dockers/docker-fpm-frr/bgpd.conf.j2 8
  9. 1. JSON形式の設定を読み込みSONiCのConfig DBにデータを格納する 2. DBにsubscribeしていたbgpcfgdがデータを読む ◦ 読むデータは現在 bgp_asnとneighbor asn, name,

    admin_statusのみ ◦ neighborの削除には対応。追加の場合は上記設定のみが反映される 3. データの内容をvtyshコマンドを使いbgpdに叩き込む SONiCにおけるBGP設定変更フロー 9 bgpcfgd Config DB config_db.json vtysh bgpd config reload
  10. SONiCでのBGP制限事項 bgpd.conf.j2を見る限り、FRRoutingで対応しているうち(少なくとも)下記ができない • VRFには対応しない (router bgp行は1つのみ) • distance指定には対応しない • aggregate-address指定には対応しない

    • router-idはLoopback0につけられたIPアドレスで固定 • bestpathはas-path multipath-relaxで固定 • redistribute指定に対応しない • as-path access-listに対応しない bgpd.conf.j2に記述を追加し、JSON形式の設定を書き、bgpcfgdを変更すれば、拡張可能。 10
  11. BGP以外のプロトコルは? • SONiCでは現状、BGP以外すべて未対応。 • bgp dockerをまねて? 同居させる形で? 用意すればおそらく拡張可能。 • テンプレートとJSON記述を用意すればBGPと同じように動かせるはず。

    11
  12. まとめ • SONiCではFRRoutingを使っている • JSON形式でBGPの設定を記述し、bgpd.confに変換して動かす • SONiCの設定はFRRoutingの機能の一部のみを対象としている • 現状対応していない機能についても拡張は (おそらく)容易に可能

    12