BGP认证功能
一. 原理概述
BGP是一种运行在AS之间的动态路由协议,具备强大的路径选择能力,这也使得BGP协议能够管理超大型网络。对于大型网络来说,路由的稳定性和安全性尤为重要。路由协议的报文一般都是明文发送的,如果网络攻击者伪造路由更新报文,或者篡改路由更新报文,就会造成严重的网络安全问题。因此在实际部署各种路由协议时,通常会配置认证功能。所谓认证,就是指路由器对路由信息来源的可靠性及路由信息本身的完整性进行检测的机制。
BGP支持简单的密码认证方式,也支持安全性更高的MD5认证方式。如果是MD5认证方式,路由器会根据BGP报文的某些字段和密钥计算出一个128比特的散列值,然后将BGP报文连同散列值发送给邻居。邻居路由器收到之后,会在本地基于接收到的BGP报文和相同的密钥再进行一次Hash运算。如果计算出的散列值与接收到的散列值相同,则认证通过,邻居关系能够正常建立;如果不同,则认证不通过,邻居关系就不会建立,且收到的BGP报文会被丢弃。
二. 实验拓扑图
三. 实验配置
3.1 接口IP地址配置
[R1]interface LoopBack0
[R1-LoopBack0]ip address 10.0.1.1 32
[R1]in g0/0/0
[R1-GigabitEthernet0/0/0]ip add 10.0.12.1 24
[R2]interface LoopBack0
[R2-LoopBack0]ip address 10.0.2.2 32
[R2]in g0/0/0
[R2-GigabitEthernet0/0/0]ip add 10.0.12.2 24
[R2]in g0/0/1
[R2-GigabitEthernet0/0/1]ip add 10.0.23.2 24
[R3]interface LoopBack0
[R3-LoopBack0]ip address 10.0.3.3 32
[R3]in g0/0/0
[R3-GigabitEthernet0/0/0]ip add 10.0.23.3 24
3.2 配置BGP路由协议
[R1]bgp 100
[R1-bgp]router-id 1.1.1.1
[R1-bgp]peer 10.0.12.2 as-number 100
[R2]bgp 100
[R2-bgp]router-id 2.2.2.2
[R2-bgp]peer 10.0.12.1 as-number 100
[R2-bgp]peer 10.0.23.3 as-number 200
[R3]bgp 200
[R3-bgp]router-id 3.3.3.3
[R3-bgp]peer 10.0.23.2 as-number 100
在R2上查看BGP邻居关系:发现路由器之间都已经建立起邻居关系了
3.3 配置基于单一秘钥的BGP认证功能
对端必须配置一样的密码才行,否则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 密文加密
使用cipher密文加密的方式是看不到密码的:
使用simper明文加密的方式是可以看到密码的:
3.4 配置基于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]keychain key mode periodic daily
[R1-keychain]key-id 1
[R1-keychain-keyid-1]algorithm md5
[R1-keychain-keyid-1]key-string huawei
[R1-keychain-keyid-1]send-time daily 08:00 to 23:00
[R1-keychain-keyid-1]receive-time daily 08:00 to 23:00
[R1]bgp 100
[R1-bgp]undo peer 10.0.12.2 password
[R1-bgp]peer 10.0.12.2 keychain key
[R2]keychain key mode periodic daily
[R2-keychain]key-id 1
[R2-keychain-keyid-1]algorithm md5
[R2-keychain-keyid-1]key-string huawei
[R2-keychain-keyid-1]send-time daily 08:00 to 23:00
[R2-keychain-keyid-1]receive-time daily 08:00 to 23:00
[R2]bgp 100
[R2-bgp]undo peer 10.0.12.1 password
[R2-bgp]peer 10.0.12.2 keychain key
配置完成后;查看R1的BGP邻居关系表:已经建立与R2的邻居关系
两台路由器上使用 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连接也是不会中断的。