ip命令⼿册:使⽤iproute2⼯具进⾏路由表管理和路由策略管
ip命令⼿册 (⼆)
这⼀部分是关于使⽤ip命令管理系统路由的内容。
7.路由表管理
7.1.缩写格式
ip route命令可以缩写成ip ro或ip 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--(此为默认项)--路由的⽬标前缀(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.65
ip route add 10.0.0/24 via 193.233.7.65
修改到⽹络10.0.0/24的直接路由,使其经过设备dummy
ip 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(回来的转换将会在后⾯的章节路由策略中介绍) 。
ip route add nat 192.203.80.142 via 193.233.7.83
7.7.ip route delete-- 删除路由
缩写:delete、del、d
参数
ip route del使⽤和ip route add相同的参数,不过语法稍有不同。这个命令使⽤关键词(to、tos、preference和table)选择要删除的路由。如果命令中使⽤了可选属性,ip命令会校验这个属性和要删除的路由是否⼀致;如果没有给定关键词或者属性不⼀致,ip route del会执⾏失败。
⽰例
删除上⼀节命令加⼊的多路径路由
ip route del default scope global nexthop dev ppp0 nexthop dev ppp1
7.8.ip route show -- 列出路由
缩写:show、list、sh、ls、l
简介
使⽤这个命令,你可以看到路由表的内容,或者查询符合某些条件的路由。
参数
to SELECTOR--(此为默认项) --只选择到给定地址的路由。 SELECTOR由修饰符(root、 match、exact,可选)和⼀个前缀(prefix)组成。root PREFIX表⽰选择前缀(prefix)不短于PREFIX的路由,例如:root 0/0将选在路由表⾥⾯的全部路由;
match PREFIX --表⽰选择前缀不长于PREFIX的路由,match 10.1.0.0/16会选择前缀是10.1.0.0/16、10.0.0.0/8和0.0.0.0/0的全部路由;⽽exact PREFIX(或者just PREFIX)表⽰精确匹配。如果没有这些选项(ip route ls),ip命令就假定是ip route ls to root 0/0 将列出系统的所有路由。
tos TOS或者dsfield TOS --只列出tos等于TOS的路由。
table TABLEID --列出路由表TABLEID⾥⾯的路由。缺省设置是table main。TABLEID或者是⼀个真正的路由表ID或者
是/etc/iproute2/rt_tables⽂件定义的字符串,或者是以下的特殊值:
all -- 列出所有表的路由;
cache -- 列出路由缓存的内容。
cloned或者cached --列出被克隆出来的路由(由于某些路由属性改变,例如:MTU,⽽由某些路由派⽣出来的路由)。实际上,它的内容和表缓存的内容是⼀样的。
from SELECTOR --和to的语法是相同的,只不过由⽬的地址换为源地址⽽已。注意:这个选项之适⽤于被克隆出来的路由。
protocol RTPROTO --只列出协议是RTPROTO的路由。
scope SCOPE_VAL --只列出范围是SCOPE_VAL的路由。
type TYPE --只列出类型为TYPE的路由。
dev NAME --只列出通过设备NAME的路由。
via PREFIX --只列出下⼀跳通过PREFIX的路由。
src PREFIX --只列出源地址属于PREFIX的路由。
realm REALMID或者realm FROMREALM/TOREALM --只列出realm为REALMID的路由。
⽰例
计算使⽤gated/bgp协议的路由个数
kuznet@amber:~ $ ip route ls proto gated/bgp |wc
1413    9891    79010
kuznet@amber:~ $
计算路由缓存⾥⾯的条数,由于被缓存路由的属性可能⼤于⼀⾏,以此需要使⽤
route add命令实例
-o选项
uznet@amber:~ $ ip -o route ls cloned |wc
159    2543    18707
kuznet@amber:~ $
输出格式
通常,在这个命令输出的信息中,每个路由纪录占⼀⾏。不过,有时某些纪录
可能会超过⼀⾏,例如被克隆出来的路由或者包含⼀些额外的信息。如果在命令中
使⽤了-o选项,在每个纪录中,会使⽤代替回车作为回⾏标记。例如:
kuznet@amber:~ $ ip ro ls 193.233.7/24
193.233.7.0/24 dev eth0 proto gated/conn scope link src 193.233.7.65 realms inr.ac kuznet@amber:~ $
如果是列出被克隆的条⽬,输出信息将是另外的形式。例如:
kuznet@amber:~ $ ip ro ls 193.233.7.82 tab cache
193.233.7.82 from 193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac/inr.ac
cache <src-direct,redirect>  mtu 1500 rtt 300 iif eth0
193.233.7.82 dev eth0  src 193.233.7.65 realms inr.ac
cache  mtu 1500 rtt 300
kuznet@amber:~ $
输出信息的第⼆⾏是以关键词cache开头的,显⽰路由的其它缓存标记和属性
。本⾏的第⼀个域是cache <;缓存标记>,缓存标记包括:
local --数据包被投递到本地。它适⽤于本地回环单向传播(unicast)路由,如果这个主机是对应⼴播组的⼀个成员,它也适⽤于⼴播路由何多播路由。
reject --路径⽆效。任何试图通过这个路由的企图都会导致错误。
mc --⽬的是多播地址(multicast)。
brd --⽬的是⼴播地址(broadcast)。
src-direct --源地址是在⼀个直接连接的接⼝。
redirected --路由是由ICMP重定向建⽴的。
redirect --数据包通过这个路由将触发ICMP重定向。
fastroute --路由适合⽤于快速路由(fastroute)。
equalize --使数据包随机地通过这个路由。
dst-nat --⽬的地址需要进⾏地址转换。
src-nat --源地址需要进⾏地址转换。
masq --源地址需要伪装(masquerading)。
notify --修改/删除这个路由将触发RTNETLINK报警。
接着是⼀些路由属性,⽀持的属性如下:
error --对于reject路由,这是返回给本地发送者的错误码。这些错误码也会被转换为ICMP错误码,发送给远程发送者。
expires --到了超时时间,这个条⽬就会消失。
iif 需要这个路由的数据包如期到达这接⼝。
统计选项

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。