VyOSを4台建ててダイナミックルーティングしてみたお話(OSPF編)

VyOS が 1.4 系から随分とその Config 体系を変えてきたのは
筆者の過去記事を漁って頂ければ皆様周知の事実かと思いますが
ダイナミックルーティングも実は結構変わっています。
今回は小規模 ISP なんかでよく見られる
「OSPF で Lo アドレスを喋らせてその Lo アドレスで BGP を繋ごう」
というよくあるパターンをご紹介します。

「なんでわざわざ OSPF まで喋らせる必要があるの?」
と言う疑問も出てくるかと思いますが、
BGP (正確には iBGP ) の特性を説明する必要性が出て来ます。
それだけで記事1つ費やせるのでお得と言えばお得なのですが、
どこかしらで説明はされているでしょうし、
今回の趣旨はそこじゃないので割愛します。


OSPF を喋らせない事には何にもならない

というわけでまずはOSPF編です。
早速なんとなくの構成イメージを紹介します。

パワポで作ったラフな絵

「 192.0.2.0/24 」は「 TEST-NET-1 」と言い、
RFC の何番かで定められています。
プライベートアドレス等と同じくインターネットへ広報できないアドレス、
いわゆる Bogon になっていますので
検証とかこういう執筆ものには便利で重宝してます。
末尾に「 -1 」とついているからわかる通り他にも似た様な用途の
NWはございましてざっくり以下の通りとなります。
TEST-NET-2 :198.51.100.0/24
TEST-NET-3 :203.0.113.0/24
IPv6 だと 今のところ、「2001:db8::/32 」だけだったと記憶しています。
ただ、IPv6 はいつの間にか微妙に変わる(と言うか増える)こともあるので
知らないところで追加されているかも知れません。

(以下脱線)
TEST-NET の話も既に脱線気味ですが、さらに脱線させて行きます。
たまにサイバー犯罪取り扱うテレビドラマとかで
現実ではあり得ない架空の IPv4 アドレス(※)を使ってて
(※: 32bit ですらないとか、256以上の表記があったりとか )
「ありえねー」とか「なんじゃこりゃあ」等と
一部クラスタで話題になる事がしばしばありますけど、
制作者側も普通にこの辺使えばいいんじゃないですかね。
なんで使わないんでしょうね。と思ったり思わなかったり。
(脱線ここまで)

構成イメージ内のそれぞれのルーターは分かりやすくリンク間の /31 と
自分の Lo アドレスだけ喋れば良い形になります。

早速Configを見てみよう

というわけで上記図の中で言うと RT-A だけですが細かいパラメーター以外は一緒なのでその他のルーターは割愛します。

vyos@RT-A:~$ sho conf co | grep ospf
set protocols ospf area 0.0.0.0 network '1.1.1.1/32'
set protocols ospf area 0.0.0.0 network '192.0.2.0/31'
set protocols ospf area 0.0.0.0 network '192.0.2.2/31'
set protocols ospf interface eth1 network 'point-to-point'
set protocols ospf interface eth1 passive disable
set protocols ospf interface eth2 network 'point-to-point'
set protocols ospf interface eth2 passive disable
set protocols ospf log-adjacency-changes detail
set protocols ospf parameters router-id '1.1.1.1'
set protocols ospf passive-interface 'default'
vyos@RT-A:~$ 

VyOS に近いとされる J 社のコマンド体系だと OSPF 周りの
インターフェース設定は「set interfaces ~」の中に居ますし、
1.3 系までは VyOS もそうだったのですが、
1.4 系からは「set protocols ospf ~」と言うコマンドの仲間になりました。

(以下脱線)
いつもながらですが最初、「set interfaces ~」と入力してから
Tab 打っても「 ospf 」と言う文言が出て来なかったので
「へ???」となったのは言うまでもありませんが。
(脱線ここまで)

不要な気しかしませんが一応各設定をざっくりと解説します。

set protocols ospf area 0.0.0.0 network ~

これは実際にネイバーに流す経路です。ルートフィルタ作って再配布、
なんてやり方もありますし、ここは設計する人の趣味嗜好が出て来ますね。
何故か VyOS は 1.4 になってからインターフェース指定が
出来なくなってしまっていたので今回、ネットワークを記載しました。
私のビルドしたバージョンが良くなかっただけかも知れませんが、
set protocols ospf area 0 network eth1 みたいに実装できるやり方を
ご存じの方がいたら教えて下さい。

set protocols ospf interface ethX network 'point-to-point'

ワザワザ「/31」でリンク間を構成するくらい、
DR 選定をさせる必要がない構成にしたので
明示的に DR 選定させないよう P-t-P にしました。
ネットワークタイプの詳細は調べればいくらでもあるので割愛します。

set protocols ospf log-adjacency-changes detail

ネイバーの状態遷移をログに出力させるコマンドです。
最後の「 detail 」があれば全ての状態遷移をログ出力し、
なければ Full とかそういう簡易な状態遷移をログ出力
(だったような気がします)させます。
筆者の記憶が曖昧なので間違っていたら指摘して下さい。

set protocols ospf passive-interface 'default'

全てのインターフェースにて OSPF のアップデートを
送信しない設定になります。
これを入れないと OSPF スピーカーが存在しないインターフェースからも
アップデートが送信されます。
「余計な通信はしたくないです」けど
「必要なインターフェースにおいてはアップデートを送信しないと
当たり前だけれども OSPF 喋れないよね」と。
そんな時は…

set protocols ospf interface ethX passive disable

特定のインターフェースを passive-interface の対象から除外する設定を
入れる事で OSPF スピーカーが対向にいるインターフェースでのみ
アップデートを送信できるようになります。
今回の場合は eth1 と eth2 になります。
これまた VyOS1.3 系では「 passive-interface-exclude 」と言うコマンドで
設定していたのですが変えてきましたね。

確認、そしてちょこっと追加

OSPF も喋れていそうなのでちゃんと
Loアドレスを学習できているか確認しましょう。

vyos@RT-A:~$ show ip route ospf
(中略)

O   1.1.1.1/32 [110/0] is directly connected, lo, weight 1, 00:29:17
O>* 2.2.2.2/32 [110/1] via 192.0.2.1, eth1, weight 1, 00:25:38
O>* 3.3.3.3/32 [110/1] via 192.0.2.3, eth2, weight 1, 00:24:17
O>* 4.4.4.4/32 [110/2] via 192.0.2.1, eth1, weight 1, 00:22:25
  *                    via 192.0.2.3, eth2, weight 1, 00:22:25
O   192.0.2.0/31 [110/1] is directly connected, eth1, weight 1, 00:29:17
O   192.0.2.2/31 [110/1] is directly connected, eth2, weight 1, 00:29:17
O>* 192.0.2.4/31 [110/2] via 192.0.2.1, eth1, weight 1, 00:25:38
O>* 192.0.2.6/31 [110/2] via 192.0.2.3, eth2, weight 1, 00:24:17
vyos@RT-A:~$

RT-A から見て斜めの関係にいる RT-D の Lo アドレス、4.4.4.4 を
ちゃんと学習していますが、当たり前ながら
RT-B から聞こえてくるパスと RT-C からのとマルチパスとして
学習しています。良いと言えば良いのですが、通常は
「 RT-A から RT-D の Lo アドレスを学習する際は RT-B からの方を優先させたい」
とかそういう様に設計されるケースが殆どだと思いますので
ケーススタディとして、コスト値で強弱をつけます。
今回の例では非常にざっくりとしたルールにはなってしまいますが
「ネットワークアドレスだろうがインターフェース名だろうが、
若番側を優先度:高とする」
と言った形にします。
というわけで以下、追加した Config になります(全台共通)

set protocols ospf interface eth1 cost '10'
set protocols ospf interface eth2 cost '100'

たったこれだけで先ほどと比較すると、

vyos@RT-A:~$ show ip route ospf
(中略)

O   1.1.1.1/32 [110/0] is directly connected, lo, weight 1, 00:56:33
O>* 2.2.2.2/32 [110/10] via 192.0.2.1, eth1, weight 1, 00:04:05
O>* 3.3.3.3/32 [110/100] via 192.0.2.3, eth2, weight 1, 00:03:56
O>* 4.4.4.4/32 [110/110] via 192.0.2.1, eth1, weight 1, 00:03:51
O   192.0.2.0/31 [110/10] is directly connected, eth1, weight 1, 00:04:05
O   192.0.2.2/31 [110/100] is directly connected, eth2, weight 1, 00:03:56
O>* 192.0.2.4/31 [110/110] via 192.0.2.1, eth1, weight 1, 00:03:56
O>* 192.0.2.6/31 [110/200] via 192.0.2.3, eth2, weight 1, 00:03:45
vyos@RT-A:~$

若番側から聞こえてくる 4.4.4.4 がルーティングテーブルに
採用されたことがわかります。

まとめ

現実的な環境においては経路フィルタ使ってある程度の制御をかけたり、
デフォルトルートの配信等が必要なケースも考えられますが、
その辺は根本がわかっている方なら全く問題はないかと思います。
個人的な偏見ですが、 OSPF で出来る事って( BGP と比較すると特にですが)割と限られている印象なのでそこまで複雑な実装をしない方が良いと考えてます。
何がともあれこれで OSPF はもう喋れますね。
そんなわけで次は BGP 編になると思います。

最後まで読んでくれてありがとうございます。
よかったら「スキ❤️」も押してくれると嬉しいです。

この記事が気に入ったらサポートをしてみませんか?