百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

linux主机frrouting和华三CE6850建立BGP EVPN邻居并实现三层互通

csdh11 2025-03-20 13:50 13 浏览

前置知识

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

CE6850 G1/0/1接口抓包

相关推荐

探索Java项目中日志系统最佳实践:从入门到精通

探索Java项目中日志系统最佳实践:从入门到精通在现代软件开发中,日志系统如同一位默默无闻却至关重要的管家,它记录了程序运行中的各种事件,为我们排查问题、监控性能和优化系统提供了宝贵的依据。在Java...

用了这么多年的java日志框架,你真的弄懂了吗?

在项目开发过程中,有一个必不可少的环节就是记录日志,相信只要是个程序员都用过,可是咱们自问下,用了这么多年的日志框架,你确定自己真弄懂了日志框架的来龙去脉嘛?下面笔者就详细聊聊java中常用日志框架的...

物理老师教你学Java语言(中篇)(物理专业学编程)

第四章物质的基本结构——类与对象...

一文搞定!Spring Boot3 定时任务操作全攻略

各位互联网大厂的后端开发小伙伴们,在使用SpringBoot3开发项目时,你是否遇到过定时任务实现的难题呢?比如任务调度时间不准确,代码报错却找不到方向,是不是特别头疼?如今,随着互联网业务规模...

你还不懂java的日志系统吗 ?(java的日志类)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

谈谈枚举的新用法--java(java枚举的作用与好处)

问题的由来前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了!事情是这样的,做过游戏的都知道,buff,需要分类型,且...

你还不懂java的日志系统吗(javaw 日志)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

Java 8之后的那些新特性(三):Java System Logger

去年12月份log4j日志框架的一个漏洞,给Java整个行业造成了非常大的影响。这个事情也顺带把log4j这个日志框架推到了争议的最前线。在Java领域,log4j可能相对比较流行。而在log4j之外...

Java开发中的日志管理:让程序“开口说话”

Java开发中的日志管理:让程序“开口说话”日志是程序员的朋友,也是程序的“嘴巴”。它能让程序在运行过程中“开口说话”,告诉我们它的状态、行为以及遇到的问题。在Java开发中,良好的日志管理不仅能帮助...

吊打面试官(十二)--Java语言中ArrayList类一文全掌握

导读...

OS X 效率启动器 Alfred 详解与使用技巧

问:为什么要在Mac上使用效率启动器类应用?答:在非特殊专业用户的环境下,(每天)用户一般可以在系统中进行上百次操作,可以是点击,也可以是拖拽,但这些只是过程,而我们的真正目的是想获得结果,也就是...

Java中 高级的异常处理(java中异常处理的两种方式)

介绍异常处理是软件开发的一个关键方面,尤其是在Java中,这种语言以其稳健性和平台独立性而闻名。正确的异常处理不仅可以防止应用程序崩溃,还有助于调试并向用户提供有意义的反馈。...

【性能调优】全方位教你定位慢SQL,方法介绍下!

1.使用数据库自带工具...

全面了解mysql锁机制(InnoDB)与问题排查

MySQL/InnoDB的加锁,一直是一个常见的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?下面是不同锁等级的区别表级锁:开销小,加锁快;不会出现死锁;锁定粒度...

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

一、什么是死锁加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获...