kuznet@kaise $ ip rule list
RTNETLINK error: Invalid argument
dump terminated
4.ip link--配置网络设备 对象 link由网络设备,对应的命令显示以及设备的状态变化组成。命令 set和 show(或者list) 4.1.ip link set--改变设备的属性 缩写 :set、s 参数 : dev NAME(default)指定进行操作的网络设备up/down起动/关闭设备。 例如:ip link set dev eth0 uparp on/off改变网络设备的NOARP选项。 如果设备处于UP状态,不允许进行这个操作。不过,内核和ip都不会对在这种情况下的这个操作进行检 查。在设备处于运行状态下改变这个选项会造成无法预料的后果。multicast on/off改变网络设备的MULTICAST选项。dynamic on/off改变网络设备的DYNAMIC选项。name NAME把设备的名字改为NAME(例如:eth0)。如果设备处于运行状态或者已经配置了地址,建议不要进行这个操作。txqueuelen NUMBER或者txqlen NUMBER改变设备传输队列的长度。 例如:ip link set dev eth0 txqueuelen 100mtu NUMBER改变网络设备MTU(最大传输单元)的值。 例如:ip link set dev eth0 mtu 1500address LLADDRESS修改网络设备的MAC地址。 例如:ip link set dev eth0 address 00:01:4f:00:15:f1broadcat LLADDRESS或者brd LLADDRESS修改数据链路层广播地址。 注意:对于大多数的网络设备(例如:以太网),修改链路层广播地址会对网络造成破坏。因此,如果对此 没有很深的理解,最好不要使用这个操作。peer LLADDRESS当使用点对点连接时,使用这个操作可以修改对端的数据链路层地址。 注意:ip不能修改PROMISC或者ALLMULTI 选项。这两个选项已经比较陈旧,而且也不应该随便修改。 注意:如果同时修改多个参数,任何一个修改失败,ip都会立即取消操作。这种情况可能 使系统进入无法预料的状态。为了避免出现这种情况,尽量不要使用ip link set同时修改多个参数,例如:ip link set dev eth0 mtu 1500 txqueuelen 100。 4.2.ip link show--显示设备属性 缩写 :show、list、lst、sh、ls、l 参数 dev NAME(default)NAME指定网络设备名称,例如:eth0。如果省略了这个参数,所有的设备属性就都会被列出。up只显示处于活动状态网络接 口的信息。
输出格式 kuznet@alisa:~ $ ip link ls eth0 3: eth0: mtu 1500 qdisc cbq qlen 100 link/ether 00:a0:cc:66:18:78 brd ff:ff:ff:ff:ff:ff: kuznet@alisa:~ $ ip link ls sit0 5: sit0@NOME: mtu 1480 qdisc noqueue link/sit 0.0.0.0 brd 0.0.0.0 kuznet@alisa:~ $ ip link ls dummy 2: dummy: mtu 1500 qdisc noop link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff kuznet@alisa:~ $ 在显示的信息中,每个引号之前的数字是一个接口索引,用于识别网络接口。这个数字后面是网络接口的名字(例如:eth0、dummy等),它 也和网络接口一一对应。不过,在某些情况下,例如:驱动模块被卸载,对应的接口名就会从列表中消失,而其它新创建的接口就会使用相同的名字。系统管理员可 以ip link set name修改接口的名字。 接口名可以是别的,或者是@NONE 。这意味着这个设备被绑定到其它的设备,例如数据包被发送到这个 设备,由这个设备封装,并从master设备发出。如果设备名字是NONE ,就表示master设备是未知的。 接着,我们看到 的是mtu(Maximal Transfer Unit,最大传输单元)。它决定这个接口单个数据包能够传输多少数据。 qdisc (queuing discipline)显示这个网络接口使用的排队算法。noqueue 表示不对数据包进行排队;noop 表示这个网络接口 出于黑洞模式,也就是所有进入本网络设备的数据会直接被丢弃。qlen 是网络接口传输队列的默认长度。 网络接口可以有如下标 志: UP这个设备处于运行状态,可以接收、发送数据包。LOOPBACK这个接口不能用于和其它的主机通讯,所有发送到这个接口的数据包都会返 回,而且这种接口只能接收反弹回来的数据包。BROADCAST这个设备具有把数据包发送到所有主机的能力。以太网连接是一个很典型的例子。 POINTTOPOINT两个节点之间是直接连接的。某个接点发出的所有数据包都会发到对端节点,接收到的所有数据包也都是从对端节点发过来的。 MULTICAST这个标志表示设备具有多播能力,能够把数据包发送到某些相邻的网络节点。实际上,广播是多播的一个特例,它的多播组包括连接上的所有节 点。 从定义上,POINTTOPOINT和BROADCAST连接都属于多播。 *如果网络接口的标志不属于LOOPBACK、 BROADCAST和POINTTOPOINT的任何一个,就假定是NMBA(Non-Broadcast Multi-Access)类型。这是最为普遍的一个标志。 PROMISC设备处于混杂模式,接收连接上的所有数据,不管目的地址是否是自己。通 常,这种模式主要用于网桥和网络监视。ALLMULTI设备接收连接上的所有多播数据包,多播路由器(muliticast router)使用这种模式。NOARP这个标志和其它的标志不同,它的含义和涉及的网络协议有关。它一般表示这个设备无需地址解析,软件或者硬件不必借 助于系统协议栈的帮助就知道如何把数据包投递到目的地。DYNAMIC这个标志表示这个网络接口是动态建立和撤消的。SLAVE表示这个接口被绑定到其它 的网络接口。 *除此之外,还有其它一些标志。这些标志或者已经过时(例如:NOTRAILERS),或者还没有实现(如:DEBUG),或者 只是特定于某些设备(例如:MASTER、AUTOMEDIA、PORTSEL)。因此,在此我们不作讨论。 *对于PROMISC和 ALLMULTI标志,ifconfig和ip显示的值是不同的。ip link ls命令显示的是设备的真正状态,而ifconfig显示的是自己设置的虚拟设备状态。 显示信息的第二行包含和链路层地址(MAC地址)相关 的信息。其中,第一个词(ether、sit)定义接口的硬件类型。而接口的硬件类型又决定MAC地址的格式和语法。默认的格式是硬件的MAC地址和广播 地址(如果是点对点连接方式,就是对端的地址),地址是用冒号隔开的16进制数字。不过,默写类型的连接有其特定的地址格式,例如:IP通道的地址格式是 用点分开的IP地址。 NBMA(Non-Broadcast Multi-Access)连接没有明确定义的广播地址和对端地址。不过,这个域包含一些有用的信息,例如:倚赖于ARP服务器的广播地址。 使用这个命令不会显示多播地址,需要使用ip maddr ls命令。详情请参考第9节ip maddr ls。
while ip -f inet add del dev eth0;do
:nothing
done
另外,可以使用ip addr flush命令取消IP地址
5.3.ip address show--显示协议地址 缩写 :show、list、lst、sh、ls、l 参数 dev NAME(default)设备的名字scope SCOPE_VAL只列出这个范围的地址to PREFIX只列出和PREFIX匹配的地址,例如: ip addr ls to 192.168.1.1label PATTERN只列出标签匹配PATTERN的地址,PATTERN是一个shell风格的正则表达式。dynamic和permanent这两个参数只 适用于IPv6。使用dynamic,ip就只列出动态地址;使用permanent,ip就只列出固定地址。tentative这个参数只适用于 IPv6,只列出没有通过重复地址检测[参考2]的地址。deprecated这个参数只适用于IPv6,只列出deprecated[参考2]地址。 primary和secondary只列出主(primary)或从(secondary)地址。
输出格式 duznet@alisa:~ $ ip addr ls eth0 3: eth0: mtu 1500 qdisc cbq qlen 100 link/ether 00:a0:cc:66:18:78 brd ff:ff:ff:ff:ff:ff inet 193.233.7.90/24 brd 193.233.7.255 scope global eth0 inet6 3ffe:2400:0:1:2a0:ccff:fe66:1878/64 scope global dynamic valid_lft forever preferred_lft 604746sec inet6 fe80::2a0:ccff:fe66:1878/10 scope link duznet@alisa:~ $ 输出的头两行和ip link ls的输出是相同的。 接着是IP和IPv6地址、广播地址以及其它的地址属性:范围(scope)、标志(flag)和标签(label)。 地址标志由内核设置,系统管理员不能修改。目前,内核定义了以下标志: secondary为输出的数据包选择默认源地址时,内核不使用这个地址。 如果一个设备已经有了一个地址,又给它设置了同一网段的不同地址,第二个地址就成为从(secondary)地址。例如:eth0已经有一个地址 192.168.1.108/24,如果又给它一个地址192.168.1.3/24,192.168.1.3/24的就会被内核标记为从地址。 dynamic这个地址是通过无状态的自动配置建立的(stateless autoconfiguration)[参考2]。如果地址仍然有效,在输出中,还包括两个时间信息。preferred_lft期满后,地址就会变成 deprecated状态;valiid_lft期满后,地址将失效。deprecated这个地址是不允许的,也就是说,地址虽然有效,但是不能使用它 建立新的连接。tentative由于重复地址监测[参考2]还没有完成或者监测失败,这个地址不能使用。
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(default)只选择到给定地址的路由。 SELECTOR由修饰符(root、match、exact,可选)和一个前缀(prefix)组成。root PREFIX 表示选择前缀(prefix)不短于PREFIX的路由,例如:root 0/0将选在路由表里面的全部路由;match PREFIX 表示选择前缀(prefix)不长于PREFIX的路由,match 10.1/16会选择前缀(prefix)是10.1/16、10./8和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或者raalm FROMREALM/TOREALM只列出realm为REALMID的路由
示例
计算使用gated/bgp协议的路由个数
kuznet@amber:~ $ ip route ls proto gated/bgp |wc
1413 9891 79010
kuznet@amber:~ $
计算路由缓存里面的条数,由于被缓存路由的属性可能大于一行,以此需要使用-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 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需要这个路由的数据包如期到达这接口。
参数 这个命令的参数和ip route show 命令的参数相同,只不过被操作的路由表不会被显示出来。它和ip route show 命令唯一的区别是它们的缺省操作,ip route show 会显示出路由表main 的所有条目,而ip route flush 只会给出帮助信息,不对路由表进行任何操作。至于这个区别的原因,恐怕不必多做解释了吧?
示例 第一个例子是删除路由表main 中的所有网关路由(例如:在路由监控程序挂掉之后): netadm@amber:~ # ip -4 ro flush scope global type unicast 第二个例子是清除所有被克隆出来的IPv6路由: netadm@amber:~ # ip -6 -s -s ro flush cache 3ffe:2400::220:afff:fef4:c5d1 via 3ffe:2400::220:afff:fef4:c5d1 dev eth0 metric 0 cache used 2 age 12sec mtu 1500 rtt 300 3ffe:2400::280:adff:feb7:8034 via 3ffe:2400::280:adff:feb7:8034 dev eth0 metric 0 cache used 2 age 15sec mtu 1500 rtt 300 3ffe:2400::280:c8ff:fe59:5bcc via 3ffe:2400::280:c8ff:fe59:5bcc dev eth0 metric 0 cache users 1 used 1 age 23sec mtu 1500 rtt 300 3ffe:2400:0:1:2a0:ccff:fe66:1878 via 3ffe:2400:0:1:2a0:ccff:fe66:1878 dev eth1 metric 0 cache used 2 age 20sec mtu 1500 rtt 300 3ffe:2400:0:1:a00:20ff:fe71:fb30 via 3ffe:2400:0:1:a00:20ff:fe71:fb30 dev eth1 metric 0 cache used 2 age 33sec mtu 1500 rtt 300 ff02::1 via ff02::1 dev eth1 metric 0 cache users 1 used 1 age 45sec mtu 1500 rtt 300 *** Round 1, deleting 6 entries *** *** Flush is complete after 1 round *** netadm@amber:~ # ip -6 -s -s ro flush cache Nothing to flush. netadm@amber:~ # 第三个例子是在gated 程序挂掉之后,清除所有的BGP路由: netadm@amber:~ # ip ro ls proto gated/bgp |wc 1408 9856 78730 netadm@amber:~ # ip -s ro f proto gated/bgp *** Round 1, deleting 1408 entries *** *** Flush is complete after 1 round *** netadm@amber:~ # ip ro f proto gated/bgp Nothing to flush. netadm@amber:~ # ip ro ls proto gated/bgp netadm@amber:~ # 7.10.ip route get -- 获得单个路由 缩写 :get、g 简介 使用这个命令可以获得到达目的地址的一个路由以及它的确切内容。
参数 to ADDRESS(default)目标地址 from ADDRESS源地址 tos TOS或者dsfield TOS服务类型 iif NAME数据包进来的设备 oif NAME数据包出去的设备 connectedip route get 命令至少要有参数to ADDRESS 。使用connected 参数,如果没有给出源地址(from ADDRESS ),ip就会重新在路由表中查询能够到达目的地址的源地址,给出获得的第一个源地址到目的地址的路由。如果使用了策略路由,会有所 不同。 ip route get 命令和ip route show 命令执行的操作是不同的。ip route show 命令只是显示现有的路由,而ip route get 命令在必要时会派生出新的路由。
输出格式 这个命令的输出格式和ip route ls 相同。
示例
搜索到193.233.7.82的路由
kuznet@amber:~ $ ip route get 193.233.7.82
193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac
cache mtu 1500 rtt 300
kuznet@amber:~ $
kuznet@amber:~ $ ip r g 193.233.7.82 from 193.233.7.82 iif eth0
193.233.7.82 from 193.233.7.82 dev eth0 src 193.233.7.65
realms inr.ac/inr.ac
cache mtu 1500 rtt 300 iif eth0
kuznet@amber:~ $
kuznet@amber:~ $ ip r g 224.2.127.254 from 193.233.7.82 iif eth0
multicast 224.2.127.254 from 193.233.7.82 dev lo
src 193.233.7.65 realms inr.ac/cosmos
cache iif eth0 Oifs: eth1 pimreg
kuznet@amber:~ $
下面我们举一个复杂一些的例子。我们首先为一个目标地址添加一个无效的网关路由,而实际上和这个地 址是直连的。 netadm@alisa:~ # ip route add 193.233.7.98 via 193.233.7.254 netadm@alisa:~ # ip route get 193.233.7.98 193.233.7.98 via 193.233.7.254 dev eth0 src 193.233.7.90 cache mtu 1500 rtt 3072 netadm@alisa:~ # 然后,我们ping一下193.233.7.98: netadm@alisa:~ # ping -n 193.233.7.98 PING 193.233.7.98 (193.233.7.98) from 193.233.7.90 : 56 data bytes From 193.233.7.254: Redirect Host(New nexthop: 193.233.7.98) 64 bytes from 193.233.7.98: icmp_seq=0 ttl=255 time=3.5 ms From 193.233.7.254: Redirect Host(New nexthop: 193.233.7.98) 64 bytes from 193.233.7.98: icmp_seq=1 ttl=255 time=2.2 ms 64 bytes from 193.233.7.98: icmp_seq=2 ttl=255 time=0.4 ms 64 bytes from 193.233.7.98: icmp_seq=3 ttl=255 time=0.4 ms 64 bytes from 193.233.7.98: icmp_seq=4 ttl=255 time=0.4 ms ^C --- 193.233.7.98 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max = 0.4/1.3/3.5 ms netadm@alisa:~ # 输出结果可以看出,路由器193.233.7.254知道有更好的路由,因此送回一个ICMP重定向信息。然后,我们再看看路由表的情况: netadm@alisa:~ # ip route get 193.233.7.98 193.233.7.98 dev eth0 src 193.233.7.90 cache mtu 1500 rtt 3072 netadm@alisa:~ # ip命令手册(三)摘要: 有关路由策略管理和多播地址管理的部分 .ip route -- 路由策略数据库管理命令 By [email=nixeon%20at%20263%20dot%20net]nixe0n [/email]
ip ru add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320
删除无用的缺省规则
ip ru del prio 32767
8.7.ip rule show -- 列出路由规则
缩写 :show、list、sh、ls、l
参数 好消息,这个命令没有参数。
输出格式 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 -- 多播地址管理
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 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:~ $ 输出的第一行是设备的索引和设备名。后面几行是多播地址,每行由协议识别符开头。