Trang chủ / Network / OSPF từ cơ bản đến nâng cao: Kiến trúc, Area, LSA và cấu hình thực chiến
NetworkOSPF (Open Shortest Path First) là giao thức định tuyến động thuộc nhóm link-state, chạy trực tiếp trên IP (protocol number 89), được chuẩn hoá bởi IETF (RFC 2328 cho OSPFv2 — IPv4, RFC 5340 cho OSPFv3 — IPv6). OSPF là IGP (Interior Gateway Protocol) — dùng để định tuyến bên trong một hệ thống tự trị (Autonomous System), khác với BGP là EGP dùng giữa các AS với nhau.
Khác với các giao thức distance-vector như RIP hay EIGRP (theo kiểu "nghe hàng xóm nói rồi tin"), OSPF hoạt động theo nguyên lý mỗi router tự xây bản đồ toàn mạng rồi tự tính đường đi ngắn nhất — nhờ vậy hội tụ nhanh hơn, tránh được loop, và mở rộng tốt hơn cho mạng lớn nếu thiết kế đúng.
| Tiêu chí | Distance-vector (RIP, EIGRP) | Link-state (OSPF, IS-IS) |
|---|---|---|
| Thông tin trao đổi | Router chia sẻ bảng định tuyến (đã tính sẵn) cho hàng xóm | Router chia sẻ trạng thái các liên kết (LSA) cho toàn vùng |
| Góc nhìn mạng | Mỗi router chỉ biết "hàng xóm nói gì" | Mỗi router có bản đồ đầy đủ của area (link-state database) |
| Thuật toán tính đường | Bellman-Ford | Dijkstra (SPF — Shortest Path First) |
| Tốc độ hội tụ | Chậm hơn, dễ đếm-đến-vô-cực | Nhanh, gần như tức thời khi có sự kiện |
| Tài nguyên | Nhẹ CPU/RAM hơn | Tốn CPU/RAM hơn (giữ toàn bộ LSDB + chạy SPF) |
Mỗi router OSPF xây một Link-State Database (LSDB) — về bản chất là một đồ thị có trọng số: đỉnh là router, cạnh là liên kết với "cost". Khi LSDB đã đồng bộ giữa tất cả router trong area, mỗi router tự chạy thuật toán Dijkstra lấy chính mình làm gốc, tính ra cây đường đi ngắn nhất (SPT — Shortest Path Tree) tới mọi router/mạng khác. Kết quả SPT được đưa vào bảng định tuyến IP.
Điểm quan trọng: vì mọi router trong cùng area dùng chung một LSDB, nên dù chạy Dijkstra độc lập, kết quả về topology mà từng router "nhìn thấy" là nhất quán — đây là lý do OSPF không bị loop tạm thời kiểu distance-vector.
Mỗi router OSPF cần một Router ID — định danh 32-bit dạng IPv4 (vd 1.1.1.1), duy nhất trong toàn bộ domain OSPF. Thứ tự chọn RID mặc định:
router-id) — luôn ưu tiên cao nhất.Khuyến nghị thực chiến: luôn đặt RID thủ công bằng loopback ổn định (vd
1.1.1.1), không phụ thuộc interface vật lý — tránh trường hợp RID đổi khi cáp rớt, gây router phải bầu lại DR/BDR và flush LSA không cần thiết.
OSPF dùng cost làm metric, tính theo công thức:
Cost = Reference Bandwidth / Interface Bandwidth
Reference bandwidth mặc định trên Cisco IOS là 100 Mbps — nghĩa là link Gigabit và link 100 Mbps đều ra cost = 1 (vì công thức làm tròn xuống tối thiểu 1), không phân biệt được trên mạng hiện đại nhiều 10G/40G/100G. Đây là lý do luôn phải chỉnh lại reference bandwidth khi triển khai thực tế:
router ospf 1
auto-cost reference-bandwidth 100000 ! quy về 100 Gbps làm chuẩn
Phải cấu hình giống nhau trên toàn bộ router trong domain — nếu không, việc tính cost bị lệch giữa các router dẫn đến định tuyến bất đối xứng (asymmetric routing).
Cost cũng có thể set thủ công trên từng interface, override công thức:
interface GigabitEthernet0/1
ip ospf cost 20
| Loại | Tên | Chức năng |
|---|---|---|
| Type 1 | Hello | Phát hiện & duy trì láng giềng, thoả thuận tham số |
| Type 2 | DBD (Database Description) | Tóm tắt nội dung LSDB để so sánh |
| Type 3 | LSR (Link State Request) | Yêu cầu LSA cụ thể còn thiếu |
| Type 4 | LSU (Link State Update) | Gửi LSA thật sự (có thể chứa nhiều LSA) |
| Type 5 | LSAck | Xác nhận đã nhận LSU (đảm bảo tin cậy) |
Gói Hello được gửi định kỳ (mặc định 10s trên mạng broadcast/point-to-point, 30s trên NBMA) tới địa chỉ multicast 224.0.0.5 (AllSPFRouters). Nếu không nhận Hello sau Dead Interval (mặc định gấp 4 lần Hello Interval — tức 40s), láng giềng bị coi là down.
Hai router chỉ trở thành neighbor khi các tham số sau khớp nhau:
Down → Init → 2-Way → ExStart → Exchange → Loading → Full
Lưu ý: 2-Way không phải là Full. Trên mạng multi-access, phần lớn cặp DROTHER-DROTHER chỉ dừng ở 2-Way — đây là hành vi bình thường, không phải lỗi.
Trên mạng broadcast (Ethernet) hoặc NBMA, nếu N router cùng full-mesh adjacency với nhau, số lượng adjacency sẽ là N(N-1)/2 — bùng nổ traffic LSA không cần thiết khi N lớn. OSPF giải quyết bằng cách bầu ra:
Nhờ đó, tổng số adjacency Full giảm còn khoảng 2N thay vì N(N-1)/2, và mọi thay đổi LSA chỉ cần gửi tới DR/BDR (multicast 224.0.0.6 — AllDRouters) rồi DR flood lại cho DROTHER qua 224.0.0.5.
interface GigabitEthernet0/0
ip ospf priority 255 ! ưu tiên tuyệt đối làm DR
Lưu ý thiết kế: point-to-point link (serial, hoặc Ethernet cấu hình
ip ospf network point-to-point) không có khái niệm DR/BDR — vì chỉ có 2 router trên link, không cần điểm trung tâm.
Một domain OSPF chỉ chạy đơn area vẫn hoạt động tốt ở quy mô nhỏ, nhưng khi mạng lớn dần, toàn bộ router phải chạy SPF lại mỗi khi có bất kỳ thay đổi nào — dù thay đổi đó xảy ra ở một nhánh xa tít. Giải pháp: chia domain thành nhiều area, giới hạn phạm vi flood LSA và phạm vi chạy lại SPF.
0.0.0.0) luôn là backbone, mọi area khác bắt buộc phải kết nối trực tiếp vào Area 0.Nếu một area không thể kết nối vật lý trực tiếp tới Area 0 (ví dụ do topology WAN lịch sử), dùng virtual link để "kéo dài" backbone một cách logic qua một area trung gian (transit area):
! Trên R2 (ABR giữa Area0-Area1), RID của R3 là 3.3.3.3
router ospf 1
area 1 virtual-link 3.3.3.3
! Trên R3 (ABR giữa Area1-Area2), RID của R2 là 2.2.2.2
router ospf 1
area 1 virtual-link 2.2.2.2
Virtual link chỉ nên dùng làm giải pháp tạm thời khi khắc phục sự cố hoặc trong giai đoạn chuyển đổi thiết kế — không nên coi là kiến trúc lâu dài vì phụ thuộc vào area trung gian còn sống.
| Type | Tên | Ai phát sinh | Phạm vi flood |
|---|---|---|---|
| 1 | Router LSA | Mọi router | Trong area |
| 2 | Network LSA | DR trên mạng multi-access | Trong area |
| 3 | Summary LSA (network) | ABR | Giữa các area |
| 4 | Summary LSA (ASBR) | ABR | Giữa các area, cho biết "đường tới ASBR" |
| 5 | External LSA | ASBR | Toàn domain (trừ stub/NSSA) |
| 7 | NSSA External LSA | ASBR trong NSSA | Trong NSSA, ABR dịch thành Type-5 khi thoát ra |
| Loại Area | Nhận Type-3 | Nhận Type-5 (External) | Default route thay thế |
|---|---|---|---|
| Standard | ✅ | ✅ | Không |
| Stub | ✅ | ❌ | ABR bơm route mặc định 0.0.0.0/0 |
| Totally Stubby (Cisco proprietary) | ❌ (trừ default) | ❌ | ABR bơm route mặc định |
| NSSA | ✅ | ❌ (nhưng cho phép redistribute nội bộ qua Type-7) | Tuỳ chọn |
| Totally NSSA | ❌ (trừ default) | ❌ | ABR bơm route mặc định |
Cấu hình ví dụ cho area 1 là Totally Stubby:
router ospf 1
area 1 stub no-summary ! "no-summary" cấu hình trên ABR mới thành totally stubby
Với NSSA (cho phép area vẫn có ASBR riêng redistribute route nội bộ, nhưng không nhận External từ nơi khác đổ vào):
router ospf 1
area 2 nssa
Ứng dụng thực tế: area chi nhánh chỉ có 1-2 uplink về HQ nên đặt Stub/Totally Stub — giảm mạnh kích thước LSDB, giảm tải CPU trên router biên vốn thường là thiết bị nhỏ. Area nào có kết nối ra ngoài riêng (VD chi nhánh có link Internet cục bộ, cần redistribute static) thì dùng NSSA.
Cùng một kịch bản để dễ đối chiếu: router R1 (RID 1.1.1.1) có uplink 10.0.12.0/24 chạy OSPF về phía backbone (area 0) và một LAN nội bộ 10.0.1.0/24 chỉ cần quảng bá route, không cần gửi Hello ra phía host (passive).
Cisco dùng mô hình network <địa chỉ> <wildcard> area <id> — khai báo theo dải mạng ở process OSPF, không khai trực tiếp trên từng interface:
router ospf 1
router-id 1.1.1.1
network 10.0.12.0 0.0.0.255 area 0
network 10.0.1.0 0.0.0.255 area 0
passive-interface default
no passive-interface GigabitEthernet0/0
!
interface GigabitEthernet0/0
ip ospf cost 10
ip ospf priority 255
ip ospf authentication message-digest
ip ospf message-digest-key 1 md5 <shared-secret>
Kiểm tra:
show ip ospf neighbor ! xem trạng thái láng giềng, DR/BDR
show ip ospf interface brief ! area, cost, trạng thái interface
show ip ospf database ! xem toàn bộ LSDB
show ip route ospf ! route học được qua OSPF
show ip protocols ! timer, redistribution, filter đang áp dụng
Lưu ý về
passive-interface: luôn setpassive-interface defaultrồi mở lại từng interface uplink cần chạy OSPF — thói quen này ngăn OSPF vô tình gửi Hello ra interface LAN/WAN không kiểm soát (rủi ro bảo mật + router lạ tự kết neighbor).
Junos đi ngược lại: OSPF được kích hoạt trực tiếp trên từng interface dưới area, không có kiểu network statement dò dải mạng như Cisco — vì vậy khai thiếu interface là lỗi hay gặp nhất khi mới chuyển từ Cisco sang:
set interfaces ge-0/0/0 unit 0 family inet address 10.0.12.1/24
set interfaces ge-0/0/1 unit 0 family inet address 10.0.1.1/24
set routing-options router-id 1.1.1.1
set protocols ospf area 0.0.0.0 interface ge-0/0/0.0 metric 10
set protocols ospf area 0.0.0.0 interface ge-0/0/0.0 priority 255
set protocols ospf area 0.0.0.0 interface ge-0/0/0.0 authentication md5 1 key "<shared-secret>"
set protocols ospf area 0.0.0.0 interface ge-0/0/1.0 passive
Kiểm tra:
show ospf neighbor # láng giềng, DR/BDR
show ospf interface brief # area, cost, trạng thái interface
show ospf database # LSDB
show route protocol ospf # route học được qua OSPF
show ospf overview # tổng quan area, SPF run gần nhất
Lưu ý:
passivetrong Junos vẫn quảng bá subnet của interface vào OSPF (giống Ciscopassive-interface) nhưng không gửi Hello — không nhầm với việc tắt hẳn OSPF trên interface.
VRP gần giống Junos ở chỗ cấu hình cost/priority/authentication ngay trên interface, nhưng vẫn giữ kiểu network theo area như Cisco ở phần khai báo area:
interface GigabitEthernet0/0/0
ip address 10.0.12.1 255.255.255.0
ospf cost 10
ospf dr-priority 255
ospf authentication-mode md5 1 cipher <shared-secret>
#
interface GigabitEthernet0/0/1
ip address 10.0.1.1 255.255.255.0
#
ospf 1 router-id 1.1.1.1
area 0.0.0.0
network 10.0.12.0 0.0.0.255
network 10.0.1.0 0.0.0.255
silent-interface GigabitEthernet0/0/1
Kiểm tra:
display ospf peer # láng giềng, DR/BDR
display ospf interface # area, cost, trạng thái interface
display ospf lsdb # LSDB
display ip routing-table protocol ospf # route học được qua OSPF
display ospf brief # tổng quan process
Lưu ý:
silent-interfacetrên Huawei tương đươngpassive-interfacecủa Cisco — router-id trên VRP có thể khai ởospf <process-id> router-id <id>(theo từng process, thường dùng khi chạy multi-instance) hoặc ở globalrouter id <id>trong system-view.
| Việc cần làm | Cisco IOS | Juniper (Junos) | Huawei (VRP) |
|---|---|---|---|
| Đặt Router ID | router-id 1.1.1.1 (trong router ospf) | set routing-options router-id 1.1.1.1 | ospf 1 router-id 1.1.1.1 |
| Bật OSPF trên mạng/interface | network <net> <wildcard> area 0 | set protocols ospf area 0 interface ge-0/0/0.0 | network <net> <wildcard> (trong area) |
| Không gửi Hello ra LAN | passive-interface <if> | ... interface <if> passive | silent-interface <if> |
| Chỉnh cost | ip ospf cost <n> | ... interface <if> metric <n> | ospf cost <n> (trên interface) |
| Chỉnh priority DR | ip ospf priority <n> | ... interface <if> priority <n> | ospf dr-priority <n> |
| Bật xác thực MD5 | ip ospf message-digest-key ... | ... interface <if> authentication md5 ... | ospf authentication-mode md5 ... |
| Xem láng giềng | show ip ospf neighbor | show ospf neighbor | display ospf peer |
| Xem LSDB | show ip ospf database | show ospf database | display ospf lsdb |
| Xem route học được | show ip route ospf | show route protocol ospf | display ip routing-table protocol ospf |
Khi đưa route từ giao thức khác (static, BGP, EIGRP...) vào OSPF, router thực hiện trở thành ASBR và OSPF không tự học metric gốc — phải khai báo metric mặc định, nếu không mọi route redistribute nhận metric mặc định rất thấp (20 cho E2), dễ gây định tuyến sai lệch:
router ospf 1
redistribute static subnets metric 100 metric-type 1
default-metric 50
Giảm Hello/Dead Interval giúp phát hiện sự cố nhanh hơn, đổi lại tốn CPU/băng thông hơn:
interface GigabitEthernet0/0
ip ospf hello-interval 1
ip ospf dead-interval 4
Tốt hơn cho hội tụ dưới giây trên mạng đòi hỏi cao (data center, core network) là dùng BFD (Bidirectional Forwarding Detection) — phát hiện lỗi ở tầng dưới trong vài chục ms, rồi báo ngay cho OSPF thay vì chờ Dead Interval:
interface GigabitEthernet0/0
ip ospf bfd
router ospf 1
bfd all-interfaces
Trên mạng lớn hoặc không ổn định, nhiều sự kiện link flap liên tiếp có thể khiến router chạy SPF liên tục, tốn CPU. Cisco cung cấp exponential backoff timer:
router ospf 1
timers throttle spf 50 200 5000 ! start 50ms, tăng dần tới max 5s
timers throttle lsa all 50 200 5000
Khi cần bảo trì router mà không muốn traffic đổ dồn đột ngột sang nó rồi lại rớt khi nó xuống hẳn, có thể tạm quảng bá cost cực cao cho mọi route nội bộ (Max metric router LSA — RFC 3137) để traffic tự động né trước:
router ospf 1
max-metric router-lsa on-startup 300
Chống router giả mạo kết nối vào domain OSPF, nên bật MD5 hoặc tốt hơn là SHA (qua key-chain) trên mọi interface tham gia OSPF, đặc biệt các segment có thể bị truy cập vật lý:
interface GigabitEthernet0/0
ip ospf authentication message-digest
ip ospf message-digest-key 1 md5 <shared-secret>
interface GigabitEthernet0/0
ipv6 ospf 1 area 0
| Khái niệm | Ghi nhớ nhanh |
|---|---|
| Metric | Cost = Reference BW / Interface BW — luôn chỉnh auto-cost reference-bandwidth |
| Hello/Dead | 10s/40s (broadcast, P2P) · 30s/120s (NBMA) |
| Multicast | 224.0.0.5 AllSPFRouters · 224.0.0.6 AllDRouters |
| DR/BDR | Chỉ có trên multi-access; point-to-point không cần |
| Area 0 | Bắt buộc là trung tâm, mọi area khác nối trực tiếp hoặc qua virtual-link |
| Stub vs NSSA | Stub chặn hoàn toàn External; NSSA cho phép ASBR nội bộ redistribute |
| E1 vs E2 | E1 cộng dồn cost nội bộ, E2 (mặc định) thì không |
Bài viết thuộc chuyên mục Network — tiếp theo sẽ là loạt bài về BGP cơ bản và so sánh OSPF với EIGRP/IS-IS trong thiết kế mạng doanh nghiệp.