OSPF max-metric wait-for bgp のはなし

7月にあった Janog30 meeting のプログラム さあ、IGPの話をしよう! であった OSPF max-metric wait-for bgp の話について。

はい。勉強不足でした。知りませんでした…。ということでどんなものなのか試してみました。

参考資料

環境構成

Cisco の資料にあわせてこんな環境を組んでみます。

  • exprtr1-4: Cisco 1812J, IOS: 15.1(4)M2, advipservices


(図をクリックするとオリジナルサイズで表示)

基本設定

まず、そもそも "ospf max-metric wait-for bgp" が何をするものなのかというところ。

  • IGP(OSPF) と BGP は収束するのに時間差がある。
  • OSPF が収束しても BGP が収束していないとブラックホールが発生することがある。
  • BGP が収束するまで OSPF の cost を max にしておくことで、そのルータにパケットが流れ込んでブラックホールに吸い込まれるのを防ぐことができる。

まあこの辺の詳細は上に上げた参考資料を見てもらうとして。今回のテストではまず

  1. 何もしないとブラックホールが発生する
  2. "max-metric wait-for bgp" を使うことでブラックホール発生を回避することができる

という点を見ていきたいわけです。ということで、ブラックホールを発生させるための設定としてこんな感じにします。

  • pc05(10.0.40.2) → pc02(10.1.1.1) への通信を考える。
    • 10.1.0.0/30 は rtr1 の ospf で redistribute connected して IGP に入れてしまうと、OSPF だけで通信できてしまうので、BGP に依存するように 1 つ中にしておきます。
  • AS64600 は AS64601 からフルルートをもらう。
    • bgpsimple で フルルートを流します。その際、10.1.0.0/16 を含めて流すように、レコードを追加しておきます。*1
stereocat@pc02:~/bgpsimple$ head myroutes -n1
TABLE_DUMP2|1331388000|B|10.1.0.2|2497|10.1.0.0/16|64601|IGP|10.1.0.2|0|0||NAG||
stereocat@pc02:~/bgpsimple$
  • OSPF のコストを調節して、pc05 → AS64601 の通信は通常 exprtr3 を経由するようにします。
    • exprtr3 の再起動で OSPF および BGP の経路の再計算を発生させ、ブラックホールが発生するかどうかを確認します。
  • OSPF と BGP の収束時間に差があったほうがよりわかりやすいので、タイマを以下のように設定します。
    • OSPF Hello:1sec, Dead:3sec
    • BGP KeepAlive:60sec, Hold:180sec (default)

コンフィグサンプルとして exprtr1 (eBGP router) と exprtr4 のコンフィグを載せておきます。

  • exprtr1
!
 hostname exprtr1
!
interface Loopback0
 ip address 10.0.0.1 255.255.255.255
!
interface Vlan712
 ip address 10.0.12.1 255.255.255.252
 ip ospf cost 10
 ip ospf dead-interval 3
 ip ospf hello-interval 1
!
interface Vlan713
ip address 10.0.13.1 255.255.255.252
 ip ospf cost 1
 ip ospf dead-interval 3
 ip ospf hello-interval 1
!
interface Vlan911
 ip address 10.1.0.2 255.255.255.252
!
router ospf 64600
 router-id 10.0.0.1
 redistribute connected subnets
 redistribute static subnets
 passive-interface default
 no passive-interface Vlan712
 no passive-interface Vlan713
 no passive-interface Vlan911
 network 10.0.0.1 0.0.0.0 area 0
 network 10.0.12.0 0.0.0.3 area 0
 network 10.0.13.0 0.0.0.3 area 0
!
router bgp 64600
 bgp router-id 10.0.0.1
 bgp log-neighbor-changes
 neighbor 10.0.0.2 remote-as 64600
 neighbor 10.0.0.2 update-source Loopback0
 neighbor 10.0.0.3 remote-as 64600
 neighbor 10.0.0.3 update-source Loopback0
 neighbor 10.0.0.4 remote-as 64600
 neighbor 10.0.0.4 update-source Loopback0
 neighbor 10.1.0.1 remote-as 64601
 neighbor 10.1.0.1 update-source Vlan911
 neighbor 10.1.0.1 timers 60 600
 !
 address-family ipv4
  neighbor 10.0.0.2 activate
  neighbor 10.0.0.2 next-hop-self
  neighbor 10.0.0.2 soft-reconfiguration inbound
  neighbor 10.0.0.3 activate
  neighbor 10.0.0.3 next-hop-self
  neighbor 10.0.0.3 soft-reconfiguration inbound
  neighbor 10.0.0.4 activate
  neighbor 10.0.0.4 next-hop-self
  neighbor 10.0.0.4 soft-reconfiguration inbound
  neighbor 10.1.0.1 activate
  neighbor 10.1.0.1 soft-reconfiguration inbound
 exit-address-family
!
  • exprtr4
!
 hostname exprtr4
!
interface Loopback0
 ip address 10.0.0.4 255.255.255.255
!
interface Vlan724
 ip address 10.0.24.2 255.255.255.252
 ip ospf cost 10
 ip ospf dead-interval 3
 ip ospf hello-interval 1
!
interface Vlan734
 ip address 10.0.34.2 255.255.255.252
 ip ospf cost 1
 ip ospf dead-interval 3
 ip ospf hello-interval 1
!
interface Vlan912
 ip address 10.0.40.1 255.255.255.0
!
router ospf 64600
 router-id 10.0.0.4
 redistribute connected subnets
 redistribute static subnets
 passive-interface default
 no passive-interface Vlan724
 no passive-interface Vlan734
 no passive-interface Vlan912
 network 10.0.0.4 0.0.0.0 area 0
 network 10.0.24.0 0.0.0.3 area 0
 network 10.0.34.0 0.0.0.3 area 0
!
router bgp 64600
 bgp router-id 10.0.0.4
 bgp log-neighbor-changes
 neighbor 10.0.0.1 remote-as 64600
 neighbor 10.0.0.1 update-source Loopback0
 neighbor 10.0.0.2 remote-as 64600
 neighbor 10.0.0.2 update-source Loopback0
 neighbor 10.0.0.3 remote-as 64600
 neighbor 10.0.0.3 update-source Loopback0
 !
 address-family ipv4
  neighbor 10.0.0.1 activate
  neighbor 10.0.0.1 soft-reconfiguration inbound
  neighbor 10.0.0.2 activate
  neighbor 10.0.0.2 soft-reconfiguration inbound
  neighbor 10.0.0.3 activate
  neighbor 10.0.0.3 soft-reconfiguration inbound
 exit-address-family
!

確認: コスト設定前後の経路

一応、確認として、コスト設定する前と後での OSPF の経路を見ておきます。

  • コスト設定なし(default)
exprtr4#sh ip route ospf
Load for five secs: 0%/0%; one minute: 1%; five minutes: 1%
Time source is NTP, 16:42:35.813 JST Sun Jul 15 2012

Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       + - replicated route, % - next hop override

Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 14 subnets, 4 masks
O        10.0.0.1/32 [110/3] via 10.0.34.1, 00:25:22, Vlan734
                     [110/3] via 10.0.24.1, 00:17:07, Vlan724
O        10.0.0.2/32 [110/2] via 10.0.24.1, 00:17:07, Vlan724
O        10.0.0.3/32 [110/2] via 10.0.34.1, 00:00:05, Vlan734
O        10.0.12.0/30 [110/2] via 10.0.24.1, 00:17:07, Vlan724
O        10.0.13.0/30 [110/2] via 10.0.34.1, 00:25:22, Vlan734
O E2     10.1.0.0/30 [110/20] via 10.0.34.1, 00:25:22, Vlan734
                     [110/20] via 10.0.24.1, 00:17:07, Vlan724
exprtr4#
  • コスト設定後
exprtr4#sh ip route ospf
Load for five secs: 0%/0%; one minute: 1%; five minutes: 1%
Time source is NTP, 16:42:35.813 JST Sun Jul 15 2012

(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 14 subnets, 4 masks
O        10.0.0.1/32 [110/3] via 10.0.34.1, 00:31:59, Vlan734
O        10.0.0.2/32 [110/11] via 10.0.24.1, 00:00:34, Vlan724
O        10.0.0.3/32 [110/2] via 10.0.34.1, 00:06:42, Vlan734
O        10.0.12.0/30 [110/11] via 10.0.24.1, 00:00:34, Vlan724
O        10.0.13.0/30 [110/2] via 10.0.34.1, 00:31:59, Vlan734
O E2     10.1.0.0/30 [110/20] via 10.0.34.1, 00:31:59, Vlan734
exprtr4#

exprtr4 から exprtr1(10.0.0.1/32), AS間境界セグメント(10.1.0.0/30) への経路が、コスト設定前だと等コストになっていて(なので ECMP される)、コスト設定後は exprtr3 側に寄せられるということがわかります。あたりまえですね。

テスト1: ブラックホールルーティングの発生

以下、各ルータおよびサーバは NTP でタイムスタンプを合わせてあります(コマンド実行タイミングによって若干ズレがあるかもしれませんが)。タイミングに注意してください。

上記のコンフィグ (max-metric wait-for bgp なしの状態) で pc05(10.0.40.2) → pc01(10.1.1.1) に ping/traceroute を撃ちながら exprtr3 を reboot してみます。

exprtr3 再起動前
  • exprtr4
exprtr4# sh ip route ospf
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 14 subnets, 4 masks
O        10.0.0.1/32 [110/3] via 10.0.34.1, 01:17:26, Vlan734
O        10.0.0.2/32 [110/11] via 10.0.24.1, 02:29:15, Vlan724
O        10.0.0.3/32 [110/2] via 10.0.34.1, 01:19:32, Vlan734
O        10.0.12.0/30 [110/11] via 10.0.24.1, 02:29:15, Vlan724
O        10.0.13.0/30 [110/2] via 10.0.34.1, 01:17:26, Vlan734
O E2     10.1.0.0/30 [110/20] via 10.0.34.1, 01:17:26, Vlan734
exprtr4#
  • pc05
    • 定期 traceroute 実行
stereocat@pc05:/etc$ while [ 1 ]; do echo "## $(date)"; traceroute -m 8 10.1.1.1; echo ''; done
## Sun Jul 29 16:36:21 JST 2012
traceroute to 10.1.1.1 (10.1.1.1), 8 hops max, 60 byte packets
1  10.0.40.1 (10.0.40.1)  1.210 ms  1.202 ms  1.363 ms
2  10.0.34.1 (10.0.34.1)  1.247 ms  1.354 ms  1.633 ms
3  10.0.13.1 (10.0.13.1)  1.583 ms  1.724 ms  1.820 ms
4  10.1.1.1 (10.1.1.1)  1.526 ms  1.549 ms  1.545 ms
(略)
    • ping with timestamp (1ping/sec)
stereocat@pc05:~$ ping 10.1.1.1 | while read pong; do echo "$(date): $pong"; done
Sun Jul 29 16:36:37 JST 2012: PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
Sun Jul 29 16:36:37 JST 2012: 64 bytes from 10.1.1.1: icmp_req=1 ttl=61 time=1.18 ms
Sun Jul 29 16:36:38 JST 2012: 64 bytes from 10.1.1.1: icmp_req=2 ttl=61 time=0.943 ms
Sun Jul 29 16:36:39 JST 2012: 64 bytes from 10.1.1.1: icmp_req=3 ttl=61 time=0.974 ms
(略)

exprtr4 の持つ経路にしたがって、exprtr3 経由で通信が行われます。

exprtr3 再起動実行(停止)

単純に停止する場合は OSPF で速やかに経路が切り替わって特に問題は発生しません。

  • exprtr3
exprtr3#sh clock
Load for five secs: 0%/0%; one minute: 15%; five minutes: 8%
Time source is NTP, 16:37:19.131 JST Sun Jul 29 2012

16:37:19.131 JST Sun Jul 29 2012
exprtr3#reload
Proceed with reload? [confirm]

Jul 29 16:37:22.068 JST: %SYS-5-RELOAD: Reload requested by console. Reload Reason: Reload Command.
  • pc05
    • traceroute (exprtr3 経由 → exprtr2 経由へ切り替わる)
## Sun Jul 29 16:37:23 JST 2012
traceroute to 10.1.1.1 (10.1.1.1), 8 hops max, 60 byte packets
1  10.0.40.1 (10.0.40.1)  0.903 ms  0.983 ms  1.124 ms
2  10.0.34.1 (10.0.34.1)  194.360 ms  194.374 ms  194.414 ms
3  10.0.13.1 (10.0.13.1)  1.267 ms  1.410 ms  1.822 ms
4  * * *
5  * * *
6  * * *
7  * * *
8  * * *

## Sun Jul 29 16:37:28 JST 2012
traceroute to 10.1.1.1 (10.1.1.1), 8 hops max, 60 byte packets
1  10.0.40.1 (10.0.40.1)  187.577 ms  187.697 ms  187.662 ms
2  10.0.24.1 (10.0.24.1)  1.175 ms  1.359 ms  1.549 ms
3  10.0.12.1 (10.0.12.1)  1.439 ms  1.563 ms  1.726 ms
4  10.1.1.1 (10.1.1.1)  1.352 ms  1.348 ms  1.385 ms
exprtr3 起動

問題は起動するとき、OSPF は収束したが BGP はまだ収束していない状況です。

exprtr3 は起動時に以下のように 物理I/F → 論理I/F(SVI) → OSPF → BGP の順でアップしていきます。OSPF についてはタイマがかなり短く設定されていること、OSPF(IGP) の経路数自体は少ないことから数秒で収束が終わります。

  • exprtr3 (起動時にタイムスタンプがずれている…)
*Jul 29 17:04:56.747 JST: %SYS-5-RESTART: System restarted --
Cisco IOS Software, C181X Software (C181X-ADVIPSERVICESK9-M), Version 15.1(4)M2,
RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2011 by Cisco Systems, Inc.
Compiled Mon 26-Sep-11 22:38 by prod_rel_team
*Jul 29 17:04:56.751 JST: %SNMP-5-COLDSTART: SNMP agent on host exprtr3 is undergoing a cold start
*Jul 29 17:04:56.763 JST: %SYS-6-BOOTTIME: Time taken to reboot after reload =   83 seconds
*Jul 29 17:04:56.787 JST: %CRYPTO-6-ISAKMP_ON_OFF: ISAKMP is OFF
*Jul 29 17:04:56.787 JST: %CRYPTO-6-GDOI_ON_OFF: GDOI is OFF
*Jul 29 17:04:57.068 JST: %DTP-5-TRUNKPORTON: Port Fa2 has become dot1q trunk
*Jul 29 17:04:57.744 JST: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet2, changed state to up
*Jul 29 17:04:57.744 JST: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet3, changed state to down
*Jul 29 17:04:57.744 JST: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet4, changed state to down
*Jul 29 17:04:57.744 JST: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet5, changed state to down
exprtr3#
*Jul 29 17:05:27.740 JST: %LINEPROTO-5-UPDOWN: Line protocol on Interface Vlan1, changed state to up
*Jul 29 17:05:27.740 JST: %LINEPROTO-5-UPDOWN: Line protocol on Interface Vlan713, changed state to up
*Jul 29 17:05:27.744 JST: %LINEPROTO-5-UPDOWN: Line protocol on Interface Vlan734, changed state to up
exprtr3#
*Jul 29 17:05:28.744 JST: %OSPF-5-ADJCHG: Process 64600, Nbr 10.0.0.4 on Vlan734 from LOADING to FULL, Loading Done
exprtr3#
*Jul 29 17:05:32.384 JST: %OSPF-5-ADJCHG: Process 64600, Nbr 10.0.0.1 on Vlan713 from LOADING to FULL, Loading Done
exprtr3#
*Jul 29 17:05:38.464 JST: %BGP-5-ADJCHANGE: neighbor 10.0.0.4 Up
*Jul 29 17:05:38.780 JST: %BGP-5-ADJCHANGE: neighbor 10.0.0.1 Up
*Jul 29 17:05:38.784 JST: %BGP-5-ADJCHANGE: neighbor 10.0.0.2 Up
exprtr3#
exprtr3#sh ip route ospf
Load for five secs: 57%/1%; one minute: 8%; five minutes: 2%
Time source is NTP, *17:05:46.412 JST Sun Jul 29 2012
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 12 subnets, 3 masks
O        10.0.0.1/32 [110/2] via 10.0.13.1, 00:00:13, Vlan713
O        10.0.0.2/32 [110/12] via 10.0.34.2, 00:00:13, Vlan734
                     [110/12] via 10.0.13.1, 00:00:13, Vlan713
O        10.0.0.4/32 [110/2] via 10.0.34.2, 00:00:13, Vlan734
O        10.0.12.0/30 [110/11] via 10.0.13.1, 00:00:13, Vlan713
O        10.0.24.0/30 [110/11] via 10.0.34.2, 00:00:13, Vlan734
O E2     10.0.40.0/24 [110/20] via 10.0.34.2, 00:00:13, Vlan734
O E2     10.1.0.0/30 [110/20] via 10.0.13.1, 00:00:13, Vlan713
exprtr3#sh ip route 10.1.1.1
Load for five secs: 99%/4%; one minute: 15%; five minutes: 3%
Time source is NTP, *17:05:48.500 JST Sun Jul 29 2012

% Subnet not in table
exprtr3#

いま、BGP はフルルートを流しているので、経路数が多く、1812J での処理には分単位でかかります。そのため、BGP ネイバが Up になった直後は、OSPF の収束が終わっていても BGP の収束が終わっておらず、AS65601 の経路 (10.1.1.1) についてはまだルーティングテーブルには現れていません。

ちなみに今回流した経路数は 39万経路弱です。

exprtr4#sh bgp ipv4 unicast summary
(略)
Neighbor        V           AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.0.0.1        4        64600  209588      43   407715    0    0 00:37:44   387801
10.0.0.2        4        64600      44      44   407715    0    0 00:37:47        0
10.0.0.3        4        64600      43      44   407715    0    0 00:37:38        0
exprtr4#

いま、exprtr1 (eBGP border router) では next-hop self して外部の経路を iBGP に流しているので、exprtr4 は 10.1.1.1 へのパケットを exprtr1 (10.0.0.1) 向けに流そうとします。

  • exprtr4 (iBGP: neighbor exprtr3 up 直後)
exprtr4#
Jul 29 16:39:26.408 JST: %BGP-5-ADJCHANGE: neighbor 10.0.0.3 Up
exprtr4#
exprtr4#sh ip route ospf
Load for five secs: 14%/0%; one minute: 18%; five minutes: 11%
Time source is NTP, 16:39:41.517 JST Sun Jul 29 2012
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 14 subnets, 4 masks
O        10.0.0.1/32 [110/3] via 10.0.34.1, 00:00:20, Vlan734
O        10.0.0.2/32 [110/11] via 10.0.24.1, 00:26:05, Vlan724
O        10.0.0.3/32 [110/2] via 10.0.34.1, 00:00:20, Vlan734
O        10.0.12.0/30 [110/12] via 10.0.34.1, 00:00:20, Vlan734
O        10.0.13.0/30 [110/2] via 10.0.34.1, 00:00:20, Vlan734
O E2     10.1.0.0/30 [110/20] via 10.0.34.1, 00:00:20, Vlan734
exprtr4#sh ip route 10.1.1.1
Load for five secs: 100%/0%; one minute: 26%; five minutes: 13%
Time source is NTP, 16:39:48.997 JST Sun Jul 29 2012

Routing entry for 10.1.0.0/16
  Known via "bgp 64600", distance 200, metric 0
  Tag 64601, type internal
  Last update from 10.0.0.1 00:25:13 ago
  Routing Descriptor Blocks:
  * 10.0.0.1, from 10.0.0.1, 00:25:13 ago
      Route metric is 0, traffic share count is 1
      AS Hops 2
      Route tag 64601
      MPLS label: none
exprtr4#

OSPF はすでに収束が終わっているので、exprtr1(10.0.0.1) は exprtr3(10.0.34.1) 経由で見えます。そのため exprtr4 で pc05 → pc02(AS64601) への通信が exprtr3 に振られるものの、exprtr3 で BGP の経路収束が完了しておらず、ブラックホールが発生します。

ブラックホール発生前後の通信の様子 (70秒ちょっと、ブラックホールが発生している)

Sun Jul 29 16:39:18 JST 2012: 64 bytes from 10.1.1.1: icmp_req=162 ttl=61 time=1.04 ms
Sun Jul 29 16:39:19 JST 2012: 64 bytes from 10.1.1.1: icmp_req=163 ttl=61 time=0.960 ms
Sun Jul 29 16:39:20 JST 2012: 64 bytes from 10.1.1.1: icmp_req=164 ttl=61 time=0.959 ms
Sun Jul 29 16:39:21 JST 2012: From 10.0.34.1 icmp_seq=165 Destination Host Unreachable
Sun Jul 29 16:39:22 JST 2012: From 10.0.34.1 icmp_seq=166 Destination Host Unreachable
Sun Jul 29 16:39:23 JST 2012: From 10.0.34.1 icmp_seq=167 Destination Host Unreachable
(略)
Sun Jul 29 16:40:33 JST 2012: From 10.0.34.1 icmp_seq=237 Destination Host Unreachable
Sun Jul 29 16:40:34 JST 2012: From 10.0.34.1 icmp_seq=238 Destination Host Unreachable
Sun Jul 29 16:40:36 JST 2012: From 10.0.34.1 icmp_seq=240 Destination Host Unreachable
Sun Jul 29 16:40:37 JST 2012: 64 bytes from 10.1.1.1: icmp_req=241 ttl=61 time=1.13 ms
Sun Jul 29 16:40:38 JST 2012: 64 bytes from 10.1.1.1: icmp_req=242 ttl=61 time=1.01 ms
Sun Jul 29 16:40:39 JST 2012: 64 bytes from 10.1.1.1: icmp_req=243 ttl=61 time=1.07 ms
## Sun Jul 29 16:39:20 JST 2012
traceroute to 10.1.1.1 (10.1.1.1), 8 hops max, 60 byte packets
1  10.0.40.1 (10.0.40.1)  0.956 ms  1.070 ms  1.245 ms
2  10.0.24.1 (10.0.24.1)  1.145 ms  1.271 ms  1.513 ms
3  10.0.12.1 (10.0.12.1)  1.357 ms  1.538 ms  1.682 ms
4  10.1.1.1 (10.1.1.1)  1.385 ms  1.380 ms  1.374 ms

## Sun Jul 29 16:39:20 JST 2012
traceroute to 10.1.1.1 (10.1.1.1), 8 hops max, 60 byte packets
1  10.0.40.1 (10.0.40.1)  0.862 ms  0.982 ms  1.193 ms
2  10.0.24.1 (10.0.24.1)  1.000 ms  1.167 ms  1.332 ms
3  10.0.12.1 (10.0.12.1)  1.164 ms  1.319 ms  1.396 ms
4  * * *
5  * * *
6  * * *
7  * * *
8  * * *
## Sun Jul 29 16:40:35 JST 2012
traceroute to 10.1.1.1 (10.1.1.1), 8 hops max, 60 byte packets
1  10.0.40.1 (10.0.40.1)  0.867 ms  0.995 ms  1.162 ms
2  10.0.34.1 (10.0.34.1)  139.050 ms  139.062 ms  139.198 ms
3  10.0.34.1 (10.0.34.1)  139.347 ms !H * *

## Sun Jul 29 16:40:40 JST 2012
traceroute to 10.1.1.1 (10.1.1.1), 8 hops max, 60 byte packets
1  10.0.40.1 (10.0.40.1)  1.266 ms  1.269 ms  1.261 ms
2  10.0.34.1 (10.0.34.1)  330.124 ms  330.299 ms  330.445 ms
3  10.0.13.1 (10.0.13.1)  1.538 ms  1.719 ms  1.813 ms
4  10.1.1.1 (10.1.1.1)  1.515 ms  1.508 ms  1.500 ms

テスト2: ブラックホールルーティングの回避

再起動時、OSPF/BGP の収束時間の違いによってブラックホールが発生しうるということが分かったので、次は "ospf max-metric wait-for bgp" による回避策の動作確認をします。以下のコマンドを各ルータに設定します。

router ospf 64600
 max-metric router-lsa on-startup wait-for-bgp

exprtr3 停止時については同様なので省略します。起動時どうなるかが問題。結論を先に書くと、exprtr3 の再起動〜経路収束の過程で、pc05 では通信断は起こりませんでした。

exprtr3 起動
  • exprtr3 (起動時にタイムスタンプがずれている…)
exprtr3#
*Jul 29 17:52:37.720 JST: %BGP-5-ADJCHANGE: neighbor 10.0.0.2 Up
exprtr3#
*Jul 29 17:52:39.144 JST: %BGP-5-ADJCHANGE: neighbor 10.0.0.1 Up
exprtr3#
exprtr3#
exprtr3#sh ip route ospf
Load for five secs: 69%/2%; one minute: 9%; five minutes: 2%
Time source is NTP, *17:52:42.756 JST Sun Jul 29 2012
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 12 subnets, 3 masks
O        10.0.0.1/32 [110/65536] via 10.0.13.1, 00:00:08, Vlan713
O        10.0.0.2/32 [110/65546] via 10.0.34.2, 00:00:08, Vlan734
                     [110/65546] via 10.0.13.1, 00:00:08, Vlan713
O        10.0.0.4/32 [110/65536] via 10.0.34.2, 00:00:08, Vlan734
O        10.0.12.0/30 [110/65545] via 10.0.13.1, 00:00:08, Vlan713
O        10.0.24.0/30 [110/65545] via 10.0.34.2, 00:00:08, Vlan734
O E2     10.0.40.0/24 [110/20] via 10.0.34.2, 00:00:08, Vlan734
O E2     10.1.0.0/30 [110/20] via 10.0.13.1, 00:00:08, Vlan713
exprtr3#
*Jul 29 17:52:41.996 JST: %BGP-5-ADJCHANGE: neighbor 10.0.0.4 Up
exprtr3#sh ip route 10.1.1.1
Load for five secs: 69%/2%; one minute: 9%; five minutes: 2%
Time source is NTP, *17:52:44.916 JST Sun Jul 29 2012

% Subnet not in table
exprtr3#

起動直後、OSPF の収束が終わっても BGP の収束に時間がかかっているというのは変わりません。テスト2 では、テスト1 と違って、exprtr3 は BGP の計算中にすべてのOSPFパスコストが 65536 (max-metric) になっていることが分かります。そのため、OSPF の収束が終わったからと言ってすぐに exprtr3 がパケットを吸い込むことがありません。BGP が収束するまでは max-metric が維持されるため、exprtr2 経由のままで変化しません。exprtr3 の BGP の収束が終わると、OSPF パスコストはコンフィグ上設定された値に変化し、pc05 の通信は exprtr3 経由のルートを流れます。BGP の収束が完了した後でコストを戻すため、ブラックホールが発生しません。

  • exprtr4 (iBGP: neighbor exprtr3 up 直後)
exprtr4#
Jul 29 17:26:30.131 JST: %BGP-5-ADJCHANGE: neighbor 10.0.0.3 Up
exprtr4#
exprtr4#sh ip route ospf
Load for five secs: 7%/0%; one minute: 13%; five minutes: 10%
Time source is NTP, 17:26:42.907 JST Sun Jul 29 2012
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 14 subnets, 4 masks
O        10.0.0.1/32 [110/21] via 10.0.24.1, 00:02:13, Vlan724
O        10.0.0.2/32 [110/11] via 10.0.24.1, 01:13:06, Vlan724
O        10.0.0.3/32 [110/2] via 10.0.34.1, 00:00:20, Vlan734
O        10.0.12.0/30 [110/20] via 10.0.24.1, 00:02:13, Vlan724
O        10.0.13.0/30 [110/21] via 10.0.24.1, 00:02:13, Vlan724
O E2     10.1.0.0/30 [110/20] via 10.0.24.1, 00:02:13, Vlan724
exprtr4#sh ip route 10.1.1.1
Load for five secs: 100%/0%; one minute: 20%; five minutes: 11%
Time source is NTP, 17:26:50.392 JST Sun Jul 29 2012

Routing entry for 10.1.0.0/16
  Known via "bgp 64600", distance 200, metric 0
  Tag 64601, type internal
  Last update from 10.0.0.1 01:12:14 ago
  Routing Descriptor Blocks:
  * 10.0.0.1, from 10.0.0.1, 01:12:14 ago
      Route metric is 0, traffic share count is 1
      AS Hops 2
      Route tag 64601
      MPLS label: none
exprtr4#

BGP 収束完了まで max-metric が設定されるため、テスト1の場合とちがって、この時点ではまだ exprtr1(10.0.0.1/32) が exprtr2(10.0.24.1) 経由になっていることがわかります。

最終的に経路が切り替わったタイミングは exprtr3-exprtr4 の neighbor が up した時点(17:26:30)から約2分後でした。

  • pc05
    • traceroute
## Sun Jul 29 17:28:31 JST 2012
traceroute to 10.1.1.1 (10.1.1.1), 8 hops max, 60 byte packets
1  10.0.40.1 (10.0.40.1)  1.024 ms  1.065 ms  1.286 ms
2  10.0.24.1 (10.0.24.1)  1.100 ms  1.267 ms  1.487 ms
3  10.0.12.1 (10.0.12.1)  1.429 ms  1.585 ms  1.720 ms
4  10.1.1.1 (10.1.1.1)  1.322 ms  1.321 ms  1.318 ms

## Sun Jul 29 17:28:31 JST 2012
traceroute to 10.1.1.1 (10.1.1.1), 8 hops max, 60 byte packets
1  10.0.40.1 (10.0.40.1)  0.898 ms  0.897 ms  1.021 ms
2  10.0.24.1 (10.0.24.1)  0.964 ms  1.113 ms  1.289 ms
3  10.0.12.1 (10.0.12.1)  1.103 ms  1.255 ms  1.379 ms
4  * * *
5  * * *
6  * * *
7  * * *
8  * * *

## Sun Jul 29 17:28:36 JST 2012
traceroute to 10.1.1.1 (10.1.1.1), 8 hops max, 60 byte packets
1  10.0.40.1 (10.0.40.1)  0.882 ms  1.047 ms  1.134 ms
2  10.0.34.1 (10.0.34.1)  88.672 ms  88.720 ms  88.870 ms
3  10.0.13.1 (10.0.13.1)  1.296 ms  1.429 ms  1.614 ms
4  10.1.1.1 (10.1.1.1)  1.512 ms  1.508 ms  1.540 ms

まとめ

"ospf max-metric wait-for bgp" によって OSPF/BGP の収束時間の差によって発生するブラックホールルーティングを回避できることを確認しました。今回、Cisco 1812J を使っているのですが、1812J は30万経路以上の大量のフルルートを扱うには CPU が弱く、収束時間の差がより現れやすいという副作用もありました。逆に言えば、1812J くらいのマシンパワーの機材でも、"wait-for bgp" を使うことによって、再起動時の経路切り替えの影響をほぼなくすことができる、ということでもあるかと思います。キャリアネットワークでは IGP のベストプラクティスでしょう。そりゃ推奨するわこれは…。

[追記](2012-08-06)

@yukihirokikuchi さんから Brocade について教えてもらったので追記しておきます。

*1:フルルート注入については BGP Route Injection Tool(2) を参照。