如何使用 Quagga 将 CentOS 机器变成 BGP 路由器如何使用 Quagga 将 CentOS 机器变成 BGP 路由器如何使用 Quagga 将 CentOS 机器变成 BGP 路由器如何使用 Quagga 将 CentOS 机器变成 BGP 路由器
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何使用 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 属性调整(例如本地首选项和路径前置)。我将在以后的教程中介绍这些主题。

希望这可以帮助。

©2015-2025 艾丽卡 support@alaica.com