[toc:faq]
概要
本ドキュメントでは、ASR9000 シリーズルータを使用している場合に、想定外 ARP パケットを受信することによって、ルートの学習に問題が発生してしまった事例と、その対処方法について紹介します。
事例の概要
- 対向 L3 Switch 再起動後に BGP session が確立できなくなった
- Ping を実施しても失敗するため、疎通性が失われているようにみえる。
- clear arp を行うことで、復旧する。
- 対向の Loopback アドレス宛に BGP neighbor を設定している
- 対向の Loopback アドレスへは static route を設定しており、route 解決している
RP/0/RSP0/CPU0:ASR9K#show bgp vrf all summary
VRF: Test ------------- 192.168.254.254 0 65535 12502 12675 0 0 0 00:08:29 Active
|
確認の手順と確認結果の例
- 疎通性の確認のためには、FIB/RIB の状態を確認する
show route による確認
- RIB には エントリが想定通りに載っていることを確認
- 設定通り、static によってエントリが生成されている
- Next-hop のアドレス、interface についても想定通り
RP/0/RSP0/CPU0:ASR9K#show route vrf Test 192.168.254.254/32
Routing entry for 192.168.254.254/32 Known via "static", distance 1, metric 0 Installed Nov 1 18:17:49.187 for 02:24:29 Routing Descriptor Blocks 192.168.0.1, via Bundle-Ether1 Route metric is 0 No advertising protos.
|
show cef / show arp による確認
- RSP 上の FIB にもエントリが想定通り載っていることを確認
- Next-hop のアドレス、interface についても想定通り
RP/0/RSP0/CPU0:ASR9K#show cef vrf Test 192.168.254.254/32 location 0/RSP0/CPU0
192.168.254.254/32, version 651, internal 0x4000801 0x0 (ptr 0x9d614714) [1], 0x0 (0x9d57e568), 0x440 (0x9e1774c8) Updated Nov 1 18:17:49.211 Prefix Len 32, traffic index 0, precedence n/a, priority 3 via 192.168.0.1, Bundle-Ether1, 4 dependencies, weight 0, class 0 [flags 0x0] path-idx 0 NHID 0x0 [0x9cf703e0 0x0], Internal 0x9e3fa46c, parent-ifh 0x220 next hop 192.168.0.1 local adjacency local label 16013 labels imposed {None}
|
- LC 上の FIB にエントリが存在しない事が判明
RP/0/RSP0/CPU0:ASR9K#show cef vrf Test 192.168.254.254/32 location 0/0/CPU0
%Prefix not found or IP is not running. VRF Test.
|
- さらに、該当 prefix への arp エントリが存在することを確認
- ARP は同一セグメント内の MAC 解決に使用される。通常Loopback が載ることはない。
RP/0/RSP0/CPU0:ASR9K#show arp vrf Test --------------------------------------------------------------------------- 0/0/CPU0 --------------------------------------------------------------------------- 192.168.254.254 00:04:29 beef.beef.beef Dynamic ARPA Bundle-Ether1
|
原因及び詳細
- 対向L3SW 再起動時にパケットキャプチャを行ったところ、Loopback アドレスを Sender IP とした ARP request を送信しており、対向機器の不具合により送信されていた。
- ASR9K では該当の ARP request によって、対向機器の Loopback アドレスを隣接アドレスとして学習しており、その影響で FIB へインストールできていなかった
106518 2016-12-13 15:00:00.000000 CiscoInc_ab:cd:ef Broadcast ARP 60 Who has 192.168.0.2? Tell 192.168.254.254. Frame 106518: 60 bytes on wire (480 bits), 60 bytes captured (480 bits) on interface 0 Ethernet II, Src: CiscoInc_ad:cd:ef (00:81:c4:ab:cd:ef), Dst: Broadcast (ff:ff:ff:ff:ff:ff) Address Resolution Protocol (request) Hardware type: Ethernet (1) Protocol type: IPv4 (0x0800) Hardware size: 6 Protocol size: 4 Opcode: request (1) Sender MAC address: CiscoInc_ab:cd:ef (00:81:c4:ab:cf:ef) Sender IP address: 192.168.254.254 Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00) Target IP address: 192.168.0.2
|
ARP で学習すると FIB にインストールされない理由
- RIB/ARP 双方で /32 ルートを学習している場合、XR 6.0.0 以前では ARP によって学習された AIB(adjacency information base) の情報を優先して採用する。
- その際、該当Prefix は、直接インタフェースと接続されている(隣接している)とみなした上で
FIB へインストールをしようとするため Connected route でカバーされているかどうかのチェックが入る。
- 今回の対向機器の loopback アドレスは別セグメントであるので、同じ L3 ドメインに所属するインタフェースを持っていない。
それにより、上記チェックに失敗し、LC上の FIB へのインストールがされない
IOS-XR の ARP の実装及び ARP の観点での対処策
- 別セグメントの ARP パケットを受信した場合でも ARP 学習される
- “arp learning local” を Interface 上に設定することで、subnet check が有効となる
- 自発の ARP request に対する reply だけでなく、別機器からの ARP request によっても学習を行い、 ARP entry を生成する。 ※ RFC826 を参照
RP/0/RP0/CPU0:ASR9K(config)#interface bundle-ether 1 RP/0/RP0/CPU0:ASR9K(config-if)#arp learning ? disable Disable dynamic learning of ARP entries local Enable dynamic learning only for local subnet only RP/0/RP0/CPU0:ASR-9922-AC(config-if)#arp learning local
|
IOS-XR FIB の実装及び、FIB の観点での対処策
- Entry の学習ソースは AIB, RIB, LSD.
- IOS-XR 6.0.0 以前のデフォルトの優先度は AIB> LSD > RIB. AIB が最優先
- IOS-XR 6.0.0 以降ではデフォルトで LSD > RIB > AIBへと実装が変更されている
- IOS-XR 5.1.2 にて優先度を変更する以下の設定が実装
- 優先度を LSD > RIB > AIB の順に変更することができる
RP/0/RP0/CPU0:ASR9K(config)#cef adjacency route override rib ? disable Prevent adjacency routes from overriding RIB routes RP/0/RP0/CPU0:ASR9K(config)#cef adjacency route override rib disable
|