主要有三块:基本操作、配置邻居、调试排错。
1. 基本操作
首先需要启用BGP路由
Router(config)# router BGP autonomous-system
这里的AS不能任意指定(因为BGP的一边是您公司的网络,另一边是Internet)。
一台路由器只能有一个BGP实例,不会把一个路由器放到多个BGP(AS)中。
通过AS号是否一样,来判断邻居是IBGP还是EBGP,如果是同一AS,则是IBGP。
2. 配置邻居
Router(config-router)#neighbor {ip-address | peer-group-name} remote-asautonomous-system
这个命令是用于指定邻居的,BGP的邻居需要手动指定,这不像RIP、OSPF、EIGRP可以自动学习。
只有指定了邻居,才能激活BGP会话。可以用IP地址或对等组名来指定。
命令中的IP地址是邻居(对方)的IP。EBGP情况下,这个IP地址应该是与你这个路由器直连的IP,而IBGP情况下,这个IP地址可以是对方路由器上任何一个IP地址,当然要求两个路由器通过通(Ping通)。IBGP的邻居IP一般情况下使用Loopback端口的IP地址进行邻居的指定。
同步和Shutdown命令
命令:Router(config-router)#neighbor {ip-address | peer-group-name} shutdown
这里使用Shutdown后,邻居关系并没有被删除,而是暂时不可用,一般用于维护和更改策略,它防止路由散动(Route Flapping)。
启用的命令是Router(config-router)# no neighbor {ip-address | peer-group-name} shutdown
A和C的关系是EBGP,A和B的关系是IBGP,当流量从B发起到达D的时候,虽然A知道如何到达C网络,但D并不知道,解决的办法是在A和B上做BGP的再分布,这样D就知道如何到达C网络了。
实现B到C网络通的两个条件:一是IBGP和EBGP连通,另一个是AS65101中IGP同样也是连通的。
BGP邻居源地址:
邻居指定(Neighbor命令)的地址是目的地址,是邻居地址。默认情况下从哪个端口发送出数据库哪个端口就是源地址。BGP里要求,源地址必须匹配,如果不匹配,数据包将会被丢弃。
下面看看什么情况下会出现源地址不匹配的现象。
在A上指定邻居B,那么A的源地址就是10.1.1.1,邻居指定的目的地址就是B上的10.1.1.2,C、D同理,在这样的一个网络状态都是连通的情况下没有什么问题,但在网络断路情况下问题就出来了。比如说,当A和B之间的链路Down时,A和B的源地址就不一致了,A的源地址是10.3.3.1而B的源地址是10.2.2.2(BGP只要能够建立连接也就是能连通并建立TCP 会话就可以通,A和B通过A-C-D-B通)。
如何确保路由器的源地址是稳定、一致不变?一般情况下我们使用Loopback地址。
为此,在配置BGP邻居时我们需要更改路由器的源地址。
命令:Router(config-router)# neighbor {ip-address | peer-group-name} update-sourceinterface-type interface-number
命令里的参数update-source指定的是自己路由器的Loopback口。
在路由器上配置了Loopback地址后,当A和B的链路Down掉了,A和B的邻居关系依然保持,因为源地址没变。
一般要求路由器与邻居之间至少有一条路径是可用的。这样邻居关系就不会出现问题。
变更源地址一般常用于IBGP中,EBGP很少用,如果要在EBGP中使用,那么还需要额外的命令(因为EBGP要求邻居是直连的,使用Loopback端口,EBGP就不是直连的了)。
这是一个使用Loopback的IBGP网络的例子:
这是一个使用Loopback的EBGP网络的例子:
在EBGP中使用Loopback端口,需要使用命令(前面提到过,需使用额外的命令,就是这个)Neighbor ip eBGP-multihop x,X为跳数。这个命令只能使用在EBGP情况下。如图例。
BGP中Next-hop(下一跳)不是指下一个路由器,而是指到达目标网络的下一个AS。
A和B是EBGP邻居,C和B是IBGP邻居。B的下一跳是A,地址为10.10.10.3,C的下一跳也是10.10.10.3(因为BGP的下一跳地址是下一个AS的地址),路由器C必须知道到达10.10.10.3怎么走,路径由B告诉C。
BGP在多路访问网络中的例子,如图:
A和B的关系是EBGP,A和C的关系也是EBGP,B和C的关系是IBGP,C和D的关系是EBGP。当B学习到到达A时,B也会告诉C到达A怎么走,C也会从A学习到到达A怎么走,显然C的下一跳地址是A要比通过B再到A的路径更好。而D的下一跳是C。
路由器也可以指定下一跳为自己,命令如下:
Router(config-router)# neighbor {ip-address | peer-group-name} next-hop-self
强制所有更新从这个邻居宣告为下一跳地址。一个实例:
EBGP到IBGP的下一跳的地址是不会改变的。A的下一跳是B。
IBGP到IBGP的下一跳可以改变。
IBGP中也可以不改变下一跳地址,如:在B上不做下一跳是自己的命令,C的下一跳必须是可达的,也就是说C必须知道到达A怎么走,B必须宣告A给C到达A从B走。
对等体组的概念:
如果有一些路由器,它们都有一致的策略,就可以指定一个邻居组(对等组)
创建组的命令:Router(config-router)# neighbor [peer-group-name] peer-group
添加成员的命令:Router(config-router)# neighbor [ip-address] peer-group [peer-group-name]
这样的好处是简化配置。
一个对等体组配置的实例。当有多个邻居时可以使用该命令。
从图中的配置我们可以看到右边使用对等体组的配置简单多了。
Network命令:Router(config-router)#network network-number [mask network-mask]
和EIGRP路由协议的Network命令有所不同。
这个是注入BGP网络路由的命令。
无Mask的宣告将是有类网络(A、B、C),有Mask的则是无类网络。
进行配置之前必须保证所宣告的网络是可用(可达)的。
下面讲讲同步
使用同步的目的是避免出现黑洞(接收到数据包后不知道给谁,而只能丢弃)。同步默认是打开的,全互连时(用于IBGP)需要关闭同步,命令是:Router(config-router)#no synchronization
同步主要是用于IBGP之间进行,EBGP不需要同步。
只有两个IBGP,所以B和C是全互连状态,所以关闭同步。
3. 调试排错
BGP邻居建立会话的5种状态:
1. Idle:查找路由表
2. Connect:找到路由表后进行TCP三次握手
3. Open Sent:握上手后发送Open message消息
4. Open Confirm:收到对方发来的Open消息
5. Established:会话建立,交换信息。
查看建立过程的命令:Router(config-router)# debug ip BGP events
当找不到路由表时,状态为Idle,一般情况下问题出在IGP。
邻居关系建立了,状态为Established,可以用Router# Show IP BGP Summary来查看汇总的情况。
Active状态:当路由器发送出OPEN包给邻居等待回应,如果长时间未接收到回应则超时,超时后状态更改为Idle,这是由于TCP链路上出现了问题所致。
产生问题的原因主要有:
1. 邻居的IP配置有误;
2. 没有指定邻居语句(两边都要指定)
3. 源地址不是指定邻居的地址,或者不可达。
Router# show ip BGP summary
邻居 BGP AS 信息包 数据库 状态 经过
版本 号 接收 发送 版本 路由器数量
Router# show ip BGP
BGP表的内容
BGP Table Version is 23,版本(序)号是23,本地的RID是192.168.1.49
*是有效的,>是最好的,i是通过IBGP学习来的,Network是网络,Next Hop是下一跳(AS)的地址,Metric是度,Locprf是本地优先级(默认为100),Weight是权重(加权),Path是的i是起点是IGP(e为EGP,?为不完整),Path中的数字部分为AS号。关于这里所提到的属性(metric、Locprf、Weight…)在下面BGP属性部分会进行讲解。
清除BGP的会话,下面三种情况下需要:
1. 策略更改时(ACL、Time、attributes)
2. 策略需要立即生效。
3. 策略需要立即执行(其实和第2点一样)。
清除全部会话的命令:Router# clear ip BGP *
复位所有BGP连接,全部BGP路由表将被丢弃,BGP会话状态更改为Idle。
清除单个会话的命令:Router# clear ip BGP [ip-address]
仅复位单个BGP连接,BGP路由表将被丢弃,BGP会话状态更改为Idle。只需在一边执行此命令即可。
如果想不复位连接,也就是会话不丢失(邻居关系不重建)来使变更策略生效的话,使用下面的命令:
Router# clear ip BGP {*|address} [soft out]
这个命令是应用于Outbound的策略。
Inbound的策略的应用:
首先要指定邻居关系在建立时要先保存Update信息(会保存在内存中),
命令:Router(config-router)# neighbor [ip-address] soft-reconfiguration inbound
这样才能在Inbound策略变更时使用下面的命令:
Router# clear ip BGP {*|address} [soft in]
使用Soft out/in这样命令的好处是邻居(会话)关系不用重新建立,节省了带宽,增加了收敛时间。
邻居查看命令:
Router# show ip BGP neighbors
红色部分为BGP当前的状态。
查看BGP update更新过程的命令:
Router# debug ip BGP updates
在一个稳定的网络,使用这条命令可能不能立即看到包,立即看到可以使用Clear ip BGP *,使之生效。
Debug update是增量更新。一个Update包只包括一条路由(可以是多条路径)和一个(类)BGP属性,一个Update包可以删除多条路由(因为删除用不到属性)。