Mặc định, một tuyến được học từng một router dạng iBGP sẽ có địa chỉ NEXT_HOP là địa chỉ của router eBGP cuối cùng quảng bá tuyến. Ví dụ, tuyến đường của R3 về mạng 31.0.0.0/8 thông qua R1 liệt kê địa chỉ IP của R6 (172.16.16.6) trong trường NEXT_HOP. Điều không may là R3 không có tuyến về địa chỉ 172.16.16.6 để tuyến đó có thể được xem là “tốt nhất” bởi BGP. Có hai giải pháp để giải quyết vấn đề:
Tùy chọn đầu tiên thường dễ dàng triển khai. Bởi vì nhiều router láng giềng eBGP dùng địa chỉ IP của cổng trên câu lệnh neighbor, thuộc tính NEXT_HOP tồn tại trong một kết nối trực tiếp đến AS. Ví dụ, R1 kết nối trực tiếp đến mạng 172.16.16.0/24 vì vậy R1 có thể quảng bá địa chỉ kết nối trực tiếp đó vào trong IGP bên trong AS.
Tuy nhiên, tùy chọn này có thể có vấn đề khi địa chỉ loopback được dùng cho láng giềng BGP. Ví dụ nếu R1 được cấu hình để chỉ đến địa chỉ cổng loopback 6.6.6.6 của R6, R1 phải có một tuyến đường để đến 6.6.6.6. Tuy nhiên, ít có khả năng rằng R1 đã quảng bá vào trong AS 123 một tuyến đường để đi đến 6.6.6.6.
Giải pháp thứ hai sẽ làm cho router thay đổi thuộc tính NEXT_HOP đến một trong các địa chỉ IP của chính nó – là địa chỉ IP đã xuất hiện trong bảng định tuyến của láng giềng. Ví dụ dưới đây chỉ ra một trường hợp như vậy, trong đó R1 dùng lệnh neighbor next-hop-self quảng bá chính nó (1.1.1.1) như là NEXT_HOP. Kết quả là, R3 thay đổi chọn lựa đường đi tốt nhất của nó, bởi vì R3 có một tuyến để đi về 1.1.1.1. Điều này giúp khắc phục vấn đề không thể đi đến được chặng kế tiếp “NEXT_HOP unreachable”.
Ví dụ dưới đây chỉ ra làm thế nào một router iBGP có thể gán thuộc tính NEXT_HOP bằng chính nó. Tuy nhiên, đây cũng là một ví dụ tốt để xem cách BGP quyết định khi nào thì quảng bá các tuyến đến iBGP.
Ví dụ bắt đầu bằng đoạn kết của ví dụ trên, trong đó R1 quảng bá các tuyến với R6 như là chặng kế tiếp và R3 không dùng các tuyến này như là tuyến đường tốt nhất.
Bước 1, ở thời điểm này, R3 vẫn tin rằng đường đi tốt nhất về cả ba mạng trong dãy 30 là thông qua R4 vì những tuyến này là eBGP, R3 quảng bá cả ba mạng này về router láng giềng iBGP R2.
R3# show ip bgp neighbor 2.2.2.2 advertised-routes
BGP table version is 7, local router ID is 3.3.3.3
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 31.0.0.0 4.4.4.4 0 45 678 ?
*> 32.0.0.0 4.4.4.4 0 45 678 i
*> 32.1.1.0/24 4.4.4.4 0 45 678 ?
Total number of prefixes 3
Ở bước 2, R2 liệt kê số tuyến học được từ R3.
R2# show ip bgp summary | begin Neighbor
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
1.1.1.1 4 123 212 210 7 0 0 03:27:59 3
3.3.3.3 4 123 213 211 7 0 0 03:28:00 3
Ở bước 3, R1 thay đổi sang dùng lệnh next-hop-self để quan hệ với R3.
R1# conf t
Enter configuration commands, one per line. End with CNTL/Z.
R1(config)# router bgp 123
R1(config-router)# neigh 3.3.3.3 next-hop-self
Ở bước 4, R3 bây giờ liệt kê các tuyến học được thông qua R1 như là tuyến tốt nhất, bởi vì giá trị NEXT_HOP là địa chỉ nguồn IP 1.1.1.1 của R1, địa chỉ này có thể đến được từ R3.
R3# show ip bgp
BGP table version is 10, local router ID is 3.3.3.3
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
* 31.0.0.0 4.4.4.4 0 45 678 ?
*>i 1.1.1.1 156160 1000 678 ?
* 32.0.0.0 4.4.4.4 0 45 678 i
*>i 1.1.1.1 0 1000 678 i
* 32.1.1.0/24 4.4.4.4 0 45 678 ?
*>i 1.1.1.1 156160 1000 678 ?
Bước 5, chú ý cả ba tuyến tốt nhất ở trên đều là tuyến kiểu iBGP, do ký hiệu “i” ngay phía trước của địa chỉ mạng. R3 chỉ quảng bá các tuyến tốt nhất, với một yêu cầu là tuyến này không được quảng bá đến các láng giềng iBGP khác. Kết quả là, R3 đã bỏ các tuyến trước đây đã gửi đến R2.
R3# show ip bgp neighbor 2.2.2.2 advertised-routes
Total number of prefixes 0
Lệnh kế tiếp xác nhận trên R2 rằng không còn bất kỳ mạng nào được học từ R3.
R2# show ip bgp summary | begin Neighbor
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
1.1.1.1 4 123 213 211 7 0 0 03:28:44 3
3.3.3.3 4 123 214 211 7 0 0 03:28:46 0
Danh sách dưới đây sẽ tóm tắt các luật mô tả những tuyến nào mà một router chạy BGP gửi trong thông điệp cập nhật của nó:
Hai luật đầu tiên sẽ được mô tả sâu hơn trong phần kế tiếp. Chương sau mô tả kỹ hơn ba luật còn lại.
Cho đến giờ, chương này đã giải thích làm thế nào hình thành quan hệ BGP, làm thế nào để đưa các tuyến vào trong bảng BGP và làm thế nào BGP chọn các tuyến nào để truyền đến láng giềng. Một phần của cơ chế này liên quan đến tiến trình ra quyết định của BGP chọn ra một tuyến đường tốt nhất đến từng mạng, với một ràng buộc là thuộc tính NEXT_HOP phải thấy được trước khi một tuyến có thể xem như là tốt nhất.
Phần này mô tả bước cuối cùng trong mục tiêu tối thượng của BGP: thêm vào các tuyến phù hợp trong bảng định tuyến IP. Trong dạng đơn giản nhất của nó, BGP sẽ chọn các tuyến BGP tốt nhất của nó và đưa các tuyến này vào bảng định tuyến IP.
Tuy nhiên, có một vài hạn chế, chủ yếu liên quan đến giá trị AD (đối với eBGP và iBGP) và tiến trình đồng bộ của BGP (đối với những tuyến iBGP).
Các phần theo sau sẽ mô tả chi tiết các ngoại lệ.
IOS của Cisco dùng cơ chế đơn giản khi xác định những tuyến eBGP nào sẽ thêm vào bảng định tuyến IP. Hai yêu cầu là như sau:
Mặc định, IOS của Cisco xem xét các tuyến eBGP có giá trị AD 20, làm cho các tuyến eBGP có giá trị AD tốt hơn (thấp hơn) giá trị AD của bất kỳ giao thức định tuyến nào khác (ngoại trừ giá trị AD bằng 5 của tuyến tóm tắt của EIGRP).
Lý luận nằm sau trạng thái mặc định này là các tuyến học thông qua eBGP sẽ không nên là một tiền tố từ bên trong một AS. Ở trạng thái bình thường, các tuyến eBGP không nên được thấy như là IGP nhưng nếu có thấy thì các tuyến BGP cũng sẽ thắng quá trình bầu.
BGP gán các giá trị AD khác nhau cho các tuyến eBGP, iBGP và cho các tuyến cục bộ các giá trị AD tương ứng là 20, 200 và 200. Các giá trị này có thể thay đổi bằng hai cách:
Trong BGP, địa chỉ IP và các giá trị wildcard muốn chỉ đến địa chỉ IP được dùng trong câu lệnh neighbor cho láng giềng đó, chứ không phải BGP RID hay giá trị NEXT_HOP của tuyến đường. ACL sẽ kiểm tra các tuyến BGP nhận được từ láng giềng, gán giá trị AD cho bất kỳ tuyến nào so trùng với ACL với hành động cho phép (permit). Cuối cùng, cần chú ý về tuyến IP thực sự được đưa vào bảng định tuyến IP. Các tuyến chứa chính xác các thông số tiền tố (prefix), độ dài tiền tố (prefix length) và địa chỉ IP chặng kế tiếp được liệt kê trong bảng BGP, ngay cả khi thuộc tính NEXT_HOP là một địa chỉ IP không nằm trong mạng kết nối trực tiếp.
Kết quả là, tiến trình đầy gói IP đi có thể cần một phép tìm kiếm đệ qui. Ví dụ dưới đây mô tả một tình huống như vậy trên R3, trong đó có ba tuyến BGP cùng liệt kê giá trị NEXT_HOP là 1.1.1.1, là địa chỉ loopback trên R1. R3 và R1 không có mạng kết nối chung. Tuyến đường đi về 1.1.1.1 liệt kê địa chỉ IP chặng kế tiếp thực sự mà một gói tin sẽ đựơc đẩy đến.
Các gói tin được truyền về 31.0.0.0/8 sẽ trùng với tuyến đường cuối cùng, với giá trị chặng kế tiếp là 1.1.1.1; R3 sau đó sẽ tìm ra những tuyến trùng với địa chỉ đích 1.1.1.1 (tuyến đầu tiên trong bảng định tuyến), tìm ra địa chỉ chặng kế tiếp phù hợp và cổng ra.
R3# show ip route | incl 1.1.1.1
D 1.1.1.1 [90/2809856] via 10.1.23.2, 04:01:44, Serial0/0/1
B 32.1.1.0/24 [200/156160] via 1.1.1.1, 00:01:00
B 32.0.0.0/8 [200/0] via 1.1.1.1, 00:01:00
B 31.0.0.0/8 [200/156160] via 1.1.1.1, 00:01:00
Việc có giá trị AD mặc định thấp (AD bằng 20) của các tuyến eBGP có thể gây ra vấn đề trong một vài sơ đồ mạng. Hình 12.6 mô tả một trường hợp tiêu biểu, trong đó khách hàng Doanh nghiệp 1 dùng các tuyến eBGP của nó để đi đến mạng 99.0.0.0 nằm trong mạng Doanh nghiệp 2. Tuy nhiên, hai doanh nghiệp này muốn dùng tuyến đường được học thông qua OSPF trên kết nối thuê bao giữa hai doanh nghiệp.
Hình 12.6: Mạng hai doanh nghiệp sử dụng các tuyến eBGP
R1 dùng các tuyến eBGP của nó để đi đến mạng 99.0.0.0 bởi vì eBGP có một giá trị AD thấp hơn (20) OSPF (110). Một giải pháp sẽ là cấu hình lệnh distance để hạ thấp giá trị AD của các tuyến học được thông qua OSPF. Tuy nhiên, BGP có một giải pháp khác dễ dàng hơn cho vấn đề đặc biệt này thông qua việc sử dụng câu lệnh network backdoor. Trong trường hợp này, nếu R1 được cấu hình câu lệnh network 99.0.0.0 backdoor, các việc sau sẽ diễn ra:
Với cơ chế đó, R1 có thể dùng lệnh network backdoor cho từng mạng mà R1 muốn chuyển sang dùng đường truyền riêng để đến Doanh nghiệp 2. Nếu các tuyến OSPF là hoạt động, R1 sẽ dùng OSPF (AD 110) chứ không dùng các tuyến được học thông qua eBGP (AD 200) được định tuyến vòng ra Internet. Nếu tuyến đường OSPF bị mất, hai doanh nghiệp vẫn có thể liên lạc thông qua Internet.
IOS của Cisco có cùng hai yêu cầu để thêm các tuyến iBGP vào trong bảng định tuyến IP giống như eBGP:
Thêm vào đó, để cho các tuyến học được thông qua iBGP, IOS xem xét khái niệm sự đồng bộ trong BGP (còn gọi là luật sync). Luật sync được tóm tắt bằng lệnh no synchronization. BGP dùng cùng thuật toán cho các tuyến iBGP như thuật toán dùng cho eBGP để chọn ra những tuyến nào sẽ được thêm vào bảng định tuyến. Tuy nhiên, bật luật đồng bộ BGP (với lệnh synchronization) ngăn ngừa một vài vấn đề liên quan đến định tuyến. Hình 12.7 mô tả chi tiết một vấn đề như vậy. Trong trường hợp này, đồng bộ là đã tắt không phù hợp trong AS 678, tạo ra một hiện tượng lỗ đen.
Hình 12.7: Mô tả luật đồng bộ trong BGP
Dưới đây liệt kê chuỗi các sự kiện sẽ diễn ra với BGP trong hình trên:
Có hai vấn đề liên quan (gán nhãn là A và B trong hình 12.7) xảy ra trong trường hợp này. Hiện tượng lỗ đen xảy ra vì R8 không có một tuyến đến các mạng được quảng bá bởi BGP. R8 không chạy BGP. Đây là một hiện tượng phổ biến cho các router không có kết nối trực tiếp đến một router eBGP. R7 không đưa các mạng này vào trong IGP. Kết quả là, R8 không thể định tuyến gói tin về các mạng này. R6 và có thể các router khác trong AS123 cố gắng đẩy gói tin về hai mạng đích thông qua AS678, nhưng R8 đã loại bỏ gói tin, vì vậy tạo ra hiện tượng lỗ đen.
Vấn đề liên quan thứ hai, được gán nhãn là B, diễn ra ở bước 5. R6 làm trầm trọng thêm vấn đề lỗ đen bằng cách quảng bá đến một AS khác (AS 123) rằng nó có đuờng đi đến các mạng trên. R6 xem các tuyến về 21.0.0.0/8 and 22.2.2.0/24 là các tuyến tốt nhất trong bảng BGP của nó, vì vậy R6 sẽ quảng bá các tuyến này đến R1. Tùy thuộc vào sơ đồ mạng và các giá trị thuộc tính, R1 có thể xem xét các tuyến này như đường đi tốt nhất – vì vậy sẽ gửi các gói tin về mạng này thông qua AS 678. Giả sử cấu hình hiển thị trong ví dụ trước, R1 sẽ thực sự tin rằng AS_PATH từ R3 đến AS45 là đường đi tốt nhất.
Giải pháp cho các vấn đề này thì khác nhau nhưng tất cả các giải pháp đều dẫn đến kết quả là các router nội bộ (ví dụ R8) học các tuyến về các địa chỉ này, vì vậy sẽ loại bỏ hiện tượng lỗ đen và tác động tiêu cực của việc quảng bá các tuyến. Giải pháp ban đầu của vấn đề này bao gồm việc sử dụng luật đồng bộ BGP hoặc dùng phân phối các tuyến BGP vào trong IGP. Tuy nhiên có hai giản pháp tốt hơn là dùng cơ chế ánh xạ tuyến BGP (BGP route reflector) và cơ chế liên minh BGP (BGP confederation).
Luật đồng bộ BGP được hiểu tốt nhất khi xem xét trong ngữ cảnh nó dự định được dùng kết hợp trong quá trình phân phối các tuyến kiểu BGP vào trong IGP. Phương thức này hiếm khi được dùng bởi các ISP ngày nay, chủ yếu là bởi vì một số lượng lớn các tuyến phải được đưa vào IGP. Tuy nhiên, dùng luật đồng bộ BGP kết hợp với quá trình phân phối lại sẽ giải quyết cả hai vấn đề liên quan đến hiện tượng lỗ đen.
Chìa khóa để hiểu luật đồng bộ BGP là để biết rằng quá trình phân phối giải quyết hiện tượng lỗ đen và đồng bộ giúp giải quyết vấn đề quảng bá các tuyến bị lỗ đen đến một AS khác. Ví dụ, để giải quyết vấn đề lỗ đen, R7 sẽ phân phối hai mạng vào trong RIP. R8 sau đó có các tuyến về các mạng này, sẽ giải quyết được vấn đề lỗ đen. Thuật toán đồng bộ trên R6 kiểm soát phần thứ hai của toàn bộ vấn đề, điều chỉnh trạng thái trong đó R6 quảng bá mạng đến các router eBGP khác (giống như R1). Luật đồng bộ hoạt động bằng cách kiểm soát khi nào một hàng trong bảng BGP có thể được xem như là tốt nhất. Bạn hãy nhớ rằng một tuyến trong bảng BGP phải được xem là tốt nhất trước khi nó có thể được quảng bá đến một láng giềng BGP khác. Luật đồng bộ BGP sẽ kiểm soát quyết định đó như sau:
Đừng xem xét một tuyến iBGP trong bảng BGP như là tốt nhất trừ phi chính địa chỉ mạng đó đã được học thông qua một IGP và hiện đang tồn tại trong bảng định tuyến. Cơ chế đồng bộ thường làm cho router một phương thức để biết khi nào một router không chạy BGP bên trong một AS có khả năng định tuyến gói tin về mạng đó. Chú ý rằng tuyến đường đó phải là một tuyến học được thông qua IGP bởi vì một tuyến đường tĩnh trên R6 sẽ không mang bất kỳ ý nghĩa nào về những gì mà các router khác có thể đã học được. Ví dụ, khi R6 học được địa chỉ mạng thông qua RIP, RIP sẽ đặt các tuyến vào trong bảng định tuyến IP của nó. Ở thời điểm đó, luật đồng bộ trên R6 có thể xem các tuyến BGP tương tự trong bảng BGP cũng là ứng cử viên cho đường đi tốt nhất. Nếu được chọn như là tốt nhất, R6 có thể sẽ quảng bá các tuyến BGP về R1.
Ví dụ dưới đây mô tả hiện tượng lỗ đen xảy ra từ góc nhìn của R6, với luật đồng bộ được tắt trên R6 bằng lệnh no synchronization. Sau đó, ví dụ mô tả trạng thái của R6 khi R7 bắt đầu đưa các tuyến vào trong RIP, với đồng bộ được bật trên R6.
R6 có đường đi tốt nhất về mạng 21.0.0.0/8 thông qua R7 (7.7.7.7) nhưng lệnh trace cho thấy gói tin đã bị loại bỏ bởi R8.
R6# show ip bgp | begin Network
Network Next Hop Metric LocPrf Weight Path
* 21.0.0.0 172.16.16.1 0 123 45 i
*>i 7.7.7.7 0 1000 45 i
* 22.2.2.0/24 172.16.16.1 0 123 45 i
*>i 7.7.7.7 0 1000 45 i
R6# trace 21.1.1.5
Type escape sequence to abort.
Tracing the route to 21.1.1.5
1 10.1.68.8 20 msec 20 msec 20 msec
2 10.1.68.8 !H * !H
R7 được cấu hình để phân phối BGP vào trong RIP.
R7# conf t
Enter configuration commands, one per line. End with CNTL/Z.
R7(config)# router rip
R7(config-router)# redist bgp 678 metric 3
Kế tiếp, R6 chuyển sang dùng luật đồng bộ và tiến trình BGP được xóa.
R6# conf t
Enter configuration commands, one per line. End with CNTL/Z.
R6(config)# router bgp 678
R6(config-router)# synchronization
R6(config-router)# ^Z
R6# clear ip bgp *
Bảng BGP của R6 cho thấy lỗi RIB bị lỗi “RIB failure”, là một trạng thái có nghĩa là mạng đó được biết thông qua một IGP 21.0.0.0/8 như là một tuyến dạng RIP. Chú ý rằng R6 các tuyến được học thông qua R7 như là đường đi tốt nhất, chú ý là các tuyến này cũng quảng bá đến R1.
R6# show ip bgp
BGP table version is 5, local router ID is 6.6.6.6
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal, r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
r 21.0.0.0 172.16.16.1 0 123 45 i
r>i 7.7.7.7 0 1000 45 i
r 22.2.2.0/24 172.16.16.1 0 123 45 i
r>i 7.7.7.7 0 1000 45 i
R6# show ip route | incl 21.0.0.0
R 21.0.0.0/8 [120/4] via 10.1.68.8, 00:00:15, Serial0/0.8
R6 xem xét các tuyến thông qua R7 như là đường đi tốt nhất. Các tuyến này vẫn được quảng bá đến R1, mặc dù nó trong trạng thái “RIB-failure”.
R6# show ip bgp neighbor 172.16.16.1 advertised-routes | begin Network
Network Next Hop Metric LocPrf Weight Path
r>i 21.0.0.0 7.7.7.7 0 1000 45 i
r>i 22.2.2.0/24 7.7.7.7 0 1000 45 i
Luật đồng bộ bao gồm một yêu cầu thêm khi OSPF được dùng như IGP. Nếu OSPF RID của router đang quảng bá mạng là một giá trị khác với BGP RID đang quảng bá cùng mạng đó, thì đồng bộ vẫn không cho phép BGP xem xét các tuyến là tuyến tốt nhất. OSPF và BGP sử dụng cùng độ ưu tiên và thuật toán để chọn lựa routerID, tuy nhiên khi dùng luật đồng bộ, ta nên cấu hình tường minh RID của OSPF và BGP có cùng giá trị trên router đang thực hiện phân phối từ BGP vào trong OSPF.