gobgp 是使用golang开发的bgp协议,支持grpc接口,和quagga/frr不同的是,此工具仅支持bgp协议,不支持ospf、rib等其他路由协议。
Gobgp的主要特点是:
- 支持BGP协议的IPv4和IPv6路由管理,可以应对各种网络拓扑结构和路由策略。
- 提供了丰富的路由管理功能,包括路由过滤、路由聚合、路由映射等,可以满足各种复杂的路由管理需求。
- 支持BGP多路径功能,可以同时维护多条相同的路由,提高网络的容错性和负载均衡能力。
- 支持BGP路由服务器功能,可以实现高效的路由分发和路由汇聚,提高网络的可扩展性和灵活性。
- 提供了丰富的命令行工具和grpc接口,方便用户进行路由管理和监控。
Gobgp的设计和实现都非常精简,代码量较少,易于维护和扩展。同时,Gobgp采用了模块化的设计,可以方便地添加新的功能模块,满足不同场景的需求。
通过两个运行gobgp的docker, 介绍一下gobgp的具有vrf的使用场景。拓扑如下图所示:
制作docker
通过https://github.com/osrg/gobgp/releases
,或者下载源码编译的方式,将gobgp、gobgpd
文件导入ubuntu容器,用来充当环境中的gobgp容器。
配置文件
gobgp配置可以通过配置文件或者grpc api
的方式完成配置。
配置文件支持toml、json、yaml、hcl
等多种配置文件格式, toml为默认的配置文件格式,项目给出的简单的配置文件实例如下:
[global.config]
as = 64512
router-id = "192.168.255.1"
[[neighbors]]
[neighbors.config]
neighbor-address = "10.0.255.1"
peer-as = 65001
[[neighbors]]
[neighbors.config]
neighbor-address = "10.0.255.2"
peer-as = 65002
gobgp
是该项目的grpc api
客户端,以cli
的方式完成配置, 命令手册见https://github.com/osrg/gobgp/blob/master/docs/sources/cli-command-syntax.md
。
启动gobgp
此实例,所有配置全部采用grpc
配置的方式,启动时不带任何配置文件。后续配置global、vrf、neighbor、rib
等配置,演示gobgp
简单使用场景
# docker run -it --privileged --name bgp1 gobgp:v0.2
# ./gobgpd
{"level":"info","msg":"gobgpd started","time":"2023-03-28T02:48:56Z"}
# docker run -it --privileged --name bgp2 gobgp:v0.2
# ./gobgpd
{"level":"info","msg":"gobgpd started","time":"2023-03-28T02:48:56Z"}
global配置
分给配置bgp1、bgp2
的global
参数。
docker bgp1
# ./gobgp global as 1000 router-id 172.17.0.2
docker bgp2
# ./gobgp global as 2000 router-id 172.17.0.3
VRF配置/查询
root@e839926089f7:~/bfswitch/bin# ./gobgp vrf add vrf1 id 100 rd 100:1 rt both 100:1 200:1
root@e839926089f7:~/bfswitch/bin# ./gobgp vrf
Name RD Import RT Export RT ID
vrf1 100:1 100:1, 200:1 100:1, 200:1 100
root@378d166ca87a:~/bfswitch/bin# ./gobgp vrf add vrf1 id 100 rd 200:1 rt both 100:1 200:1
root@378d166ca87a:~/bfswitch/bin# ./gobgp vrf
Name RD Import RT Export RT ID
vrf1 200:1 100:1, 200:1 100:1, 200:1 100
邻居配置/查询
分别给bgp1、bgp2添加带有vrf属性的neighbor
root@e839926089f7:~/bfswitch/bin# ./gobgp neighbor add 172.17.0.3 as 2000 vrf vrf1
root@378d166ca87a:~/bfswitch/bin# ./gobgp neighbor add 172.17.0.2 as 1000 vrf vrf1
root@e839926089f7:~/bfswitch/bin# ./gobgp neighbor
Peer AS Up/Down State |#Received Accepted
172.17.0.3 2000 00:00:03 Establ | 0 0
root@378d166ca87a:~/bfswitch/bin# ./gobgp neighbor
Peer AS Up/Down State |#Received Accepted
172.17.0.2 1000 00:00:11 Establ | 0
路由表添加/查询
rib 添加
root@e839926089f7:~/bfswitch/bin# ./gobgp vrf vrf1 rib -a ipv4 add 10.1.1.1/32 origin egp aspath "100, 200"
root@378d166ca87a:~/bfswitch/bin# ./gobgp vrf vrf1 rib -a ipv4 add 10.1.1.2/32 origin egp aspath "100, 200"
rib查询
root@e839926089f7:~/bfswitch/bin# ./gobgp vrf vrf1 rib
Network Next Hop AS_PATH Age Attrs
* 10.1.1.1/32 0.0.0.0 100 200 00:01:30 [{Origin: e}]
* 10.1.1.2/32 172.17.0.3 2000 100 200 00:00:19 [{Origin: e}]
root@378d166ca87a:~/bfswitch/bin# ./gobgp vrf vrf1 rib
Network Next Hop AS_PATH Age Attrs
* 10.1.1.1/32 172.17.0.2 1000 100 200 00:02:27 [{Origin: e}]
* 10.1.1.2/32 0.0.0.0 100 200 00:01:16 [{Origin: e}]
adj表查询
root@e839926089f7:~/bfswitch/bin# ./gobgp neighbor 172.17.0.3 adj-in
ID Network Next Hop AS_PATH Age Attrs
0 10.1.1.2/32 172.17.0.3 2000 100 200 00:02:10 [{Origin: e}]
root@e839926089f7:~/bfswitch/bin# ./gobgp neighbor 172.17.0.3 adj-out
ID Network Next Hop AS_PATH Attrs
1 10.1.1.1/32 172.17.0.2 1000 100 200 [{Origin: e}]
root@378d166ca87a:~/bfswitch/bin# ./gobgp neighbor 172.17.0.2 adj-in
ID Network Next Hop AS_PATH Age Attrs
0 10.1.1.1/32 172.17.0.2 1000 100 200 00:03:40 [{Origin: e}]
root@378d166ca87a:~/bfswitch/bin# ./gobgp neighbor 172.17.0.2 adj-out
ID Network Next Hop AS_PATH Attrs
1 10.1.1.2/32 172.17.0.3 2000 100 200 [{Origin: e}]