前置知识
frrouting
FRR提供IP路由服务。它在网络堆栈中的作用是与其他路由器交换路由信息,做出路由和策略决策,并将这些决策通知其他层。在最常见的场景中,FRR将路由决策安装到操作系统内核中,允许内核网络堆栈做出相应的转发决策
除了动态路由之外,FRR还支持全方位的L3配置,包括静态路由、地址、路由器广告等。它也有一些轻量级的L2功能,但这主要是留给平台的。这使得它适用于从具有静态路由的小型家庭网络到运行完整Internet表的Internet交换机的部署
传统的路由软件是作为一个进程程序制作的,它提供了所有的路由协议功能。FRR采取了不同的方法。FRR是一组守护进程,它们一起工作来构建路由表。每个主要协议都在自己的守护进程中实现,这些守护进程与amiddleman守护进程(zebra)通信,后者负责协调例程决策和与数据平面通信。
frrouting架构
所有FRR守护进程都可以通过一个名为vtysh的集成用户界面外壳进行管理。vtysh通过一个UniXdomain套接字连接到每个守护进程,然后作为用户输入的代理。除了统一的前端,vtysh还提供了通过集成配置模式使用单个配置文件配置所有守护进程的能力。这避免了维护单独的配置文件的开销
FRR通过Netlink从内核了解系统的Linux网络接口配置,但是它不直接管理网络接口。以下部分将包括与FRR的EVPN实现兼容的Linux接口配置示例。虽然有多个接口管理器可以设置适当的内核配置(例如ifupdown2),但这些示例将使用iproute2添加/配置接口
EVPN
EVPN代表以太网虚拟专用网络。这是BGP的扩展,它支持通过普通网络发送桥接(L2)和路由(L3)VPN的信令。EVPN在RFC 7432中进行了描述,并通过几个额外的RFC和IETF草案进行了更新,包括RFC 9135(以太网VPN中的集成路由和桥接)、RFC 9136(EthernetVPN中的IP前缀广告)、RFC 8584(以太网VPN指定转发ElectionExtensibility框架)和RFC 8365(使用以太网VPN的网络虚拟化覆盖解决方案)。FRR通过LACP以太网段以及对称和非对称IRB支持全活动第2层多宿主设备(MHD)。FRR使用“基于VLAN的服务接口”(RFC 7432)实现MAC-VRF,并按照“无接口IP-VRF-to-IP-VRF模型”(RFC 9136)执行对称IRB路由的处理
EVPN概念
BGP-EVPN是以太网帧传输的控制面,无论这些帧是桥接还是路由。对于带有VXLAN封装的基于VLAN的服务接口,单个VNI用于表示EVPNInstance(EVI),并将具有自己的路由区分器和一组导入/导出路由目标
VNI被认为是第2层(绑定到MAC-VRF)或第3层(绑定到IP-VRF),这表明VRF表示什么样的信息。IP-VRF表示路由表(操作方式与VRF传统上在L3VPN中的操作方式大致相同),而MAC-VRF表示桥接表,即MAC(fdb)和ARP/NDP条目
MAC-VRF可以被认为是一个带有或不带有与之关联的SVI的VLAN。SVI是绑定到桥接域的第3层接口。LinuxSVI可以是传统网桥,也可以是VLAN感知网桥的VLAN子接口。如果VLAN有SVI,ARP/NDP条目可以绑定到广播域中的MAC。没有SVI,VLAN以传统的L2方式运行,MAC是VLAN中唯一已知的主机地址类型。
就像SVI与VRF可以有多对一的关系一样,MAC-VRF(L2VNI)与IP-VRF(L3VNI)也可以有多对一的关系。在FRR中,L2VNI的L3VNI关联由VLAN的SVI的存在和SVI的VRF成员关系决定。如果L2VNI没有SVI,或者它的SVI没有被VRF奴役,L2VNI将与“默认”VRF相关联。如果L2VNI有一个SVI,其主设备是VRF,那么L2VNI将与其主VRF相关联。
实验说明
- frr-test-01 主机安装Rocky8.7 系统内核版本为4.18,因为4.18的内核支持因为EVPN支持需要>=4.18版本
- H3C S6800 使用10.32.30.100 和frr-test-01建立BGP EVPN邻居
- frr-test-01 使用100.64.0.1 和H3C S6800 建立BGP EVPN邻居,路由保持互通
- PC 使用vlan 10 进行接入
- 验证frr-test-01和H3C S6800 建立BGP EVPN邻居,并能传递Type2 Type3 和Type5 路由,实现PC 和ns br10-client互通
安装frrouting
在frr-test-01 主机安装frrouting软件并开启bgp 功能
#关闭firewalld和selinux
systemctl stop firewalld
systemctl disable firewalld
vi /etc/selinux/config
SELINUX=disable
#全局开启IPv4和IPv6地址转发,如果不使用IPv6可以不开启v6的转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
sysctl -p
#安装
FRRVER="frr-stable"
curl -O https://rpm.frrouting.org/repo/$FRRVER-repo-1-0.el8.noarch.rpm
sudo yum install ./$FRRVER*
sudo yum install frr frr-pythontools
#修改frr配置启用bgp
vim /etc/frr/daemons
bgpd=yes
#启动
systcemctl start frr
systemct enable frr
主机配置BGP EVPN
#使用vthsh进入frr
#配置vrf
vrf vrf1
vni 100
exit-vrf
!
#配置BGP EVPN
router bgp 4200000000
neighbor 10.32.30.100 remote-as 4200000000
!
address-family l2vpn evpn
neighbor 10.32.30.100 activate
advertise-all-vni
advertise-svi-ip
exit-address-family
exit
!
router bgp 4200000000 vrf vrf1
!
address-family ipv4 unicast
redistribute static
exit-address-family
!
address-family l2vpn evpn
advertise ipv4 unicast
exit-address-family
exit
主机配置vrf、vxlan和vni
#创建vpn-instance vrf1
ip link add vrf1 type vrf table 1100
ip link set vrf1 up
#新建br100接口将接口划分vpn-instance vrf1中
##############################################################
#创建一个名为br100的传统网桥接口
#将其绑定到名称为vrf1的VRF,并禁用接口的IPv6地址自动配置
#自定义了br100的MAC地址
#这个传统网桥用于L3VNI广播域映射到VRF vrf1,即br100是vrf1的L3-SVI
##############################################################
ip link add br100 type bridge
ip link set br100 master vrf1 addrgenmode none
ip link set br100 addr aa:bb:cc:00:00:64
############################################
#创建一个名为vni100的传统接口,它使用100.64.0.1的VTEP-IP,携带三层VNI 100,并禁用了动态VTEP学习
#vni100 禁用IPv6地址自动配置
#将vni100接口加入到br100,启用ARP/ND抑制,并禁用动态MAC学习
############################################
ip link add vni100 type vxlan local 100.64.0.1 dstport 4789 id 100 nolearning
ip link set vni100 master br100 addrgenmode none
ip link set vni100 type bridge_slave neigh_suppress on learning off
ip link set vni100 up
ip link set br100 up
###############
## l2vni 110 ##
###############
##################################################
#创建了一个名为br10的传统网桥。
#将br10添加到vrf1中
#设置静态SVI接口(可以理解为vbdif接口)的MAC,这里也可以不设置,但是为了一致性还是设置了一下。
#由于br10将用于路由,因此IPv4和IPv6地址也添加到了SVI中
##################################################
ip link add br10 type bridge
ip link set br10 master vrf1
ip link set br10 addr aa:bb:cc:00:00:6e
ip addr add 10.0.10.1/24 dev br10
#将br10-client的veth接口加入到br10
ip netns add br10-client
ip link add veth type veth peer name eth0 netns br10-client
ip netns exec br10-client ip link set lo up
ip netns exec br10-client ip link set eth0 up
ip netns exec br10-client ip addr add 10.0.10.100/24 dev eth0
ip netns exec br10-client ip route add 0.0.0.0/0 via 10.0.10.1
ip link set veth up
ip link set veth master br10
CE6850交换机配置BGP EVPN
在linux主机中生成的RT值是59904:VNIID 的方式所以在交换机的vpn实例里面配置了59904:100做为出入方向的RT。
#配置vlan
vlan 10 to 4094
#开启l2vpn evpn支持
l2vpn enable
#配置bgp evpn邻居
bgp 4200000000
peer 10.32.30.88 as-number 4200000000
#
address-family l2vpn evpn
peer 10.32.30.88 enable
#
#配置vrf
ip vpn-instance vrf1
route-distinguisher 10:1
#
address-family evpn
vpn-target 59904:100 import-extcommunity
vpn-target 59904:100 export-extcommunity
#
#配置vsi interface
interface Vsi-interface10
ip binding vpn-instance vrf1
ip address 10.0.110.1 255.255.255.0
local-proxy-arp enable
#
#配置vsi
vsi br10
gateway vsi-interface 10
vxlan 110
evpn encapsulation vxlan
route-distinguisher auto
vpn-target 59904:110 export-extcommunity
vpn-target 59904:110 import-extcommunity
#
#配置三层VNI
interface Vsi-interface30
ip binding vpn-instance vrf1
l3-vni 100
查看BGP EVPN邻居
可以看到邻居已经建立成功,CE6850交换机已经和frr-test-01主机建立了bgp evpn邻居
VXLAN隧道
查看BGP EVPN路由
CE6850交换机
已经通过BGP EVPN学习到了10.0.10.100的路由
[H3C]dis bgp l2vpn evpn
BGP local router ID is 100.64.0.2
Status codes: * - valid, > - best, d - dampened, h - history
s - suppressed, S - stale, i - internal, e - external
a - additional-path
Origin: i - IGP, e - EGP, ? - incomplete
Total number of routes from all PEs: 5
Route distinguisher: 1:110
Total number of routes: 4
* > Network : [2][0][48][0001-0001-0001][32][10.0.110.1]/136
NextHop : 0.0.0.0 LocPrf : 100
PrefVal : 32768 OutLabel : NULL
MED : 0
Path/Ogn: i
* > Network : [2][0][48][8e6f-865a-0306][0][0.0.0.0]/104
NextHop : 0.0.0.0 LocPrf : 100
PrefVal : 32768 OutLabel : NULL
MED : 0
Path/Ogn: i
* > Network : [2][0][48][8e6f-865a-0306][32][10.0.110.100]/136
NextHop : 0.0.0.0 LocPrf : 100
PrefVal : 32768 OutLabel : NULL
MED : 0
Path/Ogn: i
* > Network : [3][0][32][100.64.0.2]/80
NextHop : 0.0.0.0 LocPrf : 100
PrefVal : 32768 OutLabel : NULL
MED : 0
Path/Ogn: i
Route distinguisher: 10:1(vrf1)
Total number of routes: 2
* >i Network : [2][0][48][2e15-af31-52f8][32][10.0.10.100]/136
NextHop : 100.64.0.1 LocPrf : 100
PrefVal : 0 OutLabel : NULL
MED :
Path/Ogn: i
* >i Network : [2][0][48][aabb-cc00-006e][32][10.0.10.1]/136
NextHop : 100.64.0.1 LocPrf : 100
PrefVal : 0 OutLabel : NULL
MED :
Path/Ogn: i
Route distinguisher: 100.64.0.1:4
Total number of routes: 5
* >i Network : [2][0][48][2e15-af31-52f8][0][0.0.0.0]/104
NextHop : 100.64.0.1 LocPrf : 100
PrefVal : 0 OutLabel : NULL
MED :
Path/Ogn: i
* >i Network : [2][0][48][2e15-af31-52f8][32][10.0.10.100]/136
NextHop : 100.64.0.1 LocPrf : 100
PrefVal : 0 OutLabel : NULL
MED :
Path/Ogn: i
* >i Network : [2][0][48][aabb-cc00-006e][32][10.0.10.1]/136
NextHop : 100.64.0.1 LocPrf : 100
PrefVal : 0 OutLabel : NULL
MED :
Path/Ogn: i
* >i Network : [3][0][32][100.64.0.1]/80
NextHop : 100.64.0.1 LocPrf : 100
PrefVal : 0 OutLabel : NULL
MED :
Path/Ogn: i
* >i Network : [2][0][48][aabb-cc00-006e][128][FE80::A8BB:CCFF:FE00:6E]/232
NextHop : 100.64.0.1 LocPrf : 100
PrefVal : 0 OutLabel : NULL
MED :
Path/Ogn: i
frr-test-01主机
主机也通过BGP EVPN学习到了i[2]:[0]:[48]:[8e:6f:86:5a:03:06]:[32]:[10.0.110.100] 路由
frr-test-01# show bgp l2vpn evpn
BGP table version is 137, local router ID is 100.64.0.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
EVPN type-1 prefix: [1]:[EthTag]:[ESI]:[IPlen]:[VTEP-IP]:[Frag-id]
EVPN type-2 prefix: [2]:[EthTag]:[MAClen]:[MAC]:[IPlen]:[IP]
EVPN type-3 prefix: [3]:[EthTag]:[IPlen]:[OrigIP]
EVPN type-4 prefix: [4]:[ESI]:[IPlen]:[OrigIP]
EVPN type-5 prefix: [5]:[EthTag]:[IPlen]:[IP]
Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 1:110
*>i[2]:[0]:[48]:[00:01:00:01:00:01]:[32]:[10.0.110.1]
10.32.30.100 0 100 0 i
RT:59904:100 RT:59904:110 ET:8 Default Gateway Rmac:8e:2a:a3:4a:01:00
*>i[2]:[0]:[48]:[8e:6f:86:5a:03:06]:[32]:[10.0.110.100]
10.32.30.100 0 100 0 i
RT:59904:100 RT:59904:110 ET:8 Rmac:8e:2a:a3:4a:01:00
*>i[3]:[0]:[32]:[100.64.0.2]
10.32.30.100 0 100 0 i
RT:59904:110 ET:8
Route Distinguisher: 100.64.0.1:4
*> [2]:[0]:[48]:[2e:15:af:31:52:f8]
100.64.0.1 32768 i
ET:8 RT:59904:110
*> [2]:[0]:[48]:[2e:15:af:31:52:f8]:[32]:[10.0.10.100]
100.64.0.1 32768 i
ET:8 RT:59904:110 RT:59904:100 Rmac:aa:bb:cc:00:00:64
*> [2]:[0]:[48]:[aa:bb:cc:00:00:6e]:[32]:[10.0.10.1]
100.64.0.1 32768 i
ET:8 RT:59904:110 RT:59904:100 Rmac:aa:bb:cc:00:00:64
*> [2]:[0]:[48]:[aa:bb:cc:00:00:6e]:[128]:[fe80::a8bb:ccff:fe00:6e]
100.64.0.1 32768 i
ET:8 RT:59904:110
*> [3]:[0]:[32]:[100.64.0.1]
100.64.0.1 32768 i
ET:8 RT:59904:110
查看路由表
CE6850交换机
可以看到10.0.10.100/32 主机路由已经放入到了vrf1的路由表中
[H3C]dis ip routing-table vpn-instance vrf1
Destinations : 14 Routes : 14
Destination/Mask Proto Pre Cost NextHop Interface
0.0.0.0/32 Direct 0 0 127.0.0.1 InLoop0
10.0.10.1/32 BGP 255 0 100.64.0.1 Vsi30
10.0.10.100/32 BGP 255 0 100.64.0.1 Vsi30
10.0.110.0/24 Direct 0 0 10.0.110.1 Vsi10
10.0.110.0/32 Direct 0 0 10.0.110.1 Vsi10
10.0.110.1/32 Direct 0 0 127.0.0.1 InLoop0
10.0.110.255/32 Direct 0 0 10.0.110.1 Vsi10
127.0.0.0/8 Direct 0 0 127.0.0.1 InLoop0
127.0.0.0/32 Direct 0 0 127.0.0.1 InLoop0
127.0.0.1/32 Direct 0 0 127.0.0.1 InLoop0
127.255.255.255/32 Direct 0 0 127.0.0.1 InLoop0
224.0.0.0/4 Direct 0 0 0.0.0.0 NULL0
224.0.0.0/24 Direct 0 0 0.0.0.0 NULL0
255.255.255.255/32 Direct 0 0 127.0.0.1 InLoop0
[H3C]
frr-test-01主机
在frr中查看路由表,可以看到vrf1中也学习到了10.0.110.100的路由
frr-test-01# show ip route vrf vrf1
Codes: K - kernel route, C - connected, L - local, S - static,
R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, A - Babel, F - PBR, f - OpenFabric,
t - Table-Direct,
> - selected route, * - FIB route, q - queued, r - rejected, b - backup
t - trapped, o - offload failure
VRF vrf1:
C>* 10.0.10.0/24 is directly connected, br10, 19:11:49
L>* 10.0.10.1/32 is directly connected, br10, 19:11:49
B>* 10.0.110.1/32 [200/0] via 10.32.30.100, br100 onlink, weight 1, 00:02:04
B>* 10.0.110.100/32 [200/0] via 10.32.30.100, br100 onlink, weight 1, 00:02:04
frr-test-01#
测试访问
从10.0.10.100 访问 10.0.110.100
测试结果可以正常访问
在frr-test-01 veth 接口抓包
源MAC:2e:15:af:31:52:f8
目的MAC为br10接口MAC地址:aa:bb:cc:00:00:6e
在frr-test-01 br10 接口抓包
在frr-test-01 br100 接口抓包
从这里开始源MAC为br10 接口MAC,目的MAC为CE6850 vbdi10的mac地址
在frr-test-01 vni100 接口抓包
在这个接口做VXLAN封装
内层源MAC为br10 接口MAC,目的MAC为CE6850 vbdi10的mac地址
外层源IP为100.64.0.1 目的IP为10.32.30.100
在frr-test-01 eth0 接口抓包
封装VXLAN使用三层vni100