<a target="_blank"></a>
教程中,我们主要参考如下拓扑。
服务供应商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
如果quagga还没有安装,我们可以先使用yum安装。
<code># yum install quagga</code>
在centos/rhel 7,selinux策略会默认的阻止对于/usr/sbin/zebra配置目录的写操作,这会对我们将要介绍的安装操作有所影响。因此我们需要像下面这样关闭这个策略。如果你使用的是centos/rhel 6可以跳过这一步。
<code># setsebool -p zebra_write_config 1</code>
在安装过后,我们先创建配置文件zebra/bgpd作为配置流程的开始。
<code># cp /usr/share/doc/quagga-xxxxx/zebra.conf.sample /etc/quagga/zebra.conf</code>
<code># cp /usr/share/doc/quagga-xxxxx/bgpd.conf.sample /etc/quagga/bgpd.conf</code>
然后,允许这些服务开机自启。
在 centos/rhel 6:
<code># service zebra start; service bgpd start</code>
<code># chkconfig zebra on; chkconfig bgpd on</code>
在 centos/rhel 7:
<code># systemctl start zebra; systemctl start bgpd</code>
<code># systemctl enable zebra; systmectl enable bgpd</code>
quagga内部提供一个叫作vtysh的shell,其界面与那些主流路由厂商cisco或juniper十分相似。启动vtysh shell命令行:
<code># vtysh</code>
提示符将改为:
<code>router-a#</code>
或
<code>router-b#</code>
在教程的其余部分,这个提示可以表明你正身处在哪个路由的vtysh shell中。
来为zebra配置日志文件,这会有助于调试。
首先,进入全局配置模式通过输入:
<code>router-a# configure terminal</code>
提示符将变更成:
<code>router-a(config)#</code>
指定日志文件的位置。然后退出配置模式:
<code>router-a(config)# log file /var/log/quagga/quagga.log</code>
<code>router-a(config)# exit</code>
保存配置通过:
<code>router-a# write</code>
现在,让我们为quagga的物理接口配置ip地址。
首先,查看一下vtysh中现有的接口。
<code>router-a# show interfaces</code>
<code>interface eth0 is up, line protocol detection is disabled</code>
<code>## output truncated ###</code>
<code>interface eth1 is up, line protocol detection is disabled</code>
<code>## output truncated ##</code>
现在我们配置ipv6地址。
<code>router-a# conf terminal</code>
<code>router-a(config)# interface eth0</code>
<code>router-a(config-if)# ipv6 address 2001:db8:3::1/64</code>
<code>router-a(config-if)# interface eth1</code>
<code>router-a(config-if)# ipv6 address 2001:db8:1::1/64</code>
在路由b上采用同样的方式分配ipv6地址。我将配置汇总成如下。
<code>router-b# show running-config</code>
<code>interface eth0</code>
<code>ipv6 address 2001:db8:3::2/64</code>
<code></code>
<code>interface eth1</code>
<code>ipv6 address 2001:db8:2::1/64</code>
由于两台路由的eth0端口同属一个子网,即2001:db8:3::/64,你应该可以相互ping通。在保证ping通的情况下,我们开始下面的内容。
<code>router-a# ping ipv6 2001:db8:3::2</code>
<code>ping 2001:db8:3::2(2001:db8:3::2) 56 data bytes</code>
<code>64 bytes from 2001:db8:3::2: icmp_seq=1 ttl=64 time=3.20 ms</code>
<code>64 bytes from 2001:db8:3::2: icmp_seq=2 ttl=64 time=1.05 ms</code>
本段,我们将在两个路由之间配置ipv6 bgp。首先,我们在路由a上指定bgp邻居。
<code>router-a# conf t</code>
<code>router-a(config)# router bgp 100</code>
<code>router-a(config-router)# no auto-summary</code>
<code>router-a(config-router)# no synchronization</code>
<code>router-a(config-router)# neighbor 2001:db8:3::2 remote-as 200</code>
然后,我们定义ipv6的地址族。在地址族中,我们需要定义要通告的网段,并激活邻居。
<code>router-a(config-router)# address-family ipv6</code>
<code>router-a(config-router-af)# network 2001:db8:1::/48</code>
<code>router-a(config-router-af)# neighbor 2001:db8:3::2 activate</code>
我们在路由b上也实施相同的配置。这里提供我归总后的配置。
<code>router-b# conf t</code>
<code>router-b(config)# router bgp 200</code>
<code>router-b(config-router)# no auto-summary</code>
<code>router-b(config-router)# no synchronization</code>
<code>router-b(config-router)# neighbor 2001:db8:3::1 remote-as 100</code>
<code>router-b(config-router)# address-family ipv6</code>
<code>router-b(config-router-af)# network 2001:db8:2::/48</code>
<code>router-b(config-router-af)# neighbor 2001:db8:3::1 activate</code>
我们使用以下命令来确认ipv6 bgp会话的信息。
查看bgp汇总:
<code>router-a# show bgp ipv6 unicast summary</code>
查看bgp通告的路由:
<code>router-a# show bgp ipv6 neighbors <neighbor-ipv6-address> advertised-routes</code>
查看bgp获得的路由:
<code>router-a# show bgp ipv6 neighbors <neighbor-ipv6-address> routes</code>
正如我们在上面看到的输出信息那样,路由间通告了他们完整的/48 ipv6前缀。出于演示的目的,我们会考虑以下要求。
router-b将通告一个/64前缀,一个/56前缀,和一个完整的/48前缀.
router-a将接受任由b提供的何形式的ipv6前缀,其中包含有/56和/64之间的网络掩码长度。
我们将根据需要过滤的前缀,来使用路由器的前缀列表和路由映射。
目前,路由b只通告一个/48前缀。我们修改路由b的bgp配置使它可以通告额外的/56和/64前缀。
<code>router-b(config-router-af)# network 2001:db8:2::/56</code>
<code>router-b(config-router-af)# network 2001:db8:2::/64</code>
我们将路由a上验证了所有的前缀都获得到了。
太好了!我们在路由a上收到了所有的前缀,那么我们可以更进一步创建前缀列表和路由映射来过滤这些前缀。
<code>router-a(config)# ipv6 prefix-list filter-ipv6-prfx permit 2001:db8:2::/56 le 64</code>
以上的命令会创建一个名为'filter-ipv6-prfx'的前缀列表,用以匹配任何2001:db8:2::池内掩码在56和64之间的所有前缀。
现在已经在前缀列表中创建了条目,我们也应该相应的创建一条使用此条目的路由映射规则了。
<code>router-a(config)# route-map filter-ipv6-rmap permit 10</code>
<code>router-a(config-route-map)# match ipv6 address prefix-list filter-ipv6-prfx</code>
以上的命令会创建一条名为'filter-ipv6-rmap'的路由映射规则。这则规则将会允许与之前在前缀列表中创建'filter-ipv6-prfx'所匹配的ipv6
要记住路由映射规则只有在应用在邻居或者端口的指定方向时才有效。我们将把路由映射应用到bgp的邻居配置中。我们将路由映射应用于入方向,作为进入路由端的前缀过滤器。
<code>router-a(config-router-af)# neighbor 2001:db8:3::2 route-map filter-ipv6-rmap in</code>
现在我们在路由a上再查看一边获得到的路由,我们应该只能看见两个被允许的前缀了。
注意: 你可能需要重置bgp会话来刷新路由表。
所有ipv6的bgp会话可以使用以下的命令重启:
<code>router-a# clear bgp ipv6 *</code>
我汇总了两个路由的配置,并做成了一张清晰的图片以便阅读。
总结一下,这篇教程重点在于如何创建bgp对等体和ipv6的过滤。我们演示了如何向邻居bgp路由通告ipv6前缀,和如何过滤通告前缀或获得的通告。需要注意,本教程使用的过程可能会对网络供应商的网络运作有所影响,请谨慎参考。
希望这些对你有用。
本文来自云栖社区合作伙伴“linux中国”,原文发布日期:2015-09-04