ルータ2台で始めるVRF入門(4)

ルート漏洩(2): GRT-VRF間ルート漏洩

[追記 2013-01-06]

論理構成

今回は GRT-expvrf01 間の経路情報交換。そのほかはとくに変更なし。expvrf01 がハブ、GRT はスポークです。

設定(1)
  • BGP/exprtr1
    • GRT の情報を BGP プロセスに持たせておく必要があるので、address-family ipv4 を設定します。expvrf01 から GRT/exprtr02 にも通信できるようにするため、static も再配布します。
exprtr1#sh run | sec router bgp
router bgp 64601
 bgp router-id 10.0.0.0
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 !
 address-family ipv4
  redistribute connected
  redistribute static
 exit-address-family
 !
 address-family ipv4 vrf expvrf01
  redistribute connected
 exit-address-family
 !
 address-family ipv4 vrf expvrf02
  bgp router-id 10.0.0.2
  redistribute connected
  neighbor 10.2.2.2 remote-as 64601
  neighbor 10.2.2.2 update-source Vlan722
  neighbor 10.2.2.2 activate
 exit-address-family
 !
 address-family ipv4 vrf expvrf03
  redistribute connected
  redistribute ospf 64601
 exit-address-family
exprtr1#
  • expvrf01
    • import ipvr unicast で GRTの経路をインポートします。
    • インポートする経路はルートマップで選択可能。
ip vrf expvrf01
 rd 64601:1
 import ipv4 unicast map GRT_MAP
 route-target export 64601:1
 route-target import 64601:1
 route-target import 64601:2
 route-target import 64601:3
!
ip prefix-list GRT_PREFIX seq 5 permit 10.1.0.0/24
ip prefix-list GRT_PREFIX seq 10 permit 10.2.0.0/24
ip prefix-list GRT_PREFIX seq 15 permit 10.3.0.0/24
ip prefix-list GRT_PREFIX seq 20 permit 10.0.0.0/28 le 32
!
route-map GRT_MAP permit 10
 match ip address prefix-list GRT_PREFIX
!
確認(1)
  • GRT/exprtr1
exprtr1#sh ip route
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 7 subnets, 2 masks
C        10.0.0.0/32 is directly connected, Loopback0
S        10.0.0.10/32 [1/0] via 10.2.0.2
C        10.1.0.0/24 is directly connected, Vlan800
L        10.1.0.1/32 is directly connected, Vlan800
C        10.2.0.0/24 is directly connected, Vlan720
L        10.2.0.1/32 is directly connected, Vlan720
S        10.3.0.0/24 [1/0] via 10.2.0.2
exprtr1#
  • expvrf01
exprtr1#sh ip route vrf expvrf01

Routing Table: expvrf01
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 24 subnets, 2 masks
B        10.0.0.0/32 is directly connected, 00:03:56, Loopback0
C        10.0.0.1/32 is directly connected, Loopback1
B        10.0.0.2/32 is directly connected (expvrf02), 00:34:21, Loopback2
B        10.0.0.3/32 is directly connected (expvrf03), 00:29:26, Loopback3
B        10.0.0.10/32 [20/0] via 10.2.0.2, 00:03:54
B        10.0.0.12/32 [200/0] via 10.2.2.2 (expvrf02), 00:34:21
B        10.0.0.13/32 [20/2] via 10.2.3.2 (expvrf03), 00:29:26, Vlan723
B        10.1.0.0/24 is directly connected, 00:03:56, Vlan800
C        10.1.1.0/24 is directly connected, Vlan801
L        10.1.1.1/32 is directly connected, Vlan801
B        10.1.2.0/24 is directly connected (expvrf02), 00:34:21, Vlan802
L        10.1.2.1/32 is directly connected, Vlan802
B        10.1.3.0/24 is directly connected (expvrf03), 00:29:26, Vlan803
L        10.1.3.1/32 is directly connected, Vlan803
B        10.2.0.0/24 is directly connected, 00:03:56, Vlan720
B        10.2.2.0/24 is directly connected (expvrf02), 00:34:21, Vlan722
L        10.2.2.1/32 is directly connected, Vlan722
B        10.2.3.0/24 is directly connected (expvrf03), 00:29:26, Vlan723
L        10.2.3.1/32 is directly connected, Vlan723
B        10.3.0.0/24 [20/0] via 10.2.0.2, 00:03:54
B        10.3.2.0/24 [200/0] via 10.2.2.2 (expvrf02), 00:34:21
B        10.3.3.0/24 [20/2] via 10.2.3.2 (expvrf03), 00:29:26, Vlan723
B        10.4.2.0/24 [200/0] via 10.2.2.2 (expvrf02), 00:34:21
B        10.4.3.0/24 [20/2] via 10.2.3.2 (expvrf03), 00:29:26, Vlan723
exprtr1#

ちなみにここまでだと GRT の経路を expvrf01 に入れただけなので、GRT 側には特に変化はありません。
したがって、この状態だと片側にしか通信できません。各ルータに icmp debug 設定して ping するとこんな感じ。

  • exprtr1
exprtr1#ping vrf expvrf01
Protocol [ip]:
Target IP address: 10.3.0.1
Repeat count [5]:
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]: y
Source address or interface: vlan801
Type of service [0]:
Set DF bit in IP header? [no]:
Validate reply data? [no]:
Data pattern [0xABCD]:
Loose, Strict, Record, Timestamp, Verbose[none]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.3.0.1, timeout is 2 seconds:
Packet sent with a source address of 10.1.1.1

Feb 19 02:26:17.036 JST: ICMP: dst (10.1.1.1) host unreachable sent to 10.3.0.1.
Feb 19 02:26:19.036 JST: ICMP: dst (10.1.1.1) host unreachable sent to 10.3.0.1.
Feb 19 02:26:21.036 JST: ICMP: dst (10.1.1.1) host unreachable sent to 10.3.0.1.
Feb 19 02:26:23.036 JST: ICMP: dst (10.1.1.1) host unreachable sent to 10.3.0.1.
Feb 19 02:26:25.036 JST: ICMP: dst (10.1.1.1) host unreachable sent to 10.3.0.1.
Success rate is 0 percent (0/5)
exprtr1#
  • exprtr2
exprtr2#
Feb 19 02:26:17.035 JST: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
Feb 19 02:26:17.035 JST: ICMP: dst (10.3.0.1) host unreachable rcv from 10.2.0.1
exprtr2#
Feb 19 02:26:19.031 JST: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
Feb 19 02:26:19.035 JST: ICMP: dst (10.3.0.1) host unreachable rcv from 10.2.0.1
exprtr2#
Feb 19 02:26:21.031 JST: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
Feb 19 02:26:21.035 JST: ICMP: dst (10.3.0.1) host unreachable rcv from 10.2.0.1
exprtr2#
Feb 19 02:26:23.031 JST: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
Feb 19 02:26:23.035 JST: ICMP: dst (10.3.0.1) host unreachable rcv from 10.2.0.1
exprtr2#
Feb 19 02:26:25.031 JST: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
Feb 19 02:26:25.035 JST: ICMP: dst (10.3.0.1) host unreachable rcv from 10.2.0.1
exprtr2#

届いているけど、戻りの経路がないので unreachable になっている。そりゃそうだ。

を見ると、この機能の用途として

この機能は、Black Hole Routing(BHR; ブラック ホール ルーティング)をサポートするために設定できます。BHR は、管理者が、トラフィックをデッド インターフェイスや調査用の情報を収集するように設計されたホストにダイナミック ルーティングを行い、ネットワークへの攻撃の影響を軽減することによって、不正な送信元からのトラフィックや Denial of Service(DoS; サービス拒絶)攻撃により生成されたトラフィックなどの望ましくないトラフィックをブロックできる方法です。

というような話が書いてあったりするので、VRF から GRT に流すだけって程度の用途なのかもしれない。

設定(2)

…と、まあ片方向だけって訳でなくて逆方向の経路を GRT 側で設定してやればよいのです。とは言ってもこれについて特に仕掛けがあるわけではなくて、単純に static を書くことになる……らしい。どうもあまりスマートな方法に見えないですが。

  • GRT/exprtr1
ip route 10.0.0.1 255.255.255.255 Loopback1
ip route 10.1.1.0 255.255.255.0 Vlan801
確認(2)
  • GRT/exprtr1
exprtr1#sh ip route
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 9 subnets, 2 masks
C        10.0.0.0/32 is directly connected, Loopback0
S        10.0.0.1/32 is directly connected, Loopback1
S        10.0.0.10/32 [1/0] via 10.2.0.2
C        10.1.0.0/24 is directly connected, Vlan800
L        10.1.0.1/32 is directly connected, Vlan800
S        10.1.1.0/24 is directly connected, Vlan801
C        10.2.0.0/24 is directly connected, Vlan720
L        10.2.0.1/32 is directly connected, Vlan720
S        10.3.0.0/24 [1/0] via 10.2.0.2
exprtr1#

ping 撃ってみる

  • exprtr1
exprtr1#ping vrf expvrf01
Protocol [ip]:
Target IP address: 10.3.0.1
Repeat count [5]:
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]: y
Source address or interface: vlan801
Type of service [0]:
Set DF bit in IP header? [no]:
Validate reply data? [no]:
Data pattern [0xABCD]:
Loose, Strict, Record, Timestamp, Verbose[none]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.3.0.1, timeout is 2 seconds:
Packet sent with a source address of 10.1.1.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/4 ms
exprtr1#
Feb 19 02:29:50.116 JST: ICMP: echo reply rcvd, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 2
Feb 19 02:29:50.116 JST: ICMP: echo reply rcvd, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 2
Feb 19 02:29:50.120 JST: ICMP: echo reply rcvd, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 2
Feb 19 02:29:50.120 JST: ICMP: echo reply rcvd, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 2
Feb 19 02:29:50.120 JST: ICMP: echo reply rcvd, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 2
exprtr1#
  • exprtr2
exprtr2#
Feb 19 02:29:50.112 JST: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
Feb 19 02:29:50.116 JST: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
Feb 19 02:29:50.116 JST: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
Feb 19 02:29:50.116 JST: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
Feb 19 02:29:50.120 JST: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
exprtr2#
まとめ
  • "import ipv4 unicast map" を使うことで、GRT (address-family ipv4) の情報を VRF にインポートすることができます。
    • GRT の経路をインポートできるVRFの数など制約があるので、その辺は上記マニュアル (BGPコンフィギュレーションガイド) を参照してください。

さらにまとめ(ルート漏洩について)

第 3 回・第 4 回(今回)では VRF/GRT 間の経路情報交換…ルート漏洩について見てきました。この辺になるとそろそろ、何がどういう関係で何の情報を受け渡しているのかとかがわからなくなってきます。……というより、ここまで読み返すと、どうもルーティングプロセスとかルーティングテーブルとか用語の使い方が曖昧でわかりにくい気がしてきました。ごめんなさい。どちらも「経路情報を持つルーティングインスタンス」みたいな感じで捉えています。

考え方は以下の図のようになります。

図は、exprtr1 のルーティングテーブル間の相関をあらわす模式図だと思ってください。

  • VRF はそれぞれ個別にルーティングテーブルを持ち、L3インタフェース・L2ブロードキャストドメイン (=VLAN) とひも付いています。
  • VRF はそれぞれ個別にダイナミックルーティングのプロセス(ルーティングプロセスの経路情報)を持ちます。

経路情報のやりとり:

  • BGP
    • GRT の経路情報は AF ipv4 unicast で制御します。
    • GRT は AF ipv4 unicast で他の BGP プロセスと neighbor を確立します。(通常の BGP 接続: 今回はそこはやっていないので図には描いていません。)
    • VRF の経路情報は AF ipv4 vrf で制御します。
    • VRF の経路情報は、RD 情報と併せて AF vpnv4 として管理されます。
    • VRF は、自分が持っている vpnv4 経路情報に、Route Target コミュニティを付与することができます。(ルート漏洩: route-target export)
    • VRF は、vpnv4 から Route Target コミュニティを指定して経路情報を取り入れることができます。(ルート漏洩: route-target import)
    • VRF は、ipv4 vrf で他の BGP プロセスと neighbor を確立します。
    • VRF は、BGP (ipv4 vrf) に、自分が持っている connected/static/ospf などの経路情報を再配布できます。(通常の再配布の考え方と同様。)
    • GRT/IPv4 の経路情報は import ipv4 コマンドで vrf に漏洩させることができます。
    • 余談
      • BGP vpnv4 からグレーの線で書いてあるところ、MPLS に対応していれば、vpnv4 AF で neighbor を張ることができます。これは IP-VPN において VRF の持つ経路情報の交換のために使用されます。*1
  • OSPF
    • VRF は個別に OSPF プロセスを持ちます。
    • VRF は、OSPF に、自分が持っている connected/static/bgp などから渡された経路情報を再配布できます。(通常の再配布の考え方と同様。)

どうでしょうね。これでどういう流れなのか整理できるでしょうか。

ちなみに、ここまでルート漏洩については、VRF が持つすべての経路情報を export して、指定した RT コミュニティを持つすべての経路情報を import してきました。VRF の持つ経路全体を単位としたルート漏洩です。この点は、ダイナミックルーティングにおけるルートマップのようにいくつかフィルタリングすることが可能です。次回以降でその辺を見ていきます。

*1:……はずです。MPLS とかちゃんと組んだことがないのでどうも断言しにくいのですが。