1,防环/黑洞/同步/全互连(为出现大于号,现在通常都是要下一跳可达+关同步)
a)EBGP邻居传来的路由可以通过AS_PATH防环,所以收到的不会有问题,因此直接是优化的(>),也就是直接装表、再传给EBGP邻居或IBGP邻居。
b)IBGP邻居传来的路由由于是在同一个AS,所以没法通过AS_PATH防环,于是BGP规定IBGP只能传一跳。
c)BGP还有2个问题。 问题一:BGP规定从EBGP学到的路由,传给IBGP邻居,不改变下一跳。这样通常对AS内部路由器来说,这个下一跳地址是不可达的。 问题二:由于水平分割,IBGP邻居只能传一跳,所以设想就是把2个IBGP建立在网络边缘。但是中间的路由器成了黑洞。(简而言之,即IBGP下一跳可达性问题,以及路由黑洞问题,只有解决这2个问题后IBGP传来的路由才是优化的)
d)典型的组网变成下图所示。假设图中A宣告一条路由dest,传给B,B直接是优化的,正常装表并传给E。问题一就是E收到这条dest路由时,下一跳是A的地址,这地址是AS外的地址通常是不可达的。问题二就是中间的C和D并不知道这条dest路由。(再强调下,EBGP传来的直接就是优化的,能够直接装表并往下传)
e)这时路由器E怎么办呢?BGP规定只有解决了这2个问题,E收到B(IBGP邻居)传来的dest路由才是优化的(>),才能正常装表,并传给F。(否则不是坑了F么,不解决的话自己内部都还没法访问这条dest路由)
f)问题一的解决方法:B对E说next-hop-self,把下一跳改为自己;或者是,E写一条关于下一跳地址的静态路由,使得下一跳可达。问题二的解决方法:将BGP路由重发布到IGP中,使得AS65102内所有的路由器都知道dest这条路由。这个重发布只能在B上做,因为B关于这条dest是优化的,E上的这条dest是非优化的。
g)重发布让IGP内部的路由器不堪重负,因为可能C和D后面还接着很多路由器,但实际上假如这条dest路由只是想借道65102去往65103,65102内部的很多路由器无需知道这条路由。于是问题二可以不去解决,直接在E上把同步关掉即可,这样,E上的这条dest路由也能有>号,并且正常装表并传给F。(别忘了关同步只是解决问题二,要想出现大于号,问题一还是要照样解决的)
h)下一跳可达,关掉同步后,2个问题解决了,路由层都优化了,可以正常在传递了,但有什么问题呢?在传递数据时,C和D又变为黑洞了,怎么解决呢?需要依靠所有路由器运行IBGP并fullmesh或者MPLS。
i)总结IBGP路由层面打通方法:下一跳可达+开同步+BGP重发布进IGP;下一跳可达 + 关同步。(即IBGP邻居传来的路由优化的条件)
j)总结IBGP数据层面打通方法:下一跳可达+开同步+BGP重发布进IGP;下一跳可达 + 关同步 + All run and fullmesh/MPLS。
详见2-5。
f)问题一的解决方法:B对E说next-hop-self,把下一跳改为自己;或者是,E写一条关于下一跳地址的静态路由,使得下一跳可达。问题二的解决方法:将BGP路由重发布到IGP中,使得AS65102内所有的路由器都知道dest这条路由。这个重发布只能在B上做,因为B关于这条dest是优化的,E上的这条dest是非优化的。
g)重发布让IGP内部的路由器不堪重负,因为可能C和D后面还接着很多路由器,但实际上假如这条dest路由只是想借道65102去往65103,65102内部的很多路由器无需知道这条路由。于是问题二可以不去解决,直接在E上把同步关掉即可,这样,E上的这条dest路由也能有>号,并且正常装表并传给F。(别忘了关同步只是解决问题二,要想出现大于号,问题一还是要照样解决的)
h)下一跳可达,关掉同步后,2个问题解决了,路由层都优化了,可以正常在传递了,但有什么问题呢?在传递数据时,C和D又变为黑洞了,怎么解决呢?需要依靠所有路由器运行IBGP并fullmesh或者MPLS。
i)总结IBGP路由层面打通方法:下一跳可达+开同步+BGP重发布进IGP;下一跳可达 + 关同步。(即IBGP邻居传来的路由优化的条件)
j)总结IBGP数据层面打通方法:下一跳可达+开同步+BGP重发布进IGP;下一跳可达 + 关同步 + All run and fullmesh/MPLS。
详见2-5。
1.1,防环
EBGP的水平分割:AS之间的防环,路由器不收带有自己AS号的路由更新。(控制层面)
IBGP的水平分割:从IBGP收到的路由不会通过给另一个IBGP。(控制层面)
RR的防环:RR打破了IBGP只传一跳的规则,所以需要通过cluster-id防环
1.2,黑洞
由于防环机制的存在,BGP中间途径的路由器不会获知外部的路由。
黑洞举例:假设(A)-EBGP-(B-C-E)-EBGP-(F),B和E建立IBGP,此时A ping F不会通,因为A查去往F得仍给B,B查去往F需要扔给E(假设E开了nexthopself),递归查找经过C/D去E,但包到了C/D后就丢弃了,因为C/D没有路由去往F。
1)AS65101中的路由条目传到AS65103
EBGP:AB,EF。 IBGP:BE
控制层面:ABEF
数据层面:FE,到D和C会被丢弃
EBGP:AB,EF。 IBGP:BE
控制层面:ABEF
数据层面:FE,到D和C会被丢弃
2)解决方法
物理线路full mesh(关同步):不会用,代价贵,都直连了有路由
逻辑线路full mesh(关同步):全连接,所有路由器运行BGP并运行BGP,即BCDE全部建立BGP邻居关系(无需直连),可以用RR,联盟
重发布(开同步):将BGP重发布到IGP,只能实验环境做,实际中要想这么做只能通过ACL导一部分
MPLS(关同步):BGP内部通过标签走,不通过路由走,实际上就是利用了CEF解决递归查找的功能
3)BGP路由黑洞,C和D能传BE之间的路由,但是不能传数据,这是因为:
控制层面源目的在变,分为三段(源A到目的B,源B到目的E,源E到目的F,每一段都有路由),通过TCP传路由。
数据层面源目的不变,源F目的A,中间C和D没有路由
1.3,同步
BGP的同步:为了确保宣告出去的路由都不会有黑洞问题,开启同步后,BGP只会将IGP和BGP同步后(通过重发布)的路由宣告出去,即宣告的路由不可能有黑洞。
现在,思科路由器默认禁止同步。
1.4,全互连
要所有路由器都能更新路由,所有经过路由器运行BGP并且full mesh,full mesh只需路由可达,无需直连。
不是全互联,可能导致两个问题:1,更新发不过去,例如防环中的那个例子。2,更新发过去了,但数据包过不去,例如黑洞例子。
2,BGP建邻居配置命令
2.1,基本三步,邻居三步
基本三步:router-id,no au,no sy (高版本后2步默认已经有)
邻居三步:neighbor,update-source,multihop(EBGP)/next-hop-self(IBGP)
备注:
neighbor语句中,后面的地址是端口地址,不是路由器的Router-ID。
邻居三步,如果EBGP用直连建立,则只有neighbor;
邻居三步,如果EBGP邻居一边用环回口,一边用物理口,则用物理口的那边需配multihop,用环回口那边即使不声明updata-source l0也行,因为BGP的TCP连接只需要一边发起能通即可。
邻居三步,如果IBGP用连接骨干网的物理口建立,则只有neighbor和next-hop-self(不用update-source是因为物理口已经被宣告进IGP),甚至如果IGP中有到EBGP直连口的路由,则只有neighbor。
邻居三步,如果IBGP用环回口建邻居,则要包含三步,其实update-source只要一端声明也可建立连接。
2.2,命令说明
1)no auto-summary
把任何一种协议重分布的BGP中时,如果默认是auto-summary时会发生自动汇总
仅仅是发生在重分布的时候,其他情况与汇总无关
自动汇总:汇总成一个主类网络,现在一般都关,都无类了
下一跳0.0.0.0代表是自己发出的
把协议重分布到BGP:
auto-summary:不携带原有的下一跳和metric,自动汇总成主类
no auto-summary:携带原有IGP的下一跳和metric,不会自动汇总
2)update-source
BGP无法像IGP那样自动发现邻居,需要由BGPneighbor手工指定,该命令默认源IP(更新源)是出接口IP。
IBGP建立邻居用环回口时,需要更改update-source
EBGP建立邻居用环回口时,需要调整update-source、multihop
实际上建邻居连接只需要保证一方满足。
两边都是默认路由无法建立邻居(为了防环),一边静态一边默认可以建立邻居。
3)next-hop-self
当从EBGP对等体学到的路由,传给IBGP对等体时,不会改变原来的下一跳,而这个下一跳对于内部网络来说,很可能不可达。
解决方法:使外部EBGP更新源接口可达,或者用next-hop-self更改更新源。一般都用后者。
4)ebgp-multihop
用于EBGP,配合update-source命令,通过环回口建邻居。
EBGP默认只能1跳,所以如果EBGP用环回口建立邻居,需要更改为多条。(IBGP默认就是多跳,无需此命令)
3,MA网络中,BGP下一跳的特列
34之间EBGP邻居,4访问2的下一跳会更改为1
ICMP的重定向:3发现接口收到的报文又从该接口发出去了,就会发起ICMP重定向
4,BGP路由通告
a)当存在多条路径时,BGP路由器只选最优(没有负载均衡情况下)
b)BGP只把最优路由传递给BGP peer
c)从EBGP邻居学到的会向所有BGP邻居通告(直接是优化的,包括EBGP邻居和IBGP邻居)
d)从IBGP邻居学到的不会向IBGP邻居通告(为了防环,RR除外)
e)从IBGP邻居学到的只有优化了才能往EBGP邻居传(重发布,或者关同步,但关同步会产生的黑洞,解决方法见1)
假设R1从邻居学到路由,传递情况如下:
|
从R2(IBGP邻居)学到
|
从R4(EBGP邻居)学到
|
传给R3(IBGP邻居)
|
不传
开RR时能传,(但GNS实验发现传的时候下一跳不变,nexthopself也没用,只能依靠IGP到达R2了)
|
1)传,next-hop仍然R4。不优。
2)需静态或nexthopself,并关同步或重发布后变优。
3)如果关同步还需fullmesh/RR解决黑洞问题。
|
传给R5(EBGP邻居)
|
传,next-hop变成R1。
直接是优化>,装表往后传。
|
传,next-hop变成R1。
直接是优化>,装表往后传。
|
另外,如果把R4(EBGP邻居)学到路由重发布到IGP,只能在R1上做,R1是优化的,R2和R3都没有大于号。
凡是IBGP邻居传来的路由,即使IBGP邻居是相邻的,该路由也是不优的,必须关闭同步才优。
5,BGP的auto-summary与aggregate
BGP开启auto-summary时,可以network主类路由,路由表中一旦有该主类下的明细路由,主类路由就会被宣告给对方,否则BGP必须要路由表中有路由时才会被宣告给对方。
auto-summary命令作用的对象:(1)重分布进bgp的igp或(2)直连或(3)静态路由,应该还有(4)通过IGP学到的路由。如果这些路由是子网路由,在进bgp表时将被自动汇总成有类路由条目。
auto-summary命令不作用的对象:(1) network通告的路由,(2)ibgp或ebgp邻居通告的路由,如果是此类产生的路由,在show ip bgp表中将是子网路由,这些路由再通过ibgp或ebgp通告给邻居时,根据此原则,无论邻居是否启用auto-summary,接收到的都将是子网路由条目。
总结:
只要在show ip bgp表中存在的路由,都会不变地传给ibgp或ebgp的邻居,而不管邻居或自己是否启用auto-summary命令。
将BGP重发布进入IGP时,自动汇总后network的路由,不会被灌回去,但是aggregate汇总宣告的路由,会被灌回去,要用route-map防止灌回。
汇总范围:
auto-summary:只能主类,例如10.0.0.0/8
aggregate:随意,例如10.0.0.0/16
汇总方法:
auto-summary:
方法1:开启auto-summary,network 10.0.0.0,前提是需路由表有10.0.0.0/8下的任意一条明细路由。注意前提是路由表里有,并且要到BGP下network主类。
方法2:开启auto-summary,重发布IGP至BGP,所有IGP中的明细路由都会自动汇总变成主类路由。
aggregate:
手工汇总BGP表里有的路由,无论是自己network的,还是BGP邻居传过来的,都行!aggregate 10.0.0.0 255.0.0.0。注意前提是必须要BGP表里有,并且要到BGP下agg汇总!
抑制明细:
auto-summary:不会抑制明细
aggregate:不会抑制明细,想抑制需要aggregate后面加上no-summary
将BGP重发布回IGP时路由灌回:
auto-summary:不会灌回
aggregate:会灌回到IGP,本路由器sh ip route发现是一条指向null0的汇总路由,其他IGP域内的路由器也会收到该路由,如果不想收到需要做过滤
6,BGP的default-information originate
两种方法产生默认路由:详见BGP配置7
1)当本地有默认路由时并且重发布到BGP时,用default-information orignate可传递给所有邻居默认路由,注意这条必要BGP表里有默认才行,默认BGP不会将0.0.0.0传给对方,一定要有这条命令才会传,即想传默认路由给对方,一定要重发布含默认路由的+这条命令
2)或者单独的network 0.0.0.0 mask 0.0.0.0 也可产生,OSPF本地无默认路由时可以强行加上always指定,BGP没有always
3)或者本地nei 对端PE default-orignate,可强制产生默认路由,无论本地有没有默认路由,注意模拟器的版本中这条命令本地的BGP表中没有0.0.0.0,对端有,但本端会有一段说明给对方下放了默认路由