标签 Quagga 下的文章

使用开源路由协议栈 Quagga,使你的 Linux 系统成为一台路由器。

网络路由协议分为两大类:内部网关协议和外部网关协议。路由器使用内部网关协议在单个自治系统内共享信息。如果你用的是 Linux,则可以通过开源(GPLv2)路由协议栈 Quagga 使其表现得像一台路由器。

Quagga 是什么?

Quagga 是一个路由软件包),并且是 GNU Zebra 的一个分支。它为类 Unix 平台提供了所有主流路由协议的实现,例如开放最短路径优先(OSPF),路由信息协议(RIP),边界网关协议(BGP)和中间系统到中间系统协议(IS-IS)。

尽管 Quagga 实现了 IPv4 和 IPv6 的路由协议,但它并不是一个完整的路由器。一个真正的路由器不仅实现了所有路由协议,而且还有转发网络流量的能力。 Quagga 仅仅实现了路由协议栈,而转发网络流量的工作由 Linux 内核处理。

架构

Quagga 通过特定协议的守护程序实现不同的路由协议。守护程序名称与路由协议相同,加了字母“d”作为后缀。Zebra 是核心,也是与协议无关的守护进程,它为内核提供了一个抽象层,并通过 TCP 套接字向 Quagga 客户端提供 Zserv API。每个特定协议的守护程序负责运行相关的协议,并基于交换的信息来建立路由表。

 title=

环境

本教程通过 Quagga 实现的 OSPF 协议来配置动态路由。该环境包括两个名为 Alpha 和 Beta 的 CentOS 7.7 主机。两台主机共享访问 192.168.122.0/24 网络。

主机 Alpha:

IP:192.168.122.100/24 网关:192.168.122.1

主机 Beta:

IP:192.168.122.50/24 网关:192.168.122.1

安装软件包

首先,在两台主机上安装 Quagga 软件包。它存在于 CentOS 基础仓库中:

yum install quagga -y

启用 IP 转发

接下来,在两台主机上启用 IP 转发,因为它将由 Linux 内核来执行:

sysctl -w net.ipv4.ip_forward = 1
sysctl -p

配置

现在,进入 /etc/quagga 目录并为你的设置创建配置文件。你需要三个文件:

  • zebra.conf:Quagga 守护程序的配置文件,你可以在其中定义接口及其 IP 地址和 IP 转发
  • ospfd.conf:协议配置文件,你可以在其中定义将通过 OSPF 协议提供的网络
  • daemons:你将在其中指定需要运行的相关的协议守护程序

在主机 Alpha 上,

 [root@alpha]# cat /etc/quagga/zebra.conf
interface eth0
 ip address 192.168.122.100/24
 ipv6 nd suppress-ra
interface eth1
 ip address 10.12.13.1/24
 ipv6 nd suppress-ra
interface lo
ip forwarding
line vty

[root@alpha]# cat /etc/quagga/ospfd.conf
interface eth0
interface eth1
interface lo
router ospf
 network 192.168.122.0/24 area 0.0.0.0
 network 10.12.13.0/24 area 0.0.0.0
line vty

[root@alphaa ~]# cat /etc/quagga/daemons
zebra=yes
ospfd=yes

在主机 Beta 上,

[root@beta quagga]# cat zebra.conf
interface eth0
 ip address 192.168.122.50/24
 ipv6 nd suppress-ra
interface eth1
 ip address 10.10.10.1/24
 ipv6 nd suppress-ra
interface lo
ip forwarding
line vty

[root@beta quagga]# cat ospfd.conf
interface eth0
interface eth1
interface lo
router ospf
 network 192.168.122.0/24 area 0.0.0.0
 network 10.10.10.0/24 area 0.0.0.0
line vty

[root@beta ~]# cat /etc/quagga/daemons
zebra=yes
ospfd=yes

配置防火墙

要使用 OSPF 协议,必须允许它通过防火墙:

firewall-cmd --add-protocol=ospf –permanent

firewall-cmd –reload

现在,启动 zebraospfd 守护程序。

# systemctl start zebra
# systemctl start ospfd

用下面命令在两个主机上查看路由表:

[root@alpha ~]# ip route show  
default via 192.168.122.1 dev eth0 proto static metric 100
10.10.10.0/24 via 192.168.122.50 dev eth0 proto zebra metric 20
10.12.13.0/24 dev eth1 proto kernel scope link src 10.12.13.1
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.100 metric 100

你可以看到 Alpha 上的路由表包含通过 192.168.122.50 到达 10.10.10.0/24 的路由项,它是通过协议 zebra 获取的。同样,在主机 Beta 上,该表包含通过 192.168.122.100 到达网络 10.12.13.0/24 的路由项。

[root@beta ~]# ip route show
default via 192.168.122.1 dev eth0 proto static metric 100
10.10.10.0/24 dev eth1 proto kernel scope link src 10.10.10.1
10.12.13.0/24 via 192.168.122.100 dev eth0 proto zebra metric 20
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.50 metric 100

结论

如你所见,环境和配置相对简单。要增加复杂性,你可以向路由器添加更多网络接口,以为更多网络提供路由。你也可以使用相同的方法来实现 BGP 和 RIP 协议。


via: https://opensource.com/article/20/4/quagga-linux

作者:M Umer 选题:lujun9972 译者:messon007 校对:wxy

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

学习如何使用 Quagga 套件的路由协议去管理动态路由。

 title=

迄今为止,本系列文章中,我们已经在 Linux 局域网路由新手指南:第 1 部分 中学习了复杂的 IPv4 地址,在 Linux 局域网路由新手指南:第 2 部分 中学习了如何去手工创建静态路由。

今天,我们继续使用 Quagga 去管理动态路由,这是一个安装完后就不用理它的的软件。Quagga 是一个支持 OSPFv2、OSPFv3、RIP v1 和 v2、RIPng、以及 BGP-4 的路由协议套件,并全部由 zebra 守护程序管理。

OSPF 的意思是 最短路径优先 Open Shortest Path First 。OSPF 是一个内部网关协议(IGP);它可以用在局域网和跨因特网的局域网互联中。在你的网络中的每个 OSPF 路由器都包含整个网络的拓扑,并计算通过网络的最短路径。OSPF 会通过多播的方式自动对外传播它检测到的网络变化。你可以将你的网络分割为区域,以保持路由表的可管理性;每个区域的路由器只需要知道离开它的区域的下一跳接口地址,而不用记录你的网络的整个路由表。

RIP,即路由信息协议,是一个很老的协议,RIP 路由器向网络中周期性多播它的整个路由表,而不是像 OSPF 那样只多播网络的变化。RIP 通过跳数来测量路由,任何超过 15 跳的路由它均视为不可到达。RIP 设置很简单,但是 OSPF 在速度、效率以及弹性方面更佳。

BGP-4 是边界网关协议版本 4。这是用于因特网流量路由的外部网关协议(EGP)。你不会用到 BGP 协议的,除非你是因特网服务提供商。

准备使用 OSPF

在我们的小型 KVM 测试实验室中,用两台虚拟机表示两个不同的网络,然后将另一台虚拟机配置为路由器。创建两个网络:net1 是 192.168.110.0/24 ,而 net2 是 192.168.120.0/24。启用 DHCP 是明智的,否则你要分别进入这三个虚拟机,去为它们设置静态地址。Host 1 在 net1 中,Host 2 在 net2 中,而路由器同时与这两个网络连接。设置 Host 1 的网关地址为 192.168.110.126,Host 2 的网关地址为 192.168.120.136。

  • Host 1: 192.168.110.125
  • Host 2:192.168.120.135
  • Router:192.168.110.126 和 192.168.120.136

在路由器上安装 Quagga。在大多数 Linux 中它是 quagga 软件包。在 Debian 上还有一个单独的文档包 quagga-doc。取消 /etc/sysctl.conf 配置文件中如下这一行的注释去启用包转发功能:

net.ipv4.ip_forward=1

然后,运行 sysctl -p 命令让变化生效。

配置 Quagga

查看你的 Quagga 包中的示例配置文件,比如,/usr/share/doc/quagga/examples/ospfd.conf.sample。除非你的 Linux 版本按你的喜好做了创新,否则,一般情况下配置文件应该在 /etc/quagga 目录中。大多数 Linux 版本在这个目录下有两个文件,vtysh.confzebra.conf。它们提供了守护程序运行所需要的最小配置。除非你的发行版做了一些特殊的配置,否则,zebra 总是首先运行,当你启动 ospfd 的时候,它将自动启动。Debian/Ubuntu 是一个特例,稍后我们将会说到它。

每个路由器守护程序将读取它自己的配置文件,因此,我们必须创建 /etc/quagga/ospfd.conf,并输入如下内容:

!/etc/quagga/ospfd.conf
hostname router1
log file /var/log/quagga/ospfd.log
router ospf
  ospf router-id 192.168.110.15
  network 192.168.110.0/0 area 0.0.0.0
  network 192.168.120.0/0 area 0.0.0.0
access-list localhost permit 127.0.0.1/32
access-list localhost deny any
line vty
  access-class localhost

你可以使用感叹号(!)或者井号(#)去注释掉这些行。我们来快速浏览一下这些选项。

  • hostname 可以是你希望的任何内容。这里不是一般意义上的 Linux 主机名,但是,当你使用 vtysh 或者 telnet 登入时,你将看到它们。
  • log file 是你希望用于保存日志的任意文件。
  • router 指定路由协议。
  • ospf router-id 是任意的 32 位数字。使用路由器的一个 IP 地址就是很好的选择。
  • network 定义你的路由器要通告的网络。
  • access-list 限制 vtysh 登入,它是 Quagga 命令行 shell,它允许本地机器登入,并拒绝任何远程管理。

Debian/Ubuntu

在你启动守护程序之前,Debian/Ubuntu 相对其它的 Debian 衍生版可能多需要一步到多步。编辑 /etc/quagga/daemons ,除了 zebra=yesospfd=yes 外,使其它所有的行的值为 no

然后,在 Debian 上运行 ospfd 去启动 Quagga:

# systemctl start quagga

在大多数的其它 Linux 上,包括 Fedora 和 openSUSE,用如下命令启动 ospfd

# systemctl start ospfd

现在,Host 1 和 Host 2 将可以互相 ping 通对方和路由器。

这里用了许多篇幅去描述非常简单的设置。在现实中,路由器将连接两个交换机,然后为连接到这个交换机上的所有电脑提供一个网关。你也可以在你的路由器上添加更多的网络接口,这样你的路由器就可以为更多的网络提供路由服务,或者也可以直接连接到其它路由器上,或者连接到连接其它路由器的骨干网络上。

你或许不愿意如此麻烦地手工配置网络接口。最简单的方法是使用你的 DHCP 服务器去宣告你的路由器。如果你使用了 Dnsmasq,那么你就有了一个 DHCP 和 DNS 的一体化解决方案。

还有更多的配置选项,比如,加密的密码保护。更多内容请查看 Quagga 路由套件 的官方文档。


via: https://www.linux.com/learn/intro-to-linux/2018/3/dynamic-linux-routing-quagga

作者:CARLA SCHRODER 译者:qhwdw 校对:wxy

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

之前的文章中,我们介绍了如何使用 Quagga 将 CentOS 服务器变成一个 BGP 路由器,也介绍了 BGP 对等体和前缀交换设置。在本教程中,我们将重点放在如何使用 前缀列表 prefix-list 路由映射 route-map 来分别控制数据注入和数据输出。

之前的文章已经说过,BGP 的路由判定是基于前缀的收取和前缀的广播。为避免错误的路由,你需要使用一些过滤机制来控制这些前缀的收发。举个例子,如果你的一个 BGP 邻居开始广播一个本不属于它们的前缀,而你也将错就错地接收了这些不正常前缀,并且也将它转发到网络上,这个转发过程会不断进行下去,永不停止(所谓的“黑洞”就这样产生了)。所以确保这样的前缀不会被收到,或者不会转发到任何网络,要达到这个目的,你可以使用前缀列表和路由映射。前者是基于前缀的过滤机制,后者是更为常用的基于前缀的策略,可用于精调过滤机制。

本文会向你展示如何在 Quagga 中使用前缀列表和路由映射。

拓扑和需求

本教程使用下面的拓扑结构。

服务供应商A和供应商B已经将对方设置成为 eBGP 对等体,实现互相通信。他们的自治系统号和前缀分别如下所示。

  • 对等区段: 192.168.1.0/24
  • 服务供应商A: 自治系统号 100, 前缀 10.10.0.0/16
  • 服务供应商B: 自治系统号 200, 前缀 10.20.0.0/16

在这个场景中,供应商B只想从A接收 10.10.10.0/23, 10.10.10.0/24 和 10.10.11.0/24 三个前缀。

安装 Quagga 和设置 BGP 对等体

之前的教程中,我们已经写了安装 Quagga 和设置 BGP 对等体的方法,所以这里就不再详细说明了,只简单介绍下 BGP 配置和前缀广播:

上图说明 BGP 对等体已经开启。Router-A 在向 router-B 广播多个前缀,而 Router-B 也在向 router-A 广播一个前缀 10.20.0.0/16。两个路由器都能正确无误地收发前缀。

创建前缀列表

路由器可以使用 ACL 或前缀列表来过滤一个前缀。前缀列表比 ACL 更常用,因为前者处理步骤少,而且易于创建和维护。

ip prefix-list DEMO-PRFX permit 192.168.0.0/23

上面的命令创建了名为“DEMO-FRFX”的前缀列表,只允许存在 192.168.0.0/23 这个前缀。

前缀列表的另一个强大功能是支持子网掩码区间,请看下面的例子:

ip prefix-list DEMO-PRFX permit 192.168.0.0/23 le 24

这个命令创建的前缀列表包含在 192.168.0.0/23 和 /24 之间的前缀,分别是 192.168.0.0/23, 192.168.0.0/24 和 192.168.1.0/24。运算符“le”表示小于等于,你也可以使用“ge”表示大于等于。

一个前缀列表语句可以有多个允许或拒绝操作。每个语句都自动或手动地分配有一个序列号。

如果存在多个前缀列表语句,则这些语句会按序列号顺序被依次执行。在配置前缀列表的时候,我们需要注意在所有前缀列表语句之后是隐性拒绝语句,就是说凡是不被明显允许的,都会被拒绝。

如果要设置成允许所有前缀,前缀列表语句设置如下:

ip prefix-list DEMO-PRFX permit 0.0.0.0/0 le 32

我们已经知道如何创建前缀列表语句了,现在我们要创建一个名为“PRFX-LST”的前缀列表,来满足我们实验场景的需求。

router-b# conf t
router-b(config)# ip prefix-list PRFX-LST permit 10.10.10.0/23 le 24

创建路由映射

除了前缀列表和 ACL,这里还有另一种机制,叫做路由映射,也可以在 BGP 路由器中控制前缀。事实上,路由映射针对前缀匹配的微调效果比前缀列表和 ACL 都强。

与前缀列表类似,路由映射语句也可以指定允许和拒绝操作,也需要分配一个序列号。每个路由匹配可以有多个允许或拒绝操作。例如:

route-map DEMO-RMAP permit 10

上面的语句创建了名为“DEMO-RMAP”的路由映射,添加序列号为10的允许操作。现在我们在这个序列号所对应的路由映射下使用 match 命令进行匹配。

router-a(config-route-map)# match (press ? in the keyboard)

  as-path       Match BGP AS path list
  community     Match BGP community list
  extcommunity  Match BGP/VPN extended community list
  interface     match first hop interface of route
  ip            IP information
  ipv6          IPv6 information
  metric        Match metric of route
  origin        BGP origin code
  peer          Match peer address
  probability   Match portion of routes defined by percentage value
  tag           Match tag of route

如你所见,路由映射可以匹配很多属性,在本教程中匹配的是前缀。

route-map DEMO-RMAP permit 10
match ip address prefix-list DEMO-PRFX

这个 match 命令会匹配之前建好的前缀列表中允许的 IP 地址(也就是前缀 192.168.0.0/23, 192.168.0.0/24 和 192.168.1.0/24)。

接下来,我们可以使用 set 命令来修改这些属性。例子如下:

route-map DEMO-RMAP permit 10
match ip address prefix-list DEMO-PRFX
set (press ? in keyboard)

  aggregator          BGP aggregator attribute
  as-path             Transform BGP AS-path attribute
  atomic-aggregate    BGP atomic aggregate attribute
  comm-list           set BGP community list (for deletion)
  community           BGP community attribute
  extcommunity        BGP extended community attribute
  forwarding-address  Forwarding Address
  ip                  IP information
  ipv6                IPv6 information
  local-preference    BGP local preference path attribute
  metric              Metric value for destination routing protocol
  metric-type         Type of metric
  origin              BGP origin code
  originator-id       BGP originator ID attribute
  src                 src address for route
  tag                 Tag value for routing protocol
  vpnv4               VPNv4 information
  weight              BGP weight for routing table

如你所见,set 命令也可以修改很多属性。为了作个示范,我们修改一下 BGP 的 local-preference 这个属性。

route-map DEMO-RMAP permit 10
match ip address prefix-list DEMO-PRFX
set local-preference 500

如同前缀列表,路由映射语句的末尾也有隐性拒绝操作。所以我们需要添加另外一个允许语句(使用序列号20)来允许所有前缀。

route-map DEMO-RMAP permit 10
match ip address prefix-list DEMO-PRFX
set local-preference 500
!
route-map DEMO-RMAP permit 20

序列号20未指定任何匹配命令,所以默认匹配所有前缀。在这个路由映射语句中,所有的前缀都被允许。

回想一下,我们的需求是只允许或只拒绝一些前缀,所以上面的 set 命令不应该存在于这个场景中。我们只需要一个允许语句,如下如示:

router-b# conf t
router-b(config)# route-map RMAP permit 10
router-b(config-route-map)# match ip address prefix-list PRFX-LST

这个路由映射才是我们需要的效果。

应用路由映射

注意,在被应用于一个接口或一个 BGP 邻居之前,ACL、前缀列表和路由映射都不会生效。与 ACL 和前缀列表一样,一条路由映射语句也能被多个接口或邻居使用。然而,一个接口或一个邻居只能有一条路由映射语句应用于输入端,以及一条路由映射语句应用于输出端。

下面我们将这条路由映射语句应用于 router-B 的 BGP 配置,为 router-B 的邻居 192.168.1.1 设置输入前缀广播。

router-b# conf terminal
router-b(config)# router bgp 200
router-b(config-router)# neighbor 192.168.1.1 route-map RMAP in

现在检查下广播路由和收取路由。

显示广播路由的命令:

show ip bgp neighbor-IP advertised-routes

显示收取路由的命令:

show ip bgp neighbor-IP routes

可以看到,router-A 有4条路由前缀到达 router-B,而 router-B 只接收3条。查看一下范围,我们就能知道只有被路由映射允许的前缀才能在 router-B 上显示出来,其他的前缀一概丢弃。

小提示:如果接收前缀内容没有刷新,试试重置下 BGP 会话,使用这个命令:clear ip bgp neighbor-IP。本教程中命令如下:

clear ip bgp 192.168.1.1

我们能看到系统已经满足我们的要求了。接下来我们可以在 router-A 和 router-B 上创建相似的前缀列表和路由映射语句来更好地控制输入输出的前缀。

这里把配置过程总结一下,方便查看。

router bgp 200
network 10.20.0.0/16
neighbor 192.168.1.1 remote-as 100
neighbor 192.168.1.1 route-map RMAP in
!
ip prefix-list PRFX-LST seq 5 permit 10.10.10.0/23 le 24
!
route-map RMAP permit 10
match ip address prefix-list PRFX-LST

总结

在本教程中我们演示了如何在 Quagga 中设置前缀列表和路由映射来过滤 BGP 路由。我们也展示了如何将前缀列表结合进路由映射来进行输入前缀的微调功能。你可以参考这些方法来设置满足自己需求的前缀列表和路由映射。这些工具是保护网络免受路由毒化和来自 bogon 路由(LCTT 译注:指不该出现在internet路由表中的地址)的广播。

希望本文对你有帮助。


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

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

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

在之前的教程中,我们演示了如何使用Quagga建立一个完备的BGP路由器和配置前缀过滤。在本教程中,我们会向你演示如何创建IPv6 BGP对等体并通过BGP通告IPv6前缀。同时我们也将演示如何使用前缀列表和路由映射特性来过滤通告的或者获取到的IPv6前缀。

拓扑

教程中,我们主要参考如下拓扑。

服务供应商A和B希望在他们之间建立一个IPv6的BGP对等体。他们的IPv6地址和AS信息如下所示。

  • 对等体IP块: 2001:DB8:3::/64
  • 供应商A: AS 100, 2001:DB8:1::/48
  • 供应商B: AS 200, 2001:DB8:2::/48

CentOS/RHEL安装Quagga

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

# yum install quagga 

在CentOS/RHEL 7,SELinux策略会默认的阻止对于/usr/sbin/zebra配置目录的写操作,这会对我们将要介绍的安装操作有所影响。因此我们需要像下面这样关闭这个策略。如果你使用的是CentOS/RHEL 6可以跳过这一步。

# setsebool -P zebra_write_config 1 

创建配置文件

在安装过后,我们先创建配置文件zebra/bgpd作为配置流程的开始。

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

然后,允许这些服务开机自启。

在 CentOS/RHEL 6:

# service zebra start; service bgpd start
# chkconfig zebra on; chkconfig bgpd on 

在 CentOS/RHEL 7:

# systemctl start zebra; systemctl start bgpd
# systemctl enable zebra; systmectl enable bgpd 

Quagga内部提供一个叫作vtysh的shell,其界面与那些主流路由厂商Cisco或Juniper十分相似。启动vtysh shell命令行:

# vtysh

提示符将改为:

router-a#

router-b# 

在教程的其余部分,这个提示可以表明你正身处在哪个路由的vtysh shell中。

为Zebra指定日志文件

来为Zebra配置日志文件,这会有助于调试。

首先,进入全局配置模式通过输入:

router-a# configure terminal 

提示符将变更成:

router-a(config)#

指定日志文件的位置。然后退出配置模式:

router-a(config)# log file /var/log/quagga/quagga.log
router-a(config)# exit 

保存配置通过:

router-a# write 

配置接口IP地址

现在,让我们为Quagga的物理接口配置IP地址。

首先,查看一下vtysh中现有的接口。

router-a# show interfaces 

Interface eth0 is up, line protocol detection is disabled
## OUTPUT TRUNCATED ###
Interface eth1 is up, line protocol detection is disabled
## OUTPUT TRUNCATED ##

现在我们配置IPv6地址。

router-a# conf terminal
router-a(config)# interface eth0
router-a(config-if)# ipv6 address 2001:db8:3::1/64
router-a(config-if)# interface eth1
router-a(config-if)# ipv6 address 2001:db8:1::1/64

在路由B上采用同样的方式分配IPv6地址。我将配置汇总成如下。

router-b# show running-config 

interface eth0
ipv6 address 2001:db8:3::2/64

interface eth1
ipv6 address 2001:db8:2::1/64

由于两台路由的eth0端口同属一个子网,即2001:DB8:3::/64,你应该可以相互ping通。在保证ping通的情况下,我们开始下面的内容。

router-a# ping ipv6 2001:db8:3::2 

PING 2001:db8:3::2(2001:db8:3::2) 56 data bytes
64 bytes from 2001:db8:3::2: icmp_seq=1 ttl=64 time=3.20 ms
64 bytes from 2001:db8:3::2: icmp_seq=2 ttl=64 time=1.05 ms

步骤 1: IPv6 BGP 对等体

本段,我们将在两个路由之间配置IPv6 BGP。首先,我们在路由A上指定BGP邻居。

router-a# conf t
router-a(config)# router bgp 100
router-a(config-router)# no auto-summary
router-a(config-router)# no synchronization
router-a(config-router)# neighbor 2001:DB8:3::2 remote-as 200

然后,我们定义IPv6的地址族。在地址族中,我们需要定义要通告的网段,并激活邻居。

router-a(config-router)# address-family ipv6
router-a(config-router-af)# network 2001:DB8:1::/48
router-a(config-router-af)# neighbor 2001:DB8:3::2 activate

我们在路由B上也实施相同的配置。这里提供我归总后的配置。

router-b# conf t
router-b(config)# router bgp 200
router-b(config-router)# no auto-summary
router-b(config-router)# no synchronization
router-b(config-router)# neighbor 2001:DB8:3::1 remote-as 100
router-b(config-router)# address-family ipv6
router-b(config-router-af)# network 2001:DB8:2::/48
router-b(config-router-af)# neighbor 2001:DB8:3::1 activate

如果一切顺利,在路由间将会形成一个IPv6 BGP会话。如果失败了,请确保在防火墙中开启了必要的端口(TCP 179)。

我们使用以下命令来确认IPv6 BGP会话的信息。

查看BGP汇总:

router-a# show bgp ipv6 unicast summary 

查看BGP通告的路由:

router-a# show bgp ipv6 neighbors <neighbor-IPv6-address> advertised-routes 

查看BGP获得的路由:

router-a# show bgp ipv6 neighbors <neighbor-IPv6-address> routes 

步骤 2: 过滤IPv6前缀

正如我们在上面看到的输出信息那样,路由间通告了他们完整的/48 IPv6前缀。出于演示的目的,我们会考虑以下要求。

  • Router-B将通告一个/64前缀,一个/56前缀,和一个完整的/48前缀.
  • Router-A将接受任由B提供的何形式的IPv6前缀,其中包含有/56和/64之间的网络掩码长度。

我们将根据需要过滤的前缀,来使用路由器的前缀列表和路由映射。

为路由B修改通告的前缀

目前,路由B只通告一个/48前缀。我们修改路由B的BGP配置使它可以通告额外的/56和/64前缀。

router-b# conf t
router-b(config)# router bgp 200
router-b(config-router)# address-family ipv6
router-b(config-router-af)# network 2001:DB8:2::/56
router-b(config-router-af)# network 2001:DB8:2::/64

我们将路由A上验证了所有的前缀都获得到了。

太好了!我们在路由A上收到了所有的前缀,那么我们可以更进一步创建前缀列表和路由映射来过滤这些前缀。

创建前缀列表

就像在上则教程中描述的那样,前缀列表是一种机制用来匹配带有子网长度的IP地址前缀。按照我们指定的需求,我们需要在路由A的前缀列表中创建一则必要的条目。

router-a# conf t
router-a(config)# ipv6 prefix-list FILTER-IPV6-PRFX permit 2001:DB8:2::/56 le 64

以上的命令会创建一个名为'FILTER-IPV6-PRFX'的前缀列表,用以匹配任何2001:DB8:2::池内掩码在56和64之间的所有前缀。

创建并应用路由映射

现在已经在前缀列表中创建了条目,我们也应该相应的创建一条使用此条目的路由映射规则了。

router-a# conf t
router-a(config)# route-map FILTER-IPV6-RMAP permit 10
router-a(config-route-map)# match ipv6 address prefix-list FILTER-IPV6-PRFX

以上的命令会创建一条名为'FILTER-IPV6-RMAP'的路由映射规则。这则规则将会允许与之前在前缀列表中创建'FILTER-IPV6-PRFX'所匹配的IPv6

要记住路由映射规则只有在应用在邻居或者端口的指定方向时才有效。我们将把路由映射应用到BGP的邻居配置中。我们将路由映射应用于入方向,作为进入路由端的前缀过滤器。

router-a# conf t
router-a(config)# router bgp 100
router-a(config-router)# address-family ipv6
router-a(config-router-af)# neighbor 2001:DB8:3::2 route-map FILTER-IPV6-RMAP in

现在我们在路由A上再查看一边获得到的路由,我们应该只能看见两个被允许的前缀了。

注意: 你可能需要重置BGP会话来刷新路由表。

所有IPv6的BGP会话可以使用以下的命令重启:

router-a# clear bgp ipv6 * 

我汇总了两个路由的配置,并做成了一张清晰的图片以便阅读。

总结

总结一下,这篇教程重点在于如何创建BGP对等体和IPv6的过滤。我们演示了如何向邻居BGP路由通告IPv6前缀,和如何过滤通告前缀或获得的通告。需要注意,本教程使用的过程可能会对网络供应商的网络运作有所影响,请谨慎参考。

希望这些对你有用。


via: http://xmodulo.com/ipv6-bgp-peering-filtering-quagga-bgp-router.html

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

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

BGP协议运行于TCP之上,因而,它也继承了TCP连接的所有漏洞。例如,在一个BGP会话内,攻击者可以冒充一个合法的BGP邻居,然后说服另一端的BGP路由器共享路由信息给攻击者。在攻击者通告并向邻居路由注入伪造的路由时,就会发生这个问题。毫无戒备的邻居路由器就会开始向攻击者发送通信实况,实际上这些信息并没有去向任何地方,仅仅只是被丢弃了。回到2008年,YouTube实际上也受害于这样的BGP路由中毒,并遭受了长达一个小时的视频服务大量中断。一个更加糟糕的情况是,如果攻击者是个足够懂行的人,他们可以伪装成一台透明路由器,然后嗅探经过的通信以获取敏感数据。你可以想象,这会造成深远的影响。

要保护活跃的BGP会话不受攻击,许多服务提供商在BGP会话中使用MD5校验和及预共享密钥。在受保护的BGP会话中,一台发送包的BGP路由器通过使用预共享的密钥生成MD5散列值、部分IP和TCP头以及有效载荷。然后,MD5散列作为一个TCP选项字段存储。在收到包后,接受路由器用同样的方法使用预共享密钥生成它的MD5版本。它会将它的MD5散列和接收到的某个包的值进行对比,以决定是否接受该包。对于一个攻击者而言,几乎不可能猜测到校验和或其密钥。对于BGP路由器而言,它们能在使用包的内容前确保每个包的合法性。

在本教程中,我们将为大家演示如何使用MD5校验和以及预共享密钥来加固两个邻居间的BGP会话的安全。

准备

加固BGP会话安全是相当简单而直截了当的,我们会使用以下路由器。

路由器名称AS 号IP地址
router-A10010.10.12.1/30
router-B20010.10.12.2/30

常用的Linux内核原生支持IPv4和IPv6的TCP MD5选项。因此,如果你从全新的Linux机器构建了一台Quagga路由器,TCP的MD5功能会自动启用。剩下来的事情,仅仅是配置Quagga以使用它的功能。但是,如果你使用的是FreeBSD机器或者为Quagga构建了一个自定义内核,请确保内核开启了TCP的MD5支持(如,Linux中的CONFIGTCPMD5SIG选项)。

配置Router-A验证功能

我们将使用Quagga的CLI Shell来配置路由器,我们将使用的唯一的一个新命令是‘password’。

[root@router-a ~]# vtysh
router-a# conf t
router-a(config)# router bgp 100
router-a(config-router)# network 192.168.100.0/24
router-a(config-router)# neighbor 10.10.12.2 remote-as 200
router-a(config-router)# neighbor 10.10.12.2 password xmodulo

本例中使用的预共享密钥是‘xmodulo’。很明显,在生产环境中,你需要选择一个更健壮的密钥。

注意: 在Quagga中,‘service password-encryption’命令被用做加密配置文件中所有明文密码(如,登录密码)。然而,当我使用该命令时,我注意到BGP配置中的预共享密钥仍然是明文的。我不确定这是否是Quagga的限制,还是版本自身的问题。

配置Router-B验证功能

我们将以类似的方式配置router-B。

[root@router-b ~]# vtysh
router-b# conf t
router-b(config)# router bgp 200
router-b(config-router)# network 192.168.200.0/24
router-b(config-router)# neighbor 10.10.12.1 remote-as 100
router-b(config-router)# neighbor 10.10.12.1 password xmodulo

验证BGP会话

如果一切配置正确,那么BGP会话就应该起来了,两台路由器应该能交换路由表。这时候,TCP会话中的所有流出包都会携带一个MD5摘要的包内容和一个密钥,而摘要信息会被另一端自动验证。

我们可以像平时一样通过查看BGP的概要来验证活跃的BGP会话。MD5校验和的验证在Quagga内部是透明的,因此,你在BGP级别是无法看到的。

如果你想要测试BGP验证,你可以配置一个邻居路由,设置其密码为空,或者故意使用错误的预共享密钥,然后查看发生了什么。你也可以使用包嗅探器,像tcpdump或者Wireshark等,来分析通过BGP会话的包。例如,带有“-M ”选项的tcpdump将验证TCP选项字段的MD5摘要。

小结

在本教程中,我们演示了怎样简单地加固两台路由间的BGP会话安全。相对于其它协议而言,配置过程非常简明。强烈推荐你加固BGP会话安全,尤其是当你用另一个AS配置BGP会话的时候。预共享密钥也应该安全地保存。


via: http://xmodulo.com/bgp-authentication-quagga.html

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

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

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