BGP是一种运行在AS之间的动态路由协议,具备强大的路径选择能力,这也使得BGP协议能够管理超大型网络。对于大型网络来说,路由的稳定性和安全性尤为重要。路由协议的报文一般都是明文发送的,如果网络攻击者伪造路由更新报文,或者篡改路由更新报文,就会造成严重的网络安全问题。因此在实际部署各种路由协议时,通常会配置认证功能。所谓认证,就是指路由器对路由信息来源的可靠性及路由信息本身的完整性进行检测的机制。
BGP支持简单的密码认证方式,也支持安全性更高的MD5认证方式。如果是MD5认证方式,路由器会根据BGP报文的某些字段和密钥计算出一个128比特的散列值,然后将BGP报文连同散列值发送给邻居。邻居路由器收到之后,会在本地基于接收到的BGP报文和相同的密钥再进行一次Hash运算。如果计算出的散列值与接收到的散列值相同,则认证通过,邻居关系能够正常建立;如果不同,则认证不通过,邻居关系就不会建立,且收到的BGP报文会被丢弃。
本实验使用3台路由器,R1和R2属于ISP-A的网络,AS编号为100,R3属于ISP-B的网络,AS编号为200。R1与R2建立IBGP邻居关系,R2与R3建立EBGP邻居。为了保证BGP邻居之间发送的BGP路由信息的完整性,决定在BGP邻居之间配置认证功能 。
配置BGP路由协议。R1、R2、R3 的Router-id 分别为1.1.1.1、2.2.2.2、3.3.3.3。R1与R2属于AS100,R3属于AS200,使用直连接口的IP地址来建立BGP邻居。
查看BGP的邻居关系。(状态为Established 邻居关系已经建立)
接下来在R1、R2、R3配置一条单一的密钥BGP认证功能。
[R1]bgp 100
[R1-bgp]peer 10.0.12.2 password simple huawei
[R2]bgp 100
[R2-bgp]peer 10.0.12.1 password simple huawei
[R2-bgp]peer 10.0.23.3 password simple huawei
[R3]bgp 200
[R3-bgp]peer 10.0.23.2 password cipher huawei
查看R2的BGP邻居关系。
可以看到R2与R1、R3建立了邻居关系。虽然R2使用的是Simple方式,R3使用的是Cipher方式,但这并不影响R2与R3建立邻居关系,这是由于Cipher和Simple 两种方式仅仅区别在于:设备在储存密钥时,使用Cipher 方式后的密钥将会被加密,而Simple 方式是明文显示的,可以查看到真实的密钥信息。
在R1、R2、R3上的BGP视图下使用 display this 命令查看当前的BGP认证配置。
可以看到,R2上的密钥显示是明文的,R3的认证密钥是密文的。
配置基于keychain 的BGP认证。上面实验中,BGP进行认证时使用的是一个固定的密钥,当需要变换密钥来增强安全性时,操作繁琐,还会造成BGP的中断。为此,可以使用基于 Keychain 的认证方式来实现密钥的周期性更换,并对众多密钥进行集中管理。使用Keychain 的方式可以定义密钥的存活期,但应该保证设备的时间一致,避免认证失败。实际场景中,通常使用NTP(Network Time Protocol)协议来保证时间的同步。
在Keychain 方式下定义密钥的存活期分为 Absolute 与 Periodic 两种模式。Absolute 模式下,密钥Key 的有效时间为一个绝对时间段;Periodic 模式下,一个Key 的有效时间为周期性的一段时间,分别为 Daily、Monthly、Weekly 和 Yearly 等。以Daily 为例,一个Key的有效时间为每一天的某一特定时间段。一个 Keychain 中可以有多个Key,最多可支持64个 Key-ID。
Key具有多个属性,包括Key-ID、认证算法、Key-String 以及 send-time 和 receive-time,其中 send-time 和 receive-time 用来定义 keychain 中某个 key-id 的Active 时间段。如果系统时间不在 send-time 或者 receive-time 时间内,则改 key-id 不会被使用。
接下来,在R1、R2上配置基于 keychain 的认证功能,key-id 为1,key-string为huawei,选用 periodic daily 模式,每天08:00到18:00使用key-id 1 对发送的BGP报文做Hash 运算,每天08:00到18:00使用key-id 对接收到的BGP报文进行认证。
查看R1的BGP邻居关系。
两台路由器上使用 keychain 认证时,应保证keychain的名称、key-id、algorithm和key-string 保持一致,任意一个参数不匹配都会导致认证失败。当一个key的某个属性不完整或系统时间不在定义的时间段内,key会处于Inactive 状态,不会被用来进行认证。另外,在一个keychain中,不同的key-id的send-time 时间不能重叠,但Receive-time时间可以重叠,保证在任何时间段内,BGP报文的发送方只使用一个key-id 所对应的key-string 对发送的BGP报文进行Hash值计算,接收方对接收到的BGP报文将使用在Receive-time 为Active 的且key-id 相同的key-string 来进行认证。如果认证设备之间的系统时间不一致,但使用的key-id相同,并且在自身设备上是 Active 的,认证也是可以通过的。
在R1上使用display keychain key命令查看keychain 的信息。
显示信息表明,Keychain 的名称为Key ,密钥的数量为1。显示信息还包括了处于活动状态的Key-ID 信息。
在没有NTP 来保证时间同步的情况下,尽管管理员可以手动调整时间来尽量保证时间的一致性,但这样做的精度很差。在这种情况下,可以使用下面的命令来配置接收容忍时间,避免由于时间不同步或则Key-ID 的变更过程中存在的时间延迟而导致BGP报文认证失败的情况。接收容忍时间只对接收端的Key有效,其原理就是延长了 Receive-Time 时间。
[R1-keychain]receive-tolerance infinite
infinite 表示容忍所有的时间延迟;也可以用某一具体的时间代替,单位是min,最大值是14400min。
为了避免在某一时刻没有活跃的 Key-ID 而导致 BGP没有认证交互的情况,可以使用命令 default send-key-id 指定一个缺省的发送Key-ID。一个 Key-ID 。一个 keychain 中最多只能有一个Key-ID 配置为缺省的发送 Key-ID。
当一个 keychain 中有多个Key-ID 时,可以合理地给不同的 Key-ID 设置不同的 Send-time 和 Receive-time,实现密钥的无缝隙周期性更换,并不会导致BGP邻居关系的中断。当然如果密钥的更换存在时间间隙,但缝隙不超过180s(一个 HoldTime周期),BGP连接也是不会中断的。