想玩 BGP 路由器么?用 CentOS 做一个
创始人
2024-03-01 14:35:15
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属性调整、本地优先级和预先路径准备等,我将会在后续的教程中覆盖这些主题。

希望这篇教程能给大家一些帮助。


via: http://xmodulo.com/centos-bgp-router-quagga.html

作者:Sarmed Rahman 译者:disylee 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

相关内容

【问题】如何替换OpenW...
如何替换OpenWrt路由器登录logo 思路:首先...
2025-05-28 03:14:22
不影响路由器的情况下分组页...
要实现“不影响路由器的情况下分组页面”,可以使用 Nuxt.js ...
2025-01-11 07:01:35
不要在路由器上使用load...
在使用napalm库时,确实不建议直接在路由器上使用load_me...
2025-01-11 02:31:41
不要更改路由器地址中的数值...
在以下示例代码中,我们使用了Python中的Requests库发送...
2025-01-10 19:00:59
不同路由器上的Java服务...
要在不同路由器上建立Java服务器套接字连接,首先需要确保两个路由...
2025-01-09 11:01:34
不同浏览器中的WebGPU...
WebGPU是一种新的Web图形标准,它允许在Web浏览器中使用更...
2025-01-09 10:31:32

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...