むかし、先輩に教えてもらった
Linuxの名前空間でNW作る暇つぶし
でやってたことを書くよ
まずはテキトーに仮想マシン作るよ。
ワイはRockyにしたよ。

>>1
「やってたこと」って書いたけど、
やってないことも書くかもー
OSPFをつかったダイナミックルーティング
まずはLinuxにFRRoutingをいれるよ。
※FRRouting(以下:frr) → Ciscoライクなルーターソフト
# yum install frr
インストール後、OSPFを有効にするために/etc/frr/daemonsを編集し、
ospfd=yesに書き換えてサービス再起動の流れが一般的だと思うんだけど
今回は手動で名前空間の中でプロセスを起動するからやらなくておけ。
frrを入れたら物理層・データリンク層を構築してくよ。
トポロジーは超簡単だけどこういう感じ。

スクリプトとして記載しとく。
#!/bin/bash
echo "名前空間(ルーター)をつくるよ"
ip netns add R1
ip netns add R2
ip netns add R3
echo "R1 - R2間のLANケーブルをつくるよ"
ip link add R1-eth0 type veth peer name R2-eth0
ip link set R1-eth0 netns R1
ip link set R2-eth0 netns R2
echo "R2 - R3間のLANケーブルをつくるよ"
ip link add R2-eth1 type veth peer name R3-eth0
ip link set R2-eth1 netns R2
ip link set R3-eth0 netns R3
echo "R3 - R1間のLANケーブルをつくるよ"
ip link add R3-eth1 type veth peer name R1-eth1
ip link set R3-eth1 netns R3
ip link set R1-eth1 netns R1
echo "ルーター1(R1)の作成"
#R1 - R2
ip netns exec R1 ip addr add 10.0.1.1/24 dev R1-eth0
#R1 - R3
ip netns exec R1 ip addr add 10.0.0.1/24 dev R1-eth1
#loopback
ip netns exec R1 ip addr add 1.1.1.1/32 dev lo
#link up!!!
ip netns exec R1 ip link set R1-eth0 up
ip netns exec R1 ip link set R1-eth1 up
ip netns exec R1 ip link set lo up
#ip forward(v4だけでおk)を有効化
ip netns exec R1 sysctl -w net.ipv4.ip_forward=1
echo "ルーター2(R2)の作成"
#R2 - R1
ip netns exec R2 ip addr add 10.0.1.2/24 dev R2-eth0
#R2 - R3
ip netns exec R2 ip addr add 10.0.2.1/24 dev R2-eth1
#loopback
ip netns exec R2 ip addr add 2.2.2.2/32 dev lo
#link up!!!
ip netns exec R2 ip link set R2-eth0 up
ip netns exec R2 ip link set R2-eth1 up
ip netns exec R2 ip link set lo up
#ip forward(v4だけでおk)を有効化
ip netns exec R2 sysctl -w net.ipv4.ip_forward=1
echo "ルーター3(R3)の作成"
#R3 - R2
ip netns exec R3 ip addr add 10.0.2.2/24 dev R3-eth0
#R3 - R1
ip netns exec R3 ip addr add 10.0.0.2/24 dev R3-eth1
#loopback
ip netns exec R3 ip addr add 3.3.3.3/32 dev lo
#link up!!!
ip netns exec R3 ip link set R3-eth0 up
ip netns exec R3 ip link set R3-eth1 up
ip netns exec R3 ip link set lo up
#ip forward(v4だけでおk)を有効化
ip netns exec R3 sysctl -w net.ipv4.ip_forward=1
# FRR (Zebra & OSPF) の起動
# Rocky Linux用のパス
DAEMON_PATH="/usr/libexec/frr"
for router in R1 R2 R3; do
# 専用ディレクトリの準備 (FRRはここを使う)
mkdir -p /var/run/frr/$router
chown frr:frr /var/run/frr/$router 2>/dev/null || true # ユーザーがいれば権限変更
# 設定ファイルの準備
echo "hostname $router" > /var/run/frr/$router/zebra.conf
echo "hostname $router" > /var/run/frr/$router/ospfd.conf
# 起動 (-N で名前空間を指定するよ)
ip netns exec $router $DAEMON_PATH/zebra -d -N $router -f /var/run/frr/$router/zebra.conf
ip netns exec $router $DAEMON_PATH/ospfd -d -N $router -f /var/run/frr/$router/ospfd.conf
done
echo "おわり"
ルーターを作れたら、今度はルーターの設定をするよ。
ip netns exec (ルーター) bashで、ルーターのコンソールに入って
下の画像みたいに設定する

ルータのトポロジーを見ながら
各ルーターに同様の設定をするよ
設定終わり!
R1のルーティングテーブルをみてみるか
ip netns exec R1 vtysh -N R1 -c "show ip route"
OSPFで経路学習できてそうだな

pingすると1.1.1.1(R1) → 3.3.3.3(R3) の疎通はOK
tracerouteすると 1.1.1.1(R1) → 3.3.3.3(R3)のホップは1だね

ダイナミックルーティングだからR1 - R3をつなぐNICがタヒんでも疎通するはず...
R1 - R3のNICをdownさせて >>9 と同じ操作をしてみよう
1.1.1.1(R1) → 3.3.3.3(R3)は疎通する
でもホップは2になってるね

ホップが増えたのは、パケットが
R1→R3の様に通れなくなって
R1→R2→R3と通るようになったからやね。

こんな感じでNW機器が買えなくても、
Linuxのネットワーク名前空間でダイナミックルーティングが
どんなもんか触ることができるよー
いいっしょw
一応ダイナミックルーティングについて。
隣接するルーター同士が持っているルート情報を交換して、自動的にルートを作る方法のこと。
そんでルート情報を交換するためのプロトコルをルーティングプロトコルっていうよ。
ルーティングプロトコルは、その制御範囲によって「IGP(Interior Gateway Protocol)」と「EGP(Exterior Gateway Protocol)」の2種類に分けられる。
この2つを分ける概念は「AS(Autonomous System)」だよ。
ASは、ひとつのポリシーに基づいて管理されているIPネットワークの集まりで、簡単にいうとAS=組織(企業、ISP、拠点)だね。
AS内を制御するルーティングプロトコルがIGP、ASとASの間を制御するルーティングプロトコルがEGP。
今までやっていたのは、IGPの一つであるOSPFを使用したダイナミックルーティングだよ。
OSPF(Open Shortest Path Fast)はリンクステート型(リンクの状態に基づいて最適ルートを計算する)のルーティングプロトコルで、
昔からRFCで標準化されているルーティングプロトコルってこともあって、複数のベンダーが混在する中〜大規模のネットワーク環境でよく使用されてるらしい。(会社とかで意識したことはない...)
OSPFは、各ルーターがリンクの状態とか帯域幅、IP、サブネットマスク等を交換しあって、「リンクステートデータベース(LSDB)」を作る。
そんで、そこから最適ルート情報を計算してルーティングテーブルを作るよ。(OSPFは変更があったときだけ更新をかける。)
あと通常はHelloパケットっていう小さいパケットを送信して、相手が正常に動作しているかどうかだけを確認してるから、必要以上に帯域を圧迫することがないのがいいところ。
ここでやってるレベルだとそこまで踏み込む必要は無いけど、OSPFではLSDBが大きくなりすぎないように「エリア」って概念があるよ。
ネットワークをエリアに分けて、同じエリアのルータだけでLSDBを共有してる。
ちなみに、 >>10 とかでホップに着目してるけど、OSPFのメトリックには「コスト」を使用するよ。
コストは、デフォルトで「100÷帯域幅(Mbps)」に当てはめて整数値として算出されて、ルーターを超えるたびに出力インターフェースで加算されてく。
だからルートの帯域幅が大きいほど、最短ルートになりやすくなるよ。もしルーターが学習したルートのコストがまったく同じだった場合は、コストが同じルートをすべて使用して通信を負荷分散する。
(↑ECMP(Equal Cost Multi Path)っていうよ)
BGPを使ったダイナミックルーティング
>>13 でもふれたけどBGPはEGPの一つでAS同士をつなぐときに使うルーティングプロトコルだよ。
ASにはグローバルASとプライベートASがあって、それぞれ以下の番号が割り振られてるよ。
グローバルAS : 1〜64511
プライベートAS : 64512〜65534
グローバルASはIPみたいにインターネットで一意のAS番号で、IANAとその下部組織によって管理されてて、ISPとかDC事業者、通信事業者等の組織に割り振られてる。
プライベートASは組織内であれば自由につかっておk。
まあまずは >>4 と同じく手を動かしてみるのが早いっしょw
さっきの名前空間はリセットしちゃおう。OS再起動で消せるよ。
>>5 のスクリプトを少しいじって、ospfdではなくbgpdを起動するようにしよう。(zebraはそのままでおk)
スクリプトを実行してルーターの作成が終わったら、BGPの設定をしていこう。
BGP設定
下の画像はR1(AS65001)を設定したときのコンソールだよ。
これと同様にR2(AS65002)も設定するよ。

R1とR2にBGPの設定ができたら、vtyshで
show ip bgp summary
を叩いて、ステータスを確認してみる。
ステータスが以下だったから、経路情報の交換を許可しよう。

R1とR2のvtyshで
no bgp ebgp-requires-policy
をたたくよ。

今度は1つの経路を受け取るのに成功してるね。(R1が)

動確も問題なし!
これでAS同士をつなぐことができた!

一応、BGPのルーティングアルゴリズムについて。
BGPはパスベクター型のプロトコル。
経路(パス)と方向(ベクター)に基づいてルートを計算するよ。
ここでいう経路は宛先までに経由するASを表し、方向はBGPピアを表してるよ。
宛先までにどれだけのASを経由するかが、ベストパスの判断基準のひとつになってる。
ちなみにBGPピアはルート情報を交換する相手のことね。(R1であればR2)
BGPは相手を指定して1:1のTCPコネクションを作って、その中でルート情報を交換する。
BGPピアとルート情報を交換してBGPテーブルを作り、そこから一定のルールに基づいてベストパスを選択するよ。
「一定のルール」には政治とかいろんな事情が絡むらしい...
最後はVRFを使ってみる
VRFは1台のルーターに独立した複数のルーティングテーブルをもたせる仮想化技術。
FortiGateのVDOMとかCiscoのVRF-Liteと同じやね。FortiとかCiscoを例としてだすと、高級なソフトが要りそーな気がするけど
Linux標準のカーネル機能だけで実現できるからやってみよう。
ワイはVLANは触ったことあるけど、VRFは初めて触るよ。