Bắt đầu nhanh: MPLS + LDP hoạt động trong vòng 5 phút
Nếu bạn chỉ muốn thấy MPLS forwarding và LDP neighbors hoạt động trước khi đọc lý thuyết, đây là con đường ngắn nhất. Bạn cần FRRouting 8.x trở lên, Linux kernel 4.4+, và ít nhất hai VM hoặc network namespace có thể giao tiếp với nhau.
Bước 1 — Bật MPLS trong Linux Kernel
FRRouting xử lý control plane, nhưng Linux kernel mới là nơi thực sự thực hiện chuyển tiếp nhãn. Bạn cần tải hai module và bật MPLS input trên mọi interface sẽ mang lưu lượng có nhãn.
# Tải các module chuyển tiếp MPLS
modprobe mpls_router
modprobe mpls_iptunnel
# Bật MPLS input trên các interface transit
sysctl -w net.mpls.conf.eth0.input=1
sysctl -w net.mpls.conf.eth1.input=1
# Tăng giới hạn nhãn nền tảng (mặc định là 0 — MPLS sẽ không hoạt động nếu không có dòng này)
sysctl -w net.mpls.platform_labels=100000
Để các cài đặt này bền vững sau khi khởi động lại:
# /etc/sysctl.d/mpls.conf
net.mpls.platform_labels = 100000
net.mpls.conf.eth0.input = 1
net.mpls.conf.eth1.input = 1
Cũng thêm các module vào /etc/modules để chúng tải khi khởi động:
echo -e "mpls_router\nmpls_iptunnel" >> /etc/modules
Bước 2 — Bật LDP Daemon trong FRRouting
# Chỉnh sửa /etc/frr/daemons
ospfd=yes
ldpd=yes
systemctl restart frr
Bước 3 — Cấu hình LDP tối giản trong vtysh
vtysh
router ospf
network 10.0.12.0/30 area 0
network 1.1.1.1/32 area 0
!
mpls ldp
router-id 1.1.1.1
!
address-family ipv4
discovery transport-address 1.1.1.1
!
interface eth0
!
!
Đó là tất cả những gì cần thiết để LDP hoạt động. Bây giờ hãy tìm hiểu xem thực chất điều gì đang xảy ra bên dưới.
Tìm hiểu sâu: MPLS Label Switching và LDP thực sự hoạt động như thế nào
MPLS là nền tảng của mạng nhà cung cấp dịch vụ và mọi triển khai VPN nghiêm túc. Khi thấy cách một nhãn 20-bit thay thế toàn bộ quá trình tra cứu IP tại mỗi hop transit, bạn sẽ thay đổi hoàn toàn cách nghĩ về packet forwarding — bỗng nhiên thế giới SP trở nên dễ hiểu hơn rất nhiều.
Định tuyến IP truyền thống kiểm tra địa chỉ đích tại mỗi hop và thực hiện longest-prefix match — tốn kém ở quy mô lớn. MPLS thay thế điều đó bằng tra cứu nhãn 20-bit tại mỗi router transit. Nhãn được đẩy vào gói tin tại edge mạng, hoán đổi tại mỗi hop transit, và bỏ ra trước khi giao hàng. Ba thao tác, mỗi router chọn một:
- PUSH — ingress LSR thêm nhãn vào gói tin
- SWAP — transit LSR thay thế nhãn đến bằng nhãn mới
- POP — egress LSR bỏ nhãn và giao gói tin IP
LDP (Label Distribution Protocol) xử lý việc gán nhãn tự động. Các router phát hiện neighbors qua UDP 646 multicast, sau đó thiết lập phiên TCP trên port 646 để trao đổi liên kết label-to-FEC. FEC (Forwarding Equivalence Class) chỉ là một prefix đích. LDP dùng bảng định tuyến IGP làm nền tảng — đó là lý do tại sao OSPF (hoặc IS-IS) phải đang chạy và đã hội tụ trước khi LDP có thể làm bất kỳ điều gì hữu ích.
Topo Lab 3 Router
Đây là topo chúng ta sẽ xây dựng và xác minh đầu cuối:
PC1 --- R1 (Ingress LSR) --- R2 (Transit LSR) --- R3 (Egress LSR) --- PC2
Lo: 1.1.1.1/32 Lo: 2.2.2.2/32 Lo: 3.3.3.3/32
10.0.12.1/30 10.0.12.2/30
10.0.23.1/30 10.0.23.2/30
Cấu hình FRR đầy đủ cho cả ba Router
R1 — Ingress LSR:
frr version 9.1
hostname R1
!
interface eth0
ip address 10.0.12.1/30
!
interface lo0
ip address 1.1.1.1/32
!
router ospf
ospf router-id 1.1.1.1
network 1.1.1.1/32 area 0
network 10.0.12.0/30 area 0
!
mpls ldp
router-id 1.1.1.1
!
address-family ipv4
discovery transport-address 1.1.1.1
!
interface eth0
!
!
R2 — Transit LSR:
frr version 9.1
hostname R2
!
interface eth0
ip address 10.0.12.2/30
!
interface eth1
ip address 10.0.23.1/30
!
interface lo0
ip address 2.2.2.2/32
!
router ospf
ospf router-id 2.2.2.2
network 2.2.2.2/32 area 0
network 10.0.12.0/30 area 0
network 10.0.23.0/30 area 0
!
mpls ldp
router-id 2.2.2.2
!
address-family ipv4
discovery transport-address 2.2.2.2
!
interface eth0
interface eth1
!
!
R3 — Egress LSR:
frr version 9.1
hostname R3
!
interface eth0
ip address 10.0.23.2/30
!
interface lo0
ip address 3.3.3.3/32
!
router ospf
ospf router-id 3.3.3.3
network 3.3.3.3/32 area 0
network 10.0.23.0/30 area 0
!
mpls ldp
router-id 3.3.3.3
!
address-family ipv4
discovery transport-address 3.3.3.3
!
interface eth0
!
!
Nâng cao: Xác minh đường chuyển mạch nhãn
Cấu hình là điều kiện tối thiểu. Đây là cách tôi xác minh rằng nhãn đang thực sự được đẩy, hoán đổi và bỏ ra trong data plane — từ đầu đến cuối.
Kiểm tra trạng thái LDP Neighbor
vtysh -c "show mpls ldp neighbor"
AF ID State Remote Address Uptime
ipv4 2.2.2.2 OPERATIONAL 2.2.2.2 00:08:41
ipv4 3.3.3.3 OPERATIONAL 3.3.3.3 00:08:39
OPERATIONAL trên cả hai neighbors xác nhận rằng các phiên LDP đang hoạt động và label bindings đã được trao đổi.
Kiểm tra Label Information Base
vtysh -c "show mpls ldp binding"
AF Destination Nexthop Local Label Remote Label In Use
ipv4 1.1.1.1/32 10.0.12.1 imp-null 16 yes
ipv4 2.2.2.2/32 - 16 imp-null yes
ipv4 3.3.3.3/32 10.0.23.2 17 16 yes
Các mục imp-null là PHP (Penultimate Hop Popping) — router trước egress sẽ bỏ nhãn thay vì hoán đổi nó. Đây là hành vi mặc định và hoàn toàn bình thường.
Kiểm tra bảng MPLS Forwarding ở cấp độ Kernel
# Góc nhìn của FRR
vtysh -c "show mpls table"
# Góc nhìn của Linux kernel
ip -f mpls route show
Bắt các gói tin có nhãn bằng tcpdump
# Trên interface transit của R2, theo dõi nhãn đang được hoán đổi theo thời gian thực
tcpdump -i eth0 -n -e mpls
Khi nhãn MPLS xuất hiện trong đầu ra tcpdump, bạn biết rằng data plane đang thực sự hoạt động. Header nhãn 4 byte nằm giữa Ethernet frame và IP header — vô hình với các endpoint, nhưng là thứ duy nhất mà các transit LSR quan tâm.
Kiểm tra kết nối đầu cuối
# Từ R1, ping loopback của R3 qua LSP
ping 3.3.3.3 -I 1.1.1.1
Nếu OSPF đã hội tụ và LDP đã phân phối bindings, lệnh này sẽ đi qua toàn bộ đường chuyển mạch nhãn.
Mẹo thực tế: Bài học từ việc debug các lỗi thực tế
1. Module Kernel phải được tải trước FRR
Tôi đã tốn một khoảng thời gian đáng xấu hổ để tìm hiểu tại sao các phiên LDP hình thành nhưng không có nhãn nào xuất hiện trong bảng forwarding. Thủ phạm là mpls_router không được tải trước khi FRR khởi động. Luôn xác minh:
lsmod | grep mpls
2. MPLS Input là Per-Interface — Đừng quên các interface mới
Thêm một interface mới vào router đang chạy mà quên net.mpls.conf.<iface>.input=1, và các gói tin có nhãn sẽ bị drop âm thầm. Không có lỗi. Không có cảnh báo. Bây giờ tôi có một script nhỏ tự động bật MPLS trên bất kỳ interface mới nào vào thời điểm tạo.
3. Transport Address phải có thể truy cập được qua IGP
discovery transport-address — luôn được đặt thành loopback trong cấu hình của tôi — phải được quảng bá vào OSPF. Nếu OSPF không redistribute prefix loopback của bạn, LDP sẽ gửi gói Hello nhưng các phiên TCP để trao đổi nhãn sẽ không bao giờ được thiết lập. Hãy kiểm tra OSPF trước khi LDP neighbors vẫn ở trạng thái INITIALIZED.
4. Sử dụng Network Namespaces để kiểm thử trong HomeLab
Bạn không cần ba máy vật lý hay thậm chí ba VM. Linux network namespaces cho phép bạn chạy các instance FRR riêng biệt trên một máy duy nhất:
# Tạo các namespace riêng biệt
ip netns add R1
ip netns add R2
ip netns add R3
# Tạo cặp veth giữa R1 và R2
ip link add r1-eth0 netns R1 type veth peer name r2-eth0 netns R2
# Gán địa chỉ bên trong mỗi namespace
ip netns exec R1 ip addr add 10.0.12.1/30 dev r1-eth0
ip netns exec R1 ip link set r1-eth0 up
ip netns exec R2 ip addr add 10.0.12.2/30 dev r2-eth0
ip netns exec R2 ip link set r2-eth0 up
# Bật MPLS bên trong namespace
ip netns exec R1 sysctl -w net.mpls.conf.r1-eth0.input=1
ip netns exec R1 sysctl -w net.mpls.platform_labels=100000
Mỗi namespace có thư mục cấu hình FRR và bộ daemon riêng. Xóa bỏ chỉ cần ip netns del R1. Tôi kiểm thử tất cả cấu hình MPLS theo cách này trước khi chạm vào bất cứ thứ gì với lưu lượng thực.
5. Debug đàm phán phiên LDP khi có sự cố
# Bật đầu ra debug LDP bên trong vtysh
debug mpls ldp
debug mpls ldp discovery
debug mpls ldp messages recv
debug mpls ldp messages sent
# Theo dõi log FRR và lọc các sự kiện LDP
tail -f /var/log/frr/frr.log | grep -i ldp
Các chế độ lỗi phổ biến nhất là transport address không thể truy cập và router-ID không khớp. Đầu ra debug làm cả hai trở nên rõ ràng trong vài giây.
Với nền tảng vững chắc này, thách thức tiếp theo rõ ràng là MPLS L3VPN: MP-BGP mang các route VPNv4 giữa các PE router, với LDP cung cấp transport labels bên dưới. Đó là cách các nhà cung cấp dịch vụ giữ lưu lượng khách hàng được cô lập trên cơ sở hạ tầng vật lý chung. Chủ đề lớn hơn — nhưng lab này chính xác là điều kiện tiên quyết.

