定义:通过流量策略来执行选路的一种转发手段。
控制层面——给路由的转发做指导
数据层面——在路由表中找到路由的出接口或者下一跳
传统的路由表转发只能通过数据的目标地址做策略。
策略路由可以根据源地址、目的地址、源端口、目的端口、协议、TOS等流量特征来做决策提供路由——灵活性高,但速度慢,需要一个一个抓,操作相对麻烦。
策略路由是先于路由表执行的,策略路由没有捕获的流量依然会去执行路由表。
两种配置:
1:接口下配置
access-list 100 permit ip host 1.1.1.1 any //用ACL捕获流量
route-map pbr permit 10 //定义route-map
natch ip address 10 //调用被ACL捕获的流量
set ip next-hop 10.1.1.1 //设置下一跳
int f0/1
ip policy route-map pbr //接口下调用
只能捕获该接口的入接口流量做策略(不能处理本路由器产生的流量)。
2:全局配置
access-list 100 permit ip host 1.1.1.1 any //用ACL捕获流量
route-map pbr permit 10 //定义route-map
match ip address 10 //调用被ACL捕获的流量
set ip next-hop 10.1.1.1 //设置下一跳
ip local policy route-map pbr
能够捕获所有接口入接口流量以及本路由器产生的流量(源地址是本路由器地址)
3:策略路由的冗余设置
route-map pbr permit 10
match ip address 1
ip next-hop verify-availability 10.1.24.2 1 track 1 //track 成功则本条生效,track失败则执行下一条set语句
track ip next-hop 10.1.34.3
track 1 ip sla 1 //定义一个track监控sla的探测结果
ip sla 1 //定义一个sla
ip icmp-echo 10.1.12.1 source-ip 10.4.4.4 //设置其探针
ip sla schedule 1 life forever start-time now //设置sla 1的执行时间
4:default 语句
在route-map的set ip default这个位置输入,定义被捕获的流量为先查路由表。如果能精确匹配(如果抓的10.5.5.5,路由表中有10.5.5.0/24这就不叫精确匹配。如果有10.5.5.5/32则叫精确匹配)就执行路由表。如果不能则执行策略路由。
access-list 100 permit ip host 1.1.1.1 any //用ACL捕获流量
route-map pbr permit 10 //定义route-map
match ip address 100 //调用被ACL捕获的流量
set ip default next-hop 10.1.1.1 //设置下一跳
int f0/1
ip policy route-map pbr //接口下调用
策略路由在转发层面不如路由表。原因是匹配的东西过多,底层芯片处理支持有限。使用原则是能不使用就不使用,如果出现非目的地址的转发策略果断用。
5:策略路由的其他功能——为流量打标记
route-map pbr permit 10
match ip address 1
set ip precedence priority //设置队列优先级(优先出接口)
PS:前缀列表比ACL更方便抓精确流量,ACL匹配的范围更大。
10.0.0.0/24
10.0.0.0/8
10.0.0.0/16
使用前缀列表能够精确抓出上面三条中的其中一条。但抓汇总路由时使用ACL更方便。
BGP:EBGP协议,管理AS之间路由传递。距离矢量型,采用分布式计算。用TCP来传递路由信息(端口179),保证了可靠性但会丧失邻居自动发现,只能手动建邻,并且可以非直连建邻。
BGP设计用来处理AS之间的路由,所以该协议重点处理AS之间的路由,AS之内的路由不作为重点。
BGP使用AS号作为识别不同AS路由的标识,该AS号需要具有唯一性。AS号范围:1-65535,可以使用扩展32位 65535-4294967295(解决AS不够用的情况)
BGP的最新使用单位是一个路由器所以每个路由器只能使用一个BGP的进程。
由于BGP管理的路由信息非常庞大,不能够使用周期更新,只能触发更新。并且BGP会认为一条路由时间越久越稳定,在这种情况下BGP必然不会使用复杂的算法来处理BGP收到的路由信息,由于每个AS情况不一致,管理范围也有限,它必然需要丰富的管理参数(不能只依赖metrci)。综上所述BGP必然需要多种参数共同来决定路由的选择,并且不能依赖某种特定的全局算法,只能单独去计算某一条路由,不能全盘考虑,并且需要依赖所属AS管理员手动设置。BGP更像一种路径优先协议,通过给每一个路由设置大量的属性参数来进行灵活的管理或者选路,并且这些属性参数大量的都需要人为操控。
1> down——初始状态
2> idle state
配置了neighbor或者重置了邻居,BGP初始化所有资源打开connectretry计时器,初始化邻居的TCP连接,监听来自邻居初始化消息并将它的状态转到connect状态。
为了防止差错的持续出现造成BGP邻居的摆动,connectretry计时器会呈现级数级的增加,第一次60s;下一次为前一次的2倍120s,再下次240s…
3> connect state
BGP等到TCP连接完成以后再决定后续的动作
1:如果TCP同步成功,BGP将connectretry清零,完成初始化并发送一个open消息给邻居并把状态置为open
2:如果失败,BGP继续监听邻居发出的连接,重置connectretry计时器并转移到active状态
3:如果connectretry时间超时,计时器重新开始,再试图与邻居建立TCP连接,BGP保持connect状态,出现其他事件转入idle状态
4> active state
BGP试图与邻居建立一个TCP连接
1:如果TCP连接成功,BGP将connectretry计时器清零,完成初始化,给邻居发送open消息并将状态置为open,hold事件置为4mins
2:如果在active状态,connectretry计时器超时回到connect状态并重置connectretry计时器
3:如果试图与一个未知ip建立TCP会话,同时connectretry计时器重置,连接拒绝并保持active状态
4:任何一个事件都会导致重回idle
5> open send state
在此状态,已经发送了open消息,BGP等待邻居发送的open消息
1:收到open消息,如果发现差错,将给邻居发送一个notification消息并置为idle
2:如果收到open消息没错,并发送keeplive给邻居,并建立IBGP或者EBGP状态置为open confire state
3:如果收到TCP断开消息则断开BGP连接重置connectretry计时器,状态置为active
6> open confire state
在此状态下BGP会等待一个keeplive消息或notification消息
1:如果后搜到一个keeplive消息状态置为establish
2:如果收到notification消息状态置为idle断开TCP连接
3:如果hold计时器超时,检测到一个差错或者stop事件,BGP将给邻居发送一个notification并断开连接,状态置为idle
7> establish state
此状态BGP对等体间的连接已经完全建立,可以交换update,keeplive和notification消息,收到notification状态置为idle中断连接
8> path-attribute
一共10种属性(cisco11种)分为4类 well-known mandatory,well-known discretionary,optional transitive,optional nontransitive;11条属性:weight,origin,as_path,next-hop,local_pref,atomic_aggregate,aggregator,community,MED,originator_id,cluster_list.
1:公认必尊:所有BGP路由器必须识别遵守的原则有origin,as_path,next-hop
2:公认可尊:所有路由器都能识别但是不一定要遵守有local_pref,atomic_aggregate
3:可选传递:不是所有BGP路由器都能识别,但是所有BGP都能传递有aggregator和community
4:可选非传递:不是所有路由器都能识别,不能识别的BGP路由器就丢弃它有MED,originator_id和cluster_id,weight
1:open消息:open消息是TCP连接建立后发送的第一个消息,用于建立BGP对等体之间的连接关系。
2:keeplive消息:BGP会周期性地向对等体发出keeplive消息,用来保持连接的有效性。
3:update消息:用于更新路由,既可以发布可达消息,也可以撤销不可达路由信息。
4:notification消息:当BGP检测到错误状态时,就向对等体发出notification消息,之后BGP连接会立即中断。
5:reflush消息:刷新BGP路由。
参数与配置:
1:neighbor 10.1.1.1 //代表向该地址发送TCP端口为179的数据,并且自己也需要在发出地址上打开TCP 179的监听。该配置可以指定源地址也可以不指定源地址,不指定时默认为出接口地址。(意味着需要打开该出接口关于TCP 179的监听)
本端指的地址需要是对方的源地址,对方指的地址需要是本端的源地址。
2:neighbor 10.1.1.1 remote-as xx
对端建立邻居的AS号必须和本端remote-as xx号一致。
3:建邻双方保证TCP 179能够发送,不丢失,不被拦截。
BGP两种邻居关系:
IBGP邻居关系 // 相同AS路由器建立的邻居关系
EBGP邻居关系 //不同AS路由器建立的邻居关系
1:BGP不管什么邻居关系只传递最优路由(不优不传,优的标志是 > ,也就是不带 > 的路由不会被BGP传递)
2:EBGP邻居关系路由传递
只要不违背环路原则或者人工策略,EBGP邻居传递无限制(前提必须优),EBGP之间传递路由会更新next-hop为自己的更新源地址。
3:IBGP邻居关系路由传递
IBGP邻居之间不会中转路由。IBGP自己产生的路由(自己宣告的,自己重发布进行来的、和EBGP邻居传递的)都可以传递给他的IBGP邻居,但不可以在IBGP之间中转(也就是不能传递到邻居的邻居)IBGP之间传递路由不会更新next-hop(只有next-hop为0.0.0.0 的 情况才会更新,后者建立邻居的时候输入neighbor x.x.x.x next-hop-self更新为自己的更新源地址)
此设定的好处:IBGP之间拥有了水平分割从而避免了IBGP环路的产生,BGP也不必设置防环算法。
此设定的坏处:IBGP之间路由传递必须直接建立邻居,导致IBGP邻居关系是一种全互联状态。
weight:
cisco私有属性,对于离开AS的路由在路由器上选择哪一条最优,本台路由器产生为32768,学习的为0,不能传递,适用于一台路由去往别的AS有多个出口。
origin:
起源,0表示宣告(i),1表示EGP学到(E),3表示其他手段得到(重发布?),越低越好
as_path:
一条路由在传输过程中经历了哪些AS(不算自己),可用来防环,越短越好。
neighbor x.x.x.x allows-in 允许和具有自己相同的AS的路由进入本AS
neighbor x.x.x.x as-override 把具有和其他AS相同AS号的路由放入这个AS
next-hop :
到达路由的下一跳路由器ip地址
通告路由器和接收路由器不在一个as,next-hop为通告路由器的更新地址
通告路由器和接收路由器在一个as内,next-hop为通告邻居的更新地址
通告路由器和接收路由器在一个as内且为邻居关系更新地址为不同as,则为外部更新地址
local_pref:
不能传输到其他as,值越高越优,用于本as选择离开as的出口,路由器默认为100
MED:
用于选择流入as的入口路由器,可以在两个as之间传递,越低越好,默认为0
atomic_aggregate:
用来警告下游路由器路由聚合后产生的路由路径丢失。
BGP支持向BGP邻居传递重叠路由,可以选择多种方式
1> 明细和粗略的都公布 //aggregate-address 10.0.0.0 255.0.0.0
2> 只公布明细 //aggregate-address 10.0.0.0 255.0.0.0 suppress-map
3> 只公布没有重叠的as-path //aggregate-address 10.0.0.0 255.0.0.0 summary-only as-set
4> 聚合后公布聚合后的路由 //aggregate-address 10.0.0.0 255.0.0.0 summary-only
5> 明细和粗略都不公布
aggregator:
用来通告汇总路由的汇聚路由器 BGP_ID(cisco)
1> internet 默认属性,可以给任何BGP发送
2> no_export 只能在一个AS内传递,可以在联盟内传递
3> no_advertise 不在IBGP邻居间传递
4> local-as 不向任何EBGP邻居发送包括联盟的EBGP邻居
ip community-list //匹配列表
标准和扩展community:
标准是普通路由可以设置的团体公有和私有
扩展是mpls中vrf路由传递定义的
originator_id:
路由反射使用,是路由发起者产生的一个32比特的值,该值是本地路由发起者的RID,如果路由发起者从属性上看到自己的RID,说明有环路,忽略
cluster_list:
路由反射器使用,是路由经过反射器簇ID的一个序号,如果反射器在属性里看到自己的簇ID就说明有环路,忽略