之前的教程中,我对如何简单地使用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。

  1. # yum install quagga

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

  1. # setsebool -P zebra_write_config 1

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

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

配置日志记录

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

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

在CentOS6系统中:

  1. # service zebra start
  2. # chkconfig zebra on

在CentOS7系统中:

  1. # systemctl start zebra
  2. # systemctl enable zebra

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

启动vtysh shell 命令,输入:

  1. # vtysh

提示将被改成该主机名,这表明你是在vtysh shell中。

  1. Router-A#

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

  1. Router-A# configure terminal
  2. Router-A(config)# log file /var/log/quagga/quagga.log
  3. Router-A(config)# exit

永久保存Zebra配置:

  1. Router-A# write

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

配置对等的IP地址

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

  1. Router-A# show interface #显示接口信息

  1. Interface eth0 is up, line protocol detection is disabled
  2. . . . . .
  3. Interface eth1 is up, line protocol detection is disabled
  4. . . . . .

配置eth0接口的参数:

  1. site-A-RTR# configure terminal
  2. site-A-RTR(config)# interface eth0
  3. site-A-RTR(config-if)# ip address 100.100.0.1/30
  4. site-A-RTR(config-if)# description "to Router-B"
  5. site-A-RTR(config-if)# no shutdown
  6. site-A-RTR(config-if)# exit

继续配置eth1接口的参数:

  1. site-A-RTR(config)# interface eth1
  2. site-A-RTR(config-if)# ip address 100.100.1.1/24
  3. site-A-RTR(config-if)# description "test ip from provider A network"
  4. site-A-RTR(config-if)# no shutdown
  5. site-A-RTR(config-if)# exit

现在确认配置:

  1. Router-A# show interface

  1. Interface eth0 is up, line protocol detection is disabled
  2. Description: "to Router-B"
  3. inet 100.100.0.1/30 broadcast 100.100.0.3
  4. Interface eth1 is up, line protocol detection is disabled
  5. Description: "test ip from provider A network"
  6. inet 100.100.1.1/24 broadcast 100.100.1.255

  1. Router-A# show interface description #显示接口描述

  1. Interface Status Protocol Description
  2. eth0 up unknown "to Router-B"
  3. eth1 up unknown "test ip from provider A network"

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

  1. Router-A# write

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

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

  1. Router-A# ping 100.100.0.2

  1. PING 100.100.0.2 (100.100.0.2) 56(84) bytes of data.
  2. 64 bytes from 100.100.0.2: icmp_seq=1 ttl=64 time=0.616 ms

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

配置BGP对等

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

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

在CentOS6系统中:

  1. # service bgpd start
  2. # chkconfig bgpd on

在CentOS7中:

  1. # systemctl start bgpd
  2. # systemctl enable bgpd

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

  1. # vtysh

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

  1. Router-A# show running-config

  1. ... ... ...
  2. router bgp 7675
  3. bgp router-id 200.200.1.1
  4. ... ... ...

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

  1. Router-A# configure terminal
  2. Router-A(config)# no router bgp 7675
  3. Router-A(config)# router bgp 100
  4. Router-A(config)# no auto-summary
  5. Router-A(config)# no synchronizaiton
  6. Router-A(config-router)# neighbor 100.100.0.2 remote-as 200
  7. Router-A(config-router)# neighbor 100.100.0.2 description "provider B"
  8. Router-A(config-router)# exit
  9. Router-A(config)# exit
  10. Router-A# write

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

  1. Router-B# configure terminal
  2. Router-B(config)# no router bgp 7675
  3. Router-B(config)# router bgp 200
  4. Router-B(config)# no auto-summary
  5. Router-B(config)# no synchronizaiton
  6. Router-B(config-router)# neighbor 100.100.0.1 remote-as 100
  7. Router-B(config-router)# neighbor 100.100.0.1 description "provider A"
  8. Router-B(config-router)# exit
  9. Router-B(config)# exit
  10. Router-B# write

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

  1. 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中:

  1. Router-A# configure terminal
  2. Router-A(config)# router bgp 100
  3. Router-A(config)# network 100.100.0.0/22
  4. Router-A(config)# exit
  5. Router-A# write

在路由器-B中:

  1. Router-B# configure terminal
  2. Router-B(config)# router bgp 200
  3. Router-B(config)# network 200.200.0.0/22
  4. Router-B(config)# exit
  5. Router-B# write

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

测试前缀通告

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

  1. Router-A# show ip bgp summary

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

  1. Router-A# show ip bgp neighbors 100.100.0.2 advertised-routes

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

  1. Router-A# show ip bgp neighbors 100.100.0.2 routes

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

  1. Router-A# show ip bgp

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

  1. Router-A# show ip route

  1. 代码: K - 内核路由, C - 已链接 , S - 静态 , R - 路由信息协议 , O - 开放式最短路径优先协议,
  2. I - 中间系统到中间系统的路由选择协议, B - 边界网关协议, > - 选择路由, * - FIB 路由
  3. C>* 100.100.0.0/30 is directly connected, eth0
  4. C>* 100.100.1.0/24 is directly connected, eth1
  5. B>* 200.200.0.0/22 [20/0] via 100.100.0.2, eth0, 00:06:45

  1. Router-A# show ip route bgp

  1. B>* 200.200.0.0/22 [20/0] via 100.100.0.2, eth0, 00:08:13

BGP学习到的路由也将会在Linux路由表中出现。

  1. [root@Router-A~]# ip route

  1. 100.100.0.0/30 dev eth0 proto kernel scope link src 100.100.0.1
  2. 100.100.1.0/24 dev eth1 proto kernel scope link src 100.100.1.1
  3. 200.200.0.0/22 via 100.100.0.2 dev eth0 proto zebra

最后,我们将使用ping命令来测试连通。结果将成功ping通。

  1. [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中国 荣誉推出

想玩 BGP 路由器么?用 CentOS 做一个的更多相关文章

  1. 玩转 Jupyter Notebook (CentOS)

    Jupyter Notebook 简介 Jupyter Notebook 是一个开源的 Web 应用程序,可以用来创建和共享包含动态代码.方程式.可视化及解释性文本的文档.其应用于包括:数据整理与转换 ...

  2. 要想玩转FPGA,按这4个步骤来

    FPGA 作为一种高新技术,由于其结构的特殊性,可以重复编程,开发周期较短,越来越受到电子爱好者的青睐,其应用已经逐渐普及到了各行各业.因此,越来越多的学生或工程师都希望跨进FPGA的大门掌握这门技术 ...

  3. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  4. 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研

    想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研 http://blog.csdn.net/testing_is_believing/article/details/22 ...

  5. 泥瓦匠想做一个与众不同的技术"匠"

    点击蓝字,关注泥瓦匠 本文阅读大约 3 分钟.感谢阅读 喝了最后一口百事可乐,想到它的 slogan:新一代的选择.新一代的选择,每个人选择不同,人生道路历程也不同.就像我刚毕业的时候,毕业选择不一样 ...

  6. “医疗信息化行业之中的联发科”- 我们在医疗行业中的定位及目标 想做一个面对中小企业的专业上游软件供应商 台湾联发科技颠覆掉的是一个封闭的手机产业系统 解决方案,即AgileHIS.NET数字化医院基础方案

    “医疗信息化行业之中的联发科”- 我们在医疗行业中的定位及目标   我们做中国医疗信息化行业之中的联发科 ---我们在医疗行业中的定位及目标 从我个人来讲,我从2001年到现在这10年之间基本上一直在 ...

  7. 想玩API,这些套路我来告诉你!

    小伙伴是不是时常听说各种api接口的问题呢,可能许多人第一感觉:那是什么个玩意儿,那么多人回去研究它,今天思梦PHP小编就来为你揭开他的神秘的面纱,先看一下百度百科上面的官方的解释: 其实说白了就是为 ...

  8. 朋友想玩下百度的ORC我鼓捣鼓捣thinkphp3集成百度sdk

    他想玩的是文字识别  那就玩下  咱们开始 1 先到百度文字识别  添加个应用  这样就有了APPID API KEY SECRET KEY https://console.bce.baidu.com ...

  9. 玩个JAVA爬虫,没想玩大

    想玩个爬虫,爬些数据玩玩,不成想把自己玩“进去”了 想爬这个新浪的股票 大额交易页面 本以为用 HttpClient 直接爬链接,结果发现这个页面中,翻页数据压根就是动态赋值的,根本没有,那我根本无法 ...

随机推荐

  1. React Native学习(八)—— 对接七鱼客服

    本文基于React Native 0.52 Demo上传到Git了,有需要可以看看,写了新内容会上传的.Git地址 https://github.com/gingerJY/React-Native-D ...

  2. spring task 定时

    最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 首先,当然是添加依 ...

  3. Hystrix-request cache(请求缓存)

    开启请求缓存 请求缓存在run()和construce()执行之前生效,所以可以有效减少不必要的线程开销.你可以通过实现getCachekey()方法来开启请求缓存. package org.hope ...

  4. springmvc配置文件配置的事务作用范围

    作用于service,不是controller,也不是mapper.所以,要保证原子性,就放在一个serviceimpl里,而不要放在一个controller 里 第一次与数据库打交道时,事务开启,s ...

  5. PowerCLI: One-Liner to get VMs, Clusters, ESX Hosts and Datastores并导入数据库中

    需求:定期自动获取Vm在VCenter中对应的cluster.ESX.Datastore信息,同时将变化或者新增的数据上传到数据库中 解决思路分析: 1 首先使用VMware的powerCLI工具通过 ...

  6. junit源码解析--捕获测试结果

    OK,前面的博客我们整理了junit运行完了所有的测试用例,那么OK了,现在开始该收集测试结果了. 在这最后一步中,junit主要是玩一个类,TestResult.这里类中封装了几个参数,在初始化这个 ...

  7. MyEclipse安装插件

    原文地址:http://www.cnblogs.com/pharen/archive/2012/02/08/2343342.html 本文讲解MyEclipse(MyEclipse10)的三种方法,以 ...

  8. maven-assembly-plugin插件的使用方法

    一. Assembly 是什么意思? 二. maven-assembly-plugin是什么? 它是maven中针对打包任务而提供的标准插件. 三. maven-assembly-plugin插件的作 ...

  9. getResource()和getSystemResource()分析

    1. getClass().getResource() 第一步,getClass().getResource(path)是有一个路径参数的,这个路径会先被转换成"类所在的包名称+path&q ...

  10. java去重(1通过迭代器,2直接赋值)

    1.List<Integer> list=new ArrayList<Integer>();  //有值 List<Integer> listTemp= new A ...