Khi nhiều router phân phối tuyến giữa 2 vùng chạy giao thức định tuyến khác nhau, mạng có khả năng xảy ra một số trục trặc. Một kiểu trục trặc xảy ra trên router thực hiện nhiệm vụ phân phối, bởi vì các router này sẽ học hầu hết các mạng con qua cả 2 giao thức định tuyến. Router sẽ dựa vào số AD để quyết định tuyến nào tốt nhất, tuy nhiên điều này đôi khi lại làm cho tuyến được chọn không phải là tuyến tối ưu (vấn đề ở đây các giao thức định nghĩa chi phí khác nhau). Ví dụ, hình 11.4 là một mạng đơn giản, trong đó R3 chọn tuyến OSPF với AD 110 để đi đến mạng 10.1.2.0/24 mặc dù đường tốt hơn là RIP với AD 120.
Hình 11.4: Mạng chạy RIP và OSPF cần phân phối lại
Chú ý: Trong ví dụ này, OSPF chỉ chạy trên những cổng nằm trong vùng được đánh dấu là OSPF. Do RIP không có phần mặt nạ wildcard nên khi đánh lệnh network 10.0.0.0, tất cả các cổng đều chạy RIP.
Trong hình 11.4, R3 học mạng con 10.1.2.0/24 qua bản cập nhật RIP từ R2. R1 cũng học mạng con này qua RIP và phân phối vào trong OSPF. R3 lại học tiếp mạng con 10.1.2.0/24 qua OSPF. Kết quả là R3 chọn tuyến đến mạng 10.1.2.0/24 thông qua R4, R5, R1, R2. Đây là tuyến học từ OSPF do có AD thấp hơn.
Nếu cả R1 và R3 đều phân phối tuyến giữa RIP và OSPF thì vấn đề không tối ưu tuyến chỉ xảy ra hoặc ở R1, hoặc ở R3 đối với mỗi mạng con chạy RIP, tùy vào thời điểm. Ví dụ 11.3 cho thấy cấu hình phân phối tuyến, cùng với việc R3 có tuyến không tối ưu trong hình 11.4. Tuy nhiên, sau khi cổng Fa0/0 của R1 bị chập chờn, R1 lại bị tình trạng tuyến không tối ưu, trong khi R3 sẽ có tuyến tối ưu.
Ví dụ 11.3:
Cấu hình của R1 như sau:
router ospf 1
router-id 1.1.1.1
redistribute rip subnets
network 10.1.15.1 0.0.0.0 area 0
!
router rip
redistribute ospf 1
network 10.0.0.0
default-metric 1
Cấu hình liên quan của R3 như sau:
router ospf 1
router-id 3.3.3.3
redistribute rip subnets
network 10.1.34.3 0.0.0.0 area 0
!
router rip
redistribute ospf 1
network 10.0.0.0
default-metric 1
R3 bắt đầu bằng một tuyến OSPF có giá trị AD 120 và không phải là tuyến RIP đi về mạng 10.1.2.0/24.
R3# sh ip route | incl 10.1.2.0
O E2 10.1.2.0 [110/20] via 10.1.34.4, 00:02:01, Serial0/0/0.4
R1 cũng có một tuyến RIP đi về 10.1.2.0/24 và được phân phối lại vào trong OSPF, làm cho R3 học một tuyến OSPF về 10.1.2.0/24.
R1# sh ip route | incl 10.1.2.0
R 10.1.2.0 [120/1] via 10.1.12.2, 00:00:08, FastEthernet0/0
Kế tiếp, R1 mất tuyến RIP đi về 10.1.2.0/24, làm cho R3 mất tuyến OSPF của nó.
R1# conf t
Enter configuration commands, one per line. End with CNTL/Z.
R1(config)# int fa 0/0
R1(config-if)# shut
R3 mất tuyến OSPF nhưng sau đó có thể đưa tuyến dạng RIP vào trong bảng định tuyến.
R3# sh ip route | incl 10.1.2.0
R 10.1.2.0 [120/1] via 10.1.23.2, 00:00:12, Serial0/0/0.2
! Not shown: R1 brings up its fa0/0 again
! However, R1 now has the suboptimal route to 10.1.2.0/24, through OSPF.
R1# sh ip route | incl 10.1.2.0
O E2 10.1.2.0 [110/20] via 10.1.15.5, 00:00:09, Serial0/0/0.
Điểm cốt yếu của ví dụ này là việc chứng minh quá trình phân phối tuyến chỉ xử lý những tuyến hiện có trong bảng định tuyến của router. Khi mạng lần đầu tiên được bật lên, R1 học tuyến đến 10.1.2.0/24 qua RIP và phân phối lại vào OSPF trước khi R3 làm điều đó. Vì vậy, R3 phải đối mặt với vấn đề chọn lựa giữa một tuyến có AD 110 (học qua OSPF) và một tuyến có AD 120 (học qua RIP), và R3 chọn tuyến có AD nhỏ hơn, tức là tuyến học qua OSPF. Bởi R3 không bao giờ có tuyến 10.1.2.0/24 học từ RIP trong bảng định tuyến, nó sẽ không phân phối tuyến này vào OSPF.
Sau đó, khi cổng Fa0/0 của R1 bị hư, R3 sẽ loại tuyến đến 10.1.2.0/24 học từ OSPF và đưa tuyến học từ RIP vào bảng định tuyến. Vì tuyến này sẽ được phân phối lại vào OSPF nên dẫn đến tình trạng R1 có tuyến không tối ưu.
Để giải quyết vấn đề này, router thực hiện việc phân phối tuyến phải biết rõ những tuyến nào đến từ miền nào. Cụ thể, giao thức định tuyến có AD thấp hơn cần phải xác định những tuyến nào đến từ giao thức có AD cao hơn và hoặc là gán giá trị AD khác cho những tuyến này, hoặc là lọc các tuyến này đi. Phần tiếp theo sẽ trình bày một số cách ngăn chặn vấn đề tuyến không tối ưu.
Một giải pháp đơn giản và hiệu quả có thể áp dụng trên router thực hiện việc phân phối tuyến là chỉnh các tuyến được phân phối với số AD cao hơn. Giá trị AD của tuyến không được quảng bá ra ngoài; tuy vậy, giá trị AD có thể được gán cho các tuyến của một router để router đó có thể chọn tuyến như mong muốn. Chẳng hạn, quay trở lại hình 11.4 và ví dụ 11.3, R3 có thể gán cho những tuyến học từ OSPF một giá trị AD cao hơn 120, khi đó tình trạng tuyến không tối ưu sẽ không xuất hiện trong mạng nữa.
Hình 11.5 đưa ra một ví dụ phức tạp hơn, với tuyến từ vùng RIP (10.1.2.0/24) và một tuyến từ vùng OSPF (10.1.4.0/24). Router làm nhiệm vụ phân phối, R3, sẽ học hai tuyến này từ cả RIP lẫn OSPF. Bằng cách cấu hình cho R3 đối xử với các tuyến OSPF nội với AD mặc định (110) còn các tuyến OSPF ngoại với AD cao hơn 120, R3 sẽ chọn được tuyến tối ưu.
Hình 11.5: Ví dụ sử dụng ngăn chặn tuyến không tối ưu bằng AD
Ví dụ 11.4 cho thấy cách làm thế nào để cấu hình cho R1 và R3 dùng giá trị AD khác cho những tuyến ngoại. Cả router R1 và R3 đều có cấu hình giống như ví dụ trước nhưng với sự xuất hiện của câu lệnh distance.
Ví dụ 11.4:
router ospf 1
distance ospf external 180
! R3 has a more optimal RIP route to 10.1.2.0/24, as does R1.
R3# sh ip route | incl 10.1.2.0
R 10.1.2.0 [120/1] via 10.1.23.2, 00:00:19, Serial0/0/0.2
! R1 next…
R1# show ip route | incl 10.1.2.0_
R 10.1.2.0 [120/1] via 10.1.12.2, 00:00:11, FastEthernet0/0
R1 mất cổng chặng kế tiếp của nó cho các tuyến RIP, vì vậy bây giờ nó là tuyến OSPF với giá trị AD 180 và nó là tuyến duy nhất để đi về mạng 10.1.2.0/24.
R1# conf t
Enter configuration commands, one per line. End with CNTL/Z.
R1(config)# int fa 0/0
R1(config-if)# shut
R1(config-if)# do sh ip route | incl 10.1.2.0
O E2 10.1.2.0 [180/20] via 10.1.15.5, 00:00:05, Serial0/0/0.5
Mặc định, EIGRP hỗ trợ các khái niệm giống như trên: dùng AD 170 cho các tuyến ngoại và AD 90 cho các tuyến nội. Thực tế, nếu EIGRP được dùng thay OSPF trong ví dụ này thì R1 và R3 sẽ không gặp tình trạng tuyến không tối ưu. Cũng có thể đặt lại giá trị AD trong EIGRP cho tuyến nội cũng như tuyến ngoại bằng lệnh distance eigrp. (Đến thời điểm này, cả IS-IS và RIP đều chưa hỗ trợ việc gán giá trị AD cho tuyến nội hay tuyến ngoại).
Trong một vài trường hợp, các yêu cầu có thể không cho phép chỉnh giá trị AD cho tất cả các tuyến ngoại. Chẳng hạn, nếu R4 đưa một số tuyến hợp lệ vào OSPF, cấu hình trong ví dụ 11.4 sẽ trả về kết quả là R1 hoặc R3 sẽ học tuyến không tối ưu. Trong trường hợp như vậy, nên dùng câu lệnh distance theo cách khác, nhắm vào một vài hoặc tất cả các tuyến đến từ một router cụ thể.
Cú pháp như sau:
distance {distance-value ip-address {wildcard-mask} [ip-standard-list] [ip-extended-list]
Câu lệnh trên cấu hình 3 thành phần quan trọng: số AD cần đặt, địa chỉ IP của router đã quảng bá tuyến, và một tùy chọn là ACL dùng để so trùng các tuyến. Với RIP, EIGRP và IS-IS, câu lệnh này chỉ ra cổng của router láng giềng (dùng thông số mặt nạ wildcard của địa chỉ IP). Với OSPF, thông số tương tự lại chỉ đến RID của router tạo ra LSA cho tuyến đang xét. ACL xác định thêm tập các tuyến con mà các giá trị AD sẽ được chỉnh sửa. Có thể hiểu câu lệnh trên như sau:
“Đặt giá trị AD này cho tất cả các tuyến được cho phép bởi ACL và được học từ router, định danh bằng địa chỉ IP và mặt nạ wildcard”.
Ví dụ 11.5 cho thấy làm cách nào câu lệnh trên được sử dụng để giải quyết vấn đề tuyến không tối ưu trên R1 và R3, trong khi vẫn không gây ra tình trạng tuyến không tối ưu đối với những tuyến ngoại khác. Các mục tiêu chính như sau:
Ví dụ 11.5
Cấu hình của R1. Chú ý rằng lệnh này tham chiếu đến 3.3.3.3 là RID của R3. Các lệnh khác không liên quan đến việc gán giá trị AD bị loại bỏ. Điểm đặc biệt cần lưu ý là lệnh distance trên R1 tham khảo đến OSPF RID của R3 bởi vì R3 tạo ra các LSA mà ta đang cố gắng so trùng, là LSA được tạo ra khi R3 đưa các tuyến từ RIP sang.
router ospf 1
distance 179 3.3.3.3 0.0.0.0 only-rip-routes
!
ip access-list standard only-rip-routes
permit 10.1.12.0
permit 10.1.3.0
permit 10.1.2.0
permit 10.1.23.0
Cấu hình R3. Chú ý là lệnh tham chiếu đến 1.1.1.1 là RID của R1. Các lệnh khác không liên quan đến động tác gán AD bị loại bỏ. Ngoài ra, ACL only-rip-routes thì tương tự như ACL only-rip-routes của R1.
router ospf 1
distance 179 1.1.1.1 0.0.0.0 only-rip-routes
Có một cách khác để tránh vấn đề tuyến không tối ưu trên các router phân phối, rất đơn giản, chỉ cần lọc đi những tuyến gặp vấn đề. Vẫn dùng lại ví dụ cho mạng 10.1.2.0/24 ở trên, R3 sẽ dùng một danh sách phân phối (distribute-list) từ ngoài đi vào để lọc các tuyến OSPF đến mạng 10.1.2.0/24, cho phép R3 dùng các tuyến RIP để đến mạng 10.1.2.0/24. R1 cũng cần thực hiện công việc tương tự như R3 để ngăn chặn việc tuyến không tối ưu.
Việc lọc tuyến dựa vào các mạng con vẫn hoạt động bình thường, tuy nhiên các router phân phối cần được cấu hình lại mỗi lần có thay đổi về mạng trong vùng định tuyến có AD cao hơn. Có thể cải thiện vấn đề này bằng cách thêm phần đánh dấu tuyến (route tagging). Khi đánh dấu tất cả các tuyến trong vùng có AD cao hơn và phân phối lại vào vùng có AD thấp hơn, lệnh distribute-list sẽ dễ dàng kiểm tra các tuyến này. Hình 11.6 trình bày cách áp dụng phương pháp này cho mạng 10.1.2.0/24.
Các đánh dấu tuyến chỉ đơn giản là các số nguyên và thường dài 16 hoặc 32 bit tùy vào giao thức định tuyến, giúp router nhận biết một tuyến nào đó đang được phân phối từ một giao thức khác. Chẳng hạn, R1 có thể đánh dấu tuyến OSPF – học từ quá trình phân phối – với giá trị là 9999. OSPF không hề biết số 9999 đã đánh dấu có nghĩa là gì, nhưng OSPF có thể thêm trường tagging vào trong LSA của nó để phục vụ cho việc quản trị. Nhờ đó, R3 có thể lọc tuyến dựa vào giá trị đánh dấu này, giải quyết vấn đề tuyến không tối ưu.
Hình 11.6 và ví dụ 11.6 mô tả việc đánh dấu tuyến và lọc tuyến đối với tình huống tuyến không tối ưu. R1 và R3 đánh dấu tất cả các tuyến phân phối từ RIP với giá trị 9999 khi các tuyến này được đưa vào vùng OSPF, sau đó R1 và R3 sẽ lọc các tuyến OSPF dựa vào giá trị đánh dấu này. Mạng chạy tốt bởi vì R1 có thể đánh dấu tất cả các tuyến từ RIP, do đó không cần phải cấu hình lại mỗi lần có thay đổi về mạng trong vùng RIP. (Chú ý: cả R1 và R3 đều đánh dấu các tuyến được phân phối từ RIP vào OSPF với giá trị 9999, và cả hai đều lọc các tuyến OSPF loại này)
Hình 11.6: Lọc tuyến không tối ưu dựa vào việc đánh dấu tuyến
Ví dụ 11.6:
Cấu hình của R1. Lệnh redistribute sẽ tham chiếu đến một route-map, trong đó gán các tuyến từ RIP có giá trị đánh dấu là 9999. Danh sác phân phối sẽ xem các tuyến học từ OSPF đã được đánh dấu trước đó bởi R3.
router ospf 1
redistribute rip subnets route-map tag-rip-9999
network 10.1.15.1 0.0.0.0 area 0
distribute-list route-map check-tag-9999 in
Mệnh đề 10 là mệnh đề deny sẽ lựa ra tất cả các tuyến có tag là 9999. Chỉ những tuyến này bị lọc. Mệnh đề 20 cho phép tất cả các tuyến khác, bởi vì nếu không có lệnh no match thì mệnh đề tương đương với so trùng tất cả (match all).
route-map check-tag-9999 deny 10
match tag 9999
!
route-map check-tag-9999 permit 20
Route map tag-rip-9999 sẽ lựa ra tất cả các tuyến và sau đó sẽ đánh dấu bằng lệnh tag 9999. Route-map này được dùng chỉ cho những tuyến được đưa từ RIP vào trong OSPF.
route-map tag-rip-9999 permit 10
set tag 9999
Cấu hình R3. Cấu hình R3 không dùng cùng tên cho route-map nhưng các thành phần cần thiết là giống nhau vì vậy route-map không được lặp lại ở đây.
router ospf 1
redistribute rip subnets route-map tag-rip-9999
network 10.1.34.3 0.0.0.0 area 0
distribute-list route-map check-tag-9999 in
R3 và R1 có các tuyến RIP đi về 10.1.2.0 cũng như là các tuyến khác từ miền RIP. Lưu ý rằng LSDB hiển thị các giá trị đã được đánh dấu.
R3# show ip route | incl 10.1.2.0
R 10.1.2.0 [120/1] via 10.1.23.2, 00:00:26, Serial0/0/0.2
R3# sh ip ospf data begin Type-5
Type-5 AS External Link States
Link ID ADV Router Age Seq# Checksum Tag
10.1.1.0 1.1.1.1 834 0x80000006 0x00CE86 9999
10.1.1.0 3.3.3.3 458 0x80000003 0x0098B7 9999
10.1.2.0 1.1.1.1 834 0x80000006 0x00C390 9999
10.1.2.0 3.3.3.3 458 0x80000003 0x008DC1 9999
Kế tiếp, R3 không có các tuyến đi về RIP mặc định dùng các router OSPF nội vùng (ví dụ như R4).
R3# conf t
Enter configuration commands, one per line. End with CNTL/Z.
R3(config)# int s0/0/0.2
R3(config-subif)# shut
R3(config-subif)# ^Z
R3# sh ip route | incl 10.1.2.0
R3#
Các dòng cuối trong ví dụ cho thấy bất lợi lớn nhất của việc lọc tuyến để chống lại vấn đề tuyến không tối ưu. Khi R3 mất kết nối với R2, R3 sẽ không dùng tuyến dự phòng đi qua vùng OSPF. Bộ lọc của R3 sẽ loại tất cả các tuyến từ OSPF với giá trị đánh dấu là 9999 mà không cần quan tâm đến chuyện các tuyến đang chạy RIP có còn tồn tại hay không. Do đó nên sử dụng phương pháp chỉnh AD hơn là phương pháp đánh dấu tuyến.