note.

調べたことの頭の整理

Cumulus Linux - 基本的な L3 設定(FRR, Static) - 1

Cumulus Linux に興味が湧いたので触っています。ここでは頭の整理として基本的な部分をまとめました。

また、長くなったので記事を分割しました。

  • Cumulus Linux - 基本的な L3 設定(FRR, Static) - 1
  • Cumulus Linux - 基本的な L3 設定(OSPF) - 2
  • Cumulus Linux - 基本的な L3 設定(BGP) - 3

ここでは FRR と Static について扱います。

FreeRangeRouting

OSPF, BGP など一般的に求められる機能がサポートされていますが、そのドキュメントを読むと随所にFRRという単語が出てきます。

プロトコルの前にまずはFRRについて整理します。

概要

FRRとはQuagga(ソフトウェアルータ)をルーツとした LinuxFoundation が管理している Linux/Unix のプラットフォームに向けた IP Routing Protocol Suite です。簡単にいうとライブラリです。

名前の通り Free のためGitHubにソースが公開されています。

サポートしている RFC をみたいときにはFeatureMatrixが参考になるかもしれません。

このことから各種プロトコルの設定は FRR の設定ファイルに当たる /etc/frr/frr.confに設定されます。

アーキテクチャ

bgpd, ospfd, ospf6dといったようにプロトコル単位に daemon があり、それらをzebraが差分を吸収し、Kernel Routing Tableに経路情報を設定します。

利用している daemonyes となります。

cumulus@leaf01:mgmt:~$ sudo cat /etc/frr/daemons
...
bgpd=yes
ospfd=yes
ospf6d=yes
ripd=no
ripngd=no
isisd=no
fabricd=no
pimd=no
ldpd=no
nhrpd=no
eigrpd=no
babeld=no
sharpd=no
pbrd=no
fabricd=no
vrrpd=no

このことから設定の変更を反映させるには各 daemon を再起動する必要がありますが、frr.serviceを再起動することで、結果的に依存している各種サービスも再起動することができます。

詳細はArchitectureを参照ください。

設定の変更について

Cumulus Linux のユーザーには3つの設定方法が用意されています。そのため、各種マニュアルには3つの方法が記載されています。

  • net(NCLU)コマンドを通してfrr.confに設定
  • vtsh(FRR)コマンドを通してfrr.confに設定
  • vi /etc/frr/frr.confで直接編集

netコマンドと、vtshコマンドの比較はココに書いてあります。

個人的な意見ではvtshの方が慣れればシンプルなので高速に思いますが、他の操作もあるのでnetコマンドでまずは慣れるほうがいいと感じています。

ちなみに、/etc/network/interfacesからインターフェース情報をルーティングテーブルに継承する仕組みのため、vtshfrr.confではプロトコル"のみ"変更を行います。

ログについて

以上のことからプロトコルのログは/var/log/frr/frr.logで確認できます。出力レベルはinfoとなり、debugに変更したい場合はマニュアルを参照してください。

Route Entries

設計にあたって重要なスペックですが、Broadcom など汎用チップと共に利用するため、その仕様に合わせる必要があります。

詳細はマニュアルを参照ください。

簡単にいうと MAC アドレス、IPv4IPv6、Neighbor 数に応じてメモリの割り当て量をセットしたパターンから1つ選択します。例えば L2 スイッチで使うなら、L3 関連のリソースは不要なのでl2-heavy-1を選ぶ、、といった考え方です。

ECMP

ECMP は次の仕様となります。

  • デフォルトで有効
  • 同じプロトコルで等コストであること
  • フローベーすハッシュ
  • Hash*は IP protocol, 入力 IF, src IP, dst IP, src TCP/UDP, dst TCP/UDP

* Meallnox などの Spectrum ASIC 搭載の L2 では src/dst MAC, Etye Type, VLAN ID も評価

hash-seed の変更は次の通りです。範囲が広いでの loopback から求めるような仕組みにしてもいいかもしれません。

cumulus@spine01:mgmt:~$ net add forwarding ecmp hash-seed
    <0-4294967295>  :  An integer from 0 to 4294967295

ハッシュのカスタマイズは Mellanox のスイッチでサポートされています。詳細はマニュアルを参照ください。

Static Routing

Static Routing です。一般的な方法かと思います。

net add routing route 0.0.0.0/0 192.168.0.2
net add routing route 192.168.1.0/24 192.168.0.2

route に追加されます。

cumulus@spine01:mgmt:~$ net show route static
RIB entry for static
====================
...

S>* 0.0.0.0/0 [1/0] via 192.168.0.2, swp1, weight 1, 00:01:29
S>* 192.168.1.0/24 [1/0] via 192.168.0.2, swp1, weight 1, 00:08:46

また next-hop には IP だけではなく、blackholerejectがあるので、再配信の時に利用するかもしれませんね。

cumulus@leaf01:mgmt:~$ net add routing route 192.168.200.0/24
    <interface>  :  An interface name "swp1" or glob "swp1-4,6,10-12"
    <ipv4>       :  an IPv4 address
    lo           :  interface
    eth0         :  LLDP peer oob-mgmt-switch
    swp1         :  interface
    swp2         :  interface
    swp3         :  interface
    swp49        :  LLDP peer leaf02
    swp50        :  LLDP peer leaf02
    swp51        :  LLDP peer spine01
    swp52        :  LLDP peer spine02
    swp53        :  LLDP peer spine03
    swp54        :  LLDP peer spine04
    Null0        :  Null interface
    blackhole    :  Silently discard pkts when matched
    g-ebgp       :  interface
    group-ibgp   :  interface
    mgmt         :  interface
    reject       :  Emit an ICMP unreachable when matched

IPv6 は同じ方法なので省略します。

まとめ

ざっと最低限使う機能を整理しました。他のプロトコルも触っていこうと思います。

よければ他の記事も参照ください。