想玩 BGP 路由器么?用 CentOS 做一个

发布于 2025-01-28 21:50:28 字数 8678 浏览 5 评论 0

之前的教程中 ,我对如何简单地使用 Quagga 把 CentOS 系统变成一个不折不扣地 OSPF 路由器做了一些介绍。Quagga 是一个开源路由软件套件。在这个教程中,我将会重点讲讲 如何把一个 Linux 系统变成一个 BGP 路由器,还是使用 Quagga ,演示如何建立 BGP 与其它 BGP 路由器对等。

在我们进入细节之前,一些 BGP 的背景知识还是必要的。边界网关协议(即 BGP)是互联网的域间路由协议的实际标准。在 BGP 术语中,全球互联网是由成千上万相关联的自治系统(AS) 组成,其中每一个 AS 代表每一个特定运营商提供的一个网络管理域( 据说 ,美国前总统乔治.布什都有自己的 AS 编号)。

为了使其网络在全球范围内路由可达,每一个 AS 需要知道如何在英特网中到达其它的 AS。这时候就需要 BGP 出来扮演这个角色了。BGP 是一个 AS 去与相邻的 AS 交换路由信息的语言。这些路由信息通常被称为 BGP 线路或者 BGP 前缀。包括 AS 号(ASN;全球唯一号码) 以及相关的 IP 地址块。一旦所有的 BGP 线路被当地的 BGP 路由表学习和记录,每一个 AS 将会知道如何到达互联网的任何公网 IP。

在不同域(AS) 之间路由的能力是 BGP 被称为外部网关协议(EGP) 或者域间协议的主要原因。就如一些路由协议,例如 OSPF、IS-IS、RIP 和 EIGRP 都是内部网关协议(IGPs) 或者域内路由协议,用于处理一个域内的路由.

测试方案

在这个教程中,让我们来使用以下拓扑。

我们假设运营商 A 想要建立一个 BGP 来与运营商 B 对等交换路由。它们的 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 子网来连接到对方。从理论上来说,任何子网从运营商那里都是可达的、可互连的。在真实场景中,建议使用掩码为 30 位的公网 IP 地址空间来实现运营商 A 和运营商 B 之间的连通。

在 CentOS 中安装 Quagga

如果 Quagga 还没安装好,我们可以使用 yum 来安装 Quagga。

# yum install quagga 

如果你正在使用的是 CentOS7 系统,你需要应用一下策略来设置 SELinux。否则,SElinux 将会阻止 Zebra 守护进程写入它的配置目录。如果你正在使用的是 CentOS6,你可以跳过这一步。

# setsebool -P zebra_write_config 1 

Quagga 软件套件包含几个守护进程,这些进程可以协同工作。关于 BGP 路由,我们将把重点放在建立以下 2 个守护进程。

  • Zebra :一个核心守护进程用于内核接口和静态路由.
  • BGPd :一个 BGP 守护进程.

配置日志记录

在 Quagga 被安装后,下一步就是配置 Zebra 来管理 BGP 路由器的网络接口。我们通过创建一个 Zebra 配置文件和启用日志记录来开始第一步。

# cp /usr/share/doc/quagga-XXXXX/zebra.conf.sample /etc/quagga/zebra.conf 

在 CentOS6 系统中:

# service zebra start
# chkconfig zebra on

在 CentOS7 系统中:

# systemctl start zebra
# systemctl enable zebra 

Quagga 提供了一个叫做 vtysh 特有的命令行工具,你可以输入与路由器厂商(例如 Cisco 和 Juniper) 兼容和支持的命令。我们将使用 vtysh shell 来配置 BGP 路由在教程的其余部分。

启动 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 重复一次配置。

在我们继续下一步之前,确认下彼此的 IP 是可以 ping 通的。

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 对等

Quagga 守护进程负责 BGP 的服务叫 bgpd。首先我们来准备它的配置文件。

# cp /usr/share/doc/quagga-XXXXXXX/bgpd.conf.sample /etc/quagga/bgpd.conf 

在 CentOS6 系统中:

# service bgpd start
# chkconfig bgpd on

在 CentOS7 中:

# 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
... ... ... 

我们将移除一些预先配置好的 BGP 会话,并建立我们所需的会话取而代之。

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 

当相关的路由器都被配置好,两台路由器之间的对等将被建立。现在让我们通过运行下面的命令来确认:

Router-A# show ip bgp summary 

从输出中,我们可以看到"State/PfxRcd"部分。如果对等关闭,输出将会显示"Idle"或者"Active'。请记住,单词'Active'这个词在路由器中总是不好的意思。它意味着路由器正在积极地寻找邻居、前缀或者路由。当对等是 up 状态,"State/PfxRcd"下的输出状态将会从特殊邻居接收到前缀号。

在这个例子的输出中,BGP 对等只是在 AS100 和 AS200 之间呈 up 状态。因此没有前缀被更改,所以最右边列的数值是 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 

代码: K - 内核路由, C - 已链接 , S - 静态 , R - 路由信息协议 , O - 开放式最短路径优先协议,

       I - 中间系统到中间系统的路由选择协议, B - 边界网关协议, > - 选择路由, * - FIB 路由

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 路由表中出现。

[root@Router-A~]# 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 通。

[root@Router-A~]# ping 200.200.1.1 -c 2

总而言之,本教程将重点放在如何在 CentOS 系统中运行一个基本的 BGP 路由器。这个教程让你开始学习 BGP 的配置,一些更高级的设置例如设置过滤器、BGP 属性调整、本地优先级和预先路径准备等,我将会在后续的教程中覆盖这些主题。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

把梦留给海

暂无简介

文章
评论
27 人气
更多

推荐作者

alipaysp_snBf0MSZIv

文章 0 评论 0

梦断已成空

文章 0 评论 0

瞎闹

文章 0 评论 0

寄意

文章 0 评论 0

似梦非梦

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文