如何使用 Quagga BGP（边界网关协议）路由器来过滤 BGP 路由
在之前的文章中，我们介绍了如何使用 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::/48CentOS/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中国 荣誉推出
Cacti 是一个很棒的开源网络监视系统，它广泛使用于图形化地展示网络元素，例如带宽、存储、处理器和内存使用。使用它的基于Web 的界面，你可以轻松地创建和组织各种图表。然而，它默认并没有提供一些高级功能，例如合并图片、使用多个来源创建聚合图形、迁移 Cacti 到另一台服务器。使用 Cacti 的这些功能你还需要一些经验。在该教程中，我们会看到如何在将两幅 Cacti 图片合并为一幅。看看这个例子。在过去的 6 个月中，客户端 A 连接到了交换机 A 的端口 5。端口 5 发生了错误，因此客户端迁移到了端口 6。由于 Cacti 为每个接口/元素使用不同的图，客户端的带宽历史会分成端口 5 和端口 6。结果是对于一个客户端我们有两幅图片 - 一幅是 6 个月的旧数据，另一幅保存了后续的数据。在这种情况下，我们实际上可以合并两幅图片将旧数据加到新的图中，使得用一个单独的图为一个用户保存历史的和新数据。本教程将会解释如何做到这一点。Cacti 将每幅图片的数据保存在它自己的 RRD（round robin database，循环数据库）文件中。当请求一幅图片时，根据保存在对应 RRD 文件中的值生成图。在 Ubuntu/Debian 系统中，RRD 文件保存在 /var/lib/cacti/rra，在 CentOS/RHEL 系统中则是 /var/www/cacti/rra。合并图片背后的思想是更改这些 RRD 文件使得旧 RRD 文件中的值能追加到新的 RRD 文件中。情景一个客户端的服务在 eth0 上运行了超过一年。由于硬件损坏，客户端迁移到了另一台服务器的 eth1 接口。我们想展示新接口的带宽，同时保留超过一年的历史数据。该客户端希望只在一幅图中显示。确定图的 RRD 文件图合并的首个步骤是确定与图相关联的 RRD 文件。我们可以通过以调试模式打开图检查文件。要做到这点，在 Cacti 的菜单中： 控制台 > 管理图 > 选择图 > 打开图调试模式。旧图：新图：从样例输出（基于 Debian 系统）中，我们可以确定两幅图片的 RRD 文件：旧图： /var/lib/cacti/rra/old\_graph\_traffic\_in\_8.rrd新图： /var/lib/cacti/rra/new\_graph\_traffic\_in\_10.rrd准备脚本我们会用一个 RRD 剪接脚本 来合并两个 RRD 文件。下载该 PHP 脚本，并安装到 /var/lib/cacti/rra/rrdsplice.php (Debian/Ubuntu 系统) 或 /var/www/cacti/rra/rrdsplice.php (CentOS/RHEL 系统)。下一步，确认 Apache 用户拥有该文件。在 Debian 或 Ubuntu 系统中，运行下面的命令：# chown www-data:www-data rrdsplice.php 并更新 rrdsplice.php。查找下面的行：chown($finrrd, "apache"); 用下面的语句替换：chown($finrrd, "www-data"); 在 CentOS 或 RHEL 系统中，运行下面的命令即可：# chown apache:apache rrdsplice.php 合并两幅图通过不带任何参数运行该脚本可以获得脚本的使用语法。# cd /path/to/rrdsplice.php # php rrdsplice.php USAGE: rrdsplice.php --oldrrd=file --newrrd=file --finrrd=file 现在我们准备好合并两个 RRD 文件了。只需要指定旧 RRD 文件和新 RRD 文件的名称。我们会将合并后的结果重写到新 RRD 文件中。# php rrdsplice.php --oldrrd=old_graph_traffic_in_8.rrd --newrrd=new_graph_traffic_in_10.rrd --finrrd=new_graph_traffic_in_10.rrd 现在旧 RRD 文件中的数据已经追加到了新 RRD 文件中。Cacti 会将任何新数据写到新 RRD 文件中。如果我们点击图，我们可以发现也已经添加了旧图的周、月、年记录。下面图表中的第二幅图显示了旧图的周记录。总之，该教程显示了如何简单地将两幅 Cacti 图片合并为一幅。当服务迁移到另一个设备/接口，我们希望只处理一幅图片而不是两幅时，这个小技巧非常有用。该脚本非常方便，因为它可以不管源设备是不是相同都可以合并图片，例如 Cisco 1800 路由器和 Cisco 2960 交换机。希望这些能对你有所帮助。via: http://xmodulo.com/combine-two-graphs-cacti.html作者：Sarmed Rahman 译者：ictlyh 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
SNMP（简单网络管理协议）用于收集设备内部发生的数据，如负载、磁盘状态、带宽之类。像Cacti这样的网络监控工具用这些数据来生成图标以达到监控的目的。在一个典型的Cacti和SNMP部署中，会有一台或多台启用了SNMP的设备，以及一台独立的用来从那些设备收集SNMP回馈的监控服务器。请记住，所有需要监控的设备必须启用SNMP。在本教程中，出于演示目的，我们将在同一台Linux服务器上配置Cacti和SNMP。在Debian或Ubuntu上配置SNMP要在基于Debian的系统上安装SNMP代理（snmpd），请运行以下命令：root@server:~# apt-get install snmpd 然后，如下编辑配置文件。root@server:~# vim /etc/snmp/snmpd.conf # 使snmpd 监听再所有接口上 agentAddress udp:161 # 定义一个只读的 community 'myCommunity' 和源网络 rocommunity myCommunity 172.17.1.0/24 sysLocation Earth sysContact email@domain.tld 在编辑完配置文件后，重启snmpd。root@server:~# service snmpd restart 在CentOS或RHEL上配置SNMP要安装SNMP工具和库，请运行以下命令。root@server:~# sudo yum install net-snmp 然后，如下编辑SNMP配置文件。root@server:~# vim /etc/snmp/snmpd.conf # 定义一个使用 community 'myCommunity' 和源网络 172.17.1.0/24 的用户 'myUser' com2sec myUser 172.17.1.0/24 myCommunity # 将 myUser 加到 'myGroup' 组，定义组权限 group myGroup v1 myUser group myGroup v2c myUser view all included .1 access myGroup "" any noauth exact all all none root@server:~# service snmpd restart root@server:~# chkconfig snmpd on 重启snmpd服务，然后添加到启动服务列表。测试SNMPSNMP可以通过运行snmpwalk命令进行测试。如果SNMP已经配置成功，该命令会生成大量输出。root@server:~# snmpwalk -c myCommunity 172.17.1.44 -v1 iso.3.6.1.2.1.1.1.0 = STRING: "Linux mrtg 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64" iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.8072.3.2.10 iso.3.6.1.2.1.1.3.0 = Timeticks: (2097) 0:00:20.97 ~~ 输出截断 ~~ iso.3.6.1.2.1.92.1.1.2.0 = Gauge32: 1440 iso.3.6.1.2.1.92.1.2.1.0 = Counter32: 1 iso.3.6.1.2.1.92.1.2.2.0 = Counter32: 0 iso.3.6.1.2.1.92.1.3.1.1.2.7.100.101.102.97.117.108.116.1 = Timeticks: (1) 0:00:00.01 iso.3.6.1.2.1.92.1.3.1.1.3.7.100.101.102.97.117.108.116.1 = Hex-STRING: 07 DD 0B 12 00 39 27 00 2B 06 00 配置带有SNMP的Cacti在本教程中，我们将在同一台Linux服务器上设置Cacti和SNMP。所以，到刚刚配置SNMP的Linux服务器上去安装Cacti吧。安装完后，Cacti网页界面可以通过“http://172.17.1.44/cacti ”来访问，当然，在你的环境中，请将IP地址换成你的服务器的地址。安装过程中Cacti的路径一般都是正确的，但是如有必要，请再次检查以下。在首次安装过程中，Cacti默认的用户名和密码是“admin”和“admin”。在首次登录后会强制你修改密码。添加设备到Cacti并管理Cacti将根据先前配置的SNMP字符串注册设备。在本教程中，我们将只添加启用了SNMP的本地服务器。要添加设备，我们必须以管理员登录，然后转到Cacti管理员面板中的控制台。点击 控制台 > 设备。那里可能已经有一个名为‘localhost’的设备。我们不需要它，因为我们要创建全新的图表。我们可以将该设备从列表中删除，使用“添加”按钮来添加新设备。接下来，我们设置设备参数。现在设备已经添加，我们来指定想要创建的图表模板。你可以在该页面的最后部分中找到这块内容。然后，我们继续来创建图表。这里，我们创建用于平均负载、RAM和硬盘、处理器的图表。接口的图表和64位计数器默认情况下，Cacti在SNMP查询中使用32位计数器。32位计数器对于大多数带宽图表而言已经足够了，但是对于超过100Mbps的带宽，它就无能为力了。如果已经知道带宽会超过100Mbps，建议你使用64位计数器。使用64位计数器一点也不麻烦。注意： Cacti会花费大约15分钟来产生新图表，除了耐心等待，你别无选择。创建图表树这些截图展示了如何创建图表树，以及如何添加图表到这些树中。我们可以验证图表树中的图表。用户管理最后，我们创建一个只具有查看我们刚创建的图表权限的用户。Cacti内建了用户管理系统，而且是高度可定制的。在完成这些步骤后，我们可以使用‘user1’来登录进去，并验证只有该用户可以查看该图表。至此，我们在网络监控系统中部署了一台Cacti服务器。Cacti服务器比较稳定，可以处理大量图表而不会出问题。希望本文对你有所帮助。via: http://xmodulo.com/monitor-linux-servers-snmp-cacti.html作者：Sarmed Rahman 译者：GOLinux 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
Nagios内置了很多脚本来监控服务。本篇会使用其中一些来检查通用服务如MySql、Apache、DNS等等。为了保证本篇集中在系统监控，我们不会在这里配置主机组或者模板，它们已经在 前面的教程中覆盖了，它们可以满足需要了。在命令行中运行Nagios通常建议在添加到Nagios前，先在命令行中运行Nagios服务检测脚本。它会给出执行是否成功以及脚本的输出将会看上去的样子。这些脚本存储在 /etc/nagios-plugins/config/ ，可执行文件在 /usr/lib/nagios/plugins/。下面就是该怎么做root@nagios:~# cd /etc/nagios-plugins/config/ 提供的脚本包含了语法帮助。示例包含了部分输出。root@nagios:~# cat /etc/nagios-plugins/config/tcp_udp.cfg # 'check_tcp' command definition define command{ command_name check_tcp command_line /usr/lib/nagios/plugins/check_tcp -H '$HOSTADDRESS$' -p '$ARG1$' 了解了语法，TCP 80端口可以用下面的方法检查。root@nagios:~# /usr/lib/nagios/plugins/check_tcp -H 10.10.10.1 -p 80 TCP OK - 0.000 second response time on port 80|time=0.000222s;;;0.000000;10.000000 示例拓扑本片中使用下面三台服务器。每台服务器运行多个通用服务。Nagios服务器现在运行的是Ubuntu。Server 1 (10.10.10.1) : MySQL, Apache2Server 2 (10.10.10.2) : Postfix, Apache2Server 3 (10.10.10.3) : DNS首先，这些服务器被定义在了Nagios中。root@nagios:~# vim /etc/nagios3/conf.d/example.cfg define host{ use generic-host host_name test-server-1 alias test-server-1 address 10.10.10.1 } define host{ use generic-host host_name test-server-2 alias test-server-2 address 10.10.10.2 } define host{ use generic-host host_name test-server-3 alias test-server-3 address 10.10.10.3 } 监控MySQL服务MySQL 监控需要通过检查3306端口来检测MySQL是否运行中。检测特定的数据库'testDB'是否可用。MySQL 服务器设置开始检测MySQL时，需要记住MySQL默认只监听回环接口127.0.0.1。这增加了数据库的安全。手动调节需要告诉MySQL该监听什么其他接口。下面是该怎么做。这个设置要在所有的MySQL服务器上完成。root@nagios:~# vim /etc/mysql/my.cnf 下面这行被注释掉以监听所有网络接口。#bind-address = 127.0.0.1 同样，MySQL也不会让任意主机来连接它。需要为localhost和“任意”主机创建MySQL用户‘nagios’，接着在所有的数据库中为这个用户授予ALL权限，会这将在会用在监控中。下面的设置对所有的MySQL服务器都已经设置。root@nagios:~# mysql -u root –p ## MySQL root 密码 ## 在MySQL服务器中创建'nagios@localhost'用户。mysql> CREATE USER 'nagios'@'localhost' IDENTIFIED BY 'nagios-pass'; mysql> GRANT ALL PRIVILEGES ON *.* TO 'nagios'@'localhost'; 创建'nagios@任意主机'用户。（LCTT 译注：实际上这两个是同一个用户，只是分别授权给localhost和任意主机的访问；因为它们所用的密码的同一个，修改任何一个，另外一个也相应变化。）mysql> CREATE USER 'nagios'@'%' IDENTIFIED BY 'nagios-pass'; mysql> GRANT ALL PRIVILEGES ON *.* TO 'nagios'@'%'; mysql> FLUSH PRIVILEGES; 这使MySQL监听所有的网络接口，同样接受来自用户'nagios'的进入连接。请注意，这种修改可能有安全隐患，所以需要提示几点：这个设置将会暴露MySQL给所有的接口，包括外网。确保只有合法的网络访问是非常重要的。应该使用防火墙和TCP wrapper等过滤器。MySQL用户‘nagios’的密码应该非常强。如果只有几台Nagios服务器，那么应该创建'nagios@服务器名'用户而不是任意用户的'nagios@%'。对MySQL的Nagios配置按如下配置来做一些调整。root@nagios:~# vim /etc/nagios3/conf.d/services_nagios2.cfg define service{ use generic-service host_name test-server-1 ;hostgroup can be used instead as well service_description Check MYSQL via TCP port check_command check_tcp!3306 } define service{ use generic-service host_name test-server-1 ;hostgroup can be used instead as well service_description Check availability of database 'testDB' check_command check_mysql_database!nagios!nagios-pass!testDB ;check_mysql!userName!userPassword!databaseName } 这样，Nagios就可以同时监控MySQL服务器及其数据库的可用性。监控Apache服务器Nagios同样也可以监控Apache服务。Apache监控需要监控apache服务是否可用这个任务非常简单因为Nagios有一个内置命令。root@nagios:~# vim /etc/nagios3/conf.d/services_nagios2.cfg define service{ use generic-service host_name test-server-1, test-server-2 service_description Check Apache Web Server check_command check_http } 现在就非常简单了。监控DNS服务Nagios通过向DNS服务器查询一个完全限定域名（FQDN），或者使用dig工具来查询。默认用于查询的FQDN的是www.google.com，但是这个可以按需改变。按照下面的文件修改来完成这个任务。root@nagios:~# vim /etc/nagios-plugins/config/dns.cfg ## The -H portion can be modified to replace Google ## define command{ command_name check_dns command_line /usr/lib/nagios/plugins/check_dns -H www.google.com -s '$HOSTADDRESS$' } 编辑下面的行。root@nagios:~# vim /etc/nagios3/conf.d/services_nagios2.cfg ## Nagios asks server-3 to resolve the IP for google.com ## define service{ use generic-service host_name test-server-3 service_description Check DNS check_command check_dns } ## Nagios asks server-3 to dig google.com ## define service{ use generic-service host_name test-server-3 service_description Check DNS via dig check_command check_dig!www.google.com } 监控邮件服务器Nagios可以监控不同的邮件服务组件如SMTP、POP、IMAP和mailq。之前提过，server-2设置了Postfix邮件服务。Nagios将被配置来监控SMTP和邮件队列。root@nagios:~# vim /etc/nagios3/conf.d/services_nagios2.cfg define service{ use generic-service host_name test-server-2 service_description Check SMTP check_command check_smtp } define service{ use generic-service host_name test-server-2 service_description Check Mail Queue check_command check_mailq_postfix!50!100 ;warning at 50, critical at 100 } 下面的截屏显示了目前配置监控服务的概览。基于端口自定义监控程序让我们假设如下定制程序同样运行在网络中，监听着一个特定的端口。测试1号服务器：定制程序（TCP端口 12345）做一些小的调整，Nagios也可以帮助我们监控这个程序。root@nagios:~# vim /etc/nagios3/conf.d/services_nagios2.cfg define service{ use generic-service host_name test-server-1 service_description Check server 1 custom application check_command check_tcp!12345 } 在结束之前的提示，Nagios可以监控网络很多其他的方面。存储在/etc/nagios-plugins/config/中的脚本为Nagios提供了很棒的能力。一些Nagios提供的脚本被仅限于本地服务器，比如，服务器负载、进程并发数量、登录用户数量等。这些检查可以提供Nagios服务器内有用的信息。希望这篇文章对你有用。via: http://xmodulo.com/monitor-common-services-nagios.html作者：Sarmed Rahman 译者：geekpi 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
网络时间协议(NTP)用来同步网络上不同主机的系统时间。你管理的所有主机都可以和一个指定的被称为 NTP 服务器的时间服务器同步它们的时间。而另一方面，一个 NTP 服务器会将它的时间和任意公共 NTP 服务器，或者你选定的服务器同步。由 NTP 管理的所有系统时钟都会同步精确到毫秒级。在公司环境中，如果他们不想为 NTP 传输打开防火墙，就有必要设置一个内部 NTP 服务器，然后让员工使用内部服务器而不是公共 NTP 服务器。在这个指南中，我们会介绍如何将一个 CentOS 系统配置为 NTP 服务器。在介绍详细内容之前，让我们先来简单了解一下 NTP 的概念。为什么我们需要 NTP?由于制造工艺多种多样，所有的(非原子)时钟并不按照完全一致的速度行走。有一些时钟走的比较快而有一些走的比较慢。因此经过很长一段时间以后，一个时钟的时间慢慢的和其它的发生偏移，这就是常说的 “时钟漂移” 或 “时间漂移”。为了将时钟漂移的影响最小化，使用 NTP 的主机应该周期性地和指定的 NTP 服务器交互以保持它们的时钟同步。在不同的主机之间进行时间同步对于计划备份、入侵检测记录、分布式任务调度或者事务订单管理来说是很重要的事情。它甚至应该作为日常任务的一部分。NTP 的层次结构NTP 时钟以层次模型组织。层级中的每层被称为一个 stratum（阶层）。stratum 的概念说明了一台机器到授权的时间源有多少 NTP 跳。Stratum 0 由没有时间漂移的时钟组成，例如原子时钟。这种时钟不能在网络上直接使用。Stratum N (N > 1) 层服务器从 Stratum N-1 层服务器同步时间。Stratum N 时钟能通过网络和彼此互联。NTP 支持多达 15 个 stratum 的层级。Stratum 16 被认为是未同步的，不能使用的。准备 CentOS 服务器现在让我们来开始在 CentOS 上设置 NTP 服务器。首先，我们需要保证正确设置了服务器的时区。在 CentOS 7 中，我们可以使用 timedatectl 命令查看和更改服务器的时区(比如，"Australia/Adelaide"，LCTT 译注：中国可设置为 Asia/Shanghai )# timedatectl list-timezones | grep Australia # timedatectl set-timezone Australia/Adelaide # timedatectl 继续并使用 yum 安装需要的软件# yum install ntp 然后我们会添加全球 NTP 服务器用于同步时间。# vim /etc/ntp.conf server 0.oceania.pool.ntp.org server 1.oceania.pool.ntp.org server 2.oceania.pool.ntp.org server 3.oceania.pool.ntp.org 默认情况下，NTP 服务器的日志保存在 /var/log/messages。如果你希望使用自定义的日志文件，那也可以指定。logfile /var/log/ntpd.log 如果你选择自定义日志文件，确保更改了它的属主和 SELinux 环境。# chown ntp:ntp /var/log/ntpd.log # chcon -t ntpd_log_t /var/log/ntpd.log 现在初始化 NTP 服务并确保把它添加到了开机启动。# systemctl restart ntp # systemctl enable ntp 验证 NTP Server 时钟我们可以使用 ntpq 命令来检查本地服务器的时钟如何通过 NTP 同步。下面的表格解释了输出列。 remote源在 ntp.conf 中定义。‘*’ 表示当前使用的，也是最好的源；‘+’ 表示这些源可作为 NTP 源；‘-’ 标记的源是不可用的。refid用于和本地时钟同步的远程服务器的 IP 地址。stStratum（阶层）t类型。 'u' 表示单播(unicast)。其它值包括本地(local)、多播(multicast)、广播(broadcast)。when自从上次和服务器交互后经过的时间(以秒数计)。poll和服务器的轮询间隔，以秒数计。reach表示和服务器交互是否有任何错误的八进制数。值 337 表示 100% 成功（即十进制的255）。delay服务器和远程服务器来回的时间。offset我们服务器和远程服务器的时间差异，以毫秒数计。jitter两次取样之间平均时差，以毫秒数计。控制到 NTP 服务器的访问默认情况下，NTP 服务器允许来自所有主机的查询。如果你想过滤进来的 NTP 同步连接，你可以在你的防火墙中添加规则过滤流量。# iptables -A INPUT -s 192.168.1.0/24 -p udp --dport 123 -j ACCEPT # iptables -A INPUT -p udp --dport 123 -j DROP 该规则允许从 192.168.1.0/24 来的 NTP 流量(端口 UDP/123)，任何其它网络的流量会被丢弃。你可以根据需要更改规则。配置 NTP 客户端1. LinuxNTP 客户端主机需要 ntpupdate 软件包来和服务器同步时间。可以轻松地使用 yum 或 apt-get 安装这个软件包。安装完软件包之后，用服务器的 IP 地址运行下面的命令。# ntpdate <server-IP-address> 基于 RHEL 和 Debian 的系统命令都相同。2. Windows如果你正在使用 Windows，在日期和时间设置(Date and Time settings)下查找网络时间(Internet Time)。3. Cisco 设备如果你想要同步 Cisco 设备的时间，你可以在全局配置模式下使用下面的命令。# ntp server <server-IP-address> 来自其它厂家的支持 NTP 的设备有自己的用于网络时间的参数。如果你想将设备和 NTP服务器同步时间，请查看设备的说明文档。结论总而言之，NTP 是在你的所有主机上同步时钟的一个协议。我们已经介绍了如何设置 NTP 服务器并使支持 NTP 的设备和服务器同步时间。希望能对你有所帮助。via: http://xmodulo.com/setup-ntp-server-centos.html作者：Sarmed Rahman 译者：ictlyh 校对：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/30router-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中国 荣誉推出
系统管理员（sysadmins）负责日常维护生产系统和服务。其中一个关键任务就是保证功能性服务能24小时工作。为了这个，他们得很小心地计划备份方式，灾难管理策略，定时维护，安全审查，等等。和任意其他管理一样，系统管理员也有他们的必备工具。在正确的时间正确的情况下使用合适的工具，可以帮助维护操作系统的健壮，达到最小的服务中断时间和最大的运行时间。这篇文章会介绍一些系统管理员日常活动中最常用和有效的命令行工具。如果你想推荐其他没在这里列出来的好用的工具，别忘了在评论区里分享一下。网络工具ping：通过ICMP回应/回复报文来检查远端主机的端到端连接性（RTT延时，抖动，丢包）。用来检查系统状态和可连接性很不错。hping：网络扫描和检测工具，可以产生ICMP/TCP/UDP ping数据包。常常用于高级端口扫描，防火墙测试，手动MTU路径发现和碎片测试。traceroute：通过TTL限定的ICMP/UDP/TCP侦测包来发现从本地主机到远端目标主机之间的第三层转发路径。用来调试网络连接性和路由问题。mtr：traceroute的一个变种，能根据运行时统计数据整理出每一跳的包丢失/抖动。用来评估路由路径延时很不错。netcat/socat：TCP/IP网络里的瑞士军刀，可以读/写 TCP/UDP 协议字节流。用来调试防火墙策略和服务可用性很不错。dig：DNS调试工具，可以生成正向查询，反向查询，搜索域名服务器，检查CNAME，MX和其他DNS记录。可以在侦错的时候查询特定的DNS服务器。nslookup：另外一个DNS检查/调试工具。支持所有DNS查询和记录。可以查询特定DNS服务器。dnsyo：一个DNS测试工具，通过对全世界1500个不同网络中的大量开放解析器执行DNS查询来测试DNS传输。lsof：显示进程打开的文件信息（例如，普通文件，管道或套接字）。用来监视网络连接很不错。iftop：一个基于ncurses的命令行界面应用，可以实时监视各个网络物理接口上的网络连接和带宽占用。用来记录霸占带宽的应用、用户、目的地和端口等很不错。netstat：一个网络统计工具，可以显示状态以及统计信息，当前网络连接（TCP/UDP端口，IP地址）、路由表、TX/RX traffic以及网络协议。用来做网络相关诊断和性能调试很不错。tcpdump：一个常用的基于libpcap抓包库的包侦测工具。可以按伯克利包过滤器格式定义抓包条件。tshark：另一个命令行抓包工具，和它的GUI版本Wireshark完全兼容。支持1000种协议而且这个列表还在增加。用来调试、分析和保存实时网络封包信息很不错。ip：一个多功能的命令行网络工具，是iproute2包的一部分。可以检查和修改路由表、网络设备状态以及IP隧道设置。用来查看路由表、增加/删除静态路由、配置网络接口、以及调试路由问题很有用。ifup/ifdown：用来激活和关闭特定的网络接口。经常用于重启整个网络服务。autossh：一个能建立SSH连接并在断线后自动重新连接的程序。用来创建长时间保持的穿越严格企业网络的SSH隧道很有用。iperf：一个网络测试工具，通过在发送自定义TCP/UDP数据流来衡量主机间双向最大吞吐量。elinks/lynx：为基于命令行的服务器环境下使用的基于文字的网页浏览器。安全工具iptables：一个用户空间下的命令行工具，用于配置Linux内核防火墙。可以创建和修改Linux内核空间的网络包接收、转发和发送规则。nmap：一个常用的为了安全审查目的的端口扫描和网络发现工具。用来在本地网络中找出哪些主机开机并运行起来了以及某台特定主机打开了哪些端口很有用。TCP Wrappers：一个主机端的网络访问控制列表工具，可以过滤进入/出去的网络请求/回复。经常配合iptables一起使用，作为额外一层安全保护。getfacl/setfacl：查看和定制文件和目录的访问控制列表，作为传统文件权限的扩展。cryptsetup：用于创建和管理LUKS加密磁盘分区。lynis：一个命令行的漏洞扫描工具。可以扫描整个Linux系统，并汇报潜在的漏洞以及相关可能解决方案。maldet：一个恶意软件扫描命令行工具，可以检测和隔离潜在的感染文件。可以在后台运行长期监视。rkhunter/chkrootkit：一个命令行工具，可以扫描本地系统里的潜在木马、隐藏后门和可疑利用，并禁用它们。存储工具fdisk：一个磁盘分区编辑工具。用于查看、创建和修改本地磁盘或可移动磁盘的分区。sfdisk：fdisk的一个变种，能用一种非交互的方式访问或更新磁盘分区表。用来自动化备份和恢复过程中的磁盘分区很有用。parted：另一个磁盘分区编辑器，支持超过2TB的磁盘的GPT（GUID分区表）格式。gparted是parted的一个前端GTK+图形界面。df：用来查看不同分区或文件路径的已用/可用存储空间和挂载点。还有一个更易用的变种dfc。du：用来查看不同文件和目录的当前磁盘占用情况（例如，du -sh *）。mkfs：一个磁盘格式化命令，用来在独立磁盘分区上建立文件系统。有多个文件系统相关的版本：ext2、ext3、ext4、bfs、ntfs、vfat/fat。fsck：一个命令行工具，用来检查文件系统错误并尝试可能的修复。通常在启动时自动运行，但是在卸载一个分区后也可以根据需要手动运行。mount：用来映射一个物理磁盘分区、网络共享或远程存储到一个本地挂载点。任何对挂载点里的读/写操作都是对应实际存储的实际数据读/写。mdadm：一个命令行工具，用来管理物理块设备上的软件RAID设备。可以创建、构造、增长或监视RAID阵列。lvm：一套命令行工具集，用来管理卷分组和物理/逻辑卷，可以用最小的停机时间在多个物理磁盘上创建、调整大小、拆分和合并卷。日志访问工具tail：用来查看一个（增长中的）日志文件的尾部。有几个变种，包括multitail（多窗口查看）和ztail（支持inotify和正则表达式过滤以及颜色）。logrotate：一个命令行工具，可以在根据设定的时间段拆分、压缩并通过邮件发送旧的/大的日志文件。用来管理可能产生大量日志文件的繁忙主机很有用。grep/egrep：可以通过特定的模式或正则表达式过滤日志内容。变种包括用户更友好的ack和速度更快的ag。awk：一个多功能的文本扫描和处理工具。常用于从文本/日志文件中找出特定的列或内容，并输出给其他工具。sed：一个文本流编辑工具，可以过滤和改变（例如，删除行/空格、替换/转换单词、增加计数）文本流并通过管道连接到stdout/stderr或者其他工具。备份工具rsync：一个快速的单向增量备份和镜像工具（LCTT 译注：rsync 应是双向的）。常用于复制一个数据仓库到线下存储，可以选择通过SSH或stunnel的加密连接。rdiff-backup：另一个有效利用带宽的增量备份工具。管理两个连续快照之间的差分。duplicity：一个加密的增量备份工具。使用GnuPG加密备份，并通过SSH上传到远程服务器。性能监视工具top：一个命令行的进程查看程序。可以监视系统负载、进程状态、CPU和内存占用。有一个更易用的变种htop。ps：显示系统所有运行中进程的一个快照。输出可以定制成显示PID、PPID、用户、负载、内存、积累的用户/系统时间、启动时间、以及更多。有一个变种pstree可以用树结构显示进程。nethogs：一个带宽监视工具，按进程来分组显示活动网络连接，实时汇报每个进程占用的（上传/下载）带宽。ngxtop：一个网页服务器访问日志解析和监视工具，界面受到了top命令启发。它可以实时汇报整理过的页面请求列表，包括频率、大小、HTTP返回值、IP地址，等等。vmstat：一个简单的命令行工具，可以显示多个实时系统特征，例如进程数、剩余内存、分页状态、CPU占用、块设备I/O活动、中断/上下文切换统计、等等。iotop：一个基于ncurses的I/O监视工具，可以实时排序显示所有运行中进程的磁盘I/O活动。iostat：一个命令行工具，可以汇报当前CPU使用情况，以及设备I/O使用情况，这里的I/O使用情况（例如，块传输速度、字节读/写速度）是按设备或分区来汇报的。效率工具screen：用来把一个单一的终端拆分成多个持久的虚拟终端，也支持远程用户访问，类似teamviewer的屏幕分享功能。tmux：另一个终端复用工具，可以支持多个长期会话，还可以横向/纵向拆分终端。cheat：一个简单的命令行工具，可以让你查看多个常用Linux命令的备忘录，就在手边非常方便。内建的备忘录也可以完全定制。apropos：用来在帮助手册里查找描述或关键字很有用。包管理工具apt：基于Debian系统的事实上的包管理工具，例如Debian、Ubuntu或Backtrack。一个救生圈。apt-fast：apt-get的一个支撑应用，可以通过多个并行连接明显提高apt-get的下载速度。apt-file：用来查看某个特定文件属于哪个.deb包，或者显示一个特定.deb包里的所有文件。已安装和未安装的包都能支持。dpkg：一个用来手动安装.deb包的命令行工具。强烈建议尽可能的使用apt。yum：用于基于红帽的系统的自动包管理工具，比如RHEL、CentOS或Fedora。这是另一个救生圈！rpm：通常我都是使用 rpm 来配合 yum 使用。有很多有用的参数，比如-q、-f、-l可以分别用来查询、指定文件和路径。硬件工具lspci：一个命令行工具，可以显示已安装的PCI设备的各种信息，比如型号名称、设备驱动、设备功能、内存地址、PCI总线地址。lshw：一个命令行工具，可以查询和显示不同分类下的硬件配置的详细信息（例如，处理器、内存、主板、网络、存储）。支持多重输出格式：html、xml、json、text。inxi：一个综合硬件查看工具，可以提供不同硬件模块的总览，例如CPU，显卡，声卡，网卡，温度/风扇传感器，等等。如果你希望推荐没有列在这里的好用的工具，不要客气，在评论区里分享一下。via: http://xmodulo.com/2014/08/useful-cli-tools-linux-system-admins.html作者：Sarmed Rahman 译者：zpl1025 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
Quagga是一个开源路由软件套件，可以将Linux变成支持如RIP、OSPF、BGP和IS-IS等主要路由协议的路由器。它具有对IPv4和IPv6的完整支持，并支持路由/前缀过滤。Quagga可以是你生命中的救星，以防你的生产路由器一旦宕机，而你没有备用的设备而只能等待更换。通过适当的配置，Quagga甚至可以作为生产路由器。本教程中，我们将连接假设之间具有专线连接的两个分支机构网络（例如，192.168.1.0/24和172.17.1.0/24）。我们的CentOS位于所述专用链路的两端。两台主机名分别设置为“site-A-RTR”和“site-B-RTR'。下面是IP地址的详细信息。Site-A: 192.168.1.0/24Site-B: 172.16.1.0/24两个 Linux 路由器之间的对等网络: 10.10.10.0/30Quagga包括了几个协同工作的守护进程。在本教程中，我们将重点建立以下守护进程。Zebra: 核心守护进程，负责内核接口和静态路由。Ospfd: IPv4 OSPF 守护进程。在CentOS上安装Quagga我们使用yum安装Quagga。# yum install quagga 在CentOS7，SELinux默认会阻止quagga将配置文件写到/usr/sbin/zebra。这个SELinux策略会干扰我们接下来要介绍的安装过程，所以我们要禁用此策略。对于这一点，无论是关闭SELinux（这里不推荐），还是如下启用“zebrawriteconfig”都可以。如果你使用的是CentOS 6的请跳过此步骤。# setsebool -P zebra_write_config 1 如果没有做这个修改，在我们尝试在Quagga命令行中保存配置的时候看到如下错误。Can't open configuration file /etc/quagga/zebra.conf.OS1Uu5. 安装完Quagga后，我们要配置必要的对等IP地址，并更新OSPF设置。Quagga自带了一个命令行称为vtysh。vtysh里面用到的Quagga命令与主要的路由器厂商如思科和Juniper是相似的。步骤 1: 配置 Zebra我们首先创建Zebra配置文件，并启用Zebra守护进程。# cp /usr/share/doc/quagga-XXXXX/zebra.conf.sample /etc/quagga/zebra.conf # service zebra start # chkconfig zebra on 启动vtysh命令行：# vtysh 首先，我们为Zebra配置日志文件。输入下面的命令进入vtysh的全局配置模式：site-A-RTR# configure terminal 指定日志文件位置，接着退出模式：site-A-RTR(config)# log file /var/log/quagga/quagga.log site-A-RTR(config)# exit 永久保存配置：site-A-RTR# write 接下来，我们要确定可用的接口并按需配置它们的IP地址。site-A-RTR# 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 10.10.10.1/30 site-A-RTR(config-if)# description to-site-B site-A-RTR(config-if)# no shutdown 继续配置eth1参数：site-A-RTR(config)# interface eth1 site-A-RTR(config-if)# ip address 192.168.1.1/24 site-A-RTR(config-if)# description to-site-A-LAN site-A-RTR(config-if)# no shutdown 现在验证配置:site-A-RTR(config-if)# do show interface Interface eth0 is up, line protocol detection is disabled . . . . . inet 10.10.10.1/30 broadcast 10.10.10.3 . . . . . Interface eth1 is up, line protocol detection is disabled . . . . . inet 192.168.1.1/24 broadcast 192.168.1.255 . . . . . site-A-RTR(config-if)# do show interface description Interface Status Protocol Description eth0 up unknown to-site-B eth1 up unknown to-site-A-LAN 永久保存配置:site-A-RTR(config-if)# do write 在site-B上重复上面配置IP地址的步骤。如果一切顺利，你应该可以在site-A的服务器上ping通site-B上的对等IP地址10.10.10.2了。注意：一旦Zebra的守护进程启动了，在vtysh命令行中的任何改变都会立即生效。因此没有必要在更改配置后重启Zebra守护进程。步骤 2: 配置OSPF我们首先创建OSPF配置文件，并启动OSPF守护进程：# cp /usr/share/doc/quagga-XXXXX/ospfd.conf.sample /etc/quagga/ospfd.conf # service ospfd start # chkconfig ospfd on 现在启动vtysh命令行来继续OSPF配置：# vtysh 输入路由配置模式:site-A-RTR# configure terminal site-A-RTR(config)# router ospf 可选配置路由id:site-A-RTR(config-router)# router-id 10.10.10.1 添加在OSPF中的网络:site-A-RTR(config-router)# network 10.10.10.0/30 area 0 site-A-RTR(config-router)# network 192.168.1.0/24 area 0 永久保存配置:site-A-RTR(config-router)# do write 在site-B上重复和上面相似的OSPF配置:site-B-RTR(config-router)# network 10.10.10.0/30 area 0 site-B-RTR(config-router)# network 172.16.1.0/24 area 0 site-B-RTR(config-router)# do write OSPF的邻居现在应该启动了。只要ospfd在运行，通过vtysh的任何OSPF相关配置的改变都会立即生效而不必重启ospfd。下一节，我们会验证我们的Quagga设置。验证1. 通过ping测试首先你应该可以从site-A ping同site-B的LAN子网。确保你的防火墙没有阻止ping的流量。[root@site-A-RTR ~]# ping 172.16.1.1 -c 2 2. 检查路由表必要的路由应该同时出现在内核与Quagga理由表中。[root@site-A-RTR ~]# ip route 10.10.10.0/30 dev eth0 proto kernel scope link src 10.10.10.1 172.16.1.0/30 via 10.10.10.2 dev eth0 proto zebra metric 20 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.1 [root@site-A-RTR ~]# vtysh site-A-RTR# show ip route Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF, I - ISIS, B - BGP, > - selected route, * - FIB route O 10.10.10.0/30 [110/10] is directly connected, eth0, 00:14:29 C>* 10.10.10.0/30 is directly connected, eth0 C>* 127.0.0.0/8 is directly connected, lo O>* 172.16.1.0/30 [110/20] via 10.10.10.2, eth0, 00:14:14 C>* 192.168.1.0/24 is directly connected, eth1 3. 验证OSPF邻居和路由在vtysh命令行中，你可以检查必要的邻居是否在线与是否已经学习了合适的路由。[root@site-A-RTR ~]# vtysh site-A-RTR# show ip ospf neighbor 本教程中，我们将重点放在使用Quagga配置基本的OSPF。在一般情况下，Quagga能让我们能够轻松在一台普通的Linux机器上配置动态路由协议，如OSPF、RIP或BGP。启用了Quagga的机器可以与你网络中的其他路由器进行通信和交换路由信息。由于它支持主要的开放标准的路由协议，它或许是许多情况下的首选。更重要的是，Quagga的命令行界面与主要路由器厂商如思科和Juniper几乎是相同的，这使得部署和维护Quagga机器变得非常容易。希望这些对你们有帮助。via: http://xmodulo.com/turn-centos-box-into-ospf-router-quagga.html作者：Sarmed Rahman 译者：geekpi 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出