致歉声明:前版博客由于博主个人对于BGP知识的理解出现偏差,导致路由黑洞产生的原因解释错误,误导大家,抱歉。
配置文件的百度网盘连接及提取码。 链接:https://pan.baidu.com/s/12h64cTLdezTZSsKaLFb8HQ 提取码:mqbk
1. 如图,搭建拓扑图设置好相应的接口IP地址,并保证直连接口可以互通,并设置网络中的路由器RX的回环口0的地址为X.X.X.X/32。如R1的回环口IP地址为1.1.1.1.
配置略
2. 根据拓扑图配置OSPF,实现OSPF网络能够互通。
OSPF基本配置
3. R1和R3利用环回口建立起iBGP邻居关系,R1和R4、R3和R5利用物理接口建立eBGP邻居关系,R4和R5将客户网络通告进BGP路由协议,分别在BGP路由器上查看对应的条目。
详见于基础配置实例
将R4和R5的客户端通告进BGP协议(IMPORT)
#
bgp 100
peer 10.1.14.1 as-number 200
#
ipv4-family unicast
undo synchronization
import-route direct //引入直连接口的网段
peer 10.1.14.1 enable
#
4. 检查R4和R5的客户网络的联通性并且分析其网络不通的原因。
5. 使用MPLS协议解决R4和R5的网络通信问题。
6. 查看MPLS的标签转发表,分析报文在运营商网络的通信过程
以AR1上的配置为例,建立BGP邻居(省略基础IP地址等配置)
bgp 200
peer 2.2.2.2 as-number 200
peer 2.2.2.2 connect-interface LoopBack0 //采用回环口IP地址建立IBGP邻居
peer 10.1.14.4 as-number 100 //采用直连接口建立EBGP邻居
#
ipv4-family unicast
undo synchronization
peer 2.2.2.2 enable
peer 2.2.2.2 next-hop-local //设置下一跳为本地接口。增加网络稳定性
peer 10.1.14.4 enable
#
//OSPF的配置
ospf 1
area 0.0.0.0
network 1.1.1.1 0.0.0.0
network 10.1.12.0 0.0.0.255
BGP中影响邻居建立的条件:
停留在Idle状态。
没有到达Peer的路由条目。
EBGP多跳。(不去发送TCP的建立连接报文)
停留在Connect或者Active状态。
源地址错误。(查看对端的IP地址是否是本地指定的邻居地址)
TCP的认证。(TCP MD5)
有到达peer的路由,但是路由错误。
过滤了TCP的报文。
注:在华为中如果是通过默认路由的方式到达邻居,那么该邻居通告的所有路由都为无效路由。
————————————————
版权声明:BGP中影响邻居建立的条件为CSDN博主「曹世宏的博客」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38265137/article/details/80438320
在AR1的G0/0/0端口上抓包
G0/0/0是AR1和AR4直连的端口,采用直连接口建立EBGP邻居关系,对应的源目端口分别为10.1.14.1和10.1.14.4
点开其中的update报文,对它携带的属性信息分析
首先是三个所有updata消息都会携带的公认必遵消息
ORIGIN报文显示的是INCOMPLETE,表明它是通过其他方式学习到的BGP信息,如import。我们在AR4上通过import route-direct命令将直连路由引入。所以我们推测由AR4向AR1发送的更新报文应该是关于引入的直连路由信息。
AS-path属性显示的是100,表明它是由AS100发送过来的。
Next-hop属性显示的是10.1.14.4(AR4本端端口的IP地址)(EBGP建立邻居的下一跳是本端与对端直连接口的IP)
MED属性是两个AS之间的路径优选
我们在抓取AR1的G0/0/1端口的报文进行比对
采用回环口建立的IBGP邻居,源目IP为1.1.1.1和2.2.2.2
AS-path属性显示的是100,表明它是由AS100发送过来的。
Next-hop属性显示的是1.1.1.1(AR1回环口的IP地址)(IBGP建立邻居的下一跳是本端接口的IP)
ORIGIN报文显示的是INCOMPLETE,表明它是通过其他方式学习到的BGP信息
local-pref为华为私有的本地优先级属性,默认为100
路由黑洞产生的原因是由于中间路由器没有加入到BGP中,没有去往目的地址的路由条目。我们查询AR2的路由表和AR1的路由表可以验证我们的想法:
[AR2]dis ip routing-table
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Tables: Public
Destinations : 13 Routes : 13
Destination/Mask Proto Pre Cost Flags NextHop Interface
1.1.1.1/32 OSPF 10 1 D 10.1.12.1 GigabitEthernet
0/0/1
2.2.2.2/32 Direct 0 0 D 127.0.0.1 LoopBack1
3.3.3.3/32 OSPF 10 1 D 10.1.23.3 GigabitEthernet
0/0/2
10.1.12.0/24 Direct 0 0 D 10.1.12.2 GigabitEthernet
0/0/1
………………………………………………………………………………………………………………………………………………………………………………………………………………………………
篇幅有限,这里只显示部分路由条目
[AR1]dis ip routing-table
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Tables: Public
Destinations : 16 Routes : 16
Destination/Mask Proto Pre Cost Flags NextHop Interface
1.1.1.1/32 Direct 0 0 D 127.0.0.1 LoopBack1
2.2.2.2/32 OSPF 10 1 D 10.1.12.2 GigabitEthernet
0/0/1
……………………………………………………………………………………………………………………………………………………………………………………………………
篇幅有限只显示部分路由条目
192.1.1.0/24 EBGP 255 0 D 10.1.14.4 GigabitEthernet
0/0/0
192.2.1.1/32 IBGP 255 0 RD 3.3.3.3 GigabitEthernet
0/0/1
255.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0
可以看到AR1上有引入的路由条目
方法一:
我们可以让BGP实现全互联,这样就不存在路由黑洞的问题了。
方法二:
我们可以利用MPLS技术,在AS100里打一条隧道,跳过IP转发,进行标签转发,这样就算中间的路由条目没有相应的路由条目也是没事的。
1设置mpls lsr id。.将数据引入MPLS隧道,让没带标签的数据也能在隧道内传输,全局下配置:route recursive-lookup tunnel
2.保证R4和R5能够有对端客户端的路由,即建立R1和R3的BGP邻居,但是AR2不用启动BGP进程,避免路由黑洞
3.全局使能MPLS,和MPLS LDP,并下发标签
4.接口使能MPLS和MPLS LDP
以AR1为例
#
mpls lsr-id 1.1.1.1//设置MPLS lsr-id
mpls //全局使能MPLS
lsp-trigger all //下发标签
#
mpls ldp //全局使能MPLS LDP
#
interface GigabitEthernet0/0/1
ip address 10.1.12.1 255.255.255.0
mpls //接口使能MPLS
mpls ldp //接口使能MPLS LDP
#
route recursive-lookup tunnel //将没带标签的数据引入隧道
#
在AR4上带源tracert 192.1.1.1,发现中间AR1通往AR2的路由不可达,这是因为AR2没有建立BGP邻居。所以没有到达AR2的路由,但是因为在BGP内采用的是MPLS标签交换,所以没有路由也能进行通信
那么这个标签交换的过程具体是什么样的呢?让我们来具体分析一下。首先,我们在AR4上带源ping 192.2.1.1。
通过对ICMP Echo数据包的分析,我们可以知道,echo request数据包走隧道,而echo reply数据包没有走隧道,是直接回包。进入隧道的标签是1026。
其次,MPLS封装时TTL直接复制进IPv4包头中的TTL值。之后进行数据传输时,数据包只解封装到MPLS层,因此只减MPLS层的TTL值,IPv4中的TTL值保持不变。只有当数据包解封装到网络层时,IPv4中的TTL值才会发生改变。
下面我们来分析客户端192.1.1.1到192.2.1.1的具体通信过程。
在AR4上查看信息,发现AR4将数据包发送给EBGP对等体,10.1.14.1
在AR1上查看信息,发现AR1将数据发送给IBGP邻居3.3.3.3,由于FLAG为RD,表明它是迭代路由。
继续查找去往3.3.3.3的路由,发现下一跳时OSPF邻居10.1.12.2,此时网络层的封装结束,开始MPLS层封装
查看3.3.3.3的LSP表,此时路由器接受到的数据只解封装到MPLS层,开始标签交换。我们可以看到去往3.3.3.3的转发等价类的出标签为1026。
在AR2上查看标签表,看到出标签为3,表明它是一个隐式空标签。 数据包将不会再封装到MPLS层,而是直接封装在IPV4头部(PHP机制:为了减轻最后一跳的负担,最后一跳不需要再查找LSP,直接查询路由表,进行IP转发。)
在AR2的G0/0/2端口抓包也可以发现,少了MPLS层
数据转发到AR3时,直接转发给EBGP对等体AR5,AR5直接转发给客户端192.2.1.1
数据在网络中的转发方式分为四种:
1.进程转发:每一个数据包都查询RIB表(最长掩码匹配原则),存在延时且很考验CPU性能
2.缓存转发:第一个数据包查询RIB表,然后将信息缓存,后续转发数据就可以直接转发
3.硬件转发:ASIS硬件转发,转发性能迅速
4.标签转发:MPLS,起初是为了提升转发速率,目前主要和各种技术相结合,解决网络中的各种问题
BGP的路由黑洞需要解决的最大问题是如何在路由器没有全网路由的情况下进行数据转发(如本实验AR2没有建立BGP邻居,网络中查询不到去往AR2的路由)。我们可以用MPLS的标签转发技术解决问题。此外,MPLS还能用来解决IPv6孤岛通信等问题。是现代网络通信中一门很实用的技术。