ip命令手册(二)
点击次数:8 次 发布日期:2008-11-29 14:35:20 作者:源代码网
|
源代码网推荐 源代码网推荐 7.路由表管理 源代码网推荐 源代码网推荐 7.1.缩写 源代码网推荐 route、ro、r 源代码网推荐 源代码网推荐 7.2.对象 源代码网推荐 源代码网推荐 路由条目保存在内核的路由表中,它们包含寻找到其它网络节点的路径信息。路由表条目都包括一对网络地址/掩码长度以及可选的TOS值等信息。如果数据包目的地址位于属于路由条目的的范围,以及路由的TOS等于0或者等于数据包的TOS,它就匹配路由条目。如果一个数据包匹配多个路由条目,系统内核将按照以下规则决定选择哪个路由: 源代码网推荐 源代码网推荐 注:作者在文中把地址被子网掩码屏蔽后的部分/掩码长度这种表达方式叫做前缀(prefix)。例如:10/8表示网络10.0.0.0,子网掩码长度是8位;10.1/16表示网络10.1.0.0,子网掩码长度是16位; 源代码网推荐 源代码网推荐 范围最小的优先匹配,较大的放弃;路由TOS等于数据包TOS的匹配,不等于的放弃;如果经过上面两步的选择,还有数个路由,就选择优先值最高的路由;如果还有数个路由可供选择,就重复进行第一步。 源代码网推荐 源代码网推荐 为了简化,我们使用{prefix,tos,preference}来标记每个路由。 源代码网推荐 源代码网推荐 7.3.路由属性 源代码网推荐 源代码网推荐 路由条目提供IP数据包投递所需的路由信息、数据(例如:输出设备、下一跳的路由器)和一些可选属性(例如:路径的最大传输单元MTU或者源地址等)。这些属性将在后面的章节详细介绍。 源代码网推荐 源代码网推荐 7.4.路由类型 源代码网推荐 源代码网推荐 路由的设置以及其它的可选属性都依赖于路由类型。最重要的路由类型是unicast路由,这种类型的路由表示到另外主机的真实路由。一般情况下,通常的路由表只有这种类型的路由条目。不过,还存在其它类型的路由,使用的语法也不相同。Linux-2.2理解以下几种类型的路由: 源代码网推荐 源代码网推荐 unicast 这种类型的路由描述到目的地址的真实路径。 源代码网推荐 源代码网推荐 unreachable 这些目的地址是不可达的。如果发过去的数据包都被丢弃并且收到ICMP信息host unreachable,目的地址就会被标记为不可达。在这种情况下,本地发送者将返回EHOSTUNREACH错误。 源代码网推荐 源代码网推荐 blackhole 这些目的地址不可达,而且发过去的数据包都被丢弃。在这种情况下,本地发送者将返回EINVAL错误。 源代码网推荐 源代码网推荐 prohibit 这些路由是不可达的。发过去的数据包都被丢弃,而且产生ICMP信息communication administratively prohibited 。本地发送者会返回EACCESS错误。 源代码网推荐 源代码网推荐 local 目的地址被分配给本机。数据包通过回环被投递到本地。 源代码网推荐 源代码网推荐 broadcast 目的地址是广播地址,数据包作为链路广播发送。 源代码网推荐 源代码网推荐 throw 和策略规则(policy rule)一块使用的控制路由。如果选择了这种路由,就会认为没有发现路由,在这个表中的查询就会被终止。没有找到策略路由就相当于在路由表中没有找到路由,数据包会被丢弃,并产生ICMP信息net unreachable。本地发送者会返回ENETUNREACH错误。 源代码网推荐 源代码网推荐 nat 特定的NAT路由。目标地址属于哑地址(或者称为外部地址),在转发前需要进行地址转换。 源代码网推荐 源代码网推荐 anycast 目标是anycast地址,被分配给本机。这类地址和本地地址大同小异,不同的是这类地址不能用于任何数据包的源地址。 源代码网推荐 源代码网推荐 multicast 使用多播路由。在普通的路由表中,这种路由并不存在。 源代码网推荐 源代码网推荐 7.5.路由表 源代码网推荐 源代码网推荐 从Linux-2.2开始,内核把路由归纳到许多路由表中,这些表都进行了编号,编号数字的范围是1到255。另外,为了方便,还可以在/etc/iproute2/rt_tables中为路由表命名。默认情况下,所有的路由都会被插入到表main(编号254)中。在进行路由查询时,内核只使用路由表main。 源代码网推荐 源代码网推荐 实际上,还有另外一个路由表也一直存在,这个表是不可见的,而且极为重要。这就是表local。这个表保存本地和广播路由。内核会自动维护这个路由表,通常系统管理员没有必要对它进行修改,甚至不必看到。 源代码网推荐 源代码网推荐 在使用策略路由(policy routing)时,我们将使用多个路由。在这种情况下,表识别符有很多参数,因此需要使用{prefix,tos,preference}的形式唯一地识别每个路由。 源代码网推荐 源代码网推荐 7.6.ip route add -- 添加新路由 源代码网推荐 ip route change -- 修改路由 源代码网推荐 ip route replace -- 替换已有的路由 源代码网推荐 源代码网推荐 缩写:add、a;change、chg;replace、repl 源代码网推荐 源代码网推荐 参数 源代码网推荐 源代码网推荐 to PREFIX或者to TYPE PREFIX(default) 路由的目标前缀(prefix)。如果TYPE被忽略,ip命令就会使用默认的类型unicast。其它的类型在上一节都有介绍。PREFIX是一个IP或者IPv6地址,也可以跟着一个斜杠和掩码长度。如果没有掩码长度,ip命令就假定是一个单一ip地址。另外,还有一个特殊的PREFIX--default(缺省路由),它等于IPv4的0/0,或者IPv6的::/0。 源代码网推荐 源代码网推荐 tos TOS 或者defield TOS 定义服务类型关键词。在进行路由匹配时,内核首先比较数据包的TOS和route的TOS,如果没有和数据包TOS相同的路由,还可以选择TOS等于0的路由。TOS或者是一个十六进制的数字,或者是一个由/etc/iproute2/rt_dsfield文件定义的识别符。 源代码网推荐 源代码网推荐 metric NUMBER或者preference NUMBER 定义路由的优先值,NUMBER时一个任意的32位数字。 源代码网推荐 源代码网推荐 table TABLEID 路由要加入的表。TABLEID或者是一个数字或者是/etc/iproute2/rt_tables文件定义的一个字符串。如果没有这个参数,ip命令就会把路由加入到表main中,本地(local)、广播(broadcast)和网络地址转换(nat)路由除外。在默认情况下,这些类型的路由都会被加入表local中。 源代码网推荐 源代码网推荐 dev NAME 输出设备的名字 源代码网推荐 源代码网推荐 via ADDRESS 指定下一跳路由器的地址。实际上,这个域的可靠性取决于路由类型。对于通常的unicast路由,它或者是真正的下一跳路由器地址,或者如果它是BSD兼容模式安装的直接路由,它可以是一个网络接口的本地地址。对于NAT路由,它是转换后的地址。 源代码网推荐 源代码网推荐 src ADDRESS 在向目的prefix发送数据包时选择的源地址。 源代码网推荐 源代码网推荐 realm REALMID 指定路由分配的realm。REALM可以是一个数字或者/etc/iproute2/rt_realms文件定义的一个字符串。有关realm更为详细的信息请看附录(Route realms and policy propagation, rtacct)。 源代码网推荐 源代码网推荐 mtu MTU或者mtu lock MTU 设置到达目的路径的最大传输单元(MTU)。如果没有使用修饰符lock,内核会通过路径最大传输单元发现(Path MTU Discovery)机制更新MTU;如果使用了修饰符lock,内核就不会测试路径的最大传输单元。在这种情况下,发出的所有IPv4数据包DF域都会被设置为0(允许分片),对于IPv6数据包也允许分片。 源代码网推荐 源代码网推荐 window NUMBER 设置到目的地址TCP连接的最大窗口值,以字节为单位。使用这个参数可以限制对端发送数据的速率。 源代码网推荐 源代码网推荐 rtt NUMBER 估算初始往返时间(Round Trip Time) 源代码网推荐 源代码网推荐 rttvar NUMBER 估算初始往返时间偏差(RTT variance) 源代码网推荐 源代码网推荐 ssthresh NUMBER 估算慢启动阀值(slow start threshould) 源代码网推荐 源代码网推荐 cwnd NUMBER 把拥挤窗口(congestion window)值锁定为NUMBER。如果没有lock标记,这个值会被忽略。 源代码网推荐 源代码网推荐 advmss NUMBER 设置在建立TCP连接时,向目的地址声明的最大报文段大小(Maximal Segment Size,MSS)。如果没有设置,Linux内核会使用计算第一跳的最大传输单元得到的数值。 源代码网推荐 源代码网推荐 nexthop NEXTHOP 设置多路径路由的下一跳地址。NEXTHOP比较复杂,它的语法和以下高层参数类似: 源代码网推荐 via ADDRESS--表示下一跳路由器;dev NAME--表示输出设备;weight NUMBER--在多路由路径中,这个元素的权重。表示相对带宽或者服务质量。 源代码网推荐 源代码网推荐 scope SCOPE_VAL 路由前缀(prefix)覆盖的范围。SCOPE_VAL可以是一个数字,也可以是/etc/iproute2/rt_scope文件定义的一个字符串。如果没有这个参数,ip命令就会根据具体情况猜测:对于经过网关的unicast路由,就设置为global;对于直连的unicast路由和广播路由,就设置为link;对于本地路由,就设置为host。 源代码网推荐 源代码网推荐 protocol RTPROTO 本条路由得路由协议识别符。RTPROTO可以是一个数字,也可以是/etc/iproute2/rt_protos文件定义的一个字符串。如果使用时没有提供这个参数,ip命令就使用默认值boot(也就是说,ip命令认为添加路由的人不知道自己做了些什么)。有些协议值有其固定的解释: 源代码网推荐 redirect--路由是由ICMP重定向加入的;kernel--路由是由内核在自动配置期间加入的;boot--路由是启动过程中加入的。如果一个路由监控程序将要启动,这些路由都会被清除;static--为了覆盖动态路由,由系统管理员手工添加的路由。路由监控程序也会优先考虑这类路由,甚至可能通告给其对端;ra--路由是通过路由发现协议加入的(Router Discovery Protocol)。 源代码网推荐 其它的值没有保留,系统管理员可以自由分配(或者不分配)给协议标记。至少,路由监控程序应该注意对一些唯一协议值的设置,这些协议值在rtnetlink.h文件或者rt_protos数据库中分配。 源代码网推荐 源代码网推荐 onlink 假装和下一跳路由器是直接相连的,即使它没有匹配任何接口前缀(prefix)。 源代码网推荐 源代码网推荐 equalize 允许把数据包随机从多个路由发出。如果没有这个路由修饰符,内核就会冻结下一跳路由的地址。 源代码网推荐 源代码网推荐 示例 源代码网推荐 源代码网推荐 设置到网络10.0.0/24的路由经过网关193.233.7.65ip route add 10.0.0/24 via 193.233.7.65修改到网络10.0.0/24的直接路由,使其经过设备dummyip route chg 10.0.0/24 dev dummy加入缺省多路径路由,让ppp0和ppp1分担负载(注意:scope值并非必需,它只不过是告诉内核,这个路由要经过网关而不是直连的。实际上,如果你知道远程端点的地址,使用via参数来设置就更好了)。ip route add default scope global nexthop dev ppp0 nexthop dev ppp1设置NAT路由。在转发来自192.203.80.144的数据包之前,先进行网络地址转换,把这个地址转换为193.233.7.83(回来的转换 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 源代码网供稿. |
