VyOSを4台建ててダイナミックルーティングしてみたお話(iBGP編)
前回のお話の続きになります。
そもそものテーマが
「OSPF で Lo アドレスを喋らせてその Lo アドレスで BGP を繋ごう」
になりますので、今回その後ろの部分がネタになります。
VyOS の Config 体系が1.4以降で変わってることについては
それはもうそういう前提とします。
ただ、 A〇S 某クラウドサービスって確かサンプル Config を
生成してくれていて、それは VyOS も例外なくサンプルを作ってくれる様なサービスがあったはずなのですが、筆者の知る限り、 1.1.8 くらいの Config だった気がします。当時と比較すると結構異なっていますので、困っている方には良いかも知れませんね。
普通にま〇〇ば工房さんに助けを求めるのが確実ですけど。
というわけで早速行ってみよー
まずは構成イメージから
論理的なイメージ図は以下の通りとなります。
今回は検証になりますので、適当な Private AS として「65535」とします。
また router-id は適当に Lo アドレスとしました。
現実的な設計だと Lo アドレスも入手したプレフィックスの中からアサインするとは思うのですがそこは置いといて(苦笑)
ピアを張る前にやっておくこと
ざっくり以下の通りです。説明は後ほど。
set protocols bgp parameters always-compare-med
set protocols bgp parameters log-neighbor-changes
set protocols bgp parameters router-id '1.1.1.1'
set protocols bgp system-as '65535'
1つずつ説明していきます。
set protocols bgp parameters always-compare-med
通常、BGP では異なる AS から同じプレフィックスが聞こえてきた時、
MED によるベストパス比較を行いません。
しかし、現実的には IX 事業者経由でバイラテラルピアで貰えるプレフィックスとトランジット経由で貰えた同じプレフィックスであれば、
コスト面等を考慮すると前者のプレフィックスを優先して使いたいケースが殆どです。
Local Preference でも AS-Path-Prepend でも良いと言えば良いのですが、
MED で強弱をコントロールしたいとなっても、
デフォルトでは異なる AS 間で MED 比較は実施しないのですが
「always-compare-med」オプションを付与することで異なる AS から聞こえてきた同じプレフィックスの MED比較を実施できるような設定となります。
実際にはもっと複雑なのですが最初の一歩としてこれくらいの説明に留めておきます。
そもそも iBGP ではあまり関係ないですし(苦笑)
set protocols bgp parameters log-neighbor-changes
OSPF の時にも同じ様な設定がありましたが、こちらも状態遷移をログに出力させるコマンドです。
ただし、 OSPF の時とは違い「detail」の様なオプションはありません。
設定しなくても動作に影響はないのですが、運用を考慮すると必要な設定だと思いますので入れておいて損はない認識です。
set protocols bgp parameters router-id '1.1.1.1'
ルーター ID です。ここはあまり言うことはないですね。
一応ベストパス選択アルゴリズムの中に
「ルータ ID の小さい BGP ピアからの受信経路を優先」
と言うルールがあるのですが、
現実的にこのルールで制御するケースは稀だと思いますので
放っておきましょう。
set protocols bgp system-as '65535'
自身のAS番号を指定する Config です。
1.3 まではこういう設定は存在しておらず「set protoclos bgp ${AS_Num}」と設定していましたが
J 社っぽい体系に寄せてきました。
続いてピア設定。
4台分載せるのも面倒なのでRT-A⇔RT-B間のみ載せます。
ピアアドレス以外は一緒ですし。
RT-A
set protocols bgp neighbor 2.2.2.2 address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp neighbor 2.2.2.2 remote-as '65535'
set protocols bgp neighbor 2.2.2.2 timers holdtime '30'
set protocols bgp neighbor 2.2.2.2 timers keepalive '10'
set protocols bgp neighbor 2.2.2.2 update-source 'lo'
RT-B
set protocols bgp neighbor 1.1.1.1 address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp neighbor 1.1.1.1 remote-as '65535'
set protocols bgp neighbor 1.1.1.1 timers holdtime '30'
set protocols bgp neighbor 1.1.1.1 timers keepalive '10'
set protocols bgp neighbor 1.1.1.1 update-source 'lo'
これも1つずつ説明していきますが
「set protocols bgp neighbor 」までは全コマンド共通しているので、
それ以降のみに絞ります。
soft-reconfiguration inbound
受信した経路情報をルーティングテーブルとは別に保持する設定です。
細かい事になりますし難しい文言になってしまいますが、
実は BGP の実装において BGP ピアに対して UPDATE メッセージを再度送付してもらうようなメカニズムはございません。ですが、本設定を入れることによって UPDATE メッセージにより取得した経路情報やパス属性を保持できるようになります。
だのでなので、BGP のピアセッションを切断しなくても人間の手で UPDATE メッセージを発出する「ソフトクリア」が出来る様になります。
明示的に設定できる装置でこれを入れないというのは、
個人的には有り得ないと思っています。
某シェフの言葉を借りるならペペロンチーノにイタリアンパセリが入っていないくらい有り得ないです。知らんけど。
remote-as '65535'
対向のASを指定しています。それ以上でもそれ以下でもないです。
timers holdtime '30'
ホールドタイマ設定です。 VyOS のデフォルトは 180 秒だそうです。
それだと長すぎるので普通に 30 秒設定にしています。
timers keepalive '10'
キープアライブパケットの送信間隔になります。デフォルトは 60 秒。
RFCなんちゃらでホールドタイマ値の 1/3 が推奨されているとかなんとか、
実際問題、世の中の BGP 喋っているルータはほぼそうなっていると思うので普通にそうしました。
ちなみに BGP ピア間で異なる値が設定されていた場合、短い方の値が採用されます。
update-source 'lo'
このピアとの BGP ピアに使用する送信元アドレスを指定しています。
実際にリンク間とループバックインターフェースに接続性があるのですが
わざわざ OSPF まで使ってループバックアドレスを喋らせているので
当たり前の様に ループバックを使用します。
斜めの関係だけループバックインターフェース、
それ以外はリンク間なんて面倒な事はしません。
これを全台に仕込んだ状態で BGP テーブルを見ていきます。
ピアリングできたかな???
というわけで早速確認します。
vyos@RT-A:~$ show ip bgp summary
IPv4 Unicast Summary (VRF default):
BGP router identifier 198.51.100.253, local AS number 65535 vrf-id 0
BGP table version 1
RIB entries 1, using 96 bytes of memory
Peers 4, using 80 KiB of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc
2.2.2.2 4 65535 1054 1054 1 0 0 02:55:12 0 1 FRRouting/9.1
3.3.3.3 4 65535 1009 1011 1 0 0 02:46:40 0 1 FRRouting/9.1
4.4.4.4 4 65535 964 965 1 0 0 02:40:16 0 1 FRRouting/9.1
Total number of neighbors 4
vyos@RT-A:~$
ピアを張っただけなのでまだプレフィックスを交換はしていませんが
ちゃんとピアは確立しているようです。
VyOS は「 show ip bgp summary 」にて" Establish" 的な文言は出て来ないので慣れるまでは一瞬「?」となりますが確立しています。
どうしてもそういう文言を確認したい場合は「show ip bgp neighbor ~」で確認しましょう。
というわけでプレフィックスを交換します。
経路を出してみよう
今回は RT-C から「 192.0.2.128/26 」 を、RT-D から「 192.0.2.192/26 」を、それぞれ広報します。
広報させる設定は以下の通りです。
RT-C
set protocols bgp address-family ipv4-unicast network 192.0.2.128/26
RT-D
set protocols bgp address-family ipv4-unicast network 192.0.2.192/26
シンプルに network コマンドで経路を生成しています。
BGP に限らず、自身が持っている経路以外は広報しないので、
実際にインターフェースに IP アドレス振るとか、スタティックルート入れておくか、最悪適当に Null ルートを設定すれば経路は見えるはずです。
というわけでそれぞれの経路を受信しているか、 RT-A から確認します。
vyos@RT-A:~$ show ip bgp
BGP table version is 3, local router ID is 198.51.100.253, vrf id 0
Default local pref 100, local AS 65535
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
*>i192.0.2.128/26 3.3.3.3 0 100 0 i
*>i192.0.2.192/26 4.4.4.4 0 100 0 i
Displayed 2 routes and 2 total paths
vyos@RT-A:~$
全く問題なさそうですね。
因みに某社とバイラテラルピアを張る時は一度ピアリングが確立してからも某社からプレフィックスは何も降って来ず、数日ピアリングの安定稼働を確認してからプレフィックスを流す、そんな動きになっているとかなっていないとか。
大きい会社さんですし、経路がバタつくと色々諸々面倒そうなのでこういうやり方は自己防衛策としてありだと思うのです。
ですがヒトの手でやろうとすると send-community 使ったとしても、それなりに面倒そうです。
大きい会社さんですし、機械がやってくれているとは思うのですがどういう実装をしているのか、興味があります。
まとめ
というわけで、「OSPF で Lo を喋らせてそこで BGP を繋ぐ」事は出来るようになったと思います。
ただこれ、割と最小構成だという認識です。大きいシステムになるとルートリフレクタとかの実装が必要になりますし、 VRF をこれでもかって切って使うシチュエーションも想定できます。
ですがまずは基本的なところを、という形でご理解下さい。
ペペロンチーノをおいしく作れない人がボンゴレビアンコを作れないのと一緒です、多分。知らんけど。
実は一点、触れていなくてないと割と困る設定があるのですが、
それについては次回の eBGP 編で合わせて触れていきたいと思います。
最後まで読んでくれてありがとうございます。
よかったら「スキ❤️」も押してくれると嬉しいです。