ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具。例如:ifconfig、route等。这个手册将分章节介绍ip命令及其选项。
ip命令的用法如下:
[root@node01 ~]# ip
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
where OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
netns | l2tp | fou | macsec | tcp_metrics | token | netconf | ila |
vrf }
OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
-h[uman-readable] | -iec |
-f[amily] { inet | inet6 | ipx | dnet | mpls | bridge | link } |
-4 | -6 | -I | -D | -B | -0 |
-l[oops] { maximum-addr-flush-attempts } | -br[ief] |
-o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
-rc[vbuf] [size] | -n[etns] name | -a[ll] | -c[olor]}
其中,OPTIONS是一些修改ip行为或者改变其输出的选项。所有的选项都是以
-字符开头,分为长、短两种形式。目前,ip支持如下选项:
OBJECT是你要管理或者获取信息的对象。目前ip认识的对象包括:
另外,所有的对象名都可以简写,例如:address可以简写为addr,甚至是a。
COMMAND设置针对指定对象执行的操作,它和对象的类型有关。一般情况下,ip支持对象的增加(add)、删除(delete)和展示(show或者list)。有些对象不支持所有这些操作,或者有其它的一些命令。对于所有的对象,用户可以使用help命令获得帮助。这个命令会列出这个对象支持的命令和参数的语法。如果没有指定对象的操作命令,ip会使用默认的命令。一般情况下,默认命令是list,如果对象不能列出,就会执行help命令。
ARGUMENTS是命令的一些参数,它们倚赖于对象和命令。ip支持两种类型的参数:flag和parameter。flag由一个关键词组成;parameter由一个关键词加一个数值组成。为了方便,每个命令都有一个可以忽略的默认参数。例如,参数dev是ip link命令的默认参数,因此ip link ls eth0等于ip link ls dev eth0。我们将在后面的章节详细介绍每个命令的使用,命令的默认参数将使用default标出。
几乎所有的关键词都可以简写为前几个字母。在交互工作时,简写的方式非常方便,但是我们不建议在脚本中使用简写形式。另外,在讲述过程中,所有的“官
方”简写方式都会在文章中列出。
由于以下原因,ip可能会操作失败:
命令行语法错误:一个未知的关键词(an unknown keyword);错误的IP地址格式(incorrectly formated IP address)。在这种情况下,ip会打印出错误信息然后退出,在错误信息中会包含失败的原因。有时ip也会打印帮助信息。
参数不能通过一致性校验。
由于用户没有提供足够的信息,造成ip无法从参数中编译出内核请求。内核返回某些系统调用的错误。ip使用perror(3)输出错误信息,因此输出的错误信息包含一段注释以及系统调用号。内核返回RTNETLINK请求错误。这类错误信息以"RTNETLIK answers"开头。
ip的所有操作都是原子操作。例如,如果ip执行失败,它不会系统的任何东西,ip link command例外,它会修改某些设备参数。
我们无法列出所有的错误信息,尤其是语法错误。不过,错误信息的意思都非常明确。下面,我们列举一些经常出现的错误信息:
内核不支持netlink(netlink用于在内核模块和用户之间传递信息),会出现以下错
误信息:
Cannot open netlink socket: Invalid value
内核不支持RTNETLINK,会出现以下错误信息:
Cannot talk to rtnetlink: Connect refused
Cannot send dump request: Connect refused
如果在编译内核时没有配置CONFIG_IP_MULTIPLE_TABLES选项。在使用ip规则时会出现和下面的信息类似的错误信息:
kuznet@kaise $ ip rule list
RTNETLINK error: Invalid argument
dump terminated
对象 link由网络设备,对应的命令显示以及设备的状态变化组成。
命令 set和show(或者list)
缩写:set、s
参数:
ip link set dev eth0 upip link set dev eth0 txqueuelen 100 ip link set dev eth0 mtu 1500ip link set dev eth0 address 00:01:4f:00:15:f1ip link set dev eth0 mtu 1500 txqueuelen 100。缩写:show、list、lst、sh、ls、l
参数
dev NAME(default) NAME指定网络设备名称,例如:eth0。如果省略了这个参数,所有的设备属性就都会被列出。
up 只显示处于活动状态网络接口的信息。
输出格式
[root@node01 ~]# ip link ls eth0
2: eth0: mtu 1442 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:16:3e:56:05:bb brd ff:ff:ff:ff:ff:ff
[root@node01 ~]# ip link ls virbr0
4: virbr0: mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:46:c5:28 brd ff:ff:ff:ff:ff:ff
[root@node01 ~]#
在显示的信息中,每个引号之前的数字是一个接口索引,用于识别网络接口。这个数字后面是网络接口的名字(例如:eth0、dummy等),它也和网络接口一一对应。不过,在某些情况下,例如:驱动模块被卸载,对应的接口名就会从列表中消失,而其它新创建的接口就会使用相同的名字。系统管理员可以ip link set name修改接口的名字。
接口名可以是别的,或者是@NONE。这意味着这个设备被绑定到其它的设备,例如数据包被发送到这个设备,由这个设备封装,并从master设备发出。如果设备名字是NONE,就表示master设备是未知的。
接着,我们看到的是mtu(Maximal Transfer Unit,最大传输单元)。它决定这个接口单个数据包能够传输多少数据。
qdisc(queuing discipline)显示这个网络接口使用的排队算法。noqueue表示不对数据包进行排队;noop表示这个网络接口出于黑洞模式,也就是所有进入本网络设备的数据会直接被丢弃。qlen是网络接口传输队列的默认长度。
网络接口可以有如下标志:
如果网络接口的标志不属于LOOPBACK、BROADCAST和POINTTOPOINT的任何一个,就假定是NMBA(Non-Broadcast Multi-Access)类型。这是最为普遍的一个标志。
除此之外,还有其它一些标志。这些标志或者已经过时(例如:NOTRAILERS),或者还没有实现(如:DEBUG),或者只是特定于某些设备(例如:MASTER、AUTOMEDIA、PORTSEL)。因此,在此我们不作讨论。
对于PROMISC和ALLMULTI标志,ifconfig和ip显示的值是不同的。ip link ls命令显示的是设备的真正状态,而ifconfig显示的是自己设置的虚拟设备状态。
显示信息的第二行包含和链路层地址(MAC地址)相关的信息。其中,第一个词(ether、sit)定义接口的硬件类型。而接口的硬件类型又决定MAC地址的格式和语法。默认的格式是硬件的MAC地址和广播地址(如果是点对点连接方式,就是对端的地址),地址是用冒号隔开的16进制数字。不过,默写类型的连接有其特定的地址格式,例如:IP通道的地址格式是用点分开的IP地址。
使用这个命令不会显示多播地址,需要使用ip maddr ls命令。详情请参考第9节ip maddr ls。
统计信息
使用-statistics选项,ip命令会打印出网络接口的统计信息,例如:
worker:/etc/sysconfig/network # ip -s link ls eth0
2: eth0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:16:3e:c2:49:da brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
1342786 17496 0 1147 0 0
TX: bytes packets errors dropped carrier collsns
587396 6368 0 0 0 0
altname enp0s16
altname ens16
RX和TX分别是接收和发送统计信息的开头。得到的统计信息包括:
如果-s选项出现两次或者更多次,ip会输出更为详细的错误信息统计。
worker:/etc/sysconfig/network # ip -s -s link ls eth0
2: eth0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:16:3e:c2:49:da brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
1372546 17902 0 1175 0 0
RX errors: length crc frame fifo missed
0 0 0 0 0
TX: bytes packets errors dropped carrier collsns
601100 6543 0 0 0 0
TX errors: aborted fifo window heartbeat transns
0 0 0 0 2
altname enp0s16
altname ens16
worker:/etc/sysconfig/network #
这些错误的名字是纯以太化的,对于其它种类的设备,这些域可能有不同的解释。
缩写 address、addr、a
对象 这里的地址是绑定到网络设备上的协议(IP或者IPv6)地址。每个网络设备至少应该有一个协议地址。而且,一个网络设备可以绑定多个协议地址。
ip addr命令能够显示网络设备的协议地址及其性质,添加新的地址,删除旧的地址。
缩写:add、a
参数
ip addr add local 192.168.1.1/24 brd + dev eth0ip addr add local 192.168.1.1/28 brd - dev eth0#ip addr add local 192.168.4.1/28 brd + label eth0:1 dev eth0 注1:使用-,ip addr ls显示的是网络地址;使用+,ip addr ls显示的是广播地址。
注2:有关scope,在附录A中有更为详细的解释。
示例
在回环设备上添加一个回环地址:
worker:/etc/sysconfig/network # ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:c2:49:da brd ff:ff:ff:ff:ff:ff
altname enp0s16
altname ens16
inet 10.160.xxx.xxx/26 brd 10.160.xxx.xxx scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fec2:49da/64 scope link
valid_lft forever preferred_lft forever
worker:/etc/sysconfig/network # ip addr add 127.0.0.2/8 dev lo brd + scope host
worker:/etc/sysconfig/network # ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 127.0.0.2/8 brd 127.255.255.255 scope host secondary lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:c2:49:da brd ff:ff:ff:ff:ff:ff
altname enp0s16
altname ens16
inet 10.160.xxx.xxx/26 brd 10.160.xxx.xxx scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fec2:49da/64 scope link
valid_lft forever preferred_lft forever
worker:/etc/sysconfig/network #
在以太网接口eth0上增加一个地址10.0.0.1,掩码长度为24位(155.155.155.0),标准广播地址,标签为eth0:Alias:
#ip addr add 10.0.0.1/24 brd + dev eth0 label eth0:Alias
缩写:delete、del、d
参数
这个命令的参数和ip addr add命令的参数一致。其中,只有设备名是必需的
参数,其它都是可选的。如果没有给定除设备名之外的其它参数,ip就会删除这个
设备的第一个地址。
示例
删除回环设备的一个回环地址。不过,最好不要作这种尝试。
worker:/etc/sysconfig/network # ip addr del 127.0.0.2/8 dev lo
worker:/etc/sysconfig/network # ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:c2:49:da brd ff:ff:ff:ff:ff:ff
altname enp0s16
altname ens16
inet 10.160.xxx.xxx/26 brd 10.160.xxx.xxx scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fec2:49da/64 scope link
valid_lft forever preferred_lft forever
worker:/etc/sysconfig/network #
以下shell代码可以取消设备上的所有IP地址。
while ip -f inet add del dev eth0;do
:nothing
done
另外,可以使用ip addr flush命令取消IP地址
缩写:show、list、lst、sh、ls、l
参数
ip addr ls to 192.168.1.1输出格式
worker:~ # ip address list eth0
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:c2:49:da brd ff:ff:ff:ff:ff:ff
altname enp0s16
altname ens16
inet 10.160.xxx.xxx/26 brd 10.160.xxx.xxx scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fec2:49da/64 scope link
valid_lft forever preferred_lft forever
worker:~ #
worker:~ # ip link list eth0
2: eth0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:16:3e:c2:49:da brd ff:ff:ff:ff:ff:ff
altname enp0s16
altname ens16
worker:~ #
输出的头两行和ip link ls的输出是相同的。
接着是IP和IPv6地址、广播地址以及其它的地址属性:范围(scope)、标志(flag)和标签(label)。地址标志由内核设置,系统管理员不能修改。目前,内核定义了以下标志:
缩写:flush、f
简介
这个命令可以清除按照某种条件选择的协议地址。
参数
这个命令的参数和ip address show相同。唯一的区别是,如果不给定参数它什么都不会做。
警告
这个命令(和后面讨论的所有flush命令)非常危险。如果出现错误,将无法恢复,它会清除被操作的地址。
statistics选项
如果在ip addr flush命令中使用了-statistics选项,命令将输出更为详尽的信息。输出的信息包括删除地址的数目和清理地址列表的圈数。如果使用了两次-s选项,ip addr flush会按照上节叙述的格式输出所有被删除的地址。
示例
删除属于私网10.0.0.0/8的所有地址:
worker:~ # ip -s -s address flush to 192/8
Nothing to flush.
worker:~ # ip -s -s a f to 10/8
2: dummy inet 10.7.7.7/16 brd 10.7.255.255 scope global dummy
3: eth0 inet 10.10.7.7/16 brd 10.10.255.255 scope global eth0
4: eth1 inet 10.8.7.7/16 brd 10.8.255.255 scope global eth1
*** Round 1,deleting 3 addresses ***
*** Flush is complete after 1 round ***
worker:~ #
取消所有以太网卡的IP地址
worker:~ # ip -4 addr flush label "eth0"
最后一个例子是对IPv6地址的操作。在启动了转发或者关闭了自动配置之后,你需要取消通过无状态地址自动配置获得的主机地址:
worker:~ # ip -6 addr flush dynamic
缩写 neighbour、neighbor、neigh、n
对象 邻接(neighbour)对象实现同一网段协议地址和链路层地址的绑定。在内核中,这些条目被组织到表中。IPv4的相邻表也被叫做ARP表。
ip neighbour命令支持对条目及其属性的显示、添加和删除。
命令 add、change、replace、delete、fulsh、show(或者list)
附录B将详细描述如何使用ip管理代理ARP/NDISC。
ip neighbour add -- 添加一个新的邻接条目
ip neighbour change--修改一个现有的条目
ip neighbour replace--替换一个已有的条目
缩写:add、a;change、chg;replace、repl
简介:这三个命令用来建立一个邻接表的条目或者更新现有的邻接表条目。
参数
to ADDRESS(default) 相邻的协议地址。可以是IPv4或者IPv6。
dev NAME 和相邻节点连接的设备。
lladdr LLADDRESS 邻居的链路层地址。LLADDRESS可以为空。
nud NUD_STATE 邻接条目的状态。nud是Neighbour Unreachability Detection的缩写。可能的状态包括:
reachable--在超时时间之内,这个邻接条目是有效的。
stale--这个邻接条目是有效的,但是比较可疑。如果条目是有效的,ip neigh不会改变邻接状态,也不会修改其地址。
示例
在设备eth0上,为地址10.0.0.3添加一个permanent ARP条目:
worker:~ # ip neighbour add 10.0.0.3 lladdr 0:0:0:0:0:1 dev eth0 nud permanent
ip neigh add 10.0.0.3 lladdr 0:0:0:0:0:1 dev eth0 nud perm
把状态改为reachable
ip neigh chg 10.0.0.3 dev eth0 nud reachable
缩写:delete、del、d
简介
这个命令用来删除一个邻接条目
参数
这个命令的参数和ip neigh add命令的相同,只不过lladdr和nud将被忽略。
示例
删除设备eth0上的一个ARP条目10.0.0.3
ip neigh del 10.0.0.3 dev eth0
执行了删除命令之后,被删除的条目不会马上消失,它会在系统的下次垃圾收集时被删除。如果被操作的条目正在使用,将不能被删除。
警告
如果试图删除或者手工修改一个由内核建立的noarp条目,会导致一些不可预知的行为。
缩写:show、list、sh、ls
简介
这个命令用于显示网络邻居信息。
参数
输出格式
worker:~ # ip neighbour show
10.160.xxx.xxx dev eth0 lladdr 48:f8:db:d2:46:02 STALE
10.160.xxx.xxx dev eth0 lladdr 00:00:5e:00:01:04 REACHABLE
fe80::216:3eff:fed3:4e33 dev eth0 lladdr 00:16:3e:d3:4e:33 router STALE
fe80::216:3eff:fe47:ad29 dev eth0 lladdr 00:16:3e:47:ad:29 router STALE
worker:~ # ip neighbour show dev eth0
10.160.xxx.xxx lladdr 48:f8:db:d2:46:02 STALE
10.160.xxx.xxx lladdr 00:00:5e:00:01:04 REACHABLE
fe80::216:3eff:fed3:4e33 lladdr 00:16:3e:d3:4e:33 router STALE
fe80::216:3eff:fe47:ad29 lladdr 00:16:3e:47:ad:29 router STALE
worker:~ # ip neighbour ls
10.160.xxx.xxx dev eth0 lladdr 48:f8:db:d2:46:02 STALE
10.160.xxx.xxx dev eth0 lladdr 00:00:5e:00:01:04 REACHABLE
fe80::216:3eff:fed3:4e33 dev eth0 lladdr 00:16:3e:d3:4e:33 router STALE
fe80::216:3eff:fe47:ad29 dev eth0 lladdr 00:16:3e:47:ad:29 router STALE
worker:~ #
每行的第一部分是网络邻居的协议地址。第二部分是设备名。省下的部分是这个邻接条目的信息。
lladdr是这个设备的链路层地址。
nud是条目代表连接的状态。下面是状态的完整列表和简单描述:
在这些状态中,除了none、faliled和incomplete.
IPVv6网络邻居可以有一个叫做router的标志,它表示这个节点是一个IPv6路由器。
worker:~ # ip -s n ls 10.160.xxx.xxx
10.160.xxx.xxx dev eth0 lladdr 00:16:3e:8a:8b:9e ref 1 used 2/2/2 probes 4 REACHABLE
worker:~ #
输出信息里面多了ref和用斜缸分开的三个时间。ref表示有多少用户使用这个条目;三个时间分别是使用时间、确认时间和刷新时间。因此,上面输出中的时间表示:
条目12秒之前刚刚使用过;
13秒之前被确认;
20秒之前被更新。
缩写:flush、f
简介
这个命令用来清除符合某个条件的邻接表条目。
参数
这个命令的参数和ip neigh sh相同。不同之处是,如果没有参数,它什么也不会做。而且,默认情况下,被删除的条目不包括处于permanent和noarp状态的条目。
-statistics
使用了-statistics选项,这个命令的输出将更为详尽。它会输出删除的条目数和清除邻接表遍历的次数。如果使用了两个-s选项,命令的输出将包括被删除条目的信息。
示例
worker:~ # ip -s -s neighbour flush 10.160.xxx.xxx
10.160.xxx.xxx dev eth0 lladdr 00:16:3e:8a:8b:9e used 101/101/75 probes 4 STALE
*** Round 1, deleting 1 entries ***
*** Flush is complete after 1 round ***
worker:~ #
缩写:route、ro、r
对象
路由条目保存在内核的路由表中,它们包含寻找到其它网络节点的路径信息。路由表条目都包括一对网络地址/掩码长度以及可选的TOS值等信息。如果数据包目的地址位于属于路由条目的的范围,以及路由的TOS等于0或者等于数据包的TOS,它就匹配路由条目。如果一个数据包匹配多个路由条目,系统内核将按照以下规则决定选择哪个路由:
注:作者在文中把地址被子网掩码屏蔽后的部分/掩码长度这种表达方式叫做前缀(prefix)。例如:10/8表示网络10.0.0.0,子网掩码长度是8位;10.1/16表示网络10.1.0.0,子网掩码长度是16位;
为了简化,我们使用{prefix,tos,preference}来标记每个路由。
路由条目提供IP数据包投递所需的路由信息、数据(例如:输出设备、下一跳的路由器)和一些可选属性(例如:路径的最大传输单元MTU或者源地址等)。这些属性将在后面的章节详细介绍。
路由的设置以及其它的可选属性都依赖于路由类型。最重要的路由类型是unicast路由,这种类型的路由表示到另外主机的真实路由。一般情况下,通常的路由表只有这种类型的路由条目。不过,还存在其它类型的路由,使用的语法也不相同。Linux-2.2理解以下几种类型的路由:
从Linux-2.2开始,内核把路由归纳到许多路由表中,这些表都进行了编号,编号数字的范围是1到255。另外,为了方便,还可以在/etc/iproute2/rt_tables中为路由表命名。默认情况下,所有的路由都会被插入到表main(编号254)中。在进行路由查询时,内核只使用路由表main。
实际上,还有另外一个路由表也一直存在,这个表是不可见的,而且极为重要。这就是表local。这个表保存本地和广播路由。内核会自动维护这个路由表,通常系统管理员没有必要对它进行修改,甚至不必看到。
在使用策略路由(policy routing)时,我们将使用多个路由。在这种情况下,表识别符有很多参数,因此需要使用{prefix,tos,preference}的形式唯一地识别每个路由。
缩写: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比较复杂,它的语法和以下高层参数类似:
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
缩写: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
缩写: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 list cloned |wc
159 2543 18707
kuznet@amber:~ $
输出格式
通常,在这个命令输出的信息中,每个路由纪录占一行。不过,有时某些纪录可能会超过一行,例如被克隆出来的路由或者包含一些额外的信息。如果在命令中使用了-o选项,在每个纪录中,会使用代替回车作为回行标记。例如:
[root@node01 ~]# ip route show 192.168.2.1/24
192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.161
[root@node01 ~]#
如果是列出被克隆的条目,输出信息将是另外的形式。例如:
kuznet@amber:~ $ ip route list 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 ,缓存标记包括:
接着是一些路由属性,支持的属性如下:
统计选项
如果在命令中使用-statistics选项,ip命令会给出一些更为详尽的信息:
缩写:flush、f
简介
使用这个命令,可以很方便地删除符合某些条件的路由。
参数
这个命令的参数和ip route show命令的参数相同,只不过被操作的路由表不会被显示出来。它和ip route show命令唯一的区别是它们的缺省操作,ip route show会显示出路由表main的所有条目,而ip route flush只会给出帮助信息,不对路由表进行任何操作。至于这个区别的原因,恐怕不必多做解释了吧?
统计选项
如果在这个命令中使用了-statistics选项,它就会显示一些冗余信息。这些信息包括:被删除的路由数和删除过程中遍历路由表的次数。如果这个选项使用了两次,ip还会输出被删除路由的详细信息。
示例
# 第一个例子是删除路由表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:~ #
缩写:get、g
简介
使用这个命令可以获得到达目的地址的一个路由以及它的确切内容。
参数
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:~ $
搜索目的地址是193.233.7.82,来自193.233.7.82,从eth0设备到达的路由(这条命令会产生一条非常有意思的路由,这是一条到193.233.7.82的回环路由)
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:~ $
获得一个多播路由,数据包来自主机193.233.7.82,从eth0设备进入,目的地址是多播组地址224.2.127.254(需要运行多播路由监控程序pimd)。这个命令产生的路由与上面的不大相同,它包含常规部分和多播部分。常规部分用于把数据包投递到本地ip监控程序。这里,本地地址不是多播组的成员,因此这个路由没有local标记,只用于转发数据包。这个路由的输出设备是回环设备。多播部分包含额外的输出接口。
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:~ #
缩写: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)是一个空表,它是为一些后续处理保留的。对于前面的缺省策略没有匹配到的数据包,系统使用这个策略进行处理。这个规则也可以删除。 |
不要混淆路由表和策略:规则指向路由表,多个规则可以引用一个路由表,而且某些路由表可以没有策略指向它。如果系统管理员删除了指向某个路由表的所有规则,这个表就没有用了,但是仍然存在,直到里面的所有路由都被删除,它才会消失。
路由策略规则数据库可以包括如下类型的规则:
add、delete、show(或者list)
ip rule delete -- 删除规则
缩写:add、a;delete、del、d
参数
警告
使用上面两个命令对路由策略数据库进行的任何修改都不会马上生效。只有使用ip route flush cach命令刷新路由缓存之后才会生效。
示例
通过路由表inr.ruhep路由来自源地址为192.203.80/24的数据包
ip ru add from 192.203.80/24 table inr.ruhep prio 220
把源地址为193.233.7.83的数据报的源地址转换为192.203.80.144,并通过表1进行路由
ip ru add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320
删除无用的缺省规则
ip ru del prio 32767
缩写: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:~ $
上面的示例非常简单,192.203.80.0/24和193.233.7.0/24
登录查看全部
参与评论
手机查看
返回顶部