Quagga上使用验证加固BGP会话安全

Quagga上使用验证加固BGP会话安全

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-A 100 10.10.12.1/30
router-B 200 10.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’。


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

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

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

配置Router-B验证功能

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


  1. [root@router-b ~]# vtysh
  2. router-b# conf t
  3. router-b(config)# router bgp 200
  4. router-b(config-router)# network 192.168.200.0/24
  5. router-b(config-router)# neighbor 10.10.12.1 remote-as 100
  6. 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会话的时候。预共享密钥也应该安全地保存。

原文发布时间:2015-05-27

本文来自云栖合作伙伴“linux中国”

时间: 2024-08-03 14:10:49

Quagga上使用验证加固BGP会话安全的相关文章

servlet ajax-怎么用servlet获取oracle数据库信息后传递到jquery的ajax上进行验证

问题描述 怎么用servlet获取oracle数据库信息后传递到jquery的ajax上进行验证 package com.ibm.ajax.app1.entity; public class WebUser { private String uname; public WebUser(String uname){ this.uname=uname; } public String getUname() { return uname; } public void setUname(String u

为何html5的input type="email"在pc上可以验证,在iphone上没效果?

问题描述 为何html5的input type="email"在pc上可以验证,在iphone上没效果? 有谁知道为何吗 解决方案 不同的浏览器显示出来的行为有些不同.iOS显示应该是没问题的.

表单正则验证及文件上传验证功能

表单正则验证主要是用来对表单提交信息的过滤,防止sql注入(比如登录界面),上传的文件也需要进行文件名后缀和大小进行验证,下面是一个简单的表单验证 header("Content-type:text/html;charset=utf-8"); $user = isset($_POST['user'])?$_POST['user']:null; $password = isset($_POST['password'])?$_POST['password']:null; $arr = ar

阿里云ECS服务器CentOS7上系统安全加固

阿里云ECS服务器CentOS7上系统安全加固 ---------------------------------------------- 使用root登录 1.确保服务器系统处于最新状态 [root@localhost ~]# yum -y update 如果显示以下内容说明已经更新完成 Complete! 2.重启服务器 [root@localhost ~]# reboot # 寻找空密码的用户 [root@localhost ~]# awk -F: '($2==""){prin

django 文件上传 验证-django文件上传的格式验证问题,在线等!

问题描述 django文件上传的格式验证问题,在线等! 用django写入个文件上传的页面,需要上传文件名称和文件,且文件名只能为数字: class uploadForm(forms.Form): name = forms.IntegerField() headImg = forms.FileField() 遇到一个问题: 当上传的文件很大时,需要等文件上传完成后才会去验证文件名的格式是否为数字,如果 文件名不是纯数字上传就失败了,又得花很长时间重新上传,这显然是不合理的, django有什么方

如何获取环信服务器上的当前用户的会话列表?

问题描述 loadAllConversationsFromDatabaseWithAppend2Chat 只能获取数据库里面的  假如数据库里面没有呢? 解决方案 本地数据库没有就获取不到,客户端不能获取到环信服务器中的聊天记录,暂不支持消息漫游,后续可能会开发,敬请关注.

Linux下加强BGP路由协议

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

如何在 Quagga BGP 路由器中设置 IPv6 的 BGP 对等体和过滤

在之前的教程中,我们演示了如何使用Quagga建立一个完备的BGP路由器和配置前缀过滤.在本教程中,我们会向你演示如何创建IPv6 BGP对等体并通过BGP通告IPv6前缀.同时我们也将演示如何使用前缀列表和路由映射特性来过滤通告的或者获取到的IPv6前缀. 拓扑 教程中,我们主要参考如下拓扑. 服务供应商A和B希望在他们之间建立一个IPv6的BGP对等体.他们的IPv6地址和AS信息如下所示. 对等体IP块: 2001:DB8:3::/64 供应商A: AS 100, 2001:DB8:1::

如何使用 Quagga BGP(边界网关协议)路由器来过滤 BGP 路由

在之前的文章中,我们介绍了如何使用 Quagga 将 CentOS 服务器变成一个 BGP 路由器,也介绍了 BGP 对等体和前缀交换设置.在本教程中,我们将重点放在如何使用前缀列表prefix-list和路由映射route-map来分别控制数据注入和数据输出. 之前的文章已经说过,BGP 的路由判定是基于前缀的收取和前缀的广播.为避免错误的路由,你需要使用一些过滤机制来控制这些前缀的收发.举个例子,如果你的一个 BGP 邻居开始广播一个本不属于它们的前缀,而你也将错就错地接收了这些不正常前缀,