BGP 基础2

建立邻居

理解neighbor命令的含义

  • neighbor x.x.x.x remote-as 65535
  • neighbor x.x.x.x update-source loopback 0
  • 本路由器用更新源去访问neighbor后面的地址的TCP 179端口
  • 本路由器允许neighbor后面的地址来访问我的TCP 179端口
  • show tcp brief #查看TCP建立的方向

TCP连接方向的控制方法

BGP在建立邻居的时候,双向都会建立TCP连接。谁的active-delay的时间短,就会先发送TCP请求,这个TCP连接就会成功。只要有一个TCP连接建立成功了,BGP的邻居就会建立成功。如果不允许对方跟我建邻居,那就是不允许对方访问我的179号端口。

  • 访问控制列表ACL:
    • access-list 101 deny tcp any any eq 179
    • access-list 101 deny tcp any host 10.1.12.2 eq 179
    • 上两条最后还得加上一条permit语句放行其它流量,access-list 101 permit ip any any
  • TCP传输模式
    • neighbor x.x.x.x transport connection-mode {active|passive},active模式的话,对端只能是passive模式,只有自己可以发起连接。两端都是active或passive,则邻居起不来。

TCP Path-MTU-Discovery

  • BGP建邻居后,要收发路由,由于Internet的路由条目非常多,所以收敛速度很慢。
  • TCP默认的报文大小536字节。BGP报文大小=IP包头(20)+TCP段头(20)+536=576字节。BGP报文可以携带的信息量就比较少,这样报文的数量就比较多。报文的数量多,丢包的可能性就大。而TCP有慢启动和滑窗机制会使BGP的收敛速度更慢。
  • 使用TCP Path-MTU-Discovery可以根据实际情况来增加BGP的报文大小,从而加快BGP的收敛速度。
    • 老的IOS:ip tcp path-mtu-discovery,不仅影响BGP,还会影响其他TCP连接,如telnet/ssh。
    • 新的IOS:
      • 默认BGP进程下全局开启 bgp transport path-mtu-discovery;
      • 可以在邻居方向开启或关闭此功能,neighbor x.x.x.x transport path-mtu-discovery。
  • 增加接口入方向队列长度,来减少丢包,加快BGP收敛时间,但是这样会增加delay和jitter。
    • hold-queue 4096 in

TCP single-session & multi-session

  • MP-BGP可以支持ipv-unicast,ipv4-multicast,vpnv4 unicast等地址簇。

TCP的认证

  • 实际上BGP的认证就是TCP的认证
  • 只支持MD5认证
  • neighbor x.x.x.x password PASSWORD

通过open报文协商建立邻居的参数

  • open报文只在建立邻居的时候发送,建完邻居后不再发送open报文
  • open报文包括4个基本参数(AS、BGP RID、Holdtime、BGP Version)
    • 默认keepalive 60s, holdtime 180s。
    • 在BGP进程下,timers bgp 20 60 60(第一个20是keepalive的时间,第二个60是holdtime的时间,第三个60与对端建邻居时所能接受的最小holdtime时间。)。也可在BGP地址家族下neighbor对端的时候指定,neighbor x.x.x.x timers 20 60 60。
    • BGP通过holdtime来判断邻居是否失效,可以更快的切换到另一条路径上去。
      • EBGP直连邻居使用fast-external-failover机制来加快检测和切换时间。
      • IBGP或者是多跳的EBGP邻居之间,老的IOS默认没有检测机制,可以使用BFD来加快检测和切换。现在运营商或城域网中常用的技术是BFD。
        • Bidirectional Forwarding Detect – 双向转发检测,一种带外的检测直连邻居是否失效的技术。新的IOS中,BFD也开始支持multi-hop的邻居检测。
        • 在接口下,bfd interval 50 min_rx 50 multiplier 3;在BGP下,neighbor x.x.x.x fall-over bfd。bfd down掉了之后,BGP的邻居也会立刻down掉。
  • 能力协商:为不同的地址家族和地址家族下的单播组播等sub-address-family分别协商
    • neighbor x.x.x.x dont-capability-negotiate,为隐藏命令,不进行能力协商也能建立起邻居。

影响BGP邻居建立的参数

  • IGP路由,更新源互相ping不通。查看IGP路由。
  • ACL。查看更新源地址或179号段口有没有被禁用。
  • TCP active/passive:如果两边模式一样,无法建立TCP连接。
  • BGP(TCP)authentication
  • Open报文中协商的参数和能力不匹配

产生路由

  • Network: network x.x.x.x mask y.y.y.y 。可以将路由表中的路由宣告进BGP
  • Redistribute:redistribute ospf 1 。可以将IGP路由重分布进BGP
  • Aggregate:
  • Inject:

通常BGP scan默认60s扫描一次,一般通过scan来进行路由属性的改变、BGP路由的优选等,这种称之为polling model。它会检查如下:

  • validate nexthop reachability
  • validate bestpath selection
  • route redistribution and network statements
  • conditional advertisement
  • route dampening
  • BGP database cleanup

现在对IOS进行了改进,将Route Origination改为Event Driven。

  • scanner不再校验从RIB重分布进来的路由
  • redistribute和network都算是一个事件,产生这个事件,立即检查并实现
  • scanner对CPU的影响极大的减少了

发送路由

BGP只能将本路由器转发表中最优的路由发给邻居。BGP路由最优有两个必要条件:

  • 下一条可达:
    • 在BGP里面,下一跳代表下一个AS;
      • 对于EBGP邻居而言,通常因为AS-PATH增加了,所以下一跳也会变为EBGP的邻居地址;
      • 对于IBGP邻居而言,因为AS-PATH没有变化,所以默认下一跳不会改变,但有可能产生下一跳不可达的问题;
      • 解决BGP下一跳不可达有以下几种方法:
        • static
        • network + passive-interface
        • redistribute
        • next-hop-self
        • route-map
    • 本地始发的路由,如果是本地直连的,则下一跳为0.0.0.0;如果不是本地直连的,会使用IGP的下一跳地址;
  • 同步:从IBGP邻居学来的路由,从IGP也要同时学到(现在默认都是关闭同步的);

当BGP邻居关系建立之后,可以将BGP转发表中最优的路由发送给邻居。

  • 在EBGP邻居之间发送路由的时候,通常没有什么限制;
  • 在IBGP邻居之间发送路由的时候,需要遵循水平分割原则:
    • 从一个IBGP邻居学来的路由,不能发送给另外一个IBGP邻居,这称为IBGP的水平分割。所以IBGP建邻居的时候默认要求全互联。但是导致要建立的session过多,配置量过大的问题。解决方法有如下几种:
      • 路由反射器(Route Reflector):使用反射簇来解决session过多的问题。
      • 联盟(Confederation):使用EBGP传递路由的方式来解决session过多的问题。

Route Reflector(路由反射器)

  • 基本组件:RR和RRC,Cluster
  • RR的基本工作原理:非非不能传,即非客户的路由不能传给非客户。
    • 如果RR从EBGP邻居那里收到路由后,可以发给所有的RRC、所有的非客户,也可以发给其他的EBGP邻居。
    • 如果RR从一个RRC收到路由后,可以反射给所有其他RRC、所有的非客户,可以发给所有的EBGP邻居。
    • 如果RR从一个非客户收到路由,可以反射给所有的RRC,也可以发给所有的EBGP邻居。
  • 一个RR加上它的所有RRC就是一个cluster。
  • RR会增加两个新的IBGP属性,用于防止环路。通过路由反射器反射的路由才会携带这两个属性。客户或非客户的路由通过反射器传到客户与非客户,被称为“反射”。
    • Cluster-list(簇列表):为cluster-id的序列。cluster-id默认情况下等于路由器的router-id。
      • BGP进程下: no bgp cluster-id
    • Originator(起源者):反射的路由的始发者,或是EBGP路由进入本AS的入口路由器。反射器反射路由的时候发现其他的路由器的RID和这条路由的起源者一样则不发送此路由。

RR的次优路径问题

  • 有了RR以后,可以预期在网络中可能会出现次优路径问题。主要原因在于RR只会将自己认为最优的路径发给IBGP邻居。
  • 可以通过虚拟一下一条(两台出口路由器配置一个相同IP的环回接口,在RR上写route-map,设置要反射的路由的下一跳为此IP。将此IP网段通告到IGP之中,并重分布到BGP之中。)或additional-path的方法来解决这个问题。

RR的冗余

  • 一个路由器可以和多个RR建邻居。因为可能出现单点故障,为了提供冗余性,一台客户端至少和两个RR建邻居。
  • 两台互为冗余的RR,可以用相同的cluster-id,也可以使用不同的cluster-id。
    • 如果cluster-id相同,则两台RR互相不接受从一个client那反射的路由,会减轻RR的资源占用。但中间链路出故障时,可能会导致部分的路由无法从两台RR反射到其他的路由器。
    • 如果cluster-id不相同,则两台RR会互相接收从client反射的路由,增加资源的消耗,但是是全冗余,冗余更好。现网普遍采用此种方式。
  • 一个client与2-3个RR建邻居基本就够了,与过多RR建邻居有可能会消耗更多的内存。

层次化的RR设计:每经过一个RR传递后会携带上RR的cluster-id。分层设计可以保证,一个RR坏了,不影响其他簇的路由反射。

简化RR的配置

  • 因为网络中很多设备都需要跟RR建邻居,所以RR的配置量以及资源消耗很多。
  • 有以下三种方法可以简化RR的配置:
    • inherit
      • peer-session模板,是用于建邻居的。
      • peer-policy模板,是用于修改路由属性的。
      • 模板之间可以嵌套。
      • 只是简化配置,但不会减少路由器资源的消耗。
    • peer-group
      • peer-group除了有简化配置的作用,还可以减少路由器的资源消耗。
      • 对peer-group的组成员来说,需要维护相同的出站策略,可以维护不同的入站策略。
    • dynamic neighbor
      • dynamic neighbor可以有效减轻工作量,最好设置认证。
      • 设置dynamic neighbor的路由器只能开启passive模式。

RR multi-cluster & disable reflection

  • 当客户之间有邻居的时候,需要关闭反射。
    • no bgp client-to-client reflection #关闭客户和客户间的路由反射,在客户全互联的时候可以全部关掉。
    • neighbor x.x.x.x cluster-id y.y.y.y #在邻居后面加cluster-id,可以将不同的客户加到不同的簇内,同一个簇内之间的设备不反射
    • no bgp client-to-client reflection cluster-id y.y.y.y / any #在multi-cluster里选择那个簇不进行反射,或所有的簇内都不互相反射。

BGP的第三方下一跳

  • 收到一条路由,经过递归以后真实的下一跳和neighbor后面的地址如果在同一网段,保持真实的下一跳不变发给邻居。这种现象,称为第三方下一跳。
  • 如何解决次优路径问题?
    • PBR
    • route-map
    • next hop unchanged #只能用EBGP多跳的情况下使用这条命令。
      • neighbor x.x.x.x next-hop-unchanged
Author: 技师