らくがきちょう

なんとなく

IOS で MED は除去出来ない?

Cisco IOS で「BGP の MED 属性を(ゼロでは無く)除去し、missing な状態に戻して広告出来るか?」試してみました。結論から述べると上手くいきませんでした。機会があれば「何か方法が無いか?」を深掘りしてみようと思います。また、IOS-XR や NX-OS、JUNOS での振る舞いも、改めて確認してみようと思います。

構成

以下の構成で検証しました。

f:id:sig9:20160327040724p:plain

ルータはいずれも以下を用いました。

コンフィグ

R1 のコンフィグ

hostname R1
!
interface Loopback1
 ip address 10.0.0.1 255.255.255.255
 ip ospf cost 10
!
interface Loopback2
 ip address 10.0.0.2 255.255.255.255
 ip ospf cost 10
!
interface Loopback3
 ip address 10.0.0.3 255.255.255.255
 ip ospf cost 10
!
interface Loopback4
 ip address 10.0.0.4 255.255.255.255
 ip ospf cost 10
!
interface Loopback5
 ip address 10.0.0.5 255.255.255.255
 ip ospf cost 10
!
interface GigabitEthernet0/1
 ip address 10.0.12.1 255.255.255.0
 no shutdown
!
router ospf 65001
 network 10.0.0.1 0.0.0.0 area 0.0.0.0
 network 10.0.0.2 0.0.0.0 area 0.0.0.0
 network 10.0.0.3 0.0.0.0 area 0.0.0.0
 network 10.0.0.4 0.0.0.0 area 0.0.0.0
 network 10.0.0.5 0.0.0.0 area 0.0.0.0
 network 10.0.12.0 0.0.0.255 area 0.0.0.0
!
end

R2 のコンフィグ

既にコンフィグ時点で「route-map 上で MED (metric) を除去する書き方が出来ない」という問題があります (route-map「CONTROL-MED」の seq 10)。これでは MED を除去出来なくても当然です…

hostname R2
!
interface GigabitEthernet0/1
 ip address 10.0.12.2 255.255.255.0
 ip ospf cost 200
 no shutdown
!
interface GigabitEthernet0/2
 ip address 10.0.23.2 255.255.255.0
 no shutdown
!
router ospf 65001
 network 10.0.12.0 0.0.0.255 area 0.0.0.0
!
router bgp 65001
 redistribute ospf 65001
 neighbor 10.0.23.3 remote-as 65002
 neighbor 10.0.23.3 route-map CONTROL-MED out
!
ip prefix-list PREFIX-1 seq 1 permit 10.0.0.1/32
ip prefix-list PREFIX-2 seq 1 permit 10.0.0.2/32
ip prefix-list PREFIX-3 seq 1 permit 10.0.0.3/32
!
route-map CONTROL-MED permit 10
 match ip address prefix-list PREFIX-1
!
route-map CONTROL-MED permit 20
 match ip address prefix-list PREFIX-2
 set metric 0
!
route-map CONTROL-MED permit 30
 match ip address prefix-list PREFIX-3
 set metric +3000
!
route-map CONTROL-MED permit 40
 set metric 3000
!
end

R3 のコンフィグ

hostname R3
!
interface GigabitEthernet0/1
 ip address 10.0.23.3 255.255.255.0
 no shutdown
!
router bgp 65002
 neighbor 10.0.23.2 remote-as 65001
 neighbor 10.0.23.2 route-map MED+40000 in
!
ip prefix-list PREFIX-4 seq 1 permit 10.0.0.4/32
!
route-map MED+40000 permit 10
 match ip address prefix-list PREFIX-4
 set metric +40000
route-map MED+40000 permit 20
!
end

状態確認

R1 での状態確認

OSPF の RIB (Routing Information Base) を確認します。Loopback が RIB 上に存在することが分かります。但し、自ルータ上に直接接続 (directly connected) として接続されている経路なので、Best には選出されません (「>」が付与されていない)。

R1# show ip ospf rib

            OSPF Router with ID (10.0.0.3) (Process ID 65001)


		Base Topology (MTID 0)

OSPF local RIB
Codes: * - Best, > - Installed in global RIB

*   10.0.0.1/32, Intra, cost 10, area 0.0.0.0, Connected
      via 10.0.0.1, Loopback1
*   10.0.0.2/32, Intra, cost 10, area 0.0.0.0, Connected
      via 10.0.0.2, Loopback2
*   10.0.0.3/32, Intra, cost 10, area 0.0.0.0, Connected
      via 10.0.0.3, Loopback3
*   10.0.0.4/32, Intra, cost 10, area 0.0.0.0, Connected
      via 10.0.0.4, Loopback4
*   10.0.0.5/32, Intra, cost 10, area 0.0.0.0, Connected
      via 10.0.0.5, Loopback5
*   10.0.12.0/24, Intra, cost 1, area 0.0.0.0, Connected
      via 10.0.12.1, GigabitEthernet0/1

R2 での状態確認

R1 と同様に、OSPF の RIB を確認します。R1 の Loopback を受信しており、Best にも選出されていることが分かります (「>」が付与されている)。

R2# show ip ospf rib

            OSPF Router with ID (10.0.23.2) (Process ID 65001)


		Base Topology (MTID 0)

OSPF local RIB
Codes: * - Best, > - Installed in global RIB

*>  10.0.0.1/32, Intra, cost 210, area 0.0.0.0
      via 10.0.12.1, GigabitEthernet0/1
*>  10.0.0.2/32, Intra, cost 210, area 0.0.0.0
      via 10.0.12.1, GigabitEthernet0/1
*>  10.0.0.3/32, Intra, cost 210, area 0.0.0.0
      via 10.0.12.1, GigabitEthernet0/1
*>  10.0.0.4/32, Intra, cost 210, area 0.0.0.0
      via 10.0.12.1, GigabitEthernet0/1
*>  10.0.0.5/32, Intra, cost 210, area 0.0.0.0
      via 10.0.12.1, GigabitEthernet0/1
*   10.0.12.0/24, Intra, cost 200, area 0.0.0.0, Connected
      via 10.0.12.2, GigabitEthernet0/1

ルーティングテーブルを確認すると確かに、R1 から OSPF で学習した経路がインストールされていることを確認出来ます。

R2# show ip route ospf
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
       a - application route
       + - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 9 subnets, 2 masks
O        10.0.0.1/32 [110/210] via 10.0.12.1, 00:12:15, GigabitEthernet0/1
O        10.0.0.2/32 [110/210] via 10.0.12.1, 00:12:15, GigabitEthernet0/1
O        10.0.0.3/32 [110/210] via 10.0.12.1, 00:12:15, GigabitEthernet0/1
O        10.0.0.4/32 [110/210] via 10.0.12.1, 00:12:15, GigabitEthernet0/1
O        10.0.0.5/32 [110/210] via 10.0.12.1, 00:06:49, GigabitEthernet0/1

BGP テーブルを確認します。OSPF を BGP へ再配布しているので、OSPF で学習した R1 の Loopback がインストールされています。

R2# show ip bgp
BGP table version is 25, local router ID is 10.0.23.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
              x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>  10.0.0.1/32      10.0.12.1              210         32768 ?
 *>  10.0.0.2/32      10.0.12.1              210         32768 ?
 *>  10.0.0.3/32      10.0.12.1              210         32768 ?
 *>  10.0.0.4/32      10.0.12.1              210         32768 ?
 *>  10.0.0.5/32      10.0.12.1              210         32768 ?
 *>  10.0.12.0/24     0.0.0.0                  0         32768 ?

R2 〜 R3 間の eBGP Neighbor に適用されている Prefix-List と Route-Map は以下です。

R2# show ip prefix-list
ip prefix-list PREFIX-1: 1 entries
   seq 1 permit 10.0.0.1/32
ip prefix-list PREFIX-2: 1 entries
   seq 1 permit 10.0.0.2/32
ip prefix-list PREFIX-3: 1 entries
   seq 1 permit 10.0.0.3/32
R2# show route-map
route-map CONTROL-MED, permit, sequence 10
  Match clauses:
    ip address prefix-lists: PREFIX-1
  Set clauses:
  Policy routing matches: 0 packets, 0 bytes
route-map CONTROL-MED, permit, sequence 20
  Match clauses:
    ip address prefix-lists: PREFIX-2
  Set clauses:
    metric 0
  Policy routing matches: 0 packets, 0 bytes
route-map CONTROL-MED, permit, sequence 30
  Match clauses:
    ip address prefix-lists: PREFIX-3
  Set clauses:
    metric +3000
  Policy routing matches: 0 packets, 0 bytes
route-map CONTROL-MED, permit, sequence 40
  Match clauses:
  Set clauses:
    metric 3000
  Policy routing matches: 0 packets, 0 bytes
route-map MED+300, permit, sequence 10
  Match clauses:
  Set clauses:
    metric +300
  Policy routing matches: 0 packets, 0 bytes

属性の制御を表にすると以下の通りです。

経路 Prefix-List MED
10.0.0.1/32 PREFIX-1 の seq 1 制御無し
10.0.0.2/32 PREFIX-2 の seq 1 0 (ゼロ)
10.0.0.3/32 PREFIX-3 の seq 1 +3,000 (3,000 加算)
未設定 (上記以外の経路) 未設定 3,000 (3,000 で上書き)

Neighbor への advertised-routes を確認してみます。しかし、route-map が表示される前の状態が表示されている為、属性の状態を確認することが出来ません。

R2# show ip bgp neighbors 10.0.23.3 advertised-routes
BGP table version is 25, local router ID is 10.0.23.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
              x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>  10.0.0.1/32      10.0.12.1              210         32768 ?
 *>  10.0.0.2/32      10.0.12.1              210         32768 ?
 *>  10.0.0.3/32      10.0.12.1              210         32768 ?
 *>  10.0.0.4/32      10.0.12.1              210         32768 ?
 *>  10.0.0.5/32      10.0.12.1              210         32768 ?
 *>  10.0.12.0/24     0.0.0.0                  0         32768 ?

Total number of prefixes 6

よって、受信側である R3 で状態確認します。

R3 での状態確認

BGP テーブルを確認します。

R3# show ip bgp
BGP table version is 12, local router ID is 10.0.23.3
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
              x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

     Network          Next Hop            Metric LocPrf Weight Path
 *>  10.0.0.1/32      10.0.23.2              210             0 65001 ?
 *>  10.0.0.2/32      10.0.23.2                0             0 65001 ?
 *>  10.0.0.3/32      10.0.23.2             3000             0 65001 ?
 *>  10.0.0.4/32      10.0.23.2            43000             0 65001 ?
 *>  10.0.0.5/32      10.0.23.2             3000             0 65001 ?
 *>  10.0.12.0/24     10.0.23.2             3000             0 65001 ?

表にまとめると以下の通りです。一部、属性が意図通りに受信出来ていません…

経路 意図した MED 値 実際の MED 値 意図した結果になったか?
10.0.0.1/32 無し 210
10.0.0.2/32 0 210
10.0.0.3/32 3,210 3,000
10.0.0.4/32 43,000 43,000
10.0.0.5/32 3,000 3,000

問題点は以下の 2 点です。

  1. 10.0.0.1/32 の MED が「missing」では無く、「210」になっている (※ これを「意図しない」というのはおかしく、R2 のコンフィグで記載した通り、そもそも MED を除去する意図の route-map が書けていないので、想定通りと言えば想定通り…)
  2. 10.0.0.3/32 が R2 からの広告時に MED を「+3,000」しているにも関わらず、R3 で受信後の MED 値は「3,000」になっている (「加算」では無く、「上書き」になっている。但し、R3 の受信側で設定している「+40,000」は効いている…)

最終的なルーティングテーブルは以下となりました。

R3# show ip route bgp
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
       a - application route
       + - replicated route, % - next hop override, p - overrides from PfR

Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 8 subnets, 2 masks
B        10.0.0.1/32 [20/210] via 10.0.23.2, 00:07:03
B        10.0.0.2/32 [20/0] via 10.0.23.2, 00:07:03
B        10.0.0.3/32 [20/3000] via 10.0.23.2, 00:07:03
B        10.0.0.4/32 [20/43000] via 10.0.23.2, 00:07:15
B        10.0.0.5/32 [20/3000] via 10.0.23.2, 00:07:03
B        10.0.12.0/24 [20/3000] via 10.0.23.2, 00:07:03