MikroTik を BGP の Route Reflector に設定してみる
iBGP ではルーティングループの発生を抑える為にスプリットホライズン動作をします。具体的には「ある iBGP Peer で学習した経路を別の iBGP Peer には広告しない」という振る舞いをします。下図はスプリットホライズン動作を図示したものです。ルータ A、B、C はフルメッシュで iBGP 接続されている前提です。
ルータ A は B と C に経路を広告します。しかし、ルータ B は A から学習した経路を C には広告しません(iBGP で学習した経路を他の iBGP Peer には広告しません)。この振る舞いのおかげでルーティングループを防止出来ますが、「iBGP は必ずフルメッシュ構成にしなければならない」とも言えます。フルメッシュ構成時に必要となる iBGP Peer の下図は以下の式で求められます(n = ルータの台数)。
以下の通り、フルメッシュ構成ではルータの台数が増えれば増える程、爆発的に iBGP Peer の総数が肥大化します。
ルータの台数 |
iBGP Peer の総数 |
3 |
3 |
5 |
10 |
10 |
45 |
20 |
190 |
30 |
435 |
40 |
780 |
50 |
1,225 |
100 |
4,950 |
iBGP Peer の総数が肥大化すると各ルータの CPU やメモリリソースを大量に浪費する、といったデメリットがあります。こういった問題を避ける為には以下の方法があります。
- RouteReflector(RR)を導入する
- Confederation を導入する
今回は Mikrotik(RouterOS)を RR に設定してみます。
構成
構成は下図の通りです。但し、意図的にルータ 2 と 3 は iBGP Peer の設定をしていません。
ルータは全台、以下を利用しています。
対象 |
メーカー |
OS バージョン |
ルータ 1 〜 5 |
Mikrotik |
RouterOS 6.30.1 |
R1 のコンフィグ
R1 では 10.0.0.0/8 という経路を生成して BGP で広告しています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | /system identity set name=R1
/interface bridge add name=loopback
/ip address add address=10.0.99.1/32 interface=loopback
/ip address add address=10.0.12.1/24 interface=ether2
/ip address add address=10.0.13.1/24 interface=ether3
/ip route add dst-address=10.0.0.0/8 type=blackhole
/routing ospf instance set 0 router-id=10.0.99.1
/routing ospf interface add interface=loopback passive=yes
/routing ospf network add network=10.0.12.0/24 area=backbone
/routing ospf network add network=10.0.13.0/24 area=backbone
/routing ospf network add network=10.0.99.1/32 area=backbone
/routing bgp instance set default as=65000 router-id=10.0.99.1
/routing bgp peer add remote-address=10.0.99.2 remote-as=65000 update-source=loopback
/routing bgp peer add remote-address=10.0.99.3 remote-as=65000 update-source=loopback
/routing bgp network add network=10.0.0.0/8
|
BGP で経路を広告する際に幾つか方法があります。Cisco の場合、「(1) Null0 宛の経路を書いて」「(2) BGP の network コマンドで広告する」という方法があります。具体的な設定例は以下の通りです。
| ip route 10.0.0.0 255.0.0.0 Null0
!
router bgp 65000
network 10.0.0.0 mask 255.0.0.0
!
end
|
同じ設定を RouterOS で実現するには「(1) blackhole 経路を定義し」「(2) BGP の network コマンドで広告する」という流れになります。具体的な設定例は以下の通りです。
| /ip route add dst-address=10.0.0.0/8 type=blackhole
/routing bgp network add network=10.0.0.0/8
|
ルーティング設定時に指定している type には以下の三種類があります。Cisco での Null インターフェイスと同じ振る舞いをさせたいのであれば blackhole を指定します。
type |
挙動 |
blackhole |
該当するパケットを廃棄し、送信元には何も通知しない |
unreachable |
該当するパケットを廃棄し、送信元には ICMP Host Unreachable メッセージ(type 3 code 1)を返送する |
prohibit |
該当するパケットを廃棄し、送信元には ICMP communication administratively prohibited メッセージ(type 3 code 13)を返送する |
また、以前の記事 にも書いたのですが、Cisco での Loopback インターフェイスを RouterOS で実現するにはポートを割り当てない bridge インターフェイスを作成し、それにアドレスを割り当てます。具体的な設定例は以下の通りです。
| /interface bridge add name=loopback
/ip address add address=10.0.99.1/32 interface=loopback
|
R2 のコンフィグ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | /system identity set name=R2
/interface bridge add name=loopback
/ip address add address=10.0.99.2/32 interface=loopback
/ip address add address=10.0.12.2/24 interface=ether2
/ip address add address=10.0.24.2/24 interface=ether3
/routing ospf instance set 0 router-id=10.0.99.2
/routing ospf interface add interface=loopback passive=yes
/routing ospf interface add interface=ether3 passive=yes
/routing ospf network add network=10.0.12.0/24 area=backbone
/routing ospf network add network=10.0.24.0/24 area=backbone
/routing ospf network add network=10.0.99.2/32 area=backbone
/routing bgp instance set default as=65000 router-id=10.0.99.2
/routing bgp peer add remote-address=10.0.99.1 remote-as=65000 update-source=loopback
/routing bgp peer add remote-address=10.0.24.4 remote-as=65004 ttl=1
|
R3 のコンフィグ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | /system identity set name=R3
/interface bridge add name=loopback
/ip address add address=10.0.99.3/32 interface=loopback
/ip address add address=10.0.13.3/24 interface=ether2
/ip address add address=10.0.35.3/24 interface=ether3
/routing ospf instance set 0 router-id=10.0.99.3
/routing ospf interface add interface=loopback passive=yes
/routing ospf interface add interface=ether3 passive=yes
/routing ospf network add network=10.0.13.0/24 area=backbone
/routing ospf network add network=10.0.35.0/24 area=backbone
/routing ospf network add network=10.0.99.3/32 area=backbone
/routing bgp instance set default as=65000 router-id=10.0.99.3
/routing bgp peer add remote-address=10.0.99.1 remote-as=65000 update-source=loopback
/routing bgp peer add remote-address=10.0.35.5 remote-as=65005 ttl=1
|
R4 のコンフィグ
| /system identity set name=R4
/interface bridge add name=loopback
/ip address add address=192.168.99.4/32 interface=loopback
/ip address add address=10.0.24.4/24 interface=ether2
/routing bgp instance set default as=65004 router-id=192.168.99.4
/routing bgp peer add remote-address=10.0.24.2 remote-as=65000 ttl=1
/routing bgp network add network=192.168.99.4/32
|
R5 のコンフィグ
| /system identity set name=R5
/interface bridge add name=loopback
/ip address add address=192.168.99.5/32 interface=loopback
/ip address add address=10.0.35.5/24 interface=ether2
/routing bgp instance set default as=65005 router-id=192.168.99.5
/routing bgp peer add remote-address=10.0.35.3 remote-as=65000 ttl=1
/routing bgp network add network=192.168.99.5/32
|
RR 設定前のルーティングテーブル
RR 設定前の各ルータのルーティングテーブルは以下の通りです。本来であれば「iBGP はフルメッシュにしなければならない」というルールがあるのでルータ 1、2、3 はフルメッシュ iBGP 設定されているべきですが、上述の通り、今回は意図的にルータ 2 と 3 間で iBGP 設定をしていないのがポイントです。
R1 のルーティングテーブル
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | [admin@R1] > /ip route print
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 A SB 10.0.0.0/8 1
1 ADC 10.0.12.0/24 10.0.12.1 ether2 0
2 ADC 10.0.13.0/24 10.0.13.1 ether3 0
3 ADo 10.0.24.0/24 10.0.12.2 110
4 ADo 10.0.35.0/24 10.0.13.3 110
5 ADC 10.0.99.1/32 10.0.99.1 loopback 0
6 ADo 10.0.99.2/32 10.0.12.2 110
7 ADo 10.0.99.3/32 10.0.13.3 110
8 ADb 192.168.99.4/32 10.0.24.4 200
9 ADb 192.168.99.5/32 10.0.35.5 200
|
R2 のルーティングテーブル
R2 は R3 と iBGP Peer が設定されていません。この為、R3 が R5 から学習している経路を受信することが出来ず、ルーティングテーブルに「192.168.99.5/32」が存在しません。
1
2
3
4
5
6
7
8
9
10
11
12
13 | [admin@R2] > /ip route print
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 ADb 10.0.0.0/8 10.0.99.1 200
1 ADC 10.0.12.0/24 10.0.12.2 ether2 0
2 ADo 10.0.13.0/24 10.0.12.1 110
3 ADC 10.0.24.0/24 10.0.24.2 ether3 0
4 ADo 10.0.35.0/24 10.0.12.1 110
5 ADo 10.0.99.1/32 10.0.12.1 110
6 ADC 10.0.99.2/32 10.0.99.2 loopback 0
7 ADo 10.0.99.3/32 10.0.12.1 110
8 ADb 192.168.99.4/32 10.0.24.4 20
|
R3 のルーティングテーブル
R2 と同じ理由で、R2 が R4 から学習している経路を受信することが出来ず、ルーティングテーブルに「192.168.99.4/32」が存在しません。
1
2
3
4
5
6
7
8
9
10
11
12
13 | [admin@R3] > /ip route print
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 ADb 10.0.0.0/8 10.0.99.1 200
1 ADo 10.0.12.0/24 10.0.13.1 110
2 ADC 10.0.13.0/24 10.0.13.3 ether2 0
3 ADo 10.0.24.0/24 10.0.13.1 110
4 ADC 10.0.35.0/24 10.0.35.3 ether3 0
5 ADo 10.0.99.1/32 10.0.13.1 110
6 ADo 10.0.99.2/32 10.0.13.1 110
7 ADC 10.0.99.3/32 10.0.99.3 loopback 0
8 ADb 192.168.99.5/32 10.0.35.5 20
|
R4 のルーティングテーブル
| [admin@R4] > /ip route print
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 ADb 10.0.0.0/8 10.0.24.2 20
1 ADC 10.0.24.0/24 10.0.24.4 ether2 0
2 ADC 192.168.99.4/32 192.168.99.4 loopback 0
|
R5 のルーティングテーブル
| [admin@R5] > /ip route print
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 ADb 10.0.0.0/8 10.0.35.3 20
1 ADC 10.0.35.0/24 10.0.35.5 ether2 0
2 ADC 192.168.99.5/32 192.168.99.5 loopback 0
|
RR の設定
ルータ 1 を RR に設定します。
| /routing bgp peer set 0 route-reflect=yes
/routing bgp peer set 1 route-reflect=yes
|
RR の設定を行う場合は「RR の役割を担う側」(今回はルータ 1)のみ、設定が必要です。RR と接続する iBGP Peer のことを「RouteReflector Client」と呼びますが、RR Client 側で特別な設定は必要ありません。
R1 のルーティングテーブル
R1 での経路の見え方に変化はありません。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | [admin@R1] > /ip route print
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 A SB 10.0.0.0/8 1
1 ADC 10.0.12.0/24 10.0.12.1 ether2 0
2 ADC 10.0.13.0/24 10.0.13.1 ether3 0
3 ADo 10.0.24.0/24 10.0.12.2 110
4 ADo 10.0.35.0/24 10.0.13.3 110
5 ADC 10.0.99.1/32 10.0.99.1 loopback 0
6 ADo 10.0.99.2/32 10.0.12.2 110
7 ADo 10.0.99.3/32 10.0.13.3 110
8 ADb 192.168.99.4/32 10.0.24.4 200
9 ADb 192.168.99.5/32 10.0.35.5 200
|
R2 のルーティングテーブル
R1 が RR 化したことにより、他の iBGP Peer(つまり、R3)が学習している 192.168.99.5/32 という経路を RR から学習出来るようになりました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | [admin@R2] > /ip route print
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 ADb 10.0.0.0/8 10.0.99.1 200
1 ADC 10.0.12.0/24 10.0.12.2 ether2 0
2 ADo 10.0.13.0/24 10.0.12.1 110
3 ADC 10.0.24.0/24 10.0.24.2 ether3 0
4 ADo 10.0.35.0/24 10.0.12.1 110
5 ADo 10.0.99.1/32 10.0.12.1 110
6 ADC 10.0.99.2/32 10.0.99.2 loopback 0
7 ADo 10.0.99.3/32 10.0.12.1 110
8 ADb 192.168.99.4/32 10.0.24.4 20
9 ADb 192.168.99.5/32 10.0.35.5 200
|
R3 のルーティングテーブル
R2 と同様、192.168.99.4/32 という経路を学習出来るようになりました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | [admin@R3] > /ip route print
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 ADb 10.0.0.0/8 10.0.99.1 200
1 ADo 10.0.12.0/24 10.0.13.1 110
2 ADC 10.0.13.0/24 10.0.13.3 ether2 0
3 ADo 10.0.24.0/24 10.0.13.1 110
4 ADC 10.0.35.0/24 10.0.35.3 ether3 0
5 ADo 10.0.99.1/32 10.0.13.1 110
6 ADo 10.0.99.2/32 10.0.13.1 110
7 ADC 10.0.99.3/32 10.0.99.3 loopback 0
8 ADb 192.168.99.4/32 10.0.24.4 200
9 ADb 192.168.99.5/32 10.0.35.5 20
|
R4 のルーティングテーブル
| [admin@R4] > /ip route print
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 ADb 10.0.0.0/8 10.0.24.2 20
1 ADC 10.0.24.0/24 10.0.24.4 ether2 0
2 ADC 192.168.99.4/32 192.168.99.4 loopback 0
3 ADb 192.168.99.5/32 10.0.24.2 20
|
特定の経路情報を確認するには /ip route print detail where dst-address=[NETWORK/MASK] コマンドを使います。以下は 192.168.99.5/32 という経路を確認した際の出力例です。
| [admin@R4] > /ip route print detail where dst-address=192.168.99.5/32
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
0 ADb dst-address=192.168.99.5/32 gateway=10.0.24.2 gateway-status=10.0.24.2 reachable via ether2
distance=20 scope=40 target-scope=10 bgp-as-path="65000,65005" bgp-origin=igp received-from=peer1
|
R5 のルーティングテーブル
| [admin@R5] > /ip route print
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 ADb 10.0.0.0/8 10.0.35.3 20
1 ADC 10.0.35.0/24 10.0.35.5 ether2 0
2 ADb 192.168.99.4/32 10.0.35.3 20
3 ADC 192.168.99.5/32 192.168.99.5 loopback 0
|
まとめ
RouterOS を RR に設定しても、特に問題無く動作するようです。
参考