
VyOSを4台建ててダイナミックルーティングしてみたお話(eBGP - 経路制御編)
(※)課金フィルタはつけますが全文読めます。執筆に結構時間かかったのでお気持ち頂ければ励みになりますので何卒っ!
1つ柔術ネタを挟みましたが前回、前々回、前々々回の話の続きになります。
前々々回 - VyOSを4台建ててダイナミックルーティングしてみたお話(OSPF編)
前々回 - VyOSを4台建ててダイナミックルーティングしてみたお話(iBGP編)
前回 - VyOSを4台建ててダイナミックルーティングしてみたお話(eBGP編)
今回は完全一致のプレフィックスが 2 つの BGP スピーカーから聞こえてきた時、どっちを優先する?の初級編になります。
というのも A⚪︎S に代表される各クラウドサービスにおいて、 vti トンネルを 2 本張って BGP でオンプレと経路をやりとり、なんてケースにおいてもこの考え方は充分に使えるはずです。
いつぞやも言いましたが「因みに」の後がメインになりつつある弊 note ですが、今回は因みには少ないはずです。
この投稿全体が「因みに」バナシなのでは?と言うツッコミは心にそっとしまっていただき、生暖かい目でご覧ください。
そもそも論
BGP において外部 AS は言うならば違う組織です。外部組織には外部組織のルールがあります。一般的にはポリシーなんて言葉を使いますが、外部組織のポリシーに口出しできないのは現実世界と一緒で、そう言った意味では限界があります。
通信の世界で言うと Download トラフィック(※)の制御は基本的にはできません。
(※)正確には「トラヒック」かも知れませんが、
本 note では「トラフィック」とさせて頂きます、ご了承下さい。
身近なところで言うと A○S を例に説明すると BGP で接続した際、
一つは MED = 100 、もう一つは MED = 200 で同じ経路が聞こえてくるはずです。MED はその値が小さい方を優先させますから MED = 100 がメイン回線、と言う形になりますが、これは A○S がデフォルトで設定しているので変更はできないハズです。
(※詳しくないので違ったら訂正願います)
なので基本的には外部ASのポリシーは変えられない、という前提はご容赦ください。
前述の通り、 A○S は vtiA とvtiB はどちらかに強弱をつけてくれますので Download トラフィックは MED の小さい設定の方を通ります。
じゃあそれに合わせて Upload トラフィックをそうするか、は自分で決めることが出来ます。現実的には ステートフルインスペクション Firewall 等の都合により Download 側と一緒にするケースが多いとは思いますが。
シンプルな例
と言うわけで今回のケースの図解です。

RT-C へ経路を出す際に基本的には RT-A と繋がっている赤いメイン回線で経路を交換、 RT-B との接続は RT-A との接続に問題が発生した場合のみ活性化されるという単純な ACT- SBY 構成を想定しています。
前述の通り、 RT-C としては Download トラフィックは当然上位側の RT-A と RT-B 間のポリシーに依存してしまいます。
「デフォルトルートを Static で RT-A 、 RT-B に向けて metric かなんかで強弱をつければ良いじゃない。」
と一瞬よぎるかも知れませんがその際、 RT-A <-> RT-C 間の接続性がなくなってしまっても Static だと経路は失われません。
なので結果として ACT-SBY 構成が成り立たなくなってしまいます。
※NEC における connected や YAMAHA における hide オプションなんかは
その辺を解決できるオプションだったはずだけれども、
今回の趣旨とは異なるので割愛。
けれどもダイナミックルーティングであればこういう実装は簡単、と言うか
こういうのがダイナミックルーティングの活用しどころなので、
eBGP でどういう制御をしていくかの例が今回のネタです。
ベストパス選択アルゴリズム
BGP において経路を制御させるために「ベストパス選択アルゴリズム」と言うのが存在します。そもそもは完全一致した経路情報が複数存在する場合、
BGP テーブルからルーティングテーブルにインストールされる経路情報は一つだけです。
※実は J 社みたく実装が異なるベンダも存在しますが長くなるので割愛。
じゃあどの経路が採用されるのか、と言う話になりますがその強弱を決定するのがこれです。

本当は他にもたくさん色々ありますし正直覚えきれていません。且つたまーに違う実装をしているベンダさんもいたりするので何かと面倒なのですが、最低限これくらいは覚えておけば困らないでしょう。
因みに優先度の若番から順に比較していき、決着がついたらそれ以降の比較は行いません。
例えば PATH-A の AS-PATH 長が 2 つ、PATH-B のそれが 4 つだとしたら、MED の値が PATH-A = 1000 、PATH-B = 50 だとしても PATH-A がAS-PATH 長によりベストパスとして採用されます。
で、問題はこれらをどう使うかです。
答えは一つじゃない
正直な所、好みです。例えば
・採用した BGP スピーカーが C社でない = Weight は使わない
・eBGP で接続している = Local Preference はあまり意味がない
とかそういう要件があった際にそれを無理くり使うことはできませんが、
基本は好みです。
MED が好きな人もいれば AS-Path-Prepend 使う人もいます。
大規模になると AS-Path-Prepend 辺りは使い辛い部分は出て来ますし、
「MED なんて同じ AS から来ないと比較しないじゃない! always-compare-med ??? しゃらくせぇ!!!」って気持ちも always-compare-med なんて設定している場合は殆どでしょ、とは思いつつも MED のマッチアップの順番とか考えないと大規模になると面倒なので理解できないわけでもないですし、
「 設計時点で Router-ID 割り振るから優先させたい方に若番を!!!」
なんて言ってもそれ以前の条件でマッチアップしてしまい、想定通りにいかないなんて当たり前にありますしね。
というわけで筆者なりの設計にはなりますが一つの例として作ってみました。
まずは経路制御しない
それぞれの AS 番号及び広報しあう経路を紹介します。

この時、RT-A と RT-B は iBGP で接続はしていますが、今回はあまり意識しなくて良いです。
まずは経路制御を何もしていない RT-A の Config を紹介。
set protocols bgp address-family ipv4-unicast network 203.0.113.0/24
set protocols bgp neighbor 2.2.2.2 address-family ipv4-unicast nexthop-self
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 '1'
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'
set protocols bgp neighbor 192.0.2.3 address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp neighbor 192.0.2.3 remote-as '2'
set protocols bgp neighbor 192.0.2.3 timers holdtime '30'
set protocols bgp neighbor 192.0.2.3 timers keepalive '10'
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 '1'
続いて RT-B
set protocols bgp address-family ipv4-unicast network 203.0.113.0/24
set protocols bgp neighbor 1.1.1.1 address-family ipv4-unicast nexthop-self
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 '1'
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'
set protocols bgp neighbor 192.0.2.5 address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp neighbor 192.0.2.5 remote-as '2'
set protocols bgp neighbor 192.0.2.5 timers holdtime '30'
set protocols bgp neighbor 192.0.2.5 timers keepalive '10'
set protocols bgp parameters always-compare-med
set protocols bgp parameters log-neighbor-changes
set protocols bgp parameters router-id '2.2.2.2'
set protocols bgp system-as '1'
最後に RT-C
set protocols bgp address-family ipv4-unicast network 198.51.100.0/24
set protocols bgp neighbor 192.0.2.2 address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp neighbor 192.0.2.2 remote-as '1'
set protocols bgp neighbor 192.0.2.2 timers holdtime '30'
set protocols bgp neighbor 192.0.2.2 timers keepalive '10'
set protocols bgp neighbor 192.0.2.4 address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp neighbor 192.0.2.4 remote-as '1'
set protocols bgp neighbor 192.0.2.4 timers holdtime '30'
set protocols bgp neighbor 192.0.2.4 timers keepalive '10'
set protocols bgp parameters always-compare-med
set protocols bgp parameters log-neighbor-changes
set protocols bgp parameters router-id '3.3.3.3'
set protocols bgp system-as '2'
この状態で RT-C を見ると AS1 からの経路「203.0.113.0/24」はパッと見、 ECMPっぽく見えます。
vyos@RT-C:~$ show ip bgp
(~中略~)
Network Next Hop Metric LocPrf Weight Path
*> 198.51.100.0/24 0.0.0.0 0 32768 i
*= 203.0.113.0/24 192.0.2.4 0 0 1 i
*> 192.0.2.2 0 0 1 i
Displayed 2 routes and 3 total paths
vyos@RT-C:~$
けど、詳細を確認すると「Older Path」で RT-A がベストパスと判断されることが分かります。
vyos@RT-C:~$ show ip bgp ipv4 unicast 203.0.113.0/24
(~中略~)
1
192.0.2.4 from 192.0.2.4 (2.2.2.2)
Origin IGP, metric 0, valid, external, multipath
Last update: Fri Nov 29 12:13:02 2024
1
192.0.2.2 from 192.0.2.2 (1.1.1.1)
Origin IGP, metric 0, valid, external, multipath, best (Older Path)
Last update: Fri Nov 29 12:12:59 2024
vyos@RT-C:~$
ここから制御していきたいと思います。
余談ですけど、 VyOS も昔はC社っぽく「 show ip bgp <prefix>」だけで良かったのにここもコマンド変えてきました。そういうとこだぞ・・・
やっとこさ本題
前述の通り、A〇S は MED で制御しています。今回は一緒だと面白くないので AS-PATH 長を使っていきます。
RT-A からは何もせずに、 RT-B からはAS-Path-Prepend 機能を使って1つ余計に AS-Pathを追加して経路広報します。以下、追加 Config です。
RT-B
set policy route-map AS-Path-Prepend rule 10 action 'permit'
set policy route-map AS-Path-Prepend rule 10 set as-path prepend '1'
set protocols bgp neighbor 192.0.2.5 address-family ipv4-unicast route-map export 'AS-Path-Prepend'
で、 RT-C にて確認します。
vyos@RT-C:~$ show ip bgp ipv4 unicast 203.0.113.0/24
(~中略~)
1 1
192.0.2.4 from 192.0.2.4 (2.2.2.2)
Origin IGP, metric 0, valid, external
Last update: Fri Nov 29 14:07:28 2024
1
192.0.2.2 from 192.0.2.2 (1.1.1.1)
Origin IGP, metric 0, valid, external, best (AS Path)
Last update: Fri Nov 29 12:12:59 2024
vyos@RT-C:~$
ベストパスと判断された理由が「 Older Path 」から「 AS Path 」になった事が分かります。「 Older Path 」のままだと RT-C からすると、例えば RT-A とのピアが切断された際、当然ですが RT-B との経路しかないのでそこがベストパスとなります。で、 RT-A とのピアが復旧したとしてもベストパスは戻ってくれることなく RT-B のままとなります。
ですがこういう制御をすると RT-A が復旧した際に、ベストパスが RT-A に戻ってくれます。
基本的にはRT-C からの制御も同様になります。
が、advertise の方向に属性を付与するか、receive の際にそれをするか、とかどの属性を利用するか、とか他のルーティングプロトコルと比較して、その選択肢は確実に多いんです。
選択肢が多いということは自分がどこまでコントロールできるかの問題にもよりますが、何を使うかなんて本当に好みになるんです。
まとめ
今回の例は初級中の初級ですし実際にはもう少し複雑ですが BGP は、と言うより世の中で言われているインターネットというのはこんな感じで出来ています。こういう制御をしていない事業者は皆無だと思います。
筆者が BGP を導入した案件でも色々ごにょごにょ仕掛けてます。
で、事実色々出来ることは多いのでそれだけ奥が深く難解に思われてしまうかも知れません。
でも正解は一つではないので、確たる根拠があればお好みでやってみるのが良いと思います。
最後まで読んでくれてありがとうございます。
よかったら「スキ❤️」も押してくれたり、解り難い所をコメントで質問してくれたり、間違っている箇所を訂正して頂けると嬉しいです。
ここから先は
¥ 100
この記事が気に入ったらチップで応援してみませんか?