分类: 系统运维
2005-05-07 08:17:57
By
rule、ru
路由策略数据库的规则用于控制选择路由的算法。
Internet上采用的路由算法一般是基于数据包目的地址的。理论上,也可以由TOS域决定,不过这没有实际应用。要了解经典路由算法的详细情况请参考RFC-1812。
而在某些情况下,我们不只是需要通过数据包的目的地址决定路由,可能还需要通过其他一些域:源地址、IP协议、传输层端口甚至数据包的负载。这就叫做:策略路由(policy routing)。
注意:策略路由(policy routing)不等于路由策略(rouing policy)。
在这种情况下,传统的基于目的地址的路由表就无法满足要求了,需要使用路由策略数据库(routing policy database,RPDB)代替,通过它选择执行某些路由。这些规则可以由很多不同的状态,而且它们没有天生的次序,要由系统管理员决定。RPDB可以匹配以下的域:
匹配IP协议和传输层端口也是可能的,不过这要依靠iptables或者ipchains通过fwmark为某些数据包做标记,并重定向。
每个路由策略由一个选择符(selector)和一个操作(action)组成。系统按照顺序搜索路由策略数据库,把选择符和{源地址、目的地址、进入接口、tos、fwmark}等关键词进行匹配,如果匹配成功,就执行action定义的操作。操作或者成功返回,或者失败并且中止对路由策略。否则,系统继续查询路由策略数据库。
操作如何定义?最原始的操作是选择下一跳(nexthop)和输出设备(output device)。Cisco IOS使用这种方式,我们姑且把这叫做匹配并设置(match & set)。而Linux的方式则更为灵活,Linux允许的操作包括:基于目的地址的路由表查询以及按照最长匹配的原则从路由表中选择路由。因此,匹配并设置(match & set)的方式只是一个最简单的特例而已。
再系统启动时,内核会为路由策略数据库配置三条缺省的规则:
优先级 | 选择符 | 操作 | 解释 |
0 | 匹配任何条件 | 查询路由表local(ID 255) | 路由表local是一个特殊的路由表,包含对于本地和广播地址的高优先级控制路由。rule 0非常特殊,不能被删除或者覆盖。 |
32766 | 匹配任何条件 | 查询路由表main(ID 254) | 路由表main(ID 254)是一个通常的表,包含所有的无策略路由。系统管理员可以删除或者使用另外的规则覆盖这条规则。 |
32767 | 匹配任何条件 | 查询路由表default(ID 253) | 路由表default(ID 253)是一个空表,它是为一些后续处理保留的。对于前面的缺省策略没有匹配到的数据包,系统使用这个策略进行处理。这个规则也可以删除。 |
不要混淆路由表和策略:规则指向路由表,多个规则可以引用一个路由表,而且某些路由表可以没有策略指向它。如果系统管理员删除了指向某个路由表的所有规则,这个表就没有用了,但是仍然存在,直到里面的所有路由都被删除,它才会消失。
路由策略规则数据库可以包括如下类型的规则:
unicast | 返回从被引用的路由表中发现的路由 |
blackhole | 丢弃数据包,不做任何反应 |
unreachable | 产生网络不可达(Network is unreachable)的ICMP错误信息 |
prohibit | 产生通讯被禁止(Communication is administratively prohibited)的ICMP错误信息 |
nat | 把数据报的源地址转换为其它的值。详情请参考附录C |
add、delete、show(或者list)
type TYPE(default) | 这个规则的类型。有效的类型上一节已经介绍过了。 |
from PREFIX | 匹配的源地址 |
iif NAME | 选择数据包进入的设备。如果接口是回环设备,这个规则就只匹配源于本机的数据包。这意味着,你可以为本机发出的数据包和要转发的数据包分别建立路由表,使两者完全隔离。 |
tos TOS或者dsfield TOS | 选择匹配的TOS值 |
fwmark MARK | 选择要匹配的fwmark值 |
priority PREFERENCE | 设置这个规则的优先级。每个规则的优先级都应该明确设置为一个唯一的数值。实际上,由于历史的原因,ip roule add命令无需任何优先级的值,也不必是唯一的。如果用户没有在命令中提供优先级的值,内核会自动选择。如果用户提供的优先级值已经存在,内核也不会拒绝这次请求,而是在相同优先级的规则前面插入新的规则。 |
table TABLEID | 如果规则选择符匹配,就被查询的路由表识别符。 |
realms FROM/TO | 如果规则匹配和路由表查询成功,选择的realms值。 |
nat ADDRESS | 设置要进行网络地址转换的IP地址段。ADDRESS或者是进行网络地址转换ip地址段,或者是一个本机地址,甚至可以是0。 |
使用上面两个命令对路由策略数据库进行的任何修改都不会马上生效。只有使用ip route flush cach命令刷新路由缓存之后才会生效。
ip ru add from 192.203.80/24 table inr.ruhep prio 220 ip ru add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320 ip ru del prio 32767 |
好消息,这个命令没有参数。
kuznet@amber:~ $ ip ru ls 0: from all lookup local 200: from 192.203.80.0/24 to 193.233.7.0/24 lookup main 210: from 192.203.80.0/24 to 192.203.80.0/24 lookup main 220: from 192.203.80.0/24 lookup inr.ruhep realms inr.ruhep/radio-msu 300: from 193.233.7.83 to 193.233.7.0/24 lookup main 310: from 193.233.7.83 to 192.203.80.0/24 lookup main 320: from 193.233.7.83 lookup inr.ruhep map-to 192.203.80.144 32766: from all lookup main kuznet@amber:~ $ |
每行第一部分的数字是规则的优先级,接着是选择符。
关键词lookup后面接着路由表识别符。
如果规则要进行网络地址转换,还需要一个关键词map-to设置转换以后的地址。
上面的示例非常简单,192.203.80.0/24和193.233.7.0/24组成内部网络,但是它们向外发送数据包要通过不同的路由。主机193.233.7.83和外界会话时,地址需要转换为192.203.80.144。 9.ip maddress -- 多播地址管理
这个命令管理的对象是多播地址。
add、delete、show(或者list)
dev NAME(defautl) | 设备名 |
kuznet@alisa:~ $ ip maddr ls dummy 2: dummy link 33:33:00:00:00:01 link 01:00:5e:00:00:01 inet 224.0.0.1 users 2 inet6 ff02::1 kuznet@alisa:~ $ |
输出的第一行是设备的索引和设备名。后面几行是多播地址,每行由协议识别符开头。关键词link表示这是链路层多播地址。
如果一个多播地址有几个用户,那么用户数就在users关键词之后列出。上面的例子没有出现关键词static,它表示这个地址是由ip maddr add命令加入的。
使用这两个命令,我们可以添加/删除在网络接口上监听的链路层多播地址。这个命令只能管理链路层地址。
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 link 33:33:00:00:00:01 users 2 static link 01:00:5e:00:00:01 netadm@alisa:~ # ip maddr del 33:33:00:00:00:01 dev dummy |
注意:ip命令和内核都不会检查多播地址的有效性。这意味着你可以使用unicast地址代替多播地址。大多数驱动都会忽略unicast地址,但是有些驱动(例如:tulip)会把这个unicast地址加入其过滤器。这样作的效果有些奇怪,如果你使用了别的主机或者路由器的地址作为多播地址,你就可以收到发送到它们的数据包。不过,这并非一个bug,而是内核的一个功能。它可以用于网络监视。