一、概念
BGP(Border Gateway Protocol,边界网关协议)是一个距离矢量路由协议,和传统的基于下一跳的IGP协议不同,它是基于AS(自治系统)的协议。
(1)BGP使用TCP为传输层协议,TCP端口号179,BGP路由器之间基于TCP建立BGP会话,BGP对等体无需直连。
(2)运行BGP的路由器被称为BGP发言者(BGP Speaker),两台BGP路由器需建立对等体关系(邻居关系)才能交互BGP路由,存在两种类型的BGP对等体关系 EBGP和 IBGP。
(3)在BGP对等体关系建立完成之后,BGP路由器只发增量更新或触发更新(不会发周期性更新)。
(4)BGP存在两种对等体关系类型:EBGP及IBGP。
IBGP邻居:AS内部建立的BGP邻居,邻居路由器的AS号是一致的
EBGP邻居:AS之间建立的BGP邻居,邻居路由器的AS号不相同
二、自治系统
自治系统(Autonomous System,AS),指的是在同一个组织管理下、使用相同策略的设备的集合。
BGP 网络中的每个AS都被分配一个唯一的AS号,用于区分不同的AS。AS号可分为2个字节AS号和4个字节AS号,其中 2字节AS的取值范围为 1至 65535,其中64512-65535是私有AS号。4字节AS号的取值范转为 1至 4294967295,支持 4字节AS号的设备能与支持 2字节AS号的设备兼容,IANA负责AS号的分发。
三、BGP的报文
三、BGP的状态机制
1、Idle 状态是 BGP 初始状态。在 Idle 状态下, BGP 拒绝邻居发送的连接请求。只有在收到本设备的 Start 事件后,
BGP 才开始尝试和其它 BGP 对等体进行 TCP 连接,并转至 Connect状态。说明:
Start 事件是由一个操作者配置一个 BGP 过程,或者重置一个已经存在的过程或者路由器软件重置 BGP 过程引起的。
任何状态中收到 Notification 报文 或 TCP 拆链通知等 Error 事件后, BGP 都会转至 Idle状态。
2、在 Connect 状态下, BGP 启动连接重传定时器(Connect Retry),等待 TCP 完成连接。
如果 TCP 连接成功,那么 BGP 向对等体发送 Open 报文,并转至 OpenSent 状态;
如果 TCP 连接失败,那么 BGP 转至 Active 状态;
如果连接重传定时器超时, BGP 仍没有收到 BGP 对等体的响应,那么 BGP 继续尝试和其它 BGP 对等体进行 TCP 连接,停留在
Connect 状态。3、在 Active 状态下, BGP 总是在试图建立 TCP 连接。
如果 TCP 连接成功,那么 BGP 向对等体发送 Open 报文,关闭连接重传定时器,并转至 OpenSent 状态;
如果 TCP 连接失败,那么 BGP 停留在 Active 状态;
如果连接重传定时器超时, BGP 仍没有收到 BGP 对等体的响应,那么 BGP 转至 Connect状态。
4、在 OpenSent 状态下, BGP 等待对等体的 Open 报文,并对收到的 Open 报文中的 AS 号、版本号、
认证码等进行检查。如果收到的 Open 报文正确,那么 BGP 发送 Keepalive 报文,并转至 OpenConfirm 状态;
如果发现收到的 Open 报文有错误,那么 BGP 发送 Notification 报文给对等体,并转至Idle 状态。
5、在 OpenConfirm 状态下, BGP 等待 Keepalive 或 Notification 报文。如果收到 Keepalive
报文,则转至 Established 状态,如果收到 Notification 报文,则转至 Idle 状态。6、在 Established 状态下, BGP 可以和对等体交换 Update、 Keepalive、 Route-refresh
报文和Notification 报文。如果收到正确的 Update 或 Keepalive 报文,那么 BGP 就认为对端处于正常运行状态,将保持 BGP 连接。
如果收到错误的 Update 或 Keepalive 报文,那么 BGP 发送 Notification 报文通知对端,并转至 Idle
状态。Route-refresh 报文不会改变 BGP 状态。
如果收到 Notification 报文,那么 BGP 转至 Idle 状态。
如果收到 TCP 拆链通知,那么 BGP 断开连接,转至 Idle 状态。
四、路由通告规则
(1)当存在多条路径时,路由器只选取最优(Best)的BGP路由来使用(没有激活负载均衡的情况下)。
(2)BGP只把自己使用的路由,也就是自己认为最优的路由传递给对等体。
(3)路由器从EBGP对等体获得的路由会传递给它所有的BGP对等体(包括EBGP和IBGP对等体)。
(4)路由器从IBGP对等体获得的路由不会传递给它的IBGP对等体(存在反射器RR的情况除外)。
(5)路由器从IBGP对等体获得的路由是否通告给它的EBGP对等体要视IGP和BGP同步的情况来决定。
(6)IBGP之间传递路由时路由下一跳不变
(7).EBGP之间传递路由时路由的下一跳会修改为自己的更新地址(建邻地址)
AS中黑洞问题的解决办法:
(1)将 BGP路由引入 IGP。
(2)在黑洞路由器上配置BGP并且与其他BGP路由建立邻居关系实现BGP对等体关系的全互联。
(3)通过MPLS技术解决黑洞问题实现通信。
五、配置BGP
要求:
R1与R3建立EBGP
R2与R4建立EBGP
R3与R4建立IBGP
首先配置IP地址,AS300运行OSPF
R1配置
[R1]int LoopBack 0
[R1-LoopBack0]ip add 1.1.1.1 24
[R1]int g 0/0/0
[R1-GigabitEthernet0/0/0]ip add 13.0.0.1 24
R2配置
[R2]int LoopBack 0
[R2-LoopBack0]ip add 2.2.2.2 24
[R2]int g 0/0/0
[R2-GigabitEthernet0/0/0]ip add 24.0.0.1 24
R3配置
[R3]int g 0/0/0
[R3-GigabitEthernet0/0/0]ip add 13.0.0.2 24
[R3]int g 0/0/1
[R3-GigabitEthernet0/0/1]ip add 35.0.0.1 24
[R3]int LoopBack 0
[R3-LoopBack0]ip add 3.3.3.3 24
R4配置
[R4]int g 0/0/0
[R4-GigabitEthernet0/0/0]ip add 45.0.0.1 24
[R4]int g 0/0/1
[R4-GigabitEthernet0/0/1]ip add 24.0.0.2 24
[R4]int LoopBack 0
[R4-LoopBack0]ip add 4.4.4.4 24
R5配置
[R5]int g 0/0/0
[R5-GigabitEthernet0/0/0]ip add 35.0.0.2 24
[R5]int g 0/0/1
[R5-GigabitEthernet0/0/1]ip add 45.0.0.2 24
[R5]int LoopBack 0
[R5-LoopBack0]ip add 5.5.5.5 24
配置OSPF
[R3]ospf 1 router-id 3.3.3.3
[R3-ospf-1]area 0
[R3-ospf-1-area-0.0.0.0]network 3.3.3.3 0.0.0.0
[R3-ospf-1-area-0.0.0.0]network 35.0.0.0 0.0.0.255
[R5]ospf 1 router-id 5.5.5.5
[R5-ospf-1]area 0
[R5-ospf-1-area-0.0.0.0]network 5.5.5.5 0.0.0.0
[R5-ospf-1-area-0.0.0.0]network 35.0.0.0 0.0.0.255
[R5-ospf-1-area-0.0.0.0]network 45.0.0.0 0.0.0.255
[R4]ospf 1 router-id 4.4.4.4
[R4-ospf-1]area 0
[R4-ospf-1-area-0.0.0.0]network 4.4.4.4 0.0.0.0
[R4-ospf-1-area-0.0.0.0]network 45.0.0.0 0.0.0.255
配置BGP邻居关系一般而言BGP的EBGP建邻会使用直连建立,IBGP建邻会使用回环建立。如果我们用回环建立EBGP邻居需要修改建邻跳数。
默认跳数为1,修改跳数,也可以不写数字直接回车默认跳数是255
[R1]bgp 100
[R1-bgp]router-id 1.1.1.1
[R1-bgp]peer 13.0.0.2 as-number 300
[R2]bgp 200
[R2-bgp]router-id 2.2.2.2
[R2-bgp]peer 24.0.0.2 as-number 300
源地址默认是出接口地址、一旦不用出接口建立邻居关系时需要改源
[R3]bgp 300
[R3-bgp]router-id 3.3.3.3
[R3-bgp]peer 13.0.0.1 as-number 100
[R3-bgp]peer 4.4.4.4 as-number 300
[R3-bgp]peer 4.4.4.4 connect-interface LoopBack 0
[R4]bgp 300
[R4-bgp]router-id 4.4.4.4
[R4-bgp]peer 24.0.0.1 as-number 200
[R4-bgp]peer 3.3.3.3 as-number 300
[R4-bgp]peer 3.3.3.3 connect-interface LoopBack 0
建立邻居关系不会产生路由信息,所以我们需要手动配置路由
配置路由有两种方式:
Network命令时逐条将IP路由表中已经存在的路由引入到BGP路由表总,使用掩码宣告,必须和路由表中路由掩码对应,否则宣告不进去
Import命令是根据运行的路由协议(RIP、OSPF、ISIS等)将路由引入到BGP路由表中,同时import命令还可以引入直连和静态路由
[R1]bgp 100
[R1-bgp]network 1.1.1.0 255.255.255.0
[R2]bgp 200
[R2-bgp]network 2.2.2.0 255.255.255.0
[R3]route-policy direct permit node 10
[R3-route-policy]if-match interface LoopBack 0
[R3-route-policy]if-match interface GigabitEthernet 0/0/0
[R3-route-policy]if-match interface GigabitEthernet 0/0/1
[R3]bgp 300
[R3-bgp]import-route direct route-policy direct
[R4]route-policy direct permit node 10
[R4-route-policy]if-match interface LoopBack 0
[R4-route-policy]if-match interface GigabitEthernet 0/0/0
[R4-route-policy]if-match interface GigabitEthernet 0/0/1
[R4]bgp 300
[R4-bgp]import-route direct route-policy direct
IBGP之间传递路由时路由下一跳不变
解决方法:
[R3]bgp 300
[R3-bgp]peer 4.4.4.4 next-hop-local
[R4]bgp 300
[R4-bgp]peer 3.3.3.3 next-hop-local
ping不通的原因是因为这里的R5路由器没有到2.2.2.2这个网段路由,所以在半路包就被丢弃了
解决方法:使用重发布
[R3]ospf 1
[R3-ospf-1]import-route bgp
[R3-ospf-1]import-route direct 导入直连网段使直连网段也能互通
[R4]ospf 1
[R4-ospf-1]import-route bgp
[R4-ospf-1]import-route direct 导入直连网段使直连网段也能互通
到这步除了R5的环回ping不通其他都已经通了,因为R1和R2没有R5的路由,我们可以下发一条缺省来做到他们互通
[R1]ip route-static 0.0.0.0 0 13.0.0.2
[R2]ip route-static 0.0.0.0 0 24.0.0.2
测试
新增要求:
在R1上创建三个环回,传递到R3上过滤掉一条路由、传递到R2上再次过滤掉一条路由
[R1]int LoopBack 1
[R1-LoopBack1]ip add 10.1.1.1 24
[R1]int LoopBack 2
[R1-LoopBack2]ip add 10.2.2.2 24
[R1]int LoopBack 3
[R1-LoopBack3]ip add 10.3.3.3 24
[R1]bgp 100
[R1-bgp]network 10.1.1.0 255.255.255.0
[R1-bgp]network 10.2.2.0 255.255.255.0
[R1-bgp]network 10.3.3.0 255.255.255.0
BGP的过滤:使用前缀列表来实现过滤,可以在R1的出方向过滤也可以在R3的入方向进行过滤
R1的通告表:
R3的接收表:
R1出方向进行过滤:
[R1]ip ip-prefix a deny 10.3.3.3 24
[R1]ip ip-prefix a permit 0.0.0.0 0 less-equal 32
[R1-bgp]peer 13.0.0.2 ip-prefix a export
R1的通告表:
R3的接收表:
R3入方向进行过滤:
[R3]ip ip-prefix a deny 10.3.3.3 24
[R3]ip ip-prefix a permit 0.0.0.0 0 less-equal 32
[R3-bgp]peer 13.0.0.1 ip-prefix a import
使用route-policy进行过滤,实现到达R2只剩一条路由信息,可以在R4的出方向做,也可以在R2的入方向做
R4出方向进行过滤:
[R4]ip ip-prefix a permit 10.2.2.2 24
[R4]route-policy aa deny node 10
[R4-route-policy]if-match ip-prefix a
[R4]route-policy aa permit node 20
[R4]bgp 300
[R4-bgp]peer 24.0.0.1 route-policy aa export
R2入方向进行过滤:
[R2]ip ip-prefix a permit 10.2.2.2 24
[R2]route-policy aa deny node 10
[R2-route-policy]if-match ip-prefix a
[R2]route-policy aa permit node 20
[R2]bgp 200
[R2-bgp]peer 24.0.0.2 route-policy aa import