如何使用 Quagga 将 CentOS 机器变成 BGP 路由器
在上一篇教程中,我描述了如何使用开源路由软件套件 Quagga 将 Linux 盒子轻松转变为成熟的 OPSF 路由器。在本教程中,我将重点关注再次使用 Quagga 将 Linux 机器转换为 BGP 路由器,并演示如何与其他 BGP 路由器设置 BGP 对等互连。
在我们深入了解细节之前,了解一下 BGP 的背景可能会有用。边界网关协议(BGP)是事实上的标准互联网域间路由协议。在 BGP 术语中,全球互联网是数以万计的互连自治系统 (AS) 的集合,其中每个 AS 代表由特定提供商管理的网络的管理域。
为了使其网络可全局路由,每个 AS 需要知道如何到达 Internet 中的所有其他 AS。这就是 BGP 发挥作用的时候。 BGP 是 AS 与其他相邻 AS 交换路由信息的语言。路由信息通常称为 BGP 路由或 BGP 前缀,包含 AS 编号(ASN;全球唯一编号)及其关联的 IP 地址块。一旦所有 BGP 路由都被学习并填充到本地 BGP 路由表中,每个 AS 将知道如何到达 Internet 上的任何公共 IP 地址。
跨不同域 (AS) 进行路由的能力是 BGP 被称为外部网关协议 (EGP) 或域间路由协议的主要原因。而 OSPF、IS-IS、RIP 和 EIGRP 等路由协议都是内部网关协议 (IGP) 或域内路由协议,负责在一个域内进行路由。
测试场景
对于本教程,我们考虑以下拓扑。

我们假设服务提供商A
想要与服务提供商B
建立BGP对等来交换路由。它们的AS和IP地址空间的详细信息如下。
服务提供商
A
:ASN (100
)、IP 地址空间 (100.100.0.0/22
)、分配给 BGP 路由器的eth1
的 IP 地址 (100.100.1.1
)服务提供商
B
:ASN (200
)、IP 地址空间 (200.200.0.0/22
)、分配给 BGP 路由器的eth1
的 IP 地址 (200.200.1.1
)
路由器 A
和 B
将使用 100.100.0.0/30
子网相互连接。理论上,两个服务提供商均可到达的任何子网都可以用于互连。在现实生活中,建议使用来自服务提供商 A
或服务提供商 B
公共 IP 地址空间的 /30
子网。
在 CentOS 上安装 Quagga
如果 Quagga 尚未安装,我们使用 yum 安装 Quagga。
# yum install quagga
如果您使用的是 CentOS 7,则需要对 SELinux 应用以下策略更改。否则,SELinux 将阻止 Zebra 守护程序写入其配置目录。如果您使用的是 CentOS 6,则可以跳过此步骤。
# setsebool -P zebra_write_config 1
Quagga 软件套件包含多个协同工作的守护进程。对于 BGP 路由,我们将重点设置以下两个守护进程。
Zebra:负责内核接口和静态路由的核心守护进程
BGPd: BGP 守护进程
配置日志记录
安装 Quagga 后,下一步是配置 Zebra 来管理 BGP 路由器的网络接口。我们首先创建 Zebra 配置文件并启用日志记录。
# cp /usr/share/doc/quagga-XXXXX/zebra.conf.sample /etc/quagga/zebra.conf
在 CentOS 6 上:
# service zebra start
# chkconfig zebra on
对于 CentOS 7:
# systemctl start zebra
# systemctl enable zebra
Quagga 提供了一个名为 vtysh 的专用命令行 shell,您可以在其中键入与 Cisco 和 Juniper 等路由器供应商支持的命令兼容的命令。在本教程的其余部分中,我们将使用 vtysh
shell 来配置 BGP 路由器。
在路由器 A
上,通过键入以下内容启动 vtysh
命令 shell:
# vtysh
提示符将更改为主机名,这表明您位于 vtysh shell 中。
Router-A#
现在我们使用以下命令指定 Zebra 的日志文件:
Router-A# configure terminal
Router-A(config)# log file /var/log/quagga/quagga.log
Router-A(config)# exit
永久保存 Zebra 配置:
Router-A# write
在路由器 B
上也重复此过程。
配置对等 IP 地址
接下来,我们在可用接口上配置对等 IP 地址。
Router-A# show interface
Interface eth0 is up, line protocol detection is disabled
. . . . .
Interface eth1 is up, line protocol detection is disabled
. . . . .
配置接口eth0
的参数:
site-A-RTR# configure terminal
site-A-RTR(config)# interface eth0
site-A-RTR(config-if)# ip address 100.100.0.1/30
site-A-RTR(config-if)# description "to Router-B"
site-A-RTR(config-if)# no shutdown
site-A-RTR(config-if)# exit
继续配置接口 eth1
的参数:
site-A-RTR(config)# interface eth1
site-A-RTR(config-if)# ip address 100.100.1.1/24
site-A-RTR(config-if)# description "test ip from provider A network"
site-A-RTR(config-if)# no shutdown
site-A-RTR(config-if)# exit
现在验证配置:
Router-A# show interface
Interface eth0 is up, line protocol detection is disabled
Description: "to Router-B"
inet 100.100.0.1/30 broadcast 100.100.0.3
Interface eth1 is up, line protocol detection is disabled
Description: "test ip from provider A network"
inet 100.100.1.1/24 broadcast 100.100.1.255
Router-A# show interface description
Interface Status Protocol Description
eth0 up unknown "to Router-B"
eth1 up unknown "test ip from provider A network"
如果一切正常,请不要忘记保存。
Router-A# write
同样在路由器 B
上重复配置接口。
在继续之前,请验证您是否可以 ping 通对方的 IP 地址。
Router-A# ping 100.100.0.2
PING 100.100.0.2 (100.100.0.2) 56(84) bytes of data.
64 bytes from 100.100.0.2: icmp_seq=1 ttl=64 time=0.616 ms
接下来,我们将继续配置 BGP 对等互连和前缀通告设置。
配置 BGP 对等互连
负责 BGP 的 Quagga 守护进程称为 bgpd。首先,我们将准备其配置文件。
# cp /usr/share/doc/quagga-XXXXXXX/bgpd.conf.sample /etc/quagga/bgpd.conf
对于 CentOS 6:
# service bgpd start
# chkconfig bgpd on
对于 CentOS 7:
# systemctl start bgpd
# systemctl enable bgpd
现在,让我们进入 Quagga shell。
# vtysh
首先验证是否没有配置的 BGP 会话。在某些版本中,您可能会发现与 AS 7675
的 BGP 会话。我们将删除它,因为我们不需要它。
Router-A# show running-config
... ... ...
router bgp 7675
bgp router-id 200.200.1.1
... ... ...
我们将删除任何预先配置的 BPG 会话,并将其替换为我们自己的。
Router-A# configure terminal
Router-A(config)# no router bgp 7675
Router-A(config)# router bgp 100
Router-A(config)# no auto-summary
Router-A(config)# no synchronizaiton
Router-A(config-router)# neighbor 100.100.0.2 remote-as 200
Router-A(config-router)# neighbor 100.100.0.2 description "provider B"
Router-A(config-router)# exit
Router-A(config)# exit
Router-A# write
路由器 B
应该以类似的方式配置。以下配置仅供参考。
Router-B# configure terminal
Router-B(config)# no router bgp 7675
Router-B(config)# router bgp 200
Router-B(config)# no auto-summary
Router-B(config)# no synchronizaiton
Router-B(config-router)# neighbor 100.100.0.1 remote-as 100
Router-B(config-router)# neighbor 100.100.0.1 description "provider A"
Router-B(config-router)# exit
Router-B(config)# exit
Router-B# write
配置两台路由器后,应在两者之间建立 BGP 对等互连。让我们通过运行来验证这一点:
Router-A# show ip bgp summary

在输出中,我们应该查看 State/PfxRcd 部分。如果对等互连关闭,输出将显示 Idle
或 Active
。请记住,路由器内的“Active”一词总是不好的。这意味着路由器正在主动寻找邻居、前缀或路由。当对等互连启动时,State/PfxRcd
下的输出应显示从该特定邻居接收到的前缀数量。
在此示例输出中,BGP 对等互连恰好在 AS 100
和 AS 200
之间建立。因此,没有交换任何前缀,最右列中的数字是0
。
配置前缀通告
正如开头所指定的,在我们的示例中,AS 100
将通告前缀 100.100.0.0/22
,AS 200
将通告前缀 200.200.0.0/22
。这些前缀需要添加到 BGP 配置中,如下所示。
在路由器 A
上:
Router-A# configure terminal
Router-A(config)# router bgp 100
Router-A(config)# network 100.100.0.0/22
Router-A(config)# exit
Router-A# write
在路由器 B
上:
Router-B# configure terminal
Router-B(config)# router bgp 200
Router-B(config)# network 200.200.0.0/22
Router-B(config)# exit
Router-B# write
此时,两个路由器都应根据需要开始广播前缀。
测试前缀广告
首先,我们来验证一下现在前缀的数量是否发生了变化。
Router-A# show ip bgp summary

要查看有关接收到的前缀的更多详细信息,我们可以使用以下命令,该命令显示从邻居 100.100.0.2
接收到的前缀总数。
Router-A# show ip bgp neighbors 100.100.0.2 advertised-routes

要检查我们从该邻居接收到哪些前缀:
Router-A# show ip bgp neighbors 100.100.0.2 routes

我们还可以检查所有 BGP 路由:
Router-A# show ip bgp

下面的这些命令可用于检查路由表中的哪些路由是通过 BGP 获知的。
Router-A# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
I - ISIS, B - BGP, > - selected route, * - FIB route
C>* 100.100.0.0/30 is directly connected, eth0
C>* 100.100.1.0/24 is directly connected, eth1
B>* 200.200.0.0/22 [20/0] via 100.100.0.2, eth0, 00:06:45
Router-A# show ip route bgp
B>* 200.200.0.0/22 [20/0] via 100.100.0.2, eth0, 00:08:13
BGP 学习到的路由也应该出现在 Linux 路由表中。
ip route
100.100.0.0/30 dev eth0 proto kernel scope link src 100.100.0.1
100.100.1.0/24 dev eth1 proto kernel scope link src 100.100.1.1
200.200.0.0/22 via 100.100.0.2 dev eth0 proto zebra
最后,我们将使用 ping
命令进行测试。 ping
应该会成功。
ping 200.200.1.1 -c 2
总而言之,本教程重点介绍如何在 CentOS 机器上运行基本 BGP。虽然这应该可以帮助您开始使用 BGP,但还有其他高级设置,例如前缀过滤器、BGP 会话身份验证、IPv6 对等互连、BGP 属性调整(例如本地首选项和路径前置)。我将在以后的教程中介绍这些主题。
希望这可以帮助。