蚊章汇 - Sarmed Rahman
type: channel
link: https://linuxcn.bwsl.wang/author/102/
description: Sarmed Rahman
items: 如何使用 Quagga BGP（边界网关协议）路由器来过滤 BGP 路由
items: 如何在 Quagga BGP 路由器中设置 IPv6 的 BGP 对等体和过滤
items: 如何在 Cacti 中合并两幅图片
items: 使用 SNMP 和 Cacti 监控 Linux 服务器
items: 如何用 Nagios 监控通用服务
items: 如何在 CentOS 中设置 NTP 服务器
items: Quagga上使用验证加固BGP会话安全
items: 想玩 BGP 路由器么？用 CentOS 做一个
items: Linux系统管理员的命令行工具箱目录
items: 想玩路由器吗？使用 Quagga 将你的 CentOS 变成 OSPF 路由器

如何使用 Quagga BGP（边界网关协议）路由器来过滤 BGP 路由
type: item
date: 2015-10-26T21:53:00+08:00
description: 在之前的文章中，我们介绍了如何使用 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…

如何在 Quagga BGP 路由器中设置 IPv6 的 BGP 对等体和过滤
type: item
date: 2015-09-05T01:39:00+08:00
description: 在之前的教程中，我们演示了如何使用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:…

如何在 Cacti 中合并两幅图片
type: item
date: 2015-07-03T23:49:00+08:00
description: 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: ht…

使用 SNMP 和 Cacti 监控 Linux 服务器
type: item
date: 2015-07-03T17:35:00+08:00
description: 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字符串注册设备。在本教程中，我们将只…

如何用 Nagios 监控通用服务
type: item
date: 2015-07-03T00:33:41+08:00
description: 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 PRIV…

如何在 CentOS 中设置 NTP 服务器
type: item
date: 2015-06-07T05:40:31+08:00
description: 网络时间协议(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 同步连接，你可以在你的防火墙…

Quagga上使用验证加固BGP会话安全
type: item
date: 2015-05-28T00:17:52+08:00
description: 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 路由器么？用 CentOS 做一个
type: item
date: 2015-01-07T23:45:00+08:00
description: 在之前的教程中，我对如何简单地使用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 i…

Linux系统管理员的命令行工具箱目录
type: item
date: 2014-12-02T04:37:00+08:00
description: 系统管理员（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分区表）格式。gpa…

想玩路由器吗？使用 Quagga 将你的 CentOS 变成 OSPF 路由器
type: item
date: 2014-11-16T06:36:33+08:00
description: 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 …