らくがきちょう

なんとなく

MikroTik を BGP の Route Reflector に設定してみる

iBGP ではルーティングループの発生を抑える為にスプリットホライズン動作をします。具体的には「ある iBGP Peer で学習した経路を別の iBGP Peer には広告しない」という振る舞いをします。下図はスプリットホライズン動作を図示したものです。ルータ A、B、C はフルメッシュで iBGP 接続されている前提です。

f:id:sig9:20150726121337p:plain

ルータ A は B と C に経路を広告します。しかし、ルータ B は A から学習した経路を C には広告しません(iBGP で学習した経路を他の iBGP Peer には広告しません)。この振る舞いのおかげでルーティングループを防止出来ますが、「iBGP は必ずフルメッシュ構成にしなければならない」とも言えます。フルメッシュ構成時に必要となる iBGP Peer の下図は以下の式で求められます(n = ルータの台数)。

  • n * (n-1) / 2

以下の通り、フルメッシュ構成ではルータの台数が増えれば増える程、爆発的に 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 やメモリリソースを大量に浪費する、といったデメリットがあります。こういった問題を避ける為には以下の方法があります。

  1. RouteReflector(RR)を導入する
  2. Confederation を導入する

今回は Mikrotik(RouterOS)を RR に設定してみます。

構成

構成は下図の通りです。但し、意図的にルータ 2 と 3 は iBGP Peer の設定をしていません。

f:id:sig9:20150726121346p:plain

ルータは全台、以下を利用しています。

対象 メーカー OS バージョン
ルータ 1 〜 5 Mikrotik RouterOS 6.30.1

R1 のコンフィグ

R1 では 10.0.0.0/8 という経路を生成して BGP で広告しています。

/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 のコンフィグ

/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 のコンフィグ

/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 のルーティングテーブル

[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」が存在しません。

[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」が存在しません。

[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 側で特別な設定は必要ありません。

f:id:sig9:20150726184631p:plain

R1 のルーティングテーブル

R1 での経路の見え方に変化はありません。

[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 から学習出来るようになりました。

[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 という経路を学習出来るようになりました。

[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 に設定しても、特に問題無く動作するようです。