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.1.0/24), 分配给BGP路由器ens33网卡的IP地址(10.45.11.118)
  • 运营商 B: ASN (200), IP地址空间 (200.200.1.0/24), 分配给BGP路由器ens33网卡的IP地址(10.45.11.119)

路由器A和路由器B使用10.45.10.0/23子网来连接到对方。从理论上来说,任何子网从运营商那里都是可达的、可互连的。在真实场景中,建议使用掩码为30位的公网IP地址空间来实现运营商A和运营商B之间的连通。

1、在centos7中安装Quagga

yum install quagga

请确保配置了本地yum源,在centos的安装镜像文件中,自带了该软件包。

2、放开selinux限制

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

setsebool -P zebra_write_config 1

或者可以直接关闭selinux:

[root@gfs02 ~]# vi /etc/selinux/config

修改配置项为如下值:

SELINUX=disabled

重启下主机。

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

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

3、zebra配置启动

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

启动进程

systemctl start zebra

systemctl enable zebra

4、配置quagga日志

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

启动vtysh shell 命令,输入:

[root@gfs01 network-scripts]# vtysh
提示将被改成该主机名,这表明你是在vtysh shell中。

gfs01#

现在我们将使用以下命令来为Zebra配置日志文件:

gfs01# configure terminal
gfs01(config)# log file /var/log/quagga/quagga.log
gfs01(config)# exit

永久保存Zebra配置:

gfs01# write

在路由器B操作同样的步骤。

5、配置对等的ip地址

下一步,我们将在可用的接口上配置对等的IP地址。

#显示接口信息

gfs01# show interface
Interface ens33 is up, line protocol detection is disabled
  index 2 metric 1 mtu 1500 
  flags: <UP,BROADCAST,RUNNING,MULTICAST>
  HWaddr: 00:0c:29:f5:fe:fd
  inet 10.45.11.118/23 broadcast 10.45.11.255
  inet6 fe80::34a7:56c3:71b7:3a0/64
Interface lo is up, line protocol detection is disabled
  index 1 metric 1 mtu 65536 
  flags: <UP,LOOPBACK,RUNNING>
  inet 100.100.1.1/24 broadcast 100.100.1.255 lo:1
  inet 127.0.0.1/8
  inet6 ::1/128

配置ens33接口参数:

gfs01# configure terminal
gfs01(config)# interface ens33
gfs01(config-if)# ip address 10.45.11.118/23
gfs01(config-if)# description "to gfs02"
gfs01(config-if)# no shutdown
gfs01(config-if)# exit

配置lo:1接口参数:

gfs01# conf t 
gfs01(config)# interface lo:1
gfs01(config-if)# ip address 100.100.1.1/24
gfs01(config-if)# description "test ip from provider A network"
gfs01(config-if)# no shutdown
gfs01(config-if)# exit

确认配置:

gfs01# show interface
Interface ens33 is up, line protocol detection is disabled
  index 2 metric 1 mtu 1500 
  flags: <UP,BROADCAST,RUNNING,MULTICAST>
  HWaddr: 00:0c:29:f5:fe:fd
  inet 10.45.11.118/23 broadcast 10.45.11.255
  inet6 fe80::34a7:56c3:71b7:3a0/64
Interface lo is up, line protocol detection is disabled
  index 1 metric 1 mtu 65536 
  flags: <UP,LOOPBACK,RUNNING>
  inet 100.100.1.1/24 broadcast 100.100.1.255 lo:1
  inet 127.0.0.1/8
  inet6 ::1/128

如果一切看起来正常,别忘记保存配置。

gfs01# write

同样地,在路由器B重复一次配置。

注意:配置网卡接口ip这个地方我这边是在主机层面已经配置好了。

使用ens33接口作为两个centos虚机直连接口使用。使用lo:1接口作为两个 运营商后面的网络。

添加一个lo接口:

[root@gfs02 quagga-0.99.22.4]# cd /etc/sysconfig/network-scripts/

[root@gfs02 network-scripts]# cp ifcfg-lo ifcfg-lo:1

[root@gfs02 network-scripts]# vi ifcfg-lo:1
DEVICE=lo:1
IPADDR=200.200.1.1
NETMASK=255.255.255.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
ONBOOT=yes
NAME=loopback1

#重启网络

[root@gfs02 network-scripts]# systemctl restart network

#检查

[root@gfs02 network-scripts]# ifconfig -a
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.45.11.119  netmask 255.255.254.0  broadcast 10.45.11.255
        inet6 fe80::11aa:9ac6:ff72:adb0  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a1:11:5e  txqueuelen 1000  (Ethernet)
        RX packets 746441  bytes 404706532 (385.9 MiB)
        RX errors 0  dropped 34  overruns 0  frame 0
        TX packets 87385  bytes 7583699 (7.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 95719  bytes 7866600 (7.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 95719  bytes 7866600 (7.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo:1: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 200.200.1.1  netmask 255.255.255.0
        loop  txqueuelen 1000  (Local Loopback)

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

gfs01# ping 10.45.11.119
PING 10.45.11.119 (10.45.11.119) 56(84) bytes of data.
64 bytes from 10.45.11.119: icmp_seq=1 ttl=64 time=0.420 ms
64 bytes from 10.45.11.119: icmp_seq=2 ttl=64 time=0.274 ms

下一步,我们将继续配置BGP对等和前缀设置。

6、配置bgp对等

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

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

启动bgpd进程:

[root@gfs02 quagga-0.99.22.4]# systemctl start bgpd
[root@gfs02 quagga-0.99.22.4]# systemctl enable bgpd

确保没有报错。可以通过下面命令检查状态。

systemctl status bgpd

现在,让我们来进入Quagga 的shell。

[root@gfs02 quagga-0.99.22.4]# vtysh

第一步,我们要确认当前没有已经配置的BGP会话。在一些版本,我们可能会发现一个AS号为7675的BGP会话。由于我们不需要这个会话,所以把它移除。

gfs02# show running-config
Building configuration...

Current configuration:
!
hostname gfs02
log file /var/log/quagga/quagga.log
hostname bgpd
log stdout
!
password zebra
!
interface ens33
 ipv6 nd suppress-ra
!
interface lo
!
router bgp 7675
 bgp router-id 200.200.1.1
!
line vty
!
end

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

gfs02# conf t 
gfs02(config)# no router bgp 7675
gfs02(config)# router bgp 200
gfs02(config-router)# no auto-summary  
gfs02(config-router)# no synchronization  
gfs02(config-router)# neighbor  10.45.11.118 remote-as  100
gfs02(config-router)# neighbor  10.45.11.118 description  "provider A"
gfs02(config-router)# exit
gfs02(config)# exit
gfs02# write

路由器B将用同样的方式来进行配置,以下配置提供作为参考。

gfs01# configure terminal
gfs01(config)# no router bgp 7675
gfs01(config)# router bgp 100
gfs01(config-router)# no auto-summary
gfs01(config-router)# no synchronization
gfs01(config-router)# neighbor  10.45.11.119 remote-as 200
gfs01(config-router)# neighbor  10.45.11.119 description "provider B"
gfs01(config-router)# exit
gfs01(config)# exit
gfs01# write

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

gfs02# show ip bgp summary
BGP router identifier 200.200.1.1, local AS number 200
RIB entries 0, using 0 bytes of memory
Peers 1, using 4560 bytes of memory

Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.45.11.118    4   100       2       3        0    0    0 00:00:44        0

Total number of neighbors 1

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

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

7、配置前缀通告

正如一开始提到,AS 100将以100.100.1.0/24作为通告,在我们的例子中AS 200将同样以200.200.1.0/24作为通告。这些前缀需要被添加到BGP配置如下。

在路由器-A中:

gfs01# conf t 
gfs01(config)# router bgp 100
gfs01(config-router)# network 100.100.1.0/24 
gfs01(config-router)# exit
gfs01(config)# exit
gfs01# write

在路由器-B中:

gfs02# conf t 
gfs02(config)# router bgp 200
gfs02(config-router)# network 200.200.1.0/24
gfs02(config-router)# exit
gfs02(config)# exit
gfs02# write

在这一点上,两个路由器会根据需要开始通告前缀。

8、测试前缀通告

首先,让我们来确认前缀的数量是否被改变了。

gfs02# show ip bgp summary
BGP router identifier 200.200.1.1, local AS number 200
RIB entries 3, using 336 bytes of memory
Peers 1, using 4560 bytes of memory

Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.45.11.118    4   100      12      13        0    0    0 00:09:32        1

Total number of neighbors 1

为了查看所接收的更多前缀细节,我们可以使用以下命令,这个命令用于显示邻居

10.45.11.118所接收到的前缀总数。

gfs02# show ip bgp neighbors 10.45.11.118 advertised-routes  
BGP table version is 0, local router ID is 200.200.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete

Network          Next Hop            Metric LocPrf Weight Path
*> 200.200.1.0      10.45.11.119             0         32768 i

Total number of prefixes 1

查看哪一个前缀是我们从邻居接收到的:

gfs02# show ip bgp neighbors 10.45.11.118 routes
BGP table version is 0, local router ID is 200.200.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete

Network          Next Hop            Metric LocPrf Weight Path
*> 100.100.1.0/24   10.45.11.118             0             0 100 i

Total number of prefixes 1

我们也可以查看所有的BGP路由器:

gfs02# show ip bgp
BGP table version is 0, local router ID is 200.200.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete

Network          Next Hop            Metric LocPrf Weight Path
*> 100.100.1.0/24   10.45.11.118             0             0 100 i
*> 200.200.1.0      0.0.0.0                  0         32768 i

Total number of prefixes 2

以上的命令都可以被用于检查哪个路由器通过BGP在路由器表中被学习到。

gfs02# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, A - Babel,
       > - selected route, * - FIB route

K>* 0.0.0.0/0 via 10.45.11.254, ens33
C>* 10.45.10.0/23 is directly connected, ens33
B>* 100.100.1.0/24 [20/0] via 10.45.11.118, ens33, 00:04:50
C>* 127.0.0.0/8 is directly connected, lo
C>* 200.200.1.0/24 is directly connected, lo
gfs02# show ip route bgp
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, A - Babel,
       > - selected route, * - FIB route

B>* 100.100.1.0/24 [20/0] via 10.45.11.118, ens33, 00:06:08

gfs02# show ip route bgp
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, A - Babel,
       > - selected route, * - FIB route

B>* 100.100.1.0/24 [20/0] via 10.45.11.118, ens33, 03:38:21
gfs02#

BGP学习到的路由也将会在Linux路由表中出现。这个也是我们模拟在linux跑起来bgp后,无需添加静态路由的情况下,位于gfs01上的lo:1接口100.100.1.1/24和位于gfs02上的lo:1接口200.200.1.1/24直接能ping通的前提。

[root@gfs02 ~]# ip route
default via 10.45.11.254 dev ens33 proto static metric 100 
10.45.10.0/23 dev ens33 proto kernel scope link src 10.45.11.119 metric 100 
100.100.1.0/24 via 10.45.11.118 dev ens33 proto zebra 
[root@gfs02 ~]#

[root@gfs02 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.45.11.254    0.0.0.0         UG    100    0        0 ens33
10.45.10.0      0.0.0.0         255.255.254.0   U     100    0        0 ens33
100.100.1.0     10.45.11.118    255.255.255.0   UG    0      0        0 ens33

最后,我们将使用ping命令来测试连通。结果将成功ping通。
[root@gfs02 ~]# ping 100.100.1.1
PING 100.100.1.1 (100.100.1.1) 56(84) bytes of data.
64 bytes from 100.100.1.1: icmp_seq=1 ttl=64 time=0.394 ms
64 bytes from 100.100.1.1: icmp_seq=2 ttl=64 time=0.378 ms
64 bytes from 100.100.1.1: icmp_seq=3 ttl=64 time=0.538 ms
64 bytes from 100.100.1.1: icmp_seq=4 ttl=64 time=0.302 ms
^C
--- 100.100.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 0.302/0.403/0.538/0.085 ms

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

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

使用CentOS7.4搭建bgp网络实验Quagga相关推荐

  1. 网络协议知识串讲-第40讲-搭建一个网络实验环境:授人以鱼不如授人以渔

    因为这门课是基础课程,而且配合音频的形式发布,所以我多以理论为主来进行讲解.在专栏更新的过程中,不断有同学让我推荐一些网络方面的书籍,还有同学说能不能配合一些实验来说明理论. 的确,网络是一门实验性很 ...

  2. 网络实验之EtherChannel技术实践

    一.EtherChannel简介   EtherChannel简单来说就是将多个物理端口绑定为一个逻辑端口,通过多个端口绑定,能充分利用现有端口来增加带宽.构成etherchannel的端口必须配置成 ...

  3. 利用虚拟机配置SDN网络实验平台(virtual box+Ubuntu+jdk配置+mininet+floodlight/openDaylight)

    一.安装Virtual Box步骤 至于VMware,当然也可以,二者都是虚拟机软件.但是VMware的安装文件很大,安装相对麻烦,而virtual box安装过程中,是中文的,安装较快且方便,比较适 ...

  4. 网络实验之VTP协议

    一.VTP协议简介   VLAN中继协议,VTP,VLAN TRUNKING PROTOCOL,是CISCO专用协议,大多数交换机都支持该协议.VTP负责在VTP域内同步VLAN信息,这样就不必在每个 ...

  5. 网络实验之VRRP协议

    一.VRRP协议简介   虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议.V ...

  6. FRR搭建简单BGP网络环境

    实验参考文章https://segmentfault.com/a/1190000019892263,并进一步解释完善. 一.BGP查询CLI命令 对frr的配置文件/etc/frr/daemon进一步 ...

  7. Dynamips与VMware配合搭建网络实验环境

    之前我们已经利用Dynamips成功模拟了Cisco 3640路由器,并使用其VPC功能简单模拟了几台接入该路由器16×××换机模块的终端.但VPC模拟的终端与实际机器还是有很大差别,因此打算结合VM ...

  8. centos7.3网络实验环境(金个人)

    centos7.3网络实验环境 网络拓扑: 服务器IP:192.168.10.7 客户端IP:192.168.10.8 centos7桌面快捷键: alt+F1  应用程序菜单(即开始菜单) alt+ ...

  9. 网络实验环境搭建--1.工具及搭建思路

    如果有很好的真机实验环境,那也不需要使用模拟器,但对于绝大多数人来说,真机实验环境太奢侈了,可望而不可求.用自己的电脑搭建实验平台就很有必要. 工欲善其事,必先利其器! 工具软件: VMware 虚拟 ...

最新文章

  1. 【CNN基础】常见的loss函数及其实现(一)——TV Loss
  2. 物理机Windows系统下使用SSH连接虚拟机Ubuntu
  3. 一个判断字符串是否是数字的正则表达式
  4. 万能点位图软件_【像素图】复古提花毛衣+秋风落叶十字绣图,非常适合这个季节...
  5. 热传递 matlab,利用matlab程序解决热传导问题
  6. 实现业务数据的同步迁移 · 思路一
  7. .NET 二维码生成(ThoughtWorks.QRCode)
  8. Spring4.x(16)--SpringEL-正则表达式
  9. 在MFC对话框中显示html网页
  10. python模块导入的问题
  11. 计算机控制机器人运动的原理,工业机器人控制系统的基本原理
  12. 2472 莫斯方块——题解与C++示例代码
  13. 自己动手写开源爬虫框架 Slit
  14. 音视频基本概念:分辨率、帧速率、码流、采样位深、采样率、比特率
  15. Java关于跨年周数计算的问题解释,以及解决办法(附代码+图)
  16. 第二人生的源码分析(三十八)构造一个消息包并发送
  17. 三菱FX系列PLC备份电池电压低报警的处理方法
  18. 甲骨文Andrew Mendelsohn:打造高扩展性和可用性的数据库云技术
  19. 基于OHCI的USB主机 —— UFI命令监视代码
  20. 一个产品助理的世界观

热门文章

  1. 学习总结-《父与子的编程之旅》chapter 1
  2. 前端阿里矢量图的使用步骤
  3. AMBA 系列之 AXI 总线协议
  4. 图像处理--gamma矫正/Python
  5. Goland Debug出现Test framework quit unexpectedly
  6. 如何在YesDev,多团队协作程序员客栈的整包项目?
  7. 设计FMEA步骤六:优化
  8. 6.S081-7中断(键盘输入+屏幕输出) - Interrupts
  9. 用find在html中找字符串,Windows CMD中 find命令(字符串查找)
  10. 【FFmpeg】没有平均fps,计算音视频 pkt duration