首先我们来看一下路由表的查找过程:
 
1.从IP数据包中提取目的IP地址。
 
2.先用直连网段去挨个匹配,即用每个直连路由条目的子网掩码和目的网络进行And运算,再与该条目的网络前缀进行匹配。
 
3.如果没有直连匹配的项,查看是否有目的地址的主机路由存在。
 
4.如果没有主机路由,则匹配路由表中的其他条目,逐条进行匹配。
 
5.如果依然没有匹配的项,就看是否有默认路由,有的话通过默认路由发出去,如果连默认路由都没有,丢弃该数据包,返回ICMP信息指明该目的网络不可达。
 
PS: ip  classless 对路由表查找有影响,如果关闭了(默认是开启的),那么就不会用精确掩码去和目的地址去匹配(比如我写10.1.1.0 255.255.255.0),而是用这个该网络的主网络位去匹配,即255.0.0.0,这样只要有别的子网在,就不会通过默认路由转发数据。
 
另外一个命令 ip subnet-zero 在路由器中是默认启用的,以支持全0的子网,比如172.16.0.0/24,如果关闭的话,在给接口配置地址的时候像 ip address 172.16.0.1 255.255.255.0 这样就是非法的了。
 
然后我们来看看策略路由:
 
策略路由的优先级高于路由表,即使路由表中没有相对应的路由条目,单纯在策略路由也能转发正常数据包。具体是用route-map来实现,步骤如下:
 
1)定义好对象  即在写route-map的时候需要match的东东,比较常见的是地址,用ACL来定义,注意标准ACL只能针对源来做策略,而扩展ACL可以针对源,目的网络或者具体的上层应用。
 
(config)# access-list 1 permit 1.1.1.0 0.0.0.255
 
(config)# access-list 101 permit tcp 1.1.5.0 0.0.0.255 any eq telnet
 
PS:在我们做实验验证时,可以通过ip telnet source-interface loop 0 来改变自己telnet时的源地址为Loopbak 0
 
2)写route-map,下面是一个具体例子,基本的组成元素就是match和set,即针对什么东东以及执行的动作是什么。
 
(config)# route-map to-r1                              // 定义一个route-map,名字要可读性强
(config-route-map)# match ip add 1              // 这里的1就是指的access-list 1
(config-route-map)# match length 0 200       // 针对的源地址以及数据包的大小范围,二者需同时匹配
(config-route-map)# set ip next-hop 23.1.1.3    //定义好策略要实现的动作,这里是改变下一跳
 
PS:这里最后的一条set命令可以有两种选择: set ip next-hop 23.1.1.3 (对端IP)   or   set default interface fa0/0 (本地出口),不过这两条命令是有区别的,前者直接应用策略路由,而后者先检查路由表,如果没有明细路由对应再用策略路由。
 
需要注意的是,如果default interface为以太口,由于我们并未告知路由器下一跳的IP地址,路由器也就没有办法通过ARP解析出Mac,会出现封装失败的情况,不过在转发失败之后
会进行ARP请求。
 
这样的命令可能会让我们联想到静态路由,不过区别在于静态路由如果指定以太口为本地出口,比如 ip route 0.0.0.0  0.0.0.0 fa0/0,通过show arp 可以看到这条命令在敲下去以后会添加相应的ARP表项,也就是会发起ARP请求。
 
3)应用在接口,这里没有in 和out 的概念,因为肯定是该接口收到这个数据包后进行匹配然后按策略路由转发。
 
(config-if)# ip policy route-map to-r1

PS:本路由器产生的数据包默认是不会基于策略路由进行转发,需要用命令来启用:
 
(config)# ip local policy route-map name