EVPN Part 5: Cấu Hình, Kiểm Tra & Xử Lý Sự Cố
Loạt EVPN (7 phần): 1. Vì sao cần EVPN & Fabric · 2. MAC VRF & IP VRF · 3. Route Types & MAC/IP · 4. Inter-VNI & Multi-Homing · 5. Cấu hình & Troubleshooting · 6. Routing Table nội bộ · 7. Multi-Site RT & Route Leak (sắp đăng)
Phần 5/7 trong loạt EVPN: đọc sau Phần 4: Routing Giữa Các VNI & Multi-Homing. Đây là phần đầu tiên có cấu hình thật, viết song song trên 4 nền tảng (Juniper Junos dạng
set, Cisco NX-OS, Arista EOS, Huawei VRP CloudEngine), chỉ nên đọc sau khi đã nắm chắc khái niệm ở 3 phần trước. Ví dụ dùng tên thiết bị/địa chỉ IP hoàn toàn hư cấu, phục vụ mục đích minh họa. Cú pháp CLI trong phần này đã được đối chiếu với tài liệu chính thức của từng vendor tại thời điểm viết, xem Nguồn tham khảo ở cuối bài.
Bốn phần trước đã xây xong toàn bộ nền tảng khái niệm: vì sao cần EVPN, underlay/overlay là gì, RD/RT hoạt động ra sao, Symmetric IRB đi qua từng bước thế nào. Giờ là lúc ghép tất cả lại thành cấu hình thật. Vì mỗi vendor gọi cùng một khái niệm bằng một cái tên khác nhau, phần này trình bày song song 4 nền tảng phổ biến nhất trong data center: Juniper Junos, Cisco NX-OS, Arista EOS, Huawei VRP. Nguyên tắc khi đọc phần này: mỗi khối cấu hình dưới đây không phải để học thuộc, mà để nhận ra "à, dòng này chính là thứ Phần 1-4 đã giải thích", chỉ khác là giờ nó có cú pháp cụ thể theo từng vendor. Nếu chỉ dùng một vendor, cứ đọc kỹ block của vendor đó và lướt qua các block còn lại để thấy cùng một khái niệm được diễn đạt khác nhau ra sao.
Ba câu hỏi cốt lõi mà phần này trả lời:
- Một cấu hình EVPN hoàn chỉnh tách thành những lớp nào, và mỗi lớp viết ra thành lệnh gì trên Junos, NX-OS, EOS, VRP (Mục 1)?
- Sau khi commit xong, gõ lệnh gì để biết từng mảnh đã chạy đúng: BGP session, Type 2, Type 3, ARP suppression, VXLAN tunnel, ESI (Mục 2)?
- Khi một fabric không chạy, kiểm tra theo thứ tự nào để khoanh vùng nhanh nhất, và vì sao Route Target gần như luôn là chỗ đáng nghi trước tiên (Mục 3)?
Mục lục
- 1. Cấu hình đa vendor — từng bước
- 2. Lệnh kiểm tra thực tế
- 3. Xử lý sự cố
- 4. Bảng tham chiếu nhanh
- Nguồn tham khảo
1. Cấu hình đa vendor — từng bước
Tổng quan: 3 lớp cấu hình độc lập
Đúng như đã học ở Phần 1, Mục 3, một cấu hình EVPN hoàn chỉnh luôn tách thành ba lớp độc lập, và tách bạch được ba lớp này trong đầu là chìa khóa để không bị rối khi nhìn vào một file cấu hình dài hàng trăm dòng. Ba lớp này là khái niệm kiến trúc thuần túy của EVPN-VXLAN, không phụ thuộc vendor: Cisco, Arista, Huawei đều tách y hệt, chỉ khác tên lệnh.
Bảng thuật ngữ tương đương giữa 4 vendor
Trước khi vào từng bước, tra nhanh bảng này mỗi khi thấy một lệnh lạ, vì phần lớn "cú pháp khác nhau" thực ra chỉ là tên khác nhau cho cùng một khái niệm đã học ở Phần 1-4.
| Khái niệm | Junos | Cisco NX-OS | Arista EOS | Huawei VRP |
|---|---|---|---|---|
| VTEP source interface | vtep-source-interface | interface nve1 → source-interface | interface Vxlan1 → vxlan source-interface | interface nve1 → source |
| L2 VNI ↔ VLAN | vlans { … vxlan vni … } | vlan X + vn-segment Y | vxlan vlan X vni Y | bridge-domain X + vxlan vni Y |
| L3 VNI ↔ VRF | routing-instances (vrf) + ip-prefix-routes | vrf context + vni | vrf instance + vxlan vrf … vni | ip vpn-instance + vxlan vni |
| RD / RT | route-distinguisher / vrf-target | rd / route-target | rd / route-target | route-distinguisher / vpn-target |
| Anycast Gateway | irb + mac (anycast MAC) | fabric forwarding mode anycast-gateway + anycast-gateway-mac | ip address virtual + ip virtual-router mac-address | vbdif + vxlan anycast-gateway enable |
| BUM replication (ingress) | ingress-node-replication | ingress-replication protocol bgp | tự học qua BGP EVPN (không cần lệnh riêng) | head-end peer-list protocol bgp |
Bước 1: Underlay (dùng eBGP giữa Leaf và Spine)
Junos (set style):
set routing-options router-id 10.0.0.1
set routing-options autonomous-system 65001 # mỗi Leaf dùng ASN riêng (eBGP underlay)
set protocols bgp group UNDERLAY type external
set protocols bgp group UNDERLAY family inet unicast
set protocols bgp group UNDERLAY export LOOPBACK # chỉ quảng bá loopback
set protocols bgp group UNDERLAY neighbor 192.168.1.0 peer-as 65000 # Spine-01
set protocols bgp group UNDERLAY neighbor 192.168.1.2 peer-as 65000 # Spine-02
set policy-options policy-statement LOOPBACK from protocol direct
set policy-options policy-statement LOOPBACK from route-filter 10.0.0.1/32 exact
set policy-options policy-statement LOOPBACK then accept
Cisco NX-OS:
feature bgp
router bgp 65001
router-id 10.0.0.1
address-family ipv4 unicast
network 10.0.0.1/32 ! quảng bá loopback vào underlay
neighbor 192.168.1.0 remote-as 65000 ! Spine-01
address-family ipv4 unicast
neighbor 192.168.1.2 remote-as 65000 ! Spine-02
address-family ipv4 unicast
Arista EOS:
router bgp 65001
router-id 10.0.0.1
neighbor 192.168.1.0 remote-as 65000 ! Spine-01
neighbor 192.168.1.2 remote-as 65000 ! Spine-02
network 10.0.0.1/32 ! quảng bá loopback vào underlay
Huawei VRP:
bgp 65001
router-id 10.0.0.1
peer 192.168.1.0 as-number 65000 # Spine-01
peer 192.168.1.2 as-number 65000 # Spine-02
network 10.0.0.1 255.255.255.255
ipv4-family unicast
peer 192.168.1.0 enable
peer 192.168.1.2 enable
Đây chỉ là một cấu hình BGP thuần túy để quảng bá loopback, không có gì liên quan tới EVPN ở bước này. Với ai từng cấu hình eBGP giữa hai AS, đoạn này không có gì lạ dù ở vendor nào: mỗi Leaf một ASN riêng, peer với Spine, quảng bá đúng một prefix /32.
Bước 2: Overlay BGP EVPN (iBGP giữa Leaf và Spine RR)
Junos (set style):
# Leaf-01 — Overlay iBGP EVPN
set routing-options autonomous-system 65000 # tất cả Leaf/Spine dùng chung ASN (iBGP)
set protocols bgp group OVERLAY-EVPN type internal
set protocols bgp group OVERLAY-EVPN family evpn signaling # bật EVPN address-family
set protocols bgp group OVERLAY-EVPN local-address 10.0.0.1 # dùng loopback
set protocols bgp group OVERLAY-EVPN neighbor 10.100.0.1 # Spine-01 (Route Reflector)
set protocols bgp group OVERLAY-EVPN neighbor 10.100.0.2 # Spine-02 (Route Reflector)
# Spine-01 — cấu hình Route Reflector
set protocols bgp group OVERLAY-EVPN type internal
set protocols bgp group OVERLAY-EVPN family evpn signaling
set protocols bgp group OVERLAY-EVPN cluster 0.0.0.1 # bật Route Reflector
set protocols bgp group OVERLAY-EVPN local-address 10.100.0.1
set protocols bgp group OVERLAY-EVPN neighbor 10.0.0.1 # Leaf-01
set protocols bgp group OVERLAY-EVPN neighbor 10.0.0.2 # Leaf-02
set protocols bgp group OVERLAY-EVPN neighbor 10.0.0.3 # Leaf-03 ... tất cả Leaf
Cisco NX-OS:
! Leaf-01
router bgp 65000
neighbor 10.100.0.1 remote-as 65000 ! Spine-01 (RR)
update-source loopback0
address-family l2vpn evpn
send-community extended
neighbor 10.100.0.2 remote-as 65000 ! Spine-02 (RR)
update-source loopback0
address-family l2vpn evpn
send-community extended
! Spine-01 — Route Reflector
router bgp 65000
neighbor 10.0.0.1 remote-as 65000 ! Leaf-01
update-source loopback0
address-family l2vpn evpn
send-community extended
route-reflector-client
neighbor 10.0.0.2 remote-as 65000 ! Leaf-02
update-source loopback0
address-family l2vpn evpn
send-community extended
route-reflector-client
Arista EOS:
! Leaf-01
router bgp 65000
neighbor 10.100.0.1 remote-as 65000 ! Spine-01 (RR)
neighbor 10.100.0.1 update-source Loopback0
neighbor 10.100.0.2 remote-as 65000 ! Spine-02 (RR)
neighbor 10.100.0.2 update-source Loopback0
address-family evpn
neighbor 10.100.0.1 activate
neighbor 10.100.0.2 activate
! Spine-01 — Route Reflector
router bgp 65000
neighbor 10.0.0.1 remote-as 65000 ! Leaf-01
neighbor 10.0.0.1 update-source Loopback0
neighbor 10.0.0.2 remote-as 65000 ! Leaf-02
neighbor 10.0.0.2 update-source Loopback0
address-family evpn
neighbor 10.0.0.1 activate
neighbor 10.0.0.1 route-reflector-client
neighbor 10.0.0.2 activate
neighbor 10.0.0.2 route-reflector-client
Huawei VRP:
# Leaf-01
bgp 65000
peer 10.100.0.1 as-number 65000 # Spine-01 (RR)
peer 10.100.0.1 connect-interface LoopBack0
peer 10.100.0.2 as-number 65000 # Spine-02 (RR)
peer 10.100.0.2 connect-interface LoopBack0
l2vpn-family evpn
peer 10.100.0.1 enable
peer 10.100.0.2 enable
# Spine-01 — Route Reflector
bgp 65000
peer 10.0.0.1 as-number 65000 # Leaf-01
peer 10.0.0.1 connect-interface LoopBack0
peer 10.0.0.2 as-number 65000 # Leaf-02
peer 10.0.0.2 connect-interface LoopBack0
l2vpn-family evpn
peer 10.0.0.1 enable
peer 10.0.0.1 reflect-client
peer 10.0.0.2 enable
peer 10.0.0.2 reflect-client
Dòng đáng chú ý nhất ở khối Junos là family evpn signaling, chính xác là cách khai báo "tôi muốn dùng address-family evpn" mà Phần 1 đã nói: BGP gốc chỉ hiểu IPv4, nên cần khai báo rõ một address-family riêng để mang theo MAC/VNI. Ba vendor còn lại làm đúng việc này bằng ba cái tên khác nhau: address-family l2vpn evpn (Cisco), address-family evpn (Arista), l2vpn-family evpn (Huawei), bản chất vẫn là một. cluster/route-reflector-client/reflect-client trên Spine chính là cấu hình bật vai trò Route Reflector đã học ở Phần 3.
Bước 3: Hiểu RD và RT trước khi cấu hình
Phần 1, Mục 4 đã giải thích RD/RT bằng lời, phần này chỉ là cách viết chúng ra thành cấu hình thật.
Route Distinguisher (RD) chỉ làm đúng một việc: khiến route trở nên độc nhất trong bảng BGP chung. Nó không quyết định route đi đâu. Vì sao cần tới nó thì thấy rõ nhất ở trường hợp Anycast Gateway: mọi Leaf đều dùng chung một MAC gateway, nên nếu không có gì phân biệt, hai Leaf sẽ quảng bá ra hai route trông giống hệt nhau và BGP không còn cách nào tách chúng ra:
| Không có RD | Có RD | |
|---|---|---|
| Leaf-01 quảng bá | MAC=AA, IP=10.1.1.10 | 10.0.0.1:1 + MAC=AA |
| Leaf-02 quảng bá | MAC=AA, IP=10.1.1.10 | 10.0.0.2:1 + MAC=AA |
| BGP nhìn thấy | Hai route trùng khít nhau, xung đột | Hai route riêng biệt, cùng tồn tại |
Route Target (RT) mới là thứ quyết định route được import vào forwarding-space nào, viết theo định dạng target:<ASN>:<local-value>. Bên export gắn RT lên route trước khi gửi đi; bên import so RT nhận được với danh sách RT mà nó chấp nhận. Hai giá trị phải khớp chính xác, không có cơ chế khớp gần đúng hay khớp một phần nào:
| Leaf-01 export | Leaf-02 import | Kết quả |
|---|---|---|
target:65000:1 | target:65000:1 | Route được nhận, vào đúng forwarding-space |
target:65000:1 | target:65000:2 | Route bị bỏ qua, không vào VRF nào |
Trên Junos có hai cách viết RT ra thành cấu hình thật.
Cách 1: shorthand vrf-target. Đặt đúng một dòng, Junos tự suy ra cả hướng import lẫn hướng export đều dùng giá trị đó. Đây là cách dùng cho gần như mọi trường hợp thông thường, khi import RT bằng đúng export RT:
set switch-options vrf-target target:65000:1
Cách 2: policy tường minh. Cần tới nó khi một thiết bị phải import nhiều RT khác nhau cùng lúc, chẳng hạn thiết kế hub-and-spoke hoặc DCI nhiều site:
set policy-options community RT-A members target:65000:1
set policy-options community RT-B members target:65000:2
set policy-options policy-statement EVPN-IMPORT term 1 from community [ RT-A RT-B ]
set policy-options policy-statement EVPN-IMPORT term 1 then accept
set policy-options policy-statement EVPN-EXPORT term 1 then community add RT-A
set policy-options policy-statement EVPN-EXPORT term 1 then accept
EVPN-IMPORT chấp nhận cả RT-A lẫn RT-B, nên thiết bị nhận được route của hai nhóm khác nhau; EVPN-EXPORT thì chỉ gắn RT-A lên route do chính nó phát ra. Tách rời hai hướng như vậy là đúng thứ mà shorthand vrf-target không làm được.
RT xếp theo hai tầng. Junos cho phép đặt một RT mặc định ở switch-options áp cho mọi VNI (tầng 1), rồi override riêng cho từng VNI cần giá trị khác qua vni-options (tầng 2). Từ khóa auto ở tầng 1 sinh thêm một RT theo công thức ASN ghép VNI:
# Tầng 1 — RT mặc định cho mọi VNI chưa có override
set switch-options vrf-target target:65001.0:1
set switch-options vrf-target auto
# Tầng 2 — override RT cho từng VNI cụ thể
set protocols evpn vni-options vni 1000110
set protocols evpn vni-options vni 1000124 vrf-target target:65002.0:10124
set protocols evpn vni-options vni 1002010 vrf-target target:65001.0:12010
Kết quả: VNI 1000110 dùng global target:65001.0:1; VNI 1000124 và 1002010 dùng RT riêng đã override. Cơ chế này hữu ích trong thiết kế multi-tenant: mỗi tenant có ASN riêng nên RT riêng, đảm bảo VNI của tenant B không bị import nhầm bởi thiết bị của tenant A dù chung một EVPN fabric. Mô hình multi-site với nhiều RT theo từng site trong thực tế production sẽ được nói kỹ ở các phần sau.
Từ khóa auto khiến một VNI mang hai RT cùng lúc: một global explicit và một auto-derived theo công thức ASN+VNI. Một route mang nhiều RT là chuyện bình thường trong BGP (multiple extended communities); nhờ vậy, một thiết bị có thể import theo RT global (nhận toàn bộ VNI của tenant) trong khi thiết bị khác import theo RT auto-derived (chỉ nhận đúng một VNI cụ thể). Cùng một route, hai cách import khác nhau tùy nhu cầu từng thiết bị.
Cùng khái niệm này trên 3 vendor còn lại, chỉ khác tên lệnh, logic import/export giống hệt:
| Cơ chế | Junos | Cisco NX-OS | Arista EOS | Huawei VRP |
|---|---|---|---|---|
| RT chung (import = export) | vrf-target target:ASN:VAL | route-target both ASN:VAL (hoặc both auto) | route-target both ASN:VAL | vpn-target ASN:VAL |
| Import riêng | vrf-import POLICY + community/policy-statement | route-target import ASN:VAL [evpn] — nhiều dòng = nhiều RT | route-target import ASN:VAL | vpn-target ASN:VAL import-extcommunity |
| Export riêng | vrf-export POLICY | route-target export ASN:VAL [evpn] | route-target export ASN:VAL | vpn-target ASN:VAL export-extcommunity |
Hậu tố evpn trên Cisco/Huawei (route-target … evpn, vpn-target … evpn) chỉ cần thêm khi RD/VRF đó dùng chung cho cả VPNv4 lẫn L2VPN EVPN và muốn RT chỉ áp dụng riêng cho EVPN address-family. Trường hợp thường gặp nhất trong bài này (chỉ chạy EVPN) không bắt buộc phải có hậu tố này.
Bước 4: EVPN + VXLAN cấu hình đầy đủ trên Leaf
Junos (set style):
# --- Interfaces ---
set interfaces lo0 unit 0 family inet address 10.0.0.1/32
set interfaces ge-0/0/0 unit 0 family ethernet-switching interface-mode access
set interfaces ge-0/0/0 unit 0 family ethernet-switching vlan members vlan-100
set interfaces irb unit 1000 family inet address 10.1.1.1/24
set interfaces irb unit 1000 mac 00:00:5e:00:01:01 # Anycast MAC — giống trên tất cả Leaf!
# --- VLANs + VNI mapping ---
set vlans vlan-100 vlan-id 100
set vlans vlan-100 vxlan vni 1000
set vlans vlan-100 vxlan ingress-node-replication # dùng EVPN ingress-replication (không cần multicast)
set vlans vlan-100 l3-interface irb.1000
# --- Switch options ---
set switch-options vtep-source-interface lo0.0 # loopback làm source IP của VXLAN tunnel
set switch-options route-distinguisher 10.0.0.1:1 # RD riêng của Leaf này — Leaf-02 sẽ dùng 10.0.0.2:1
set switch-options vrf-target target:65000:1 # RT — tất cả Leaf phải cùng value này
# --- EVPN protocol ---
set protocols evpn encapsulation vxlan
set protocols evpn extended-vni-list all # bật EVPN cho tất cả VNI
set protocols evpn default-gateway no-gateway-community # cho phép anycast GW
Cisco NX-OS:
feature bgp
feature interface-vlan
feature vn-segment-vlan-based
feature nv overlay
nv overlay evpn
fabric forwarding anycast-gateway-mac 0000.5e00.0101 ! Anycast MAC — giống trên tất cả Leaf!
interface loopback0
ip address 10.0.0.1/32
interface loopback1 ! VTEP source riêng biệt (best practice)
ip address 10.0.0.11/32
vlan 100
vn-segment 1000 ! VLAN 100 ↔ VNI 1000
interface Vlan100
no shutdown
ip address 10.1.1.1/24
fabric forwarding mode anycast-gateway ! bật anycast gateway cho SVI này
interface nve1
no shutdown
source-interface loopback1 ! loopback làm source IP của VXLAN tunnel
host-reachability protocol bgp
member vni 1000
suppress-arp ! ARP suppression per-VNI
ingress-replication protocol bgp ! không cần multicast underlay
evpn
vni 1000 l2
rd 10.0.0.1:1 ! RD riêng của Leaf này
route-target import 65000:1
route-target export 65000:1
Arista EOS:
ip virtual-router mac-address 00:00:5e:00:01:01 ! Anycast MAC — giống trên tất cả Leaf!
interface Loopback0
ip address 10.0.0.1/32
interface Loopback1 ! VTEP source riêng biệt
ip address 10.0.0.11/32
vlan 100
interface Vlan100
ip address virtual 10.1.1.1/24 ! anycast gateway — cùng IP+MAC trên mọi Leaf
interface Vxlan1
vxlan source-interface Loopback1 ! loopback làm source IP của VXLAN tunnel
vxlan udp-port 4789
vxlan vlan 100 vni 1000 ! VLAN 100 ↔ VNI 1000
router bgp 65000
vlan 100
rd 10.0.0.1:1 ! RD riêng của Leaf này
route-target both 65000:1
redistribute learned ! quảng bá MAC học được (Type-2) qua BGP
Huawei VRP:
evpn-overlay enable
interface LoopBack0
ip address 10.0.0.1 255.255.255.255
interface LoopBack1 # VTEP source riêng biệt
ip address 10.0.0.11 255.255.255.255
bridge-domain 100
vxlan vni 1000 # BD 100 ↔ VNI 1000 (BD là broadcast domain riêng, không đồng nhất với VLAN 802.1Q)
evpn
route-distinguisher 10.0.0.1:1 # RD riêng của Leaf này
vpn-target 65000:1
interface vbdif100
ip address 10.1.1.1 255.255.255.0
mac-address 0000-5e00-0101 # Anycast MAC — giống trên tất cả Leaf!
vxlan anycast-gateway enable
arp collect host enable # thu thập ARP host-route để phục vụ ARP suppression
interface nve1
source 10.0.0.11 # loopback làm source IP của VXLAN tunnel
vni 1000 head-end peer-list protocol bgp # không cần multicast underlay
Ba khối vtep-source-interface, route-distinguisher, vrf-target trong switch-options (Junos), hay source-interface/rd/route-target trên Cisco và Arista, source/route-distinguisher/vpn-target trên Huawei, chính là ba mảnh ghép đã học riêng lẻ ở các phần trước: Loopback làm VTEP (Phần 1), RD để tránh trùng route (mục này), RT để phân loại đúng VRF (mục này). ingress-node-replication/ingress-replication protocol bgp/head-end peer-list protocol bgp là cách mỗi vendor xây danh sách BUM-replication mà không cần multicast underlay, chính là cơ chế Type 3 đã học ở Phần 3. Riêng Arista không cần lệnh suppress-arp tường minh: khi redistribute learned đã bật, EOS tự học và quảng bá host-route (MAC+IP) làm nền cho proxy-ARP.
Bổ sung: Cấu hình L3 VNI cho inter-VNI routing (Symmetric IRB)
Junos (set style):
set routing-instances VRF-PROD instance-type vrf
set routing-instances VRF-PROD interface irb.1000 # gateway cho VNI 1000
set routing-instances VRF-PROD interface irb.2000 # gateway cho VNI 2000
set routing-instances VRF-PROD route-distinguisher 10.0.0.1:50000
set routing-instances VRF-PROD vrf-target target:65000:50000
set routing-instances VRF-PROD protocols evpn ip-prefix-routes advertise direct-nexthop
set routing-instances VRF-PROD protocols evpn ip-prefix-routes encapsulation vxlan
set routing-instances VRF-PROD protocols evpn ip-prefix-routes vni 50000 # L3 VNI riêng của VRF này
Cisco NX-OS:
vrf context VRF-PROD
vni 50000 ! L3 VNI riêng của VRF này
rd 10.0.0.1:50000
address-family ipv4 unicast
route-target both 65000:50000
route-target both 65000:50000 evpn
interface Vlan100
vrf member VRF-PROD ! gateway cho VNI 1000
interface Vlan200
vrf member VRF-PROD ! gateway cho VNI 2000
router bgp 65000
vrf VRF-PROD
address-family ipv4 unicast
advertise l2vpn evpn ! sinh Type-5 từ route trong VRF
Arista EOS:
vrf instance VRF-PROD
interface Vlan100
vrf VRF-PROD ! gateway cho VNI 1000
interface Vlan200
vrf VRF-PROD ! gateway cho VNI 2000
interface Vxlan1
vxlan vrf VRF-PROD vni 50000 ! L3 VNI riêng của VRF này
router bgp 65000
vrf VRF-PROD
rd 10.0.0.1:50000
route-target import 65000:50000
route-target export 65000:50000
redistribute connected ! sinh Type-5 từ route trong VRF
Huawei VRP:
ip vpn-instance VRF-PROD
vxlan vni 50000 # L3 VNI riêng của VRF này
ipv4-family
route-distinguisher 10.0.0.1:50000
vpn-target 65000:50000 evpn
interface vbdif100
ip binding vpn-instance VRF-PROD # gateway cho VNI 1000
interface vbdif200
ip binding vpn-instance VRF-PROD # gateway cho VNI 2000
ip-prefix-routes { advertise direct-nexthop; ... } (Junos), hay advertise l2vpn evpn (Cisco), redistribute connected trong context VRF (Arista), việc gán vxlan vni cho ip vpn-instance (Huawei): tất cả đều là cấu hình sinh ra Type 5 route với GW IP = 0.0.0.0 như đã giải thích ở Phần 4, Mục 1. Cú pháp Junos này đã có từ Junos 15.1X53-D60 và vẫn là cách làm hiện đại được khuyến nghị.
Bổ sung: Cấu hình Type-5 Import/Export
Type 5 có hai phía, export (bên quảng bá prefix) và import (bên nhận prefix), và cả hai phải khớp RT thì route mới đi đúng chỗ, đúng nguyên tắc RT đã học ở Bước 3.
Phía Export, quảng bá Type-5 ra ngoài (Junos, set style):
set routing-instances VRF-A instance-type vrf
set routing-instances VRF-A interface irb.1000
set routing-instances VRF-A route-distinguisher 10.0.0.1:100
set routing-instances VRF-A vrf-target target:65000:100 # export với RT này
set routing-instances VRF-A protocols evpn ip-prefix-routes advertise direct-nexthop
set routing-instances VRF-A protocols evpn ip-prefix-routes encapsulation vxlan
set routing-instances VRF-A protocols evpn ip-prefix-routes vni 50100 # L3 VNI của VRF-A
# Kết quả: prefix 10.1.1.0/24 (direct route trong VRF-A)
# → được quảng bá ra EVPN dưới dạng Type-5:
# {prefix=10.1.1.0/24, L3 VNI=50100, RT=target:65000:100, GW IP=0.0.0.0}
Phía Import, nhận Type-5 vào VRF (Junos, set style, tách import/export riêng):
set routing-instances VRF-B instance-type vrf
set routing-instances VRF-B interface irb.2000
set routing-instances VRF-B route-distinguisher 10.0.0.1:200
set routing-instances VRF-B vrf-import VRF_B_IMPORT
set routing-instances VRF-B vrf-export VRF_B_EXPORT
set policy-options community RT-A members target:65000:100 # RT của VRF-A
set policy-options community RT-B members target:65000:200 # RT của VRF-B
set policy-options policy-statement VRF_B_IMPORT term accept-from-vrf-a from community RT-A
set policy-options policy-statement VRF_B_IMPORT term accept-from-vrf-a then accept
set policy-options policy-statement VRF_B_IMPORT term reject-rest then reject
set policy-options policy-statement VRF_B_EXPORT term export-vrf-b then community add RT-B
set policy-options policy-statement VRF_B_EXPORT term export-vrf-b then accept
# Kết quả: VRF-B nhận Type-5 từ VRF-A
# → route 10.1.1.0/24 xuất hiện trong VRF-B.inet.0
# → next-hop = VTEP của VRF-A (10.0.0.X), L3 VNI = 50100
Đặt hai cách khai RT cạnh nhau để biết khi nào chọn cái nào:
vrf-target target:X:Y | vrf-import + vrf-export | |
|---|---|---|
| Phạm vi tác dụng | Set cả hướng import và hướng export cùng một RT | Tách rời hai hướng, mỗi hướng một policy riêng |
| Số RT xử lý được | Đúng một | Import nhiều RT cùng lúc, export gán nhiều RT hoặc kèm điều kiện lọc prefix |
| Dùng khi | Import RT bằng đúng export RT, cấu hình ngắn gọn | DCI, multi-tenant, hub-and-spoke |
Khai cả hai cùng lúc trên một instance cũng hợp lệ, và thứ tự ưu tiên cần nhớ: vrf-import override hướng import của vrf-target, nên khi đó vrf-target chỉ còn tác dụng ở hướng export.
Cùng kịch bản VRF-B nhận Type-5 từ VRF-A trên 3 vendor còn lại. Điểm cần nhìn ở cả ba khối dưới đây là một: import RT của VRF-B phải khớp export RT của VRF-A, đúng logic Junos vừa trình bày ở trên.
Cisco NX-OS:
vrf context VRF-B
vni 50200
rd 10.0.0.1:200
address-family ipv4 unicast
route-target import 65000:100 evpn ! nhận từ VRF-A
route-target export 65000:200 evpn
Arista EOS:
router bgp 65000
vrf VRF-B
rd 10.0.0.1:200
route-target import 65000:100 ! nhận từ VRF-A
route-target export 65000:200
Huawei VRP:
ip vpn-instance VRF-B
vxlan vni 50200
ipv4-family
route-distinguisher 10.0.0.1:200
vpn-target 65000:100 import-extcommunity evpn # nhận từ VRF-A
vpn-target 65000:200 export-extcommunity evpn
Với kịch bản DCI 2 site (mỗi site RT riêng, mỗi site phải import cả RT của site kia lẫn RT của chính mình để route không bị "rớt" khi đi ngược lại): cơ chế trên cả 4 vendor giống hệt nhau: thêm nhiều dòng vrf-import/route-target import/vpn-target … import-extcommunity, mỗi dòng một RT cần chấp nhận. Bản Junos đầy đủ của kịch bản DCI:
DCI: Site A và Site B trao đổi Type-5 (Junos, set style):
set routing-instances VRF-PROD instance-type vrf
set routing-instances VRF-PROD route-distinguisher 10.0.0.1:1000
set routing-instances VRF-PROD vrf-import VRF_PROD_IMPORT
set routing-instances VRF-PROD vrf-export VRF_PROD_EXPORT
set routing-instances VRF-PROD protocols evpn ip-prefix-routes advertise direct-nexthop
set routing-instances VRF-PROD protocols evpn ip-prefix-routes encapsulation vxlan
set routing-instances VRF-PROD protocols evpn ip-prefix-routes vni 51000
set policy-options community RT-SITE-A members target:65001:1000
set policy-options community RT-SITE-B members target:65002:1000
set policy-options policy-statement VRF_PROD_IMPORT term from-site-b from community RT-SITE-B
set policy-options policy-statement VRF_PROD_IMPORT term from-site-b then accept
set policy-options policy-statement VRF_PROD_IMPORT term from-self from community RT-SITE-A
set policy-options policy-statement VRF_PROD_IMPORT term from-self then accept
set policy-options policy-statement VRF_PROD_IMPORT term reject then reject
set policy-options policy-statement VRF_PROD_EXPORT term export then community add RT-SITE-A
set policy-options policy-statement VRF_PROD_EXPORT term export then accept
# Site B — config tương tự, đổi RT-SITE-A ↔ RT-SITE-B
Mô hình multi-site với nhiều RT theo từng site trong thực tế production, cả trên Junos lẫn 3 vendor kia, sẽ được nói kỹ hơn ở các phần sau.
Verify Type-5 import/export (Junos):
# Xem Type-5 route đang được quảng bá (export)
show route table bgp.evpn.0 match-prefix "5:" detail
# Output mẫu:
# 5:10.0.0.1:1000::0::10.1.1.0::24/248
# *[EVPN/170] ...
# Route Distinguisher: 10.0.0.1:1000
# IP prefix: 10.1.1.0, IP prefix length: 24
# Gateway IP: 0.0.0.0
# Label1: 50100 ← L3 VNI
# Communities: target:65000:100
# Xem Type-5 đã vào VRF routing table chưa
show route table VRF-B.inet.0
# Nếu thiếu route → kiểm tra RT có khớp không
show route table bgp.evpn.0 match-prefix "5:" extensive | match "target"
Lệnh tương đương trên Cisco/Arista/Huawei cho các bước verify này nằm trong bảng ở Mục 2.
Kiểm tra nhanh sau khi cấu hình
# 1. BGP session với Route Reflector?
show bgp summary
# 2. EVPN route đến được chưa?
show evpn database
# 3. Type-2 route (MAC/IP) học được chưa?
show route table bgp.evpn.0 detail | match "MAC"
# 4. ARP suppression table đã có entry?
show evpn arp-table
# 5. VXLAN tunnel lên chưa?
show ethernet-switching vxlan-tunnel-end-point remote
Đây là checklist Junos. Lệnh tương đương cho từng bước trên Cisco NX-OS, Arista EOS, Huawei VRP nằm ngay trong bảng ở Mục 2 dưới đây.
2. Lệnh kiểm tra thực tế
Kiểm tra EVPN database (bảng MAC/IP của local VTEP)
show evpn database
# Output mẫu:
# Instance: default
# VLAN DomainId MAC address Active source Timestamp IP address
# 100 1000 aa:bb:cc:dd:ee:ff ge-0/0/0.0 (local) 01:23:45 ago 10.1.1.10
# 100 1000 dd:ee:ff:aa:bb:cc 10.0.0.2 (remote VTEP) 00:05:12 ago 10.1.1.20
# ↑ MAC này ở VTEP 10.0.0.2
Kiểm tra EVPN BGP routes
# Xem tất cả EVPN route nhận được
show route table bgp.evpn.0
# Xem Type-2 routes (MAC/IP)
show route table bgp.evpn.0 match-prefix "2:"
# Xem Type-3 routes (BUM list)
show route table bgp.evpn.0 match-prefix "3:"
# Xem Type-5 routes (IP prefix)
show route table bgp.evpn.0 match-prefix "5:"
Kiểm tra ARP Suppression
# ARP table học từ EVPN (để proxy ARP)
show evpn arp-table
# Output:
# IP MAC VTEP VNI Source
# 10.1.1.10 aa:bb:cc:... 10.0.0.1 1000 EVPN
# 10.1.1.20 dd:ee:ff:... local 1000 ARP
Kiểm tra VTEP và ingress-replication list
show evpn instance extensive
# Output:
# Instance: default
# Route Distinguisher: 10.0.0.1:1
# Per-VNI statistics:
# VNI 1000:
# Ingress replication peers: 10.0.0.2, 10.0.0.3
# ↑ BUM sẽ gửi đến những VTEP này — chính là danh sách Type-3 đã học
Kiểm tra Multi-Homing (ESI)
show evpn instance esi-detail
# Output:
# ESI: 0x00:11:22:33:44:55:66:77:88:99
# Status: Resolved
# DF Election: Leaf-01 is DF (bầu chọn DF)
# Peers: 10.0.0.1 (local), 10.0.0.2 (remote)
show route table bgp.evpn.0 match-prefix "1:"
Lệnh tương đương trên Cisco NX-OS / Arista EOS / Huawei VRP
Toàn bộ lệnh show/display dưới đây đã đối chiếu với tài liệu chính thức từng vendor, xem Nguồn tham khảo.
| Mục đích | Junos | Cisco NX-OS | Arista EOS | Huawei VRP |
|---|---|---|---|---|
| BGP overlay session | show bgp summary | show bgp l2vpn evpn summary | show bgp evpn summary | display bgp evpn peer |
| Toàn bộ EVPN route trong bảng BGP | show route table bgp.evpn.0 | show bgp l2vpn evpn | show bgp evpn | display bgp evpn all routing-table |
| Type-2 — MAC/IP đã học | show evpn database | show l2route evpn mac-ip all | show bgp evpn route-type mac-ip | display bgp evpn vpn-instance <vpn> routing-table mac-route |
| Type-3 — VTEP/BUM replication list | show evpn instance extensive | show nve peers | show vxlan vtep | display vxlan tunnel |
| Type-5 — IP prefix route | show route table bgp.evpn.0 match-prefix "5:" | show bgp l2vpn evpn (lọc route-type ip-prefix trong output) | show bgp evpn route-type ip-prefix | display bgp evpn all routing-table (lọc theo prefix) |
| ARP suppression table | show evpn arp-table | show ip arp suppression-cache | show arp interface Vxlan1 (EOS không có cache riêng — xem ARP đã snoop) | display arp broadcast-suppress user bridge-domain <bd-id> |
| ESI / multi-homing | show evpn instance esi-detail | show evpn esi | show bgp evpn instance (xem local ES: DF, mode) | display bgp evpn all esi |
Ba dòng đầu (BGP session → EVPN route → Type-2 MAC/IP) chính là 80% những gì cần gõ khi debug một session EVPN mới lên, và thứ tự này khớp với sơ đồ debug ở Mục 3 bên dưới.
3. Xử lý sự cố
Khi một mạng EVPN "không chạy", cám dỗ đầu tiên thường là nghi ngờ VXLAN hay VLAN, nhưng phần lớn sự cố thực tế nằm ở BGP session hoặc RT không khớp. Dưới đây là 4 tình huống thường gặp nhất, theo đúng thứ tự nên kiểm tra. Logic debug này giống hệt nhau trên mọi vendor — chỉ khác tên lệnh đã liệt kê ở bảng Mục 2, nên phần dưới giữ nguyên theo Junos để tập trung vào tư duy debug thay vì lặp lại cú pháp 4 lần.
Vấn đề 1: BGP EVPN session không lên
Triệu chứng: show bgp summary báo neighbor ở trạng thái Active thay vì Established.
Bốn thứ cần kiểm tra, theo đúng thứ tự dưới đây:
Bước 1: underlay có ping được không. Nếu bước này đã fail thì không cần xem tiếp phần overlay: phải fix underlay (OSPF hoặc BGP underlay) trước.
ping 10.100.0.1 routing-instance default source 10.0.0.1
Bước 2: ASN có đúng không. Leaf phải peer đúng ASN mà Spine đang dùng.
show bgp summary | match AS
Bước 3: local-address có phải loopback không. Phải dùng loopback, không dùng IP của interface vật lý:
set protocols bgp group OVERLAY local-address 10.0.0.1
Bước 4: address-family EVPN đã bật chưa. Trong danh sách capabilities đã đàm phán phải thấy EVPN; nếu không thấy, hai đầu chưa thống nhất được address-family nên session không thể lên.
show bgp neighbor 10.100.0.1 detail | match EVPN
Vấn đề 2: Không thấy MAC của VM ở Leaf khác
Triệu chứng: show evpn database chỉ liệt kê MAC cục bộ, không có MAC nào từ VTEP ở xa.
Bước 1: BGP session lên chưa. Mọi neighbor phải ở trạng thái Established.
show bgp summary
Bước 2: Route Reflector có nhận được route từ Leaf-A không. Gõ trên Spine; không thấy route nào mang RD của Leaf-A nghĩa là Leaf-A chưa hề gửi route đi.
show route table bgp.evpn.0 | match "10.0.0.1"
Bước 3: Route Target có khớp nhau không. Đây là nguyên nhân hay gặp nhất của toàn bộ bốn tình huống trong mục này, và cũng là thứ Bước 3 ở Mục 1 đã nhấn: export RT của Leaf-01 phải trùng khít import RT của Leaf-02, chẳng hạn cả hai đều target:65000:1000.
show evpn instance extensive | match "Route Target"
Bước 4: VM đã gửi traffic chưa. EVPN chỉ sinh Type 2 route sau khi leaf nhìn thấy traffic từ VM (nhớ lại GARP ở Phần 3, Mục 4), nên một VM vừa boot mà im lặng sẽ không xuất hiện ở đâu cả. Cho VM ping gateway rồi kiểm tra lại:
# từ VM
ping 10.1.1.1
# trên leaf
show evpn database
Vấn đề 3: ARP Suppression không hoạt động
Triệu chứng: vẫn thấy ARP bị flood trên fabric dù EVPN đã chạy.
Bước 1: bảng ARP học từ EVPN có entry nào chưa. Bảng rỗng nghĩa là chưa có gì để proxy-reply, nên leaf buộc phải flood.
show evpn arp-table
Bước 2: Type 2 route đã mang IP chưa. Route Type 2 phải có cả MAC lẫn IP; nếu chỉ có MAC thì VM chưa từng gửi ARP nên chưa có ánh xạ IP để leaf trả lời thay (xem lại Phần 3, Mục 5).
show route table bgp.evpn.0 | match "MAC"
Bước 3: ingress-node-replication đã bật chưa. Output phải có dòng Ingress node replication: Enabled.
show vlans vlan-100 detail | match "ingress"
Vấn đề 4: Inter-VNI routing không hoạt động
Triệu chứng: VM-A (VNI 1000) không ping được VM-X (VNI 2000), nhưng ping trong cùng một VNI thì vẫn tốt. Triệu chứng tách bạch như vậy đã khoanh vùng sẵn: lớp bridging ổn, vấn đề nằm ở lớp routing.
Bước 1: IRB interface có up không. Cả hai IRB phải ở State: up.
show interfaces irb.1000
show interfaces irb.2000
Bước 2: VM-A có ping được gateway của chính nó không. Nếu bước này fail thì đây là lỗi layer 2 cục bộ, chưa liên quan gì tới routing.
# từ VM-A
ping 10.1.1.1
Bước 3: route tới subnet của VNI 2000 đã có chưa. Phải thấy route, và nguồn học phải là EVPN Type 5.
show route 10.2.2.0/24
Bước 4: L3 VNI đã cấu hình và có khớp nhau chưa. Giá trị L3 VNI phải giống nhau giữa Leaf-01 và Leaf-02, đúng tính chất đối xứng của Symmetric IRB (xem lại Phần 2, Mục 3 và Phần 4, Mục 2).
Bước 5: Anycast MAC có giống nhau trên mọi Leaf không. Mọi Leaf phải mang cùng một MAC trên IRB interface, nếu lệch thì host sẽ thấy gateway "nhảy" MAC khi đi qua leaf khác.
show interfaces irb.1000 detail | match MAC
4. Bảng tham chiếu nhanh
EVPN Route Types
| Type | Tên | Mục đích | Khi nào tạo |
|---|---|---|---|
| 1 | Ethernet Auto-Discovery | ESI multi-homing | Khi cấu hình ESI |
| 2 | MAC/IP Advertisement | Vị trí host (MAC+IP) | Khi VM giao tiếp |
| 3 | Inclusive Multicast | BUM replication list | Khi VNI bật |
| 4 | Ethernet Segment | DF election (ESI) | Khi cấu hình ESI |
| 5 | IP Prefix | Routing giữa VNI | Khi cấu hình L3 |
EVPN vs Flood-and-Learn
| Tính năng | Flood-and-Learn | EVPN Control Plane |
|---|---|---|
| ARP behavior | Flood toàn fabric | Proxy ARP tại local Leaf |
| MAC learning | Từ data plane (chậm) | Từ BGP UPDATE (ngay lập tức) |
| VM mobility | Chờ MAC aging (phút) | BGP UPDATE ngay (giây) |
| BUM traffic | Nhiều, không kiểm soát | Ít, ingress-replication list |
| Multi-homing | MAC flapping | ESI-based, không flap |
VNI Naming Convention (gợi ý)
L2 VNI (per VLAN/segment): VNI 10xxx = VLAN xxx
L3 VNI (per VRF): VNI 50xxx = VRF xxx
Bức tranh tổng thể
Ba tầng trong hình trên (underlay, VXLAN data plane, EVPN control plane) chính là ba lớp cấu hình đã đi qua ở Mục 1, dù triển khai bằng Junos, NX-OS, EOS hay VRP. Nếu quay lại đọc Phần 1 sau khi đã xem qua cấu hình thật ở đây, các khái niệm sẽ rõ ràng hơn nhiều so với lần đọc đầu tiên — đây là điều bình thường khi học một hệ thống nhiều lớp như EVPN.
Nguồn tham khảo
RFC nền tảng: RFC 7432 (EVPN), RFC 8365 (EVPN for VXLAN), RFC 9135 (IRB), RFC 9136 (IP Prefix Route).
Cú pháp CLI từng vendor trong bài đã đối chiếu với các tài liệu chính thức sau (truy cập 2026-07-15):
- Juniper — Example: Configure an EVPN-VXLAN Centrally Routed Bridging Fabric, Example: Configuring VNI Route Targets Manually, Example: Configuring VNI Route Targets Automatically with Manual Override.
- Cisco — Nexus 9000 NX-OS VXLAN Configuration Guide — Configure VXLAN BGP EVPN, EVPN Ethernet Segment Identifier Multi-Homing.
- Arista — EOS Configuring EVPN, EOS VXLAN Configuration, EOS EVPN and VCS Commands.
- Huawei — CloudEngine EVPN VXLAN Fundamentals, Example for Configuring VXLAN in Centralized Gateway Mode, Example for Configuring VXLAN in Distributed Gateway Mode Using BGP EVPN, VXLAN Configuration Commands — Command Reference.
Lưu ý về độ chính xác: cú pháp show/display verify ở Mục 2 cho Cisco/Arista/Huawei đã đối chiếu với tài liệu chính thức ở trên; riêng cách lọc Type-5 (IP prefix route) trên Cisco NX-OS và Arista EOS không có flag lọc riêng biệt như Junos match-prefix "5:", nên cần lọc thủ công trong output chung, đã ghi chú trực tiếp trong bảng.
Kết thúc phần cơ bản (Phần 1-5). Phần 6 và 6 chuyển sang bối cảnh production thực tế: kiến trúc routing table nội bộ, cùng các pattern multi-site và multi-tenant thường gặp khi vận hành EVPN ở quy mô lớn. Vì các khái niệm ở mức đó được từng vendor hiện thực rất khác nhau, hai phần cuối trình bày theo Junos thay vì song song bốn vendor như phần này.
Tiếp theo: Phần 6: Kiến Trúc Routing Table Nội Bộ.