あるインターフェースがUP/DOWNを繰り返すと、いつまで待ってもルート計算が収束しません。このようなフラッピング対策として、UP/DOWNするルートに対してペナルティ値という概念を適用する設定があります。
概要
広域網を実装するのにあたり、flappingを考慮する必要があります。flappingとはinterfaceが短期間でup/downを繰り返す現象です。flappingが発生すると、経路計算を繰り返す状態になってしまい、CPU上昇を引き起こすだけでなく、最悪の場合、全断につながる事もあります。
このページではflapping対策についてまとめます。
コマンド一覧
このシナリオで重要なコマンド一覧は以下の通りです。
Router(config)# interface <interface> Router(config-if)# carrier-delay {[ <sec> | msec <msec> }] Router(config)# interface <interface> Router(config-if)# dampening <half-life> <resume> <suppress> <max_minute> [ restart ≤penalty> ] Router(config)# router bgp <as> Router(config-router)# bgp dampening <half-life> <resume> <suppress> <max_minute> Router(config)# route-map <route-map> Router(config-route-map)# match <condition> Router(config-route-map)# set dampening <half-life> <resume> <suppress> <max_minute> Router(config)# router bgp <as> Router(config-router)# bgp route-map <route-map> Router(config)# router ospf <proc> Router(config-router)# max-metric router-lsa on-startup [ summary-lsa ] [ external-lsa ] [ include-stub ] [{ <minute> | wait-for-bgp }]
構成図
以下の構成で動作確認を行います。R2, R3はPEルータでBGPとNATが実装されています。R1, R2, R3はOSPFによってルーティングされています。
e0/0 e0/1 .2+--------+.2 ┌--+ R2 +--┐ +--------+ │ +--------+ │ +--------+ | ISP1 +----┤ ├----+ R4 | +--------+.1 │ +--------+ │ .4+--------+ e0/0 └--+ R3 +--┘ e0/1 .3+--------+.3 e0/0 e0/1 155.1.123.0/24 192.168.234.0/24 R1 Loopback0 R2 Loopback0 R3 Loopback0 R4 Loopback0 150.1.1.1/32 10.2.2.2/32 10.3.3.3/32 10.4.4.4/32
[R1] interface Loopback100 ip address 30.0.0.1 255.255.255.255 ! interface Loopback101 ip address 30.1.0.1 255.255.255.255 ! interface Loopback102 ip address 30.2.0.1 255.255.255.255 ! interface Loopback103 ip address 30.3.0.1 255.255.255.255 ! router bgp 100 network 30.0.0.1 mask 255.255.255.255 network 30.1.0.1 mask 255.255.255.255 network 30.2.0.1 mask 255.255.255.255 network 30.3.0.1 mask 255.255.255.255 neighbor 155.1.123.2 remote-as 230 neighbor 155.1.123.3 remote-as 230 [R2] router ospf 1 redistribute bgp 230 subnets network 10.2.2.2 0.0.0.0 area 0 network 192.168.234.2 0.0.0.0 area 0 ! router bgp 230 neighbor 155.1.123.1 remote-as 100 neighbor 192.168.234.3 remote-as 230 no auto-summary [R3] router ospf 1 redistribute bgp 230 subnets network 10.3.3.3 0.0.0.0 area 0 network 192.168.234.3 0.0.0.0 area 0 ! router bgp 230 neighbor 155.1.123.1 remote-as 100 neighbor 192.168.234.2 remote-as 230 no auto-summary [R4] router ospf 1 network 10.4.4.4 0.0.0.0 area 0 network 192.168.234.4 0.0.0.0 area 0
設定全文は下記ファイルです。詳細設定は下記を参照ください。
仕様説明
carrier delay
carrier delayは、flapping対策としてinterfaceがup/downする状態になるまでの遅延時間です。carrier delayはデフォルトで2秒に設定されており、言い換えれば、2秒以内のup/downならばinterfaceの状態が変わらないという事です。
以下のコマンドでcarrier delayを変更する事ができます。長めに設定すればflappingに強くなり、短めに設定すればconvergenceが早くなります。なお、carrier delayを短く設定する場合は、flapping対策としてdampeningと併用する事が推奨されます。
Router(config)# interface <interface> Router(config-if)# carrier-delay {[ <sec> | msec <msec> }]
interface dampening
dampeningはpenalty値という概念を用いてflappingを検知する機能です。リンクのup/downが発生するたびにpenalty値を加算し、ある一定の閾値を超えた時点でflappingが発生したと判定します。
dampeningは以下4つのパラメータを用いて設定します。これらパラメータはヘルプストリングを読めば分かる情報なので暗記する必要はございません。しかし、一回のリンクup/downで加算されるpenalty値が1000である事はヘルプストリングに書かれていませんので、暗記しておいた方が無難です。
パラメータ | 説明 |
---|---|
half-life-period | penalty値の半減期です。指定時間経過でpenalty値が半分になります。 |
reuse-threshold | penalty値がこの閾値を下回ると、再度、パケットが転送されるようになります。 |
suppress-threshold | penalty値がこの閾値を超過するとパケットが転送されなくなります。 |
max-suppress | penalty値上限の定義です。 interfaceをsuppressする時間の上限をminuteで指定します。 |
restart | OS起動時のpenalty値を定義し、 OS起動直後にinterfacが有効にならないようにします。 |
dampeningを定義するには以下コマンドをinterfaceに投入します。
Router(config)# interface <interface> Router(config-if)# dampening <half-life> <resume> <suppress> <max_minute> [ restart ≤penalty> ]
BGP dampening
BGP prefixもdampeningを定義する事ができます。以下のコマンドでBGP prefix全てに対してdampeningを設定する事ができます。
Router(config)# router bgp <as> Router(config-router)# bgp dampening <half-life> <resume> <suppress> <max_minute>
以下のようなroute-mapを作成すれば、dampeningの対象とするprefixを限定する事もできます。
Router(config)# route-map <route-map> Router(config-route-map)# match <condition> Router(config-route-map)# set dampening <half-life> <resume> <suppress> <max_minute> Router(config)# router bgp <as> Router(config-router)# bgp route-map <route-map>
OSPF max metric
ルータ起動直後は、ルーティングがconvergenceしておらず通信が不安定になるリスクがあります。OSPFには、ルータ起動直後のみmetricを最大にする事で、起動直後のルータを経由しないようにする機能があります。以下のコマンドで、router lsaのmetricを最大にする事ができます。metricを最大にする時間は<minute>で指定するかBGP convergenceが完了するまでにするかを選択できます。
Router(config-router)# max-metric router-lsa on-startup [{ <minute> | wait-for-bgp }]
ABR, ASBRの場合は、以下のキーワードでsummary lsa, external lsaのmetricも最大化する事ができます。また、include-stubキーワードでstub network(Loopback addressなど)もmetricの最大化が可能です。
Router(config-router)# max-metric router-lsa on-startup [ summary-lsa ] [ external-lsa ] [ include-stub ] <minute>
interface dampening
デフォルトの動作確認
動作確認のため、以下のようなloopback addressを作成します。
[R2] interface Loopback1 ip address 169.254.0.2 255.255.255.255
動作確認用のLoopbackをshutdownさせます。デフォルトの状態ではlink down検知の2秒後にinterfaceがdownしています。
[R2] R2#debug ip routing IP routing debugging is on R2#conf t Enter configuration commands, one per line. End with CNTL/Z. R2(config)# R2(config)#interface Loopback1 R2(config-if)#shutdown R2(config-if)# *Mar 1 00:06:46.259: RT: is_up: Loopback1 0 state: 6 sub state: 1 line: 0 has_route: True *Mar 1 00:06:46.263: RT: interface Loopback1 removed from routing table *Mar 1 00:06:46.267: RT: del 169.254.0.2/32 via 0.0.0.0, connected metric [0/0] *Mar 1 00:06:46.271: RT: delete subnet route to 169.254.0.2/32 *Mar 1 00:06:46.275: RT: NET-RED 169.254.0.2/32 *Mar 1 00:06:46.275: RT: delete network route to 169.254.0.0 *Mar 1 00:06:46.279: RT: NET-RED 169.254.0.0/16 *Mar 1 00:06:48.259: %LINK-5-CHANGED: Interface Loopback1, changed state to administratively down *Mar 1 00:06:48.267: RT: is_up: Loopback1 0 state: 6 sub state: 1 line: 0 has_route: False *Mar 1 00:06:49.259: %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback1, changed state to down *Mar 1 00:06:49.267: RT: is_up: Loopback1 0 state: 6 sub state: 1 line: 0 has_route: False R2(config-if)#
動作確認
carrier-delayを0秒に変更します。link down検知の直後にinterfaceがdownするようになりました。
[R2] R2(config)#interface Loopback1 R2(config-if)#carrier-delay msec 0 R2(config-if)#shutdown R2(config-if)# *Mar 1 00:08:19.355: RT: is_up: Loopback1 0 state: 6 sub state: 1 line: 0 has_route: True *Mar 1 00:08:19.359: RT: interface Loopback1 removed from routing table *Mar 1 00:08:19.363: RT: del 169.254.0.2/32 via 0.0.0.0, connected metric [0/0] *Mar 1 00:08:19.367: RT: delete subnet route to 169.254.0.2/32 *Mar 1 00:08:19.367: RT: NET-RED 169.254.0.2/32 *Mar 1 00:08:19.371: RT: delete network route to 169.254.0.0 *Mar 1 00:08:19.375: RT: NET-RED 169.254.0.0/16 *Mar 1 00:08:19.379: %LINK-5-CHANGED: Interface Loopback1, changed state to administratively down *Mar 1 00:08:19.391: RT: is_up: Loopback1 0 state: 6 sub state: 1 line: 0 has_route: False *Mar 1 00:08:20.379: %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback1, changed state to down *Mar 1 00:08:20.383: RT: is_up: Loopback1 0 state: 6 sub state: 1 line: 0 has_route: False R2(config-if)#
BGP dampening
設定投入
BGP dampeningの設定を行い、flappingがおきているprefixをBGP tableに載せないようにします。
[R2] router bgp 230 bgp dampening 1 400 800 3
動作確認
動作確認のため、リンクダウンをすぐに通知するようBGPの設定を変更します。
[ISP1] router bgp 100 neighbor 155.1.123.2 advertisement-interval 0 neighbor 155.1.123.3 advertisement-interval 0
ISP1には動作確認用のLoopback interfaceが予め作成されています。このinterfaceのup/downを繰り返し、flappingを再現させます。
[ISP1] ISP1(config)#interface range Loopback 100 - 103 ISP1(config-if-range)#carrier-delay 0 ISP1(config-if-range)#shutdown ISP1(config-if-range)# *Mar 1 00:20:28.439: %LINK-5-CHANGED: Interface Loopback100, changed state to administratively down *Mar 1 00:20:28.443: %LINK-5-CHANGED: Interface Loopback101, changed state to administratively down *Mar 1 00:20:28.447: %LINK-5-CHANGED: Interface Loopback102, changed state to administratively down *Mar 1 00:20:28.447: %LINK-5-CHANGED: Interface Loopback103, changed state to administratively down *Mar 1 00:20:29.435: %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback100, changed state to down *Mar 1 00:20:29.443: %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback101, changed state to down *Mar 1 00:20:29.447: %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback102, changed state to down *Mar 1 00:20:29.451: %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback103, changed state to down ISP1(config-if-range)#
R2において、flappingを検知している事を確認します。
[R2] R2#show ip bgp 30.0.0.1 BGP routing table entry for 30.0.0.1/32, version 138 Paths: (1 available, no best path) Flag: 0x820 Advertised to update-groups: 2 100 (history entry) 155.1.123.1 from 155.1.123.1 (150.1.1.1) Origin IGP, metric 0, localpref 100, external Dampinfo: penalty 840, flapped 1 times in 00:00:16 R2#show ip bgp 30.1.0.1 BGP routing table entry for 30.1.0.1/32, version 139 Paths: (1 available, no best path) Flag: 0x820 Advertised to update-groups: 2 100 (history entry) 155.1.123.1 from 155.1.123.1 (150.1.1.1) Origin IGP, metric 0, localpref 100, external Dampinfo: penalty 840, flapped 1 times in 00:00:18 R2#
BGP dampening with route map
設定投入
ISP1 Lo100(30.0.0.1/32)のみdampeningを行うようR3を設定します。
[R3] ip prefix-list PREFIX_DAMPENING seq 10 permit 30.0.0.1/32 ! route-map RMAP_DAMPENING match ip address prefix-list PREFIX_DAMPENING set dampening 1 400 800 3 ! router bgp 230 bgp dampening route-map RMAP_DAMPENING
動作確認
先程と同様のflappingを発生させます。
[ISP1] interface range Loopback 100 - 103 carrier-delay 0 shutdown no shutdown
30.0.0.1/32のみdampeningが機能している事を確認します。
[R3] R3#show ip bgp 30.0.0.1 BGP routing table entry for 30.0.0.1/32, version 25 Paths: (2 available, best #2, table Default-IP-Routing-Table) Flag: 0x820 Advertised to update-groups: 1 100 155.1.123.1 from 192.168.234.2 (10.2.2.2) Origin IGP, metric 0, localpref 100, valid, internal 100 155.1.123.1 from 155.1.123.1 (150.1.1.1) Origin IGP, metric 0, localpref 100, valid, external, best Dampinfo: penalty 560, flapped 1 times in 00:01:00 R3# R3#show ip bgp 30.1.0.1 BGP routing table entry for 30.1.0.1/32, version 24 Paths: (2 available, best #2, table Default-IP-Routing-Table) Advertised to update-groups: 1 100 155.1.123.1 from 192.168.234.2 (10.2.2.2) Origin IGP, metric 0, localpref 100, valid, internal 100 155.1.123.1 from 155.1.123.1 (150.1.1.1) Origin IGP, metric 0, localpref 100, valid, external, best R3#
OSPF max metric
設定投入
以下の設定をR2に投入し、OS起動後5分間のmetricを最大にします。
[R2] router ospf 1 max-metric router-lsa summary-lsa external-lsa on-startup 300
動作確認
R2を再起動します。その後、R2から伝播されるLSAのmetricが最大になっている事を確認します。
[R4] R4#show ip ospf database external 30.0.0.1 OSPF Router with ID (10.4.4.4) (Process ID 1) Type-5 AS External Link States LS age: 34 Options: (No TOS-capability, DC) LS Type: AS External Link Link State ID: 30.0.0.1 (External Network Number ) Advertising Router: 10.2.2.2 LS Seq Number: 80000001 Checksum: 0x1809 Length: 36 Network Mask: /32 Metric Type: 2 (Larger than any link state path) TOS: 0 Metric: 16711680 Forward Address: 0.0.0.0 External Route Tag: 100 Routing Bit Set on this LSA LS age: 856 Options: (No TOS-capability, DC) LS Type: AS External Link Link State ID: 30.0.0.1 (External Network Number ) Advertising Router: 10.3.3.3 LS Seq Number: 80000001 Checksum: 0xD10 Length: 36 Network Mask: /32 Metric Type: 2 (Larger than any link state path) TOS: 0 Metric: 1 Forward Address: 0.0.0.0 External Route Tag: 100 R4#
R4からISP1への経路が、負荷分散されずR3経由になっている事を確認します。
[R4] R4#show ip route ospf 10.0.0.0/32 is subnetted, 3 subnets O 10.2.2.2 [110/11] via 192.168.234.2, 00:02:35, Ethernet0/1 O 10.3.3.3 [110/11] via 192.168.234.3, 00:02:35, Ethernet0/1 30.0.0.0/32 is subnetted, 4 subnets O E2 30.3.0.1 [110/1] via 192.168.234.3, 00:01:42, Ethernet0/1 O E2 30.2.0.1 [110/1] via 192.168.234.3, 00:01:42, Ethernet0/1 O E2 30.1.0.1 [110/1] via 192.168.234.3, 00:01:42, Ethernet0/1 O E2 30.0.0.1 [110/1] via 192.168.234.3, 00:01:42, Ethernet0/1 R4#
R2再起動から5分経過すると、metricが元に戻り、再び負荷分散されるようになりました。
[R4] R4#show ip ospf database external 30.0.0.1 OSPF Router with ID (10.4.4.4) (Process ID 1) Type-5 AS External Link States Routing Bit Set on this LSA LS age: 20 Options: (No TOS-capability, DC) LS Type: AS External Link Link State ID: 30.0.0.1 (External Network Number ) Advertising Router: 10.2.2.2 LS Seq Number: 80000002 Checksum: 0x20FE Length: 36 Network Mask: /32 Metric Type: 2 (Larger than any link state path) TOS: 0 Metric: 1 Forward Address: 0.0.0.0 External Route Tag: 100 Routing Bit Set on this LSA LS age: 1074 Options: (No TOS-capability, DC) LS Type: AS External Link Link State ID: 30.0.0.1 (External Network Number ) Advertising Router: 10.3.3.3 LS Seq Number: 80000001 Checksum: 0xD10 Length: 36 Network Mask: /32 Metric Type: 2 (Larger than any link state path) TOS: 0 Metric: 1 Forward Address: 0.0.0.0 External Route Tag: 100 R4# R4#show ip route ospf 10.0.0.0/32 is subnetted, 3 subnets O 10.2.2.2 [110/11] via 192.168.234.2, 00:00:43, Ethernet0/1 O 10.3.3.3 [110/11] via 192.168.234.3, 00:00:43, Ethernet0/1 30.0.0.0/32 is subnetted, 4 subnets O E2 30.3.0.1 [110/1] via 192.168.234.3, 00:00:43, Ethernet0/1 [110/1] via 192.168.234.2, 00:00:43, Ethernet0/1 O E2 30.2.0.1 [110/1] via 192.168.234.3, 00:00:43, Ethernet0/1 [110/1] via 192.168.234.2, 00:00:43, Ethernet0/1 O E2 30.1.0.1 [110/1] via 192.168.234.3, 00:00:43, Ethernet0/1 [110/1] via 192.168.234.2, 00:00:43, Ethernet0/1 O E2 30.0.0.1 [110/1] via 192.168.234.3, 00:00:43, Ethernet0/1 [110/1] via 192.168.234.2, 00:00:43, Ethernet0/1 R4#
Tips
penalty 上限
penaltyには上限があります。以下のように大きすぎる値を設定すると、bgp dampeningの設定が無効になってしまいます。
R2(config)#router bgp 230 R2(config-router)#bgp dampening 2 1000 2000 30 R2(config-router)# *Mar 1 00:04:21.639: %BGP-5-DAMPENING_HIGH_MAX_PENALTY: Maximum penalty (32768000) is more than allowed maximum (20000). Dampening is OFF R2(config-router)#