目錄
前言
Policy Based Routing (PBR) 名字好像有點深奧,其實說穿了只不過是改改 Next Hop IP 讓我們可以對 Routing Table 的結果作出干擾,控制某些 Traffic 的路由方向。本篇假設讀者已經了解路由判斷和 EIGRP 等理論,如不肯定可以先溫習一下。
實驗基本設定
為了測試 PBR,先設定好以下網絡,假設 R1 是公司的 WAN Link Router,分別連接 ISP1 (R2) 和 ISP2 (R3),所有 Router 執行 EIGRP。
R1 會收到分別由 R2 和 R3 傳來 10.10.10.10/32 的 Route,即是說 R1 無論用 ISP1 或 ISP2 都能夠到達 10.10.10.10。
R1#show ip eigrp topology all-links EIGRP-IPv4 Topology Table for AS(1)/ID(192.168.15.1) Codes: P - Passive, A - Active, U - Update, Q - Query, R - Reply, r - reply Status, s - sia Status P 10.10.10.10/32, 1 successors, FD is 409600, serno 9 via 192.168.12.2 (409600/128256), Ethernet1/0 via 192.168.13.3 (2323456/409600), Serial2/0 P 192.168.34.0/24, 1 successors, FD is 2195456, serno 12 via 192.168.13.3 (2195456/281600), Serial2/0 P 192.168.12.0/24, 1 successors, FD is 281600, serno 1 via Connected, Ethernet1/0 P 192.168.13.0/24, 1 successors, FD is 2169856, serno 11 via Connected, Serial2/0 P 192.168.15.0/24, 1 successors, FD is 281600, serno 13 via Connected, Ethernet1/1 P 1.1.1.1/32, 1 successors, FD is 409600, serno 14 via 192.168.15.5 (409600/128256), Ethernet1/1
當然 R1 選了 Next Hop 為 192.168.12.2 這條 Route,因為 Metric 較小。
R1#show ip route eigrp
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
1.0.0.0/32 is subnetted, 1 subnets
D 1.1.1.1 [90/409600] via 192.168.15.5, 00:16:08, Ethernet1/1
10.0.0.0/32 is subnetted, 1 subnets
D 10.10.10.10 [90/409600] via 192.168.12.2, 00:03:38, Ethernet1/0
D 192.168.34.0/24 [90/2195456] via 192.168.13.3, 00:19:26, Serial2/0
然而,我們故意在 R3 加入一條 Distribute List 來阻擋 10.10.10.10/32 發放至 R1,迫使所有要到 10.10.10.10/32 的 Traffic 只有 R5 > R1 > R2 這條路徑。
R3(config)#ip prefix-list DENY_10 deny 10.10.10.10/32 R3(config)#ip prefix-list DENY_10 permit 0.0.0.0/0 le 32 R3(config)#router eigrp 1 R3(config-router)#distribute-list prefix DENY_10 out
所以,R1 知道只有 192.168.12.2 可以到達 10.10.10.10/32。
R1#show ip eigrp topology all-links
EIGRP-IPv4 Topology Table for AS(1)/ID(192.168.15.1)
Codes: P - Passive, A - Active, U - Update, Q - Query, R - Reply,
r - reply Status, s - sia Status
P 10.10.10.10/32, 1 successors, FD is 409600, serno 9
via 192.168.12.2 (409600/128256), Ethernet1/0
P 192.168.31.0/24, 1 successors, FD is 281600, serno 23
via Connected, Ethernet1/7
P 192.168.12.0/24, 1 successors, FD is 281600, serno 1
via Connected, Ethernet1/0
P 192.168.15.0/24, 1 successors, FD is 281600, serno 13
via Connected, Ethernet1/1
P 1.1.1.1/32, 1 successors, FD is 409600, serno 14
via 192.168.15.5 (409600/128256), Ethernet1/1
所以,在 R5 Traceroute 10.10.10.10 的話,Packet 會走 R5 > R1 > R2 這條路徑。到此應該沒有問題吧?如無法理解,請先到 EIGRP 練功後再來挑戰。
Set Ip Next-hop
PBR 第一式是 Set Ip Next-hop,我們可以強迫從 R5 Source 1.1.1.1 到 Destination 10.10.10.10 的 Traffic 走 R5 > R1 > R3 > R4,其餘的 Traffic 卻走原來的 R5 > R1 > R2,這就是所謂的 Policy。
基本設定
設定上不會複雜,先在 R1 用 Extended Access List 把想要的 Traffic 抓出來。
R1(config)#ip access-list extended PBR_TRAFFIC R1(config-ext-nacl)#permit ip host 1.1.1.1 host 10.10.10.10
然後用 Route Map 去改變 Next Hop IP。
R1(config)#route-map PBR R1(config-route-map)#match ip address PBR_TRAFFIC R1(config-route-map)#set ip next-hop 192.168.13.3
最後把這條 Route Map 放到 e1/1,即 Traffic 流進的方向。
R1(config)#int ethernet 1/1 R1(config-if)#ip policy route-map PBR
現在,從 R5 1.1.1.1 到 10.10.10.10 的 Traffic 就走 R5 > R1 > R3 > R4 了。
R5#traceroute 10.10.10.10 source 1.1.1.1 Type escape sequence to abort. Tracing the route to 10.10.10.10 VRF info: (vrf in name/id, vrf out name/id) 1 192.168.15.1 48 msec 24 msec 20 msec 2 192.168.13.3 40 msec 40 msec 32 msec 3 192.168.34.4 52 msec 40 msec 40 msec
其他 Traffic 卻走原本的 R5 > R1 > R2。(Traceroute 不設定 Source,Router 預設使用 Outbound Interface 作為 Source,即 e1/0 的 192.168.15.5。)
R5#traceroute 10.10.10.10 Type escape sequence to abort. Tracing the route to 10.10.10.10 VRF info: (vrf in name/id, vrf out name/id) 1 192.168.15.1 12 msec 20 msec 20 msec 2 192.168.12.2 28 msec 32 msec 32 msec
注意,使用這個方法,Next Hop IP 必需是存在於 Directly Connected 的 Network 之中,否則 PBR 設定不會有效。
例如:把 R3 的 S2/0 shutdown。
R3(config)#int serial 2/0 R3(config-if)#shutdown
R1 Route Table 的 192.168.13.0/24 這個 Connected Network 就消失了,造成 set ip next hop 無效。
R1#show ip route 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 1.0.0.0/32 is subnetted, 1 subnets D 1.1.1.1 [90/409600] via 192.168.15.5, 00:46:36, Ethernet1/1 10.0.0.0/32 is subnetted, 1 subnets D 10.10.10.10 [90/409600] via 192.168.12.2, 00:05:40, Ethernet1/0 192.168.12.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.12.0/24 is directly connected, Ethernet1/0 L 192.168.12.1/32 is directly connected, Ethernet1/0 192.168.15.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.15.0/24 is directly connected, Ethernet1/1 L 192.168.15.1/32 is directly connected, Ethernet1/1
Traffic 就會跟原本路經走。
R5#traceroute 10.10.10.10 source 1.1.1.1 Type escape sequence to abort. Tracing the route to 10.10.10.10 VRF info: (vrf in name/id, vrf out name/id) 1 192.168.15.1 20 msec 20 msec 20 msec 2 192.168.12.2 28 msec 28 msec 20 msec
輕輕一提,如果 set ip next hop 設定了兩組 IP 或以上,則 Router 會先檢查第一組 IP 是否存在於 Connected Network,有則使用,無則檢查下一組,如此類推。
Verify Availability
有時 Interface 是 UP,Route Table 有 Connected Network 了,卻因為其他原因無法傳 Data。如果想穩當一點,我們可以加一句 set ip next-hop verify-availability,這樣 R1 就會監察 R3 的 CDP 狀態,如果收不到 CDP 就算 Interface UP 也不會發生 PBR。
route-map PBR permit 10
match ip address PBR_TRAFFIC
set ip next-hop 192.168.13.3
set ip next-hop verify-availability
IP SLA Tracking
假設 R1 與 R3 之間並非直接連上,而是經過 Switch,R1 不能用 CDP 監察也無法感知 R3 的 Port 是 UP 還是 DOWN。如果 R3 那邊 DOWN 了,PBR 卻繼續執行,Packet 就石沉大海無法到達。如遇這情況我們可以使用 IP SLA Tracking。
首先建立 SLA,如不清楚 SLA 原理,請看這篇文章。IOS Version 不同,指令設定上會有少許差異。
R1(config)#ip sla 1 R1(config-ip-sla)#icmp-echo 192.168.13.3 R1(config-ip-sla-echo)#frequency 5 R1(config-ip-sla-echo)#timeout 5000 R1(config-ip-sla-echo)#threshold 100 R1(config-ip-sla-echo)#exit R1(config)#ip sla schedule 1 life forever start-time now
然後使用 sla 1 用作 track 1,並加進 Route Map 就可以了。
R1(config)#track 1 ip sla 1 reachability R1(config)#route-map PBR permit 10 R1(config-route-map)#match ip address PBR_TRAFFIC R1(config-route-map)#set ip next-hop verify-availability 192.168.13.3 1 track 1
用 show route-map 確認一下,現時 tracking 是 [up] 的,即 SLA 1 狀態正常,亦即是 192.168.13.3 可以 Ping 通。
R1#show route-map
route-map PBR, permit, sequence 10
Match clauses:
ip address (access-lists): PBR_TRAFFIC
Set clauses:
ip next-hop verify-availability 192.168.13.3 1 track 1 [up]
Policy routing matches: 129 packets, 7740 bytes
所以 PBR 是發揮作用的。
R5#traceroute 10.10.10.10 source 1.1.1.1 Type escape sequence to abort. Tracing the route to 10.10.10.10 VRF info: (vrf in name/id, vrf out name/id) 1 192.168.15.1 52 msec 40 msec 20 msec 2 192.168.13.3 40 msec 20 msec 20 msec 3 192.168.34.4 32 msec 32 msec 28 msec
如果在 R3 把 S2/0 Shutdown,R1 的 Tracking 就 down 了。
R1#show route-map
route-map PBR, permit, sequence 10
Match clauses:
ip address (access-lists): PBR_TRAFFIC
Set clauses:
ip next-hop verify-availability 192.168.13.3 1 track 1 [down]
Policy routing matches: 159 packets, 9540 bytes
所以 PBR 不會生效。
R5#traceroute 10.10.10.10 source 1.1.1.1 Type escape sequence to abort. Tracing the route to 10.10.10.10 VRF info: (vrf in name/id, vrf out name/id) 1 192.168.15.1 20 msec 20 msec 12 msec 2 192.168.12.2 20 msec 20 msec 20 msec
Set Ip Next-hop Recursive
剛才說過如果用 Set Ip Next-hop ,Next Hop 必需是 Connected Network,PBR才會生效。如果有需要用非 Connected Network 的 Interface 做 Next Hop 的話,可以用招式二 Set Ip Next-hop Recursive。例如:在剛才的網絡中想把 Next Hop 指向 192.168.34.4,設定如下:
R1(config)#route-map PBR R1(config-route-map)#match ip address PBR_TRAFFIC R1(config-route-map)#set ip next-hop recursive 192.168.34.4
Set Ip Default Next-hop
PBR 招式三 Set Ip Default Next-hop,這句指令讓人有點混淆,它的意思是說 PBR 只用作後備路徑,Router 會預設使用 Route Table 的 Route 到達目的地。除非 Route Table 找不到紀錄時才使用 PBR。
R1(config)#route-map PBR R1(config-route-map)#match ip address PBR_TRAFFIC R1(config-route-map)#set ip default next-hop 192.168.13.3
由於 R1 的 Route Table 有 10.10.10.10/32 存在。
R1#show ip route 10.10.10.10 Routing entry for 10.10.10.10/32 Known via "eigrp 1", distance 90, metric 409600, type internal Redistributing via eigrp 1 Last update from 192.168.12.2 on Ethernet1/0, 1d15h ago Routing Descriptor Blocks: * 192.168.12.2, from 192.168.12.2, 1d15h ago, via Ethernet1/0 Route metric is 409600, traffic share count is 1 Total delay is 6000 microseconds, minimum bandwidth is 10000 Kbit Reliability 255/255, minimum MTU 1500 bytes Loading 1/255, Hops 1
這時侯就算附合 Policy 的 Traffic 通過,R1 仍會使用正常路徑 R5 > R1 > R2。
R5#traceroute 10.10.10.10 source 1.1.1.1 Type escape sequence to abort. Tracing the route to 10.10.10.10 VRF info: (vrf in name/id, vrf out name/id) 1 192.168.15.1 20 msec 20 msec 20 msec 2 192.168.12.2 20 msec 20 msec 20 msec
除非把 Route 殺掉,例如 Shutdown R2 的 e1/0。
R2(config)#int ethernet 1/0 R2(config-if)#shutdown
R1 的 10.10.10.10/32 Route 消失了。
R1#show ip route 10.10.10.10 % Network not in table
於是 PBR 生效。
R5#traceroute 10.10.10.10 source 1.1.1.1 Type escape sequence to abort. Tracing the route to 10.10.10.10 VRF info: (vrf in name/id, vrf out name/id) 1 192.168.15.1 20 msec 12 msec 8 msec 2 192.168.13.3 64 msec 40 msec 28 msec 3 192.168.34.4 72 msec 48 msec 52 msec
Set Interface
第四式 Set Interface 這個指令比較單純,就是把 Next Hop 直接指向一 Outbound Interface (需為 Point to Point Interface)。例如:在 R1 不使用 IP 192.168.13.3 作為 Next Hop,取而代之的是使用 Interface Serial 2/0。
R1(config)#route-map PBR R1(config-route-map)#match ip address PBR_TRAFFIC R1(config-route-map)#set interface serial 2/0
Set Default Interface
最後一招是與 set ip default next-Hop 有相同功效的 set default interface,就是當 Route table 的 Route 失去時才使用 PBR 指向 Interface。
R1(config)#route-map PBR R1(config-route-map)#match ip address PBR_TRAFFIC R1(config-route-map)#set default interface serial 2/0
PBR 的處理次序
當以上 PBR 設定同時存在於同一 Route Map 時,Router 會按以下優先次序執行。
- set ip next hop
- set ip next hop recursive
- set ip default next hop
- set interface
- set default interface
舉例:set ip next hop,set ip default next hop 與 set interface 同時存在,只有 set ip next hop 生效。
相關主題
Jan Ho 2017-09-16
Posted In: Layer 3 網絡技術
發佈留言