策略路由:
策略路由的主要思想是允许用户除了可以根据目的IP地址配置路由外,还可以根据其他多个参数来配置路由。当使用策略路由时,为目的地址查找路由可以分为两个步骤:根据策略选中要用的路由表;从选中的路由表中查找路由。当然,在执行这两步时,总是先在路由缓存中寻找。
内核可以根据以下参数作为选择路由表时所用的策略:
源IP或/与目的IP。
入口设备。
TOS。
Fwmark:这是表示Linux防火墙威力的一个特性,可以根据防火墙分类来定义策略路由规则。
以上参数可以任意组合来确定路由策略。
多路径路由:
多路径路由是指管理员可以为一条路由的目的地址指定多个下一跳。默认情况下,路由缓存不支持多路径,但是从内核2.6.12开始,有一个选项可以使用户激活缓存支持多路径,而且允许管理员针对一条多路径路由,选择一个算法在此路由的不同下一跳之间分配流量。
基于路由表的分类器:
流量控制子系统有一种称为基于路由表的分类器。它能够基于realm来将路由分类。realm使可以在策略和路由上指定的数字标签。每一个路由和每一个策略最多可以指定两个realm:一个是入口realm,一个是出口realm。
配置策略realm:
ip rule add from 10.0.1.0/24 realm 128:将源于10.0.1.0/24子网的所有流量与策略目的地realm128相关联。
ip rule add from 10.0.1.0/24 to 10.0.2.0/24 realms 64/128:将源于10.0.1.0/24子网且目的为10.0.2.0/24子网的所有流量与策略源64和策略目的地128关联。
配置路由realm:
ip route add 10.0.1.0/24 via 10.0.0.3 realms 100:将目的地为10.0.1.0/24子网且通过网关地址10.0.0.3转发的流量与目的地realm100相关联。
ip route add 10.0.1.0/24 via 10.0.0.3 realm 100/200:将目的地为10.0.1.0/24子网且通过网关地址10.0.0.3转发的流量与源realm100和目的地realm200相关联。
计算路由标签realm:
上图中,策略P1,P2配置了源realm,没有配置目的realm。路由R1,R2没有配置realm。
从A(10.0.1.100)到B(10.0.2.200)。路由子系统为该封包查找路由时,计算路由标签过程如下:
路由查找返回R1和P1,因为路由R1没有配置realm,所以使用策略P1上的源realmA;
因为没有配置目的realm,内核计算从10.0.2.200到10.0.1.100的反向路由,这次路由查找返回R2和P2,找到源realmB,所以realmB被用作转发路径上的目的realm。
最终,路由标签初始化为源realmA和目的realmB,当流量稍后通过流量控制层时,Qos层可以使用这两个realm来将封包正确分类。
路由协议守护进程:
可以用下面三种方式将路由插入到内核的路由表中:
通过用户命令(ip route和route)。
通过路由协议,例如边界网关协议BGP,外部网关协议RGP,OSPF协议等动态配置。这些协议的实现是作为用户空间的路由守护进程。
内核接收和处理的ICMP重定向消息。
每一个守护进程在用户空间维护自己的路由表,路由选择时并不是直接使用这些路由表,而是用内核中存储的路由表。但是,守护进程可以将自己路由表中的路由项插入到内核路由表中。
Verbose监控:
当内核支持verbose监控选项并且激活时,在输入封包的源ip或目的ip地址可疑或无效时,内核将在控制台上输出警告信息。这些信息每5秒输出一条,以避免潜在的DoS攻击。
共享介质:
当配置为不同子网的主机被连到同一LAN时,IP路由文档中称之为共享介质。
如上图所示,在连接到同一LAN上的主机被配置为三个不同的子网,两个路由器RT1和RT2被用于连接IP子网。
子网10.0.0.0/24内的主机将RT1认定为自己的默认网关,通过这个网关可以访问子网10.0.1.0/24。但是这样效率较差,因为从图中可以看到,所有的子网在链路层上是直接相连的。路由子系统使用ICMP RERDIRECT机制克服了这种缺陷。当10.0.0.0/24内的主机A想要与子网10.0.1.0/24内的主机B通信时,A查找路由表,发现可以通过RT1将消息转发给B,于是RT1会收到A的消息,但RT1意识到,A和B可以直接通信,于是它会发送一个ICMP REDIRECT告诉A,有一个更好的路径可以访问B。
但有时候,使用ICMP REDIRECT消息而造成的捷径可能并非我们所期望的,因为这些捷径会绕过某些路由器,而我们在这些路由器上配置了一些流量策略。
反向路径过滤:
Linux的默认行为认为非对称路由是可疑的,因此会丢弃那些通过非对称路径返回的封包。可以通过/proc来调整每个设备的这种行为。