BFD - Bidirectional Forwarding Detection là gì? Lợi ích và trường hợp sử dụng
Trong bài viết này, chúng ta sẽ cùng tìm hiểu về tính năng BFD, trường hợp sử dụng, và lợi ích của tính năng này trong hệ thống mạng nhé.
Tổng quan
BFD là gì?
BFD là viết tắt của Bidirectional Forwarding Detection, được định nghĩa trong RFC 5880, là 1 giao thức phát hiện, được thiết kế để cung cấp cơ chế phát hiện lỗi kết nối nhanh giữa 2 thiết bị. Sau khi phiên BFD được thiết lập, thì các gói BFD sẽ được gửi định kỳ giữa 2 thiết bị, nếu không nhận được gói BFD sau 1 khoảng thời gian nhất định, thì BFD xác định đã có lỗi xảy ra trên link liên kết.
Mục đích thiết kế của BFD là phát hiện nhanh lỗi trong mạng, tuy nhiên thì BFD không được sử dụng độc lập, mà thay vào đó, nó được sử dụng cùng với các giao thức khác, chẳng hạn như VPN, HSRP, VRRP hay các giao thức định tuyến khác như MPLS, OSPF, IS-IS, BGP, RIP… BFD có thể tích hợp được với giao thức nào thì tùy thuộc vào từng hãng hoặc phiên bản firmware.
Đối với mỗi giao thức, thì chúng đều có 1 số loại cơ chế để phát hiện lỗi liên kết hoặc láng giềng UP/DOWN. Ví dụ OSPF sẽ sử dụng các gói tin Hello và Dead Interval, EIGRP sử dụng gói tin Hello và holdown timer để xác định láng giềng của nó còn hoạt động hay không. Mặc định thì khoảng thời gian này khá lâu, lên đến vài chục giây. Đối với hệ thống quan trọng cần downtime thấp, thì chúng ta có thể cấu hình thời gian gửi gói tin hello hoặc dead interval xuống 1 giây. Tuy nhiên vấn đề là tất cả các giao thức này chưa bao giờ được thiết kế để chuyển đổi dự phòng dưới 1 giây. Các gói tin hello được xử lý bởi Control Plane, nên nếu giảm xuống 1 giây, thì có thể tiêu tốn khá nhiều tài nguyên của thiết bị, làm giảm hiệu suất tổng thể của toàn bộ mạng.
Do vậy, trong các hệ thống quan trọng cần downtime thấp hoặc yêu cầu thời gian thực như VoIP, thì chúng ta sẽ sử dụng kết hợp với BFD. BFD có thể phát hiện lỗi tính theo mili giây, thậm chỉ là micro giây. Các bạn có thể cấu hình kết hợp BFD với các giao thức mà nó hỗ trợ để phát hiện lỗi liên kết thay vì cơ chế riêng của nó. Khi liên kết bị lỗi, BFD sẽ thông báo cho giao thức đó để nó chuyển đổi dự phòng ngay lập tức, thời gian sẽ tương đương với thời gian mà chúng ta đã cấu hình cho BFD. BFD được thiết kế để phát hiện lỗi nhanh, nên các gói tin của nó có thể được xử lý bởi 1 số interface modules hoặc line card, nên sẽ không bị quá tải hoặc tiêu tốn tài nguyên liên quan đến CPU như cơ chế riêng của các giao thức.
Các chế độ hoạt động
BFD sẽ có 2 chế độ hoạt động là asynchronous mode và demand mode.
- Ở chế độ asynchronous mode thì tương tự như hello của giao thức khác, BFD sẽ liên tục gửi các gói tin hello của nó, gọi là BFD Control Packets, khi không nhận được các gói này thì phiên BFD sẽ bị down.
- Demand mode thì sẽ khác. Khi 1 phiên BFD giữa 2 thiết bị được thiết lập, thì BFD sẽ không gửi control packets, mà chỉ sử dụng cơ chế thăm dò. Khi đó BFD sẽ phải sử dụng 1 cách khác để kiểm tra, ví dụ như kiểm tra số liệu truyền và nhận trên cổng. Hiện tại thì đa số các hãng sẽ không hỗ trợ cơ chế này, do nó khá phức tạp, nên mặc định chúng ta sẽ sử dụng asynchronous mode.
Cả 2 chế độ đều có 1 cái là echo mode. Khi 1 thiết bị gửi các gói echo BFD thì thiết bị hàng xóm sẽ trả về mà ko xử lý chúng. Nếu không nhận được các gói echo, thì BFD sẽ kết luận kết nối bị lỗi và sẽ hủy phiên.
Lợi ích của BFD với hệ thống mạng
- Phát hiện lỗi kết nối nhanh chóng, chỉ vài mili giây, giúp tăng độ tin cậy cho hệ thống mạng.
- Phát hiện nhanh chóng nhiều loại lỗi khác nhau, bao gồm lỗi giao diện, lỗi liên kết, lỗi forwarding engine...
- Cung cấp cơ chế phát hiện lỗi thống nhất theo thời gian thực, sử dụng được cho nhiều loại giao thức khác nhau mà không phụ thuộc vào phần cứng.
Hướng dẫn cấu hình BFD trên Cisco
Trong bài viết này thì mình sẽ hướng dẫn các bạn cấu hình BFD kết hợp với OSPF trên các thiết bị Cisco. Đối với các giao thức khác thì cũng tương tự. Phần cấu hình BFD sẽ giống nhau, chỉ khác phần gán vào giao thức thôi. Mình sẽ test với 2 trường hợp OSPF có BFD và không có BFD để các bạn dễ dàng thấy được lợi ích của BFD.
OSPF không có BFD
Đầu tiên mình sẽ test với OSPF khi không có BFD. Mình sẽ sử dụng 1 mô hình đơn giản gồm 2 router và 1 switch. Switch ở giữa chỉ là switch layer 2, mục đích chỉ để khi mình ngắt link nối từ switch sang R2 thì link trên cổng R1 sẽ không down thôi, ngoài ra không có tác dụng gì khác.
Mình sẽ cấu hình IP và OSPF giữa 2 Routers
Cấu hình IP và OSPF trên Router R1:
R1(config)#interface e0/0
R1(config-if)#no shutdown
R1(config-if)#ip add 10.0.0.1 255.255.255.0
R1(config-if)#ip ospf 1 area 0 |
Cấu hình IP và OSPF trên Router R2:
R2(config)#interface e0/0
R2(config-if)#no shutdown
R2(config-if)#ip add 10.0.0.2 255.255.255.0
R2(config-if)#ip ospf 1 area 0 |
Các bạn sẽ cần chờ 1 khoảng thời gian để OSPF thiết lập quan hệ láng giềng. Sau khi OSPF hội tụ thì các bạn sẽ thấy log như bên dưới.
*Nov 25 08:05:01.157: %OSPF-5-ADJCHG: Process 1, Nbr 10.0.0.2 on Ethernet0/0 from LOADING to FULL, Loading Done |
Bây giờ chúng ta sẽ ngắt kết nối link từ switch sang R2. Trên R2 sẽ có log thông báo cổng E0/0 down.
R2(config-if)#
*Nov 25 08:05:30.206: %LINK-3-UPDOWN: Interface Ethernet0/0, changed state to down
R2(config-if)#
*Nov 25 08:05:30.206: %OSPF-5-ADJCHG: Process 1, Nbr 10.0.0.1 on Ethernet0/0 from FULL to DOWN, Neighbor Down: Interface down or detached
*Nov 25 08:05:31.206: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/0, changed state to down
R2(config-if)# |
Trên R1 thì sẽ mất thêm khoảng 30 giây nữa để OSPF cập nhật thông tin về láng giềng của nó.
R1(config-if)#
*Nov 25 08:05:57.157: %OSPF-5-ADJCHG: Process 1, Nbr 10.0.0.2 on Ethernet0/0 from FULL to DOWN, Neighbor Down: Dead timer expired
R1(config-if)# |
Đây là khoảng thời gian khá lâu để OSPF hội tụ. Kể cả các bạn có cấu hình hello time và dead interval thì cũng phải mất khoảng 1 giây và quan trọng là sẽ tiêu tốn nhiều tài nguyên của thiết bị.
OSPF sử dụng kết hợp với BFD
Bây giờ mình sẽ test OSPF kết hợp với BFD.
Để cấu hình BFD thì các bạn vào mode config interface để cấu hình cho từng cổng, mình sẽ cấu hình trên cổng E0/0 đang chạy OSPF của 2 router. Cấu hình BFD trên 2 router sẽ giống nhau, các bạn lặp lại cho router còn lại.
R1(config)#interface e0/0
R1(config-if)#bfd interval 50 min_rx 50 multiplier 3 |
- interval: là khoảng thời gian mà router sẽ gửi gói tin hello đi. Các bạn có thể cấu hình từ 50 mili giây trở lên, nó tùy thuộc vào loại thiết bị. Càng nhanh thì thời gian phát hiện lỗi kết nối sẽ càng thấp. Các bạn có thể cân nhắc giá trị dựa trên phần cứng sử dụng, và độ quan trọng của ứng dụng.
- Min_rx: là tần suất các gói tin sẽ nhận được từ router đối diện.
- Multiplier: là hệ số nhân, nếu sau khoảng min_rx nhân với hệ số nhân mà router không nhận được gói BFD thì link sẽ được thông báo là lỗi, nó giống như dead interval của các giao thức khác.
Ví dụ mình cấu hình multiplier là 3, min_rx là 50 thì sau 150 mili giây nếu router không nhận được gói tin BFD thì link sẽ được cho là lỗi.
Sau khi cấu hình xong thì chúng ta sẽ gán BFD vào OSPF. Chúng ta có thể gán qua mode interface hoặc qua OSPF config đều được, tương tự như với cấu hình OSPF. Nếu gán vào tất cả interface chạy OSFP thì các bạn vào mode OSPF config, còn chỉ muốn bật trên 1 số cổng thì các bạn có thể sử dụng 1 trong 2 cách.
R1(config)#router ospf 1
R1(config-router)#bfd all-interfaces |
Nếu chỉ muốn bật trên 1 số cổng, thì các bạn vào mode config interface và bật BFD cho OSPF bằng lệnh ip ospf bfd. Tùy chọn ip ospf bfd disable nếu các bạn muốn tắt BFD trên 1 số cổng cụ thể.
R1(config)#interface e0/0
R1(config-if)#ip ospf bfd ?
disable Disable BFD on this interface
|
Để kiểm tra cấu hình BFD, thì các bạn có thể sử dụng lệnh show bfd neighbor. Chúng ta sẽ thấy các IP mà BFD đang check, cùng với trạng thái và cổng.
R1#show bfd neighbors
IPv4 Sessions
NeighAddr LD/RD RH/RS State Int
10.0.0.2 1/1 Up Up Et0/0
R1#
Để kiểm tra chi tiết thì các bạn thêm tùy chọn details.
R1#show bfd neighbors details
IPv4 Sessions
NeighAddr LD/RD RH/RS State Int
10.0.0.2 1/1 Up Up Et0/0
Session state is UP and using echo function with 50 ms interval.
Session Host: Software
OurAddr: 10.0.0.1
Handle: 1
Local Diag: 0, Demand mode: 0, Poll bit: 0
MinTxInt: 1000000, MinRxInt: 1000000, Multiplier: 3
Received MinRxInt: 1000000, Received Multiplier: 3
Holddown (hits): 0(0), Hello (hits): 1000(71)
Rx Count: 32, Rx Interval (ms) min/max/avg: 1/1006/833 last: 455 ms ago
Tx Count: 72, Tx Interval (ms) min/max/avg: 1/1004/867 last: 583 ms ago
Elapsed time watermarks: 0 0 (last: 0)
Registered protocols: OSPF CEF
Uptime: 00:00:26
Last packet: Version: 1 - Diagnostic: 0
State bit: Up - Demand bit: 0
Poll bit: 0 - Final bit: 0
C bit: 0
Multiplier: 3 - Length: 24
My Discr.: 1 - Your Discr.: 1
Min tx interval: 1000000 - Min rx interval: 1000000
Min Echo interval: 50000
R1#
Chúng ta sẽ biết được các thông số đang cấu hình, và BFD này đang được gán vào giao thức nào.. Một trong các lợi ích lớn nhất của BFD là chúng ta có 1 giao thức monitor chung cho toàn bộ các giao thức khác. Các bạn có thể gán BFD này vào OSPF, BGP… đồng thời, mà không cần sử dụng nhiều cơ chế khác nhau.
Các bạn show ip ospf thì cũng được kết quả tương tự.
R1#show ip ospf
Routing Process "ospf 1" with ID 10.0.0.1
Start time: 00:14:45.043, Time elapsed: 00:08:21.937
Supports only single TOS(TOS0) routes
Supports opaque LSA
Supports Link-local Signaling (LLS)
Supports area transit capability
Supports NSSA (compatible with RFC 3101)
Supports Database Exchange Summary List Optimization (RFC 5243)
Event-log enabled, Maximum number of events: 1000, Mode: cyclic
Router is not originating router-LSAs with maximum metric
Initial SPF schedule delay 5000 msecs
Minimum hold time between two consecutive SPFs 10000 msecs
Maximum wait time between two consecutive SPFs 10000 msecs
Incremental-SPF disabled
Minimum LSA interval 5 secs
Minimum LSA arrival 1000 msecs
LSA group pacing timer 240 secs
Interface flood pacing timer 33 msecs
Retransmission pacing timer 66 msecs
EXCHANGE/LOADING adjacency limit: initial 300, process maximum 300
Number of external LSA 0. Checksum Sum 0x000000
Number of opaque AS LSA 0. Checksum Sum 0x000000
Number of DCbitless external and opaque AS LSA 0
Number of DoNotAge external and opaque AS LSA 0
Number of areas in this router is 1. 1 normal 0 stub 0 nssa
Number of areas transit capable is 0
External flood list length 0
IETF NSF helper support enabled
Cisco NSF helper support enabled
BFD is enabled
Reference bandwidth unit is 100 mbps
Area BACKBONE(0)
Number of interfaces in this area is 1
Area has no authentication
SPF algorithm last executed 00:04:07.973 ago
SPF algorithm executed 7 times
Area ranges are
Number of LSA 3. Checksum Sum 0x014EA9
Number of opaque link LSA 0. Checksum Sum 0x000000
Number of DCbitless LSA 0
Number of indication LSA 0
Number of DoNotAge LSA 0
Flood list length 0
R1#
Bây giờ mình sẽ ngắt lại link nối từ switch sang router R2.
Log trên Router R2:
R2#
*Nov 25 08:12:34.222: %BFDFSM-6-BFD_SESS_DOWN: BFD-SYSLOG: BFD session ld:1 handle:1,is going Down Reason: ECHO FAILURE
*Nov 25 08:12:34.222: %BFD-6-BFD_SESS_DESTROYED: BFD-SYSLOG: bfd_session_destroyed, ld:1 neigh proc:OSPF, handle:1 act
R2#
*Nov 25 08:12:34.222: %OSPF-5-ADJCHG: Process 1, Nbr 10.0.0.1 on Ethernet0/0 from FULL to DOWN, Neighbor Down: BFD node down
R2#
*Nov 25 08:12:46.080: %LINK-3-UPDOWN: Interface Ethernet0/0, changed state to down
*Nov 25 08:12:47.082: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/0, changed state to down
R2# |
Log trên Router R1:
R1#
*Nov 25 08:12:34.234: %BFDFSM-6-BFD_SESS_DOWN: BFD-SYSLOG: BFD session ld:1 handle:1,is going Down Reason: ECHO FAILURE
*Nov 25 08:12:34.234: %BFD-6-BFD_SESS_DESTROYED: BFD-SYSLOG: bfd_session_destroyed, ld:1 neigh proc:OSPF, handle:1 act
R1#
*Nov 25 08:12:34.234: %OSPF-5-ADJCHG: Process 1, Nbr 10.0.0.2 on Ethernet0/0 from FULL to DOWN, Neighbor Down: BFD node down
R1# |
Các bạn có thể thấy, R1 ngay lập tức thông báo láng giềng down, gần như cùng lúc với thông báo trên R2, chỉ sau vài mili giây, nên OSPF sẽ hội tụ nhanh hơn rất nhiều.
Cấu hình và hoạt động của BFD chỉ đơn giản vậy thôi, các bạn nên sử dụng trong mọi tình huống có thể, nhất là trên các thiết bị có các phần cứng hỗ trợ BFD
Kết luận
BFD là 1 tính năng rất đơn giản nhưng hữu ích, giúp hệ thống mạng trở lên đáng tin cậy hơn. Các thông số khuyến nghị thì sẽ phụ thuộc vào phần cứng và các hãng khác nhau. Nếu các bạn có thắc mắc hay góp ý nào thì hãy để lại comment để mọi người cùng trao đổi nhé.
Chúc các bạn thành công
Bình luận bài viết!