Bài viết chuyên đề

Tiến trình chọn đường của BGP

10/12/2021 07:50:38

Trong các bài viết trước, chúng ta đã cùng trao đổi về những đặc điểm cơ bản nhất về giao thức định tuyến BGP đồng thời thực hiện một bài lab cơ bản về giao thức này. Trong các bài viết tiếp theo này, chúng ta sẽ cùng đề cập đến Tiến trình chọn đường của BGP (BGP path selection process).

Bài số 1 – Một số thuộc tính đường đi của BGP

Giới thiệu

Trong các bài viết trước, chúng ta đã cùng trao đổi về những đặc điểm cơ bản nhất về giao thức định tuyến BGP đồng thời thực hiện một bài lab cơ bản về giao thức này. Trong các bài viết tiếp theo này, chúng ta sẽ cùng đề cập đến Tiến trình chọn đường của BGP (BGP path selection process).

Như đã trao đổi trong bài viết đầu tiên, BGP là một giao thức Path – vector, nó hoạt động theo cách thức của Distance – vector, ngoại trừ việc đường đi của BGP sẽ được đo đạc độ tối ưu bằng nhiều thuộc tính chứ không chỉ giới hạn bằng một thông số duy nhất là Metric như với các giao thức RIP và EIGRP.

Tương tự như EIGRP, BGP cũng sử dụng một bộ 3 bảng dữ liệu cơ bản trong quá trình hoạt động của nó: Bảng neighborBảng BGP và Bảng định tuyến. Bảng neighbor sẽ liệt kê ra danh sách các BGP router mà router đang xét đã thiết lập được quan hệ láng giềng (peering thành công); bảng BGP sẽ tập hợp tất cả các route mà các láng giềng này quảng bá cho router đang xét; và bảng định tuyến sẽ là nơi tập hợp những route tốt nhất mà giao thức BGP đã chọn ra từ bảng BGP để sử dụng làm đường đi chính thức đến các mạng đích. Quá trình vừa nêu có thể được tóm tắt trong hình vẽ dưới đây (hình 1):

Hình 1 – Quá trình tiếp nhận và chọn lọc thông tin định tuyến của BGP.

Như mô tả trong hình 1, quá trình một router BGP tiếp nhận thông tin định tuyến và xử lý những thông tin này diễn ra theo các bước sau:

  1. Router R đã peering thành công với các neighbor R1, R2 và R3. Các router R1, R2 và R3 sẽ gửi đi các BGP routing update để quảng bá cho router R các route BGP tốt nhất mà chúng đã lựa chọn được trước đó.
  2. Router R khi nhận được các routing update từ các neighbor sẽ tập hợp hết lại vào một “kho chứa” route là bảng BGP. Như vậy, bảng BGP của một router là nơi tập kết tất cả thông tin định tuyến mà nó nhận được từ các láng giềng.
  3. Tiếp theo, router R sẽ thực hiện “tuyển chọn” từ “kho route” trong bảng BGP ra các route tốt nhất cho từng mạng đích. Việc tuyển chọn này tuân theo một bộ quy tắc so sánh các thuộc tính đường đi của các route để từ đó chọn ra route tối ưu gọi là Tiến trình chọn đường BGP (BGP Path selection process)
  4. Các route tốt nhất được chọn ra ở trên sẽ được router R cập nhật vào bảng định tuyến để sử dụng chính thức cho việc dẫn đường dữ liệu, đồng thời cũng được quảng bá đi cho router láng giềng kế tiếp (trên hình vẽ là router R’). Lưu ý rằng, một router Path – vector hay Distance – vector chỉ quảng bá đến láng giềng những route tốt nhất mà nó có.

Chuỗi bài viết tiếp theo của chúng ta sẽ đi vào phân tích các bước hoạt động của Tiến trình chọn đường BGP đã đề cập đến ở trên.

Một số thuộc tính đường đi thường gặp

Như đã trình bày ở trên, một đường đi (route) trong BGP sẽ được đo đạc mức độ tối ưu bằng rất nhiều thông số đính kèm mà người ta thường gọi là các Thuộc tính đường đi của BGP (BGP Path Attributes). Trong mục này, chúng ta sẽ cùng điểm qua một vài thuộc tính đường đi thường gặp nhất của giao thức BGP. Để có thể nắm vững và vận dụng thành thạo Tiến trình chọn đường BGP, chúng ta cần phải nắm vững vai trò và đặc điểm của các thuộc tính này.

Các thuộc tính thường gặp được mô tả ở đây sẽ bao gồm: 

  • AS – path.
  • Next – hop.
  • Origin.
  • Local Preference.
  • MED.
  • Weight.

AS – path

AS – path là một chuỗi ký tự liệt kê ra danh sách ASN của các AS mà một IP prefix đã lan truyền ngang qua để đến được router đang xét. Chúng ta xem xét một ví dụ trong hình 2:

Hình 2 – Ví dụ về thuộc tính AS – path.

Trên hình 2, chúng ta xem xét quá trình prefix 192.168.1.0 lan truyền từ AS 64520, qua AS 65500 rồi đến router B nằm trên AS 65000. Khi router B hiển thị thông tin về prefix 192.168.1.0 mà nó nhận được từ BGP, một chuỗi ký tự kèm theo sẽ xuất hiện cho biết prefix này đã đi qua các AS nào trước khi đến được router B. Chuỗi ký tự này trình bày ASN của các AS theo thứ tự từ gần nhất đến xa nhất với router B: “65500 64520”. 

AS – path là một thuộc tính quan trọng, được sử dụng rất nhiều trong việc so sánh độ tối ưu giữa các route đi đến cùng một đích đến trong Tiến trình chọn đường BGP.

Next – hop

Tương tự như với các giao thức IGP Distance – vector, next – hop là địa chỉ của router neighbor đã quảng bá thông tin định tuyến cho router đang xét, là router kế tiếp phải đi qua trong lộ trình đi đến một mạng đích nào đó. Tuy nhiên, trong xử lý thông tin định tuyến được quảng bá qua lại giữa các AS, vì BGP là một giao thức định tuyến ngoài, next – hop được xem như là địa chỉ IP inbound của AS kế tiếp trên đường đi đến đích. Chúng ta xem xét một ví dụ (hình 3):

Hình 3 – Ví dụ về ứng xử next – hop.

Trong ví dụ này, Router A (AS 64520) quảng bá prefix 172.16.0.0 đến router B thông qua một session eBGP với trường next – hop trong routing update được thiết lập là “10.10.10.3”. Đến lượt nó, router B lại tiếp tục quảng bá prefix này vào cho router C. Nếu giống như với các giao thức IGP thông thường, B sẽ quảng bá địa chỉ next – hop cho C là “172.20.10.1” –là IP của chính nó, nhưng vì đây là BGP – một giao thức định tuyến ngoài, router B sẽ vẫn để nguyên next – hop “10.10.10.3” cho mạng 172.16.0.0 mà quảng bá đến cho router C. Kết quả là C sẽ nhận được cập nhật định tuyến cho prefix 172.16.0.0 có next – hop là 10.10.10.3, và nếu như C không được định tuyến trước đó để có thể đi đến được địa chỉ 10.10.10.3, C sẽ không thể sử dụng được cập nhật định tuyến này, từ đó không thể route dữ liệu đi đến mạng 172.16.0.0 được.

Để tránh ảnh hưởng của ứng xử next – hop như next – AS như trình bày ở trên, trên các router biên như router B, khi thiết lập iBGP peering với các router BGP trong cùng AS, chúng ta có thể sử dụng tùy chọn “next-hop-self” trong câu lệnh “neighbor”. Ví dụ, với router B trong trường hợp này, B sẽ cấu hình thiết lập neighbor với C sử dụng “next-hop-self”:

B(config)#router bgp 65000

B(config-router)#neighbor 172.20.10.2 remote-as 65000

B(config-router)#neighbor 172.20.10.2 next-hop-self

B(config-router)#exit

Sau khi sử dụng tùy chọn này, router B khi quảng bá thông tin eBGP route vào cho các iBGP peer bên trong cùng AS sẽ không giữ địa chỉ next – hop là next – AS như trên nữa mà sẽ đổi thành địa chỉ IP của chính nó. Điều đó có nghĩa là, lần này router C sẽ nhận được cập nhật định tuyến cho mạng 172.16.0.0 với next – hop là địa chỉ 172.20.10.1 – một địa chỉ mà C có thể đi đến được, từ đó C có thể sử dụng được cập nhật định tuyến 172.16.0.0 mà nó vừa nhận được.

Các bạn có thể tham khảo lại bài lab cơ bản về cấu hình BGP tại đường link: https://waren.vn/chuyen-de/cau-hinh-co-ban-bgp-voi-cisco-ios.html để nắm rõ hơn về ứng xử next – hop vừa nêu.

Thuộc tính next – hop là một thông số bắt buộc phải có trong mọi bản tin định tuyến cho mọi prefix được trao đổi giữa các router BGP.

Origin

Có nhiều cách để một router ban đầu quảng bá các IP Prefix vào mạng lưới BGP. Trong bài lab cấu hình cơ bản BGP đã trình bày trong bài viết trước, phương pháp được sử dụng là dùng câu lệnh “network” để tìm kiếm và quảng bá một IP Prefix có sẵn trước đó trong bảng định tuyến của router vào BGP.

Bên cạnh phương pháp sử dụng lệnh “network”, một phương pháp khác cũng thường được sử dụng là thực hiện redistribute các route có sẵn trong bảng định tuyến của một phương thức IGP nào đó vào BGP. Ví dụ, khi “redistribute ospf…”, router sẽ đem toàn bộ các route OSPF đã có trước đó quảng bá vào BGP; hay khi “redistribute eigrp…”, router sẽ đem các route EIGRP đã có trước đó quảng bá vào vào BGP. 

Một prefix khi được quảng bá và lan truyền trên mạng lưới BGP sẽ được đính kèm một mã hiệu cho biết nó được router gốc đưa vào BGP bằng phương pháp nào. Mã hiệu này được gọi là Origin code, và được coi là một thuộc tính đường đi của BGP: thuộc tính Origin.

Có 3 Origin code có thể xuất hiện trong thuộc tính Origin:

  • i” – “IGP”: Mã hiệu này cho biết prefix đang xét được router gốc quảng bá vào BGP bằng lệnh “network” hoặc bằng thao tác summary địa chỉ.
  • e” – “EGP”: Mã hiệu này cho biết prefix đang xét được router gốc quảng bá vào BGP bằng cách redistribute các route của một giao thức định tuyến ngoài khác là EGP. EGP (Exterior Gateway Protocol) là một giao thức định tuyến ngoài cũ, được sử dụng phổ biến trước khi BGP ra đời; ngày nay, BGP gần như là giao thức định tuyến ngoài duy nhất được sử dụng nên trừ phi người quản trị của router gốc cố tình thiết lập Origin code thành “e”, chúng ta ít gặp mã hiệu origin này trên các IP Prefix trong bảng BGP.
  • ?” – “Incomplete”: Mã hiệu này cho biết IP prefix được router gốc đưa vào BGP bằng một phương pháp không xác định. Tuy nhiên, ngày nay, mã hiệu này thường được dùng để chỉ ra rằng các prefix được router gốc redistribute vào BGP từ một phương thức IGP nào đó.

Chúng ta có thể xem xét một vài ví dụ về Origin code.

Ví dụ 1:

R1#show ip bgp

BGP table version is 3, local router ID is 192.168.13.1

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

 *>  101.0.0.0/24     0.0.0.0                  0         32768 i

 * i 109.0.0.0/24     192.168.12.2             0    100      0 104 106 789 

 *>i                  192.168.13.3             0    100      0 105 789 i

Trong kết quả hiển thị bảng BGP bằng lệnh “show ip bgp” của Cisco IOS, Origin code của một routing update được trình bày ở phía cuối của dòng thông tin. Với kết quả show ở trên, ta thấy các IP prefix mà R1 nhận được từ các neighbor đều có Origin code là “i”, điều này cho thấy các prefix này được router ban đầu đưa vào mạng lưới BGP bằng lệnh “network” hoặc bởi thao tác summary địa chỉ.

Ví dụ 2:

R9#show ip bgp

BGP table version is 4, local router ID is 192.168.89.9

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

 *>i 101.0.0.0/24     192.168.79.7             0    100      0 105 123 ?

 * i                  192.168.89.8             0    100      0 106 104 123 ?

 *>  109.0.0.0/24     0.0.0.0                  0         32768 i

Trong kết quả show ở ví dụ thứ 2, ta thấy các Origin code của các route đi đến mạng 101.0.0.0/24 lại là “?”. Điều này cho thấy rằng mạng 101.0.0.0/24 đã được router gốc đưa vào BGP bằng cách redistribute prefix này từ một phương thức IGP nào đó.

Origin là một thuộc tính bắt buộc phải tồn tại trong mọi bản tin cập nhật cho mọi prefix BGP.

Local Preference

Chúng ta cùng xem xét một ví dụ trong hình 4:

Hình 4 – Ví dụ về Local Preference.

Trong ví dụ trên hình 4, mạng 172.16.0.0 được quảng bá ban đầu từ một router BGP trên AS 65350 và lan truyền qua mạng lưới BGP theo nhiều hướng để đi đến AS 64520. Ta thấy rằng AS 64520 có hai gateway là router A và router B cho phép đi ra khỏi AS này để đi đến mạng 172.16.0.0 củ AS 65350 mới đề cập ở trên.

Trong các bài viết tới, sau khi đã tìm hiểu về Tiến trình chọn đường BGP, chúng ta sẽ lý giải được rằng, nếu không thay đổi gì thêm, các router BGP bên trong AS 64520 (không thể hiện trên sơ đồ) sẽ chọn gateway B để chuyển đi tiếp dữ liệu muốn đi đến mạng 172.16.0.0 vì khi đi theo hướng này, dữ liệu sẽ phải trung chuyển qua ít AS hơn. Tuy nhiên, có thể là do đường truyền của B nối đến AS 65500 đang quá tải nên người quản trị muốn dữ liệu xuất phát từ bên trong AS 64520 đi đến mạng 172.16.0.0 phải được chuyển tiếp theo gateway A để giảm tải bớt cho hướng gateway B. Để làm được điều này, người quản trị sẽ phải can thiệp vào một thuộc tính có độ ưu tiên cao hơn chiều dài của AS – path để lái dữ liệu theo ý mình, đó là thuộc tính Local Preference.

Local Preference đơn giản là một số tự nhiên được BGP gán cho một hướng đi đến một prefix IP. Nguyên tắc một router BGP chọn đường dựa trên so sánh thuộc tính Local Prefence là: trong nhiều hướng đi đến cùng một đích đến, hướng đi nào có giá trị Local Preference đính kèm cao nhất, hướng đi đó được xem là tốt nhất và sẽ được chọn làm hướng đi chính thức đi đến đích đến đang xét. Hướng đi này sẽ được BGP cài vào bảng định tuyến để route dữ liệu đồng thời quảng bá đi cho router láng giềng kế tiếp.

Thuộc tính Local Preference chỉ có thể được quảng bá giữa các iBGP peer với nhau và sẽ bị gỡ bỏ khi prefix được quảng bá cho một eBGP peer khác. Người ta thường sử dụng Local Preference trên các router biên để định hướng cách các router BGP bên trong AS lái dữ liệu đi ra ngoài AS: router biên nào được ưu tiên làm gateway chính sẽ quảng bá route nhận được từ bên ngoài vào các iBGP router bên trong với giá trị Local Preference cao hơn, và router biên nào chỉ sử dụng làm gateway dự phòng sẽ quảng bá route nhận được từ bên ngoài vào các iBGP router bên trong với giá trị Local Preference thấp hơn.

Trở lại ví dụ đang xem xét ở trên. 

Vì người quản trị muốn rằng dữ liệu xuất phát từ bên trong AS 64520 đi đến mạng 172.16.0.0 cần phải đi ra ngoài bằng gateway A và gateway B chỉ để dự phòng, người quản trị sẽ thực hiện cấu hình để khi A nhận được mạng 172.16.0.0, nó sẽ thiết lập giá trị Local Preference là 200 cho prefix rồi mới quảng bá tiếp mạng này vào các router bên trong còn router B chỉ thiết lập Local Preference là 100 cho prefix khi quảng bá mạng nhận được vào các router bên trong. Kết quả là các router bên trong thấy rằng hướng đi đến mạng 172.16.0.0 thông qua gateway A có Local Preference cao hơn là qua gateway B sẽ ưu tiên chọn hướng Gateway A để route dữ liệu đi đến mạng 172.16.0.0, đáp ứng được yêu cầu đặt ra.

Nếu ta không cấu hình gì thêm, các iBGP peer sẽ gán giá trị Local Preference mặc định là 100 cho các prefix mà chúng quảng bá cho nhau.

MED (Multi Exit Discriminator)

Còn gọi là thuộc tính Metric của BGP. Chúng ta cần phân biệt với khái niệm metric trong các IGP vì Metric (hay MED) với BGP chỉ là một thuộc tính trong số nhiều thuộc tính khác nhau được dùng để đánh giá độ tối ưu của một đường đi.

Chúng ta cùng quan sát ví dụ trên hình 5:

Hình 5 – Ví dụ về thuộc tính MED.

Trong ví dụ trên, router A của AS 65000 thực hiện quảng bá mạng 172.16.0.0 cho các router B và C của AS 65500. Chính sách của AS 65000 (phía router A) muốn rằng AS láng giềng 65500 khi gửi dữ liệu đến mạng 172.16.0.0 cần đi vào AS 65000 theo đường link bên trái sơ đồ (đường link nối giữa A và B), còn đường link bên phải (nối giữa A và C) chỉ để dự phòng. Như vậy, trong trường hợp này, yêu cầu đặt ra là người quản trị của AS 65000 phải tác động như thế nào đó để ảnh hưởng đến quyết định chọn đường của AS láng giềng trong việc định tuyến dữ liệu đi đến mình, chứ không phải định hướng dữ liệu từ mình đi đến người ta.

Một thuộc tính cũng thường được sử dụng trong tình huống này là thuộc tính MED. MED cũng đơn giản chỉ là một số tự nhiên được gán cho một hướng đi nào đó. Nguyên tắc chọn đường dựa vào MED là: trong nhiều hướng đi đến cùng một đích đến, hướng đi nào có MED nhỏ nhất, hướng đi đó được xem là tốt nhất và sẽ được router chọn sử dụng làm hướng đi chính thức để đi đến đích đến này. 

Mặc định, router BGP chỉ so sánh MED trên hai hướng đi có cùng neighbor AS và nếu không cấu hình gì thêm, MED sẽ mặc định được nhận giá trị là 0 với Cisco IOS.

Trở lại ví dụ trên, để thực hiện chính sách đã nêu, người quản trị của AS 65000 sẽ thực hiện thiết lập thuộc tính MED cho mạng 172.16.0.0 là 150 khi quảng bá cho router B và là 200 khi quảng bá cho router C. Các router B và C tiếp tục lan truyền prefix này đến các router bên trong của AS láng giềng 65500. Các router bên trong của AS 65500 khi xem xét hai hướng đi đến mạng 172.16.0.0 thông qua hai Gateway B và C sẽ thấy rằng hướng đi qua B có MED nhỏ hơn MED của hướng đi qua C (150 < 200), nên sẽ chọn hướng qua B để lái dữ liệu đi đến 172.16.0.0. Ở phía AS 65000, khi các router bên AS 65500 láng giềng thực hiện định tuyến như vừa nêu, chính sách về định hướng dữ liệu “đi vào” để tới mạng 172.16.0.0 cảu người quản trị đã đươc thiết lập thành công.

Trong các bài viết tới về Tiến trình chọn đường BGP, các bạn sẽ thấy rằng MED có thứ tự ưu tiên không cao trong tiến trình này nên thiết lập MED để định hướng dữ liệu như ở trên có thể không thành công nếu AS láng giềng lại cố tình hiệu chỉnh một thuộc tính có độ ưu tiên cao hơn để lái dữ liệu theo hướng ngược lại. Tuy nhiên, MED vẫn là một thuộc tính thông dụng được sử dụng nhiều, đặc biệt trong việc ảnh hưởng đến quyết định chọn đường của một AS láng giềng.

 Weight

Chúng ta cùng xem xét một ví dụ (hình 6):

Hình 6 – Ví dụ về thuộc tính Weight.

Trong ví dụ ở trên, router A nhận được cập nhật định tuyến để đi đến mạng 172.20.0.0 của AS 65250 từ hai hướng là thông qua router B và router C. Với ví dụ này, người quản trị mong muốn rằng router A luôn luôn chọn hướng đi qua B để đi tới mạng 172.20.0.0, hướng qua C chỉ để dự phòng bất kể các thuộc tính trên hai hướng đi này như thế nào. Để thực hiện yêu cầu đặt ra, thuộc tính Weight có thể được sử dụng.

Weight là thuộc tính có độ ưu tiên cao nhất trong Tiến trình chọn đường BGP. Weight cũng là một số tự nhiên được gán cho một hướng đi để đến một IP prefix. Trong nhiều đường đi khác nhau cùng đi đến một đích đến, đường đi nào có Weight cao nhất, đường đi đó được xem là tốt nhất, bất kể các thuộc tính khác có giá trị như thế nào. 

Weight là thuộc tính chỉ có tác dụng trong nội bộ của một router, và không được quảng bá kèm theo các prefix sang các BGP peer khác. Một đặc điểm khác đáng chú ý, Weight là thuộc tính BGP do Cisco đưa ra và chỉ xuất hiện trên các thiết bị của Cisco, các phiên bản BGP của các hãng khác không có thuộc tính này.

Mặc định, một router BGP sẽ gán giá trị Weight = 0 cho mọi prefix nhận được từ các router khác và gán Weight = 32768 cho các prefix do tự nó đưa vào BGP (thường được gọi là các local route).

Với ví dụ đang xem xét, để thực hiện yêu cầu của người quản trị, router A sẽ gán giá trị Weight = 200 cho prefix 172.20.0.0 khi nhận prefix này từ router B và gán Weight = 150 cho cùng prefix ấy khi nhận từ router C, từ đó, router A sẽ luôn chọn hướng B để đi đến 172.20.0.0 và hướng C chỉ để dự phòng.

 

Trên đây, chúng ta đã cùng điểm qua một số thuộc tính đường đi thường gặp trong BGP. Trong các bài viết kế tiếp, chúng ta sẽ cùng khảo sát Tiến trình chọn đường BGP để xem thử tiến trình này sử dụng các thuộc tính trên như thế nào nhằm chọn ra các đường đi tối ưu đến các đích đến trên Internet.

Cảm ơn các bạn!

Hẹn gặp lại các bạn trong các bài viết tiếp theo!