摘要
有关路由策略治理和多播地址治理的部分
路由策略数据库治理命令
8.1.缩写
rule、ru
8.2.对象
路由策略数据库的规则用于控制选择路由的算法。
Internet上采用的路由算法一般是基于数据包目的地址的。理论上,也可以由TOS域决定,不过这没有实际应用。要了解经典路由算法的具体情况请参考RFC-1812。
而在某些情况下,我们不只是需要通过数据包的目的地址决定路由,可能还需要通过其他一些域:源地址、ip协议、传输层端口甚至数据包的负载。这就叫做:策略路由(policy routing)。
注重:策略路由(policy routing)不等于路由策略(rouing policy)。
在这种情况下,传统的基于目的地址的路由表就无法满足要求了,需要使用路由策略数据库(routing policy database,RPDB)代替,通过它选择执行某些路由。这些规则可以由很多不同的状态,而且它们没有天生的次序,要由系统治理员决定。RPDB可以匹配以下的域:
数据包的源地址;
数据包的目的地址;
服务类型(Type of Service);
进入的网络接口;
匹配IP协议和传输层端口也是可能的,不过这要依靠iptables或者ipchains通过fwmark为某些数据包做标记,并重定向。
每个路由策略由一个选择符(selector)和一个操作(action)组成。系统按照顺序搜索路由策略数据库,把选择符和{源地址、目的地址、进入接口、tos、fwmark}等要害词进行匹配,假如匹配成功,就执行action定义的操作。操作或者成功返回,或者失败并且中止对路由策略。否则,系统继续查询路由策略数据库。
操作如何定义?最原始的操作是选择下一跳(nexthop)和输出设备(output device)。Cisco IOS使用这种方式,我们姑且把这叫做匹配并设置(match & set)。而linux的方式则更为灵活,Linux答应的操作包括:基于目的地址的路由表查询以及按照最长匹配的原则从路由表中选择路由。因此,匹配并设置(match & set)的方式只是一个最简单的特例而已。
再系统启动时,内核会为路由策略数据库配置三条缺省的规则:
不要混淆路由表和策略:规则指向路由表,多个规则可以引用一个路由表,而且某些路由表可以没有策略指向它。假如系统治理员删除了指向某个路由表的所有规则,这个表就没有用了,但是仍然存在,直到里面的所有路由都被删除,它才会消失。
8.3.规则类型
路由策略规则数据库可以包括如下类型的规则:
8.4.命令
add、delete、show(或者list)
8.5.ip rule add -- 插入新的规则
ip rule delete -- 删除规则
缩写:add、a;delete、del、d
参数
警告
使用上面两个命令对路由策略数据库进行的任何修改都不会马上生效。只有使用ip route flush cach命令刷新路由缓存之后才会生效。
示例
8.7.ip rule show -- 列出路由规则
缩写:show、list、sh、ls、l
参数
好消息,这个命令没有参数。
输出格式
每行第一部分的数字是规则的优先级,接着是选择符。
要害词lookup后面接着路由表识别符。
假如规则要进行网络地址转换,还需要一个要害词map-to设置转换以后的地址。
上面的示例非常简单,192.203.80.0/24和193.233.7.0/24组成内部网络,但是它们向外发送数据包要通过不同的路由。主机193.233.7.83和外界会话时,地址需要转换为192.203.80.144。
9.ip maddress -- 多播地址治理
9.1.对象
这个命令治理的对象是多播地址。
9.2.命令
add、delete、show(或者list)
9.3.ip maddress show -- 列出多播地址
缩写:show、list、sh、ls、l
参数
dev NAME(defautl) 设备名
输出格式
kuznet@alisa:~ $ ip maddr ls dummy
2:dummy
link33:33:00:00:00:01
link01:00:5e:00:00:01
inet224.0.0.1 users 2
inet6 ff02::1
kuznet@alisa:~ $
输出的第一行是设备的索引和设备名。后面几行是多播地址,每行由协议识别符开头。要害词link表示这是链路层多播地址。
假如一个多播地址有几个用户,那么用户数就在users要害词之后列出。上面的例子没有出现要害词static,它表示这个地址是由ip maddr add命令加入的。
9.4.ip maddress add -- 加入多播地址
ip maddress delete -- 删除多播地址
缩写:add、a;delete、del、d
简介
使用这两个命令,我们可以添加/删除在网络接口上监听的链路层多播地址。这个命令只能治理链路层地址。
参数
address LLADDRESS(default) 链路层多播地址
dev NAME 加入/脱离这个多播地址的设备
示例
让我们继续上一小节的例子
netadm@alisa:~ # ip maddr add 33:33:00:00:00:01 dev dummy
netadm@alisa:~ # ip -O maddr ls dummy
2:dummy
link33:33:00:00:00:01 users 2 static
link01:00:5e:00:00:01
netadm@alisa:~ # ip maddr del 33:33:00:00:00:01 dev dummy
注重:ip命令和内核都不会检查多播地址的有效性。这意味着你可以使用unicast地址代替多播地址。大多数驱动都会忽略unicast地址,但是有些驱动(例如:tulip)会把这个unicast地址加入其过滤器。这样作的效果有些希奇,假如你使用了别的主机或者路由器的地址作为多播地址,你就可以收到发送到它们的数据包。不过,这并非一个bug,而是内核的一个功能。它可以用于网络监视。