IP命令详解

简介

ip命令是对ifconfig的进化,属于iproute2包的一个命令,功能很强大,特此进行简单的说明。

主要的参考文档是官方文档,http://www.policyrouting.org/iproute2.doc.html。

语法结构

一般情况下,直接使用yum install iproute即可安装ip等相关命令了。如果 要想更新版本,可以在https://mirrors.edge.kernel.org/pub/linux/utils/net/iproute2/下载。

1
ip [ OPTIONS ] OBJECT [ COMMAND [ ARGUMENTS ]]

ip命令,除了OBJECT之外,都是可以省略的。

默认情况下,安装好iproute之后,有如下的配置文件:

1
2
3
4
5
6
7
8
9
10
[root@xmxyk ~]#ll /etc/iproute2
total 32
-rw-r--r--. 1 root root 75 Nov 6 2016 ematch_map
-rw-r--r--. 1 root root 31 Nov 6 2016 group
-rw-r--r--. 1 root root 264 Nov 6 2016 nl_protos
-rw-r--r--. 1 root root 442 Nov 6 2016 rt_dsfield
-rw-r--r--. 1 root root 317 Nov 6 2016 rt_protos
-rw-r--r--. 1 root root 112 Nov 6 2016 rt_realms
-rw-r--r--. 1 root root 92 Nov 6 2016 rt_scopes
-rw-r--r--. 1 root root 87 Nov 6 2016 rt_tables

OPTIONS选项

有如下选项,常用的是-4 -o等:

1
2
3
4
5
6
7
8
-V:显示指令版本信息;
-s:-stats, -statistics输出更详细的信息;可以使用多个-s来显示更多的信息
-f:-family {inet, inet6, link} 强制使用指定的协议族;
-4:-family inet的简写,指定使用的网络层协议是IPv4协议;
-6:-family inet6的简写,指定使用的网络层协议是IPv6协议;
-0:shortcut for -family link.
-o:-oneline,输出信息每条记录输出一行,即使内容较多也不换行显示;
-r:-resolve,显示主机时,不使用IP地址,而使用主机的域名。
  • 查看版本
    centos 7.1 的默认版本是iproute-3.10.0,此版本是2013年出来的,现在(2019年5月)最新的版本是v5.0.0
1
2
3
4
[root@xmxyk ~]#rpm -qf /usr/sbin/ip
iproute-3.10.0-74.el7.x86_64
[root@xmxyk ~]#ip -V
ip utility, iproute2-ss130716
  • -o 显示一行

使用-o显示一行,只显示ipv4、是global以及dynamic动态地址的eth0的IP信息。

1
2
[root@xmxyk ~]#ip -o -4 address show eth0 scope global dynamic
2: eth0 inet 144.34.167.181/19 brd 144.34.191.255 scope global dynamic eth0\ valid_lft 149795sec preferred_lft 149795sec

OBJECT对象

  • link :网卡信息
  • address:IP地址信息
  • neighbour:邻居表
  • route:路由表
  • rule:IP策略
  • maddress:多播地址
  • mourte:组播路由缓存条目
  • tunnel:IP隧道

COMMAND命令

add, delete, and show 之类的操作指令

ARGUMENTS

ARGUMENTS是命令的一些参数,它们倚赖于对象和命令。ip支持两种类型的参数:flag和parameter。flag由一个关键词组成;parameter由一个关键词加一个数值组成。为了方便,每个命令都有一个可以忽略的默认参数。例如,参数dev 是ip link 命令的默认参数,因此ip link ls eth0等于ip link ls dev eth0

IP address

用法

1
2
3
4
5
6
7
8
9
10
11
12
13
ip [ OPTIONS ] address  { COMMAND | help }

ip address { add | del } IFADDR dev STRING

ip address { show | flush } [ dev STRING ] [ scope SCOPE-ID ] [ to PREFIX ] [ FLAG-LIST ] [ label PATTERN ]

IFADDR := PREFIX | ADDR peer PREFIX [ broadcast ADDR ] [ anycast ADDR ] [ label STRING ] [ scope SCOPE-ID ]

SCOPE-ID := [ host | link | global | NUMBER ]

FLAG-LIST := [ FLAG-LIST ] FLAG

FLAG := [ permanent | dynamic | secondary | primary | tentative |deprecated | dadfailed | temporary ]
  • dev STRING:指定要进行操作的网络设备名称
  • IFADDR:协议地址,地址的格式由使用的协议所决定,比如在ipv4协议中,地址的格式为用小数点分隔的四个十进制数,后面可以用/连接子网掩码的位数,比如192.168.1.100/24。
  • peer address:使用点对点连接时对端的协议地址。
  • broadcast address:协议广播地址,可以简写成brd,此外可以简单的在后面加上“+”表示广播地址由协议地址主机位全置1组成,“-”则表示主机位全置0。
  • label:装置的别名,为了和linux 2.0中的别名相兼容,该标志由该网络设备名称开头,后面用“:”接上地址名称,比如eth0:3等等。
  • scope:地址作用范围,可能的值有:
    • global:允许来自所有来源的连接,加IP时,默认值
    • site:仅支持 IPv6 ,仅允许本主机的连接
    • link:仅允许本装置自我连接
    • host:仅允许本主机内部的连接

ip addr show显示IP信息

IPV4中,有Primary address和Secondary address之分,如下使用ip -o -4 addr show dev eth0 secondary就只会显示子IP地址。

标志:

  • secondary:为输出的数据包选择默认源地址时,内核不使用这个地址。如果一个设备已经有了一个地址,又给它设置了同一网段的不同地址,第二个地址就成为从(secondary)地址。例如:eth0已经有一个地址192.168.1.108/24 ,如果又给它一个地址192.168.1.3/24,192.168.1.3/24 的就会被内核标记为从地址。
  • dynamic:这个地址是通过无状态的自动配置建立的(stateless autoconfiguration)。如果地址仍然有效,在输出中,还包括两个时间信息。preferred_lft 期满后,地址就会变成deprecated状态;valiid_lft期满后,地址将失效。
  • deprecated:这个地址是不允许的,也就是说,地址虽然有效,但是不能使用它建立新的连接。
  • tentative:由于重复地址监测还没有完成或者监测失败,这个地址不能使用。

Primary与Secondary的区别:

  • 在每一个接口上可以配置多个Primary地址和多个Secondary地址。
  • 对一个特定的网络掩码(例子中的网络掩码为/24),只能有一个Primary地址。
  • 当删除一个Primary地址时,所有相关的Secondary地址也被删除。但通过/proc可以配置一个选项,在当前Primary地址被删除时可以将Secondary地址提升为Primary地址。
  • 当主机为本地生成的流量选择源IP地址时,只考虑Primary地址。

valid_lft为地址的有效使用期限,preferred_lft是地址的首选生存期。

1
2
3
4
5
6
7
8
9
10
11
[root@xmxyk ~]#ip -4 -o addr show eth0
2: eth0 inet 144.34.167.181/19 brd 144.34.191.255 scope global dynamic eth0\ valid_lft 130078sec preferred_lft 130078sec
2: eth0 inet 198.19.128.20/24 scope global eth0\ valid_lft forever preferred_lft forever
2: eth0 inet 198.19.128.21/24 scope global secondary eth0:0\ valid_lft forever preferred_lft forever

[root@xmxyk ~]#ip -4 -o addr show eth0 secondary
2: eth0 inet 198.19.128.21/24 scope global secondary eth0:0\ valid_lft forever preferred_lft forever
[root@xmxyk ~]#
[root@xmxyk ~]#
[root@xmxyk ~]#ip -4 -o addr show eth0 dynamic
2: eth0 inet 144.34.167.181/19 brd 144.34.191.255 scope global dynamic eth0\ valid_lft 130040sec preferred_lft 130040sec

如果想实现主用IP删除时,辅助IP自动转成主用IP,可以使用promote_secondaries=1,其使用就是晋升辅助ip地址。

1
2
3
4
5
[root@xmxyk ~]#sysctl -a |grep promote_secondaries
net.ipv4.conf.all.promote_secondaries = 1
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.eth0.promote_secondaries = 1
net.ipv4.conf.lo.promote_secondaries = 0

另外,ip alias和secondary ip address是两种不同的实现方式,用来在Linux系统中给同一个物理网卡增加多个ip地址。ip alias是由ifconfig程序来创建和维护的,而secondary ip address则是有ip程序来创建和维护的。ip addr add 创建的scondary ip address不能在ifconfig -a中看到,反过来,ifconfig创建的ethX:Y却能在ip addr show中看到。

http://blog.chinaunix.net/uid-24148050-id-3045244.html

ip addr add添加IP

1
2
3
4
5
6
[root@localhost tmp]# ip addr add 198.19.128.20/24 dev eth0
[root@localhost tmp]# ip addr add 198.19.128.21/24 dev eth0 label eth0:0
[root@localhost tmp]#
[root@localhost tmp]# ip -o -4 addr show dev eth0
2: eth0 inet 198.19.128.20/24 scope global eth0\ valid_lft forever preferred_lft forever
2: eth0 inet 198.19.128.21/24 scope global secondary eth0:0\ valid_lft forever preferred_lft forever

如上,添加了2个同段IP之后,第二个IP198.19.128.21就显示为secondary的IP了。

删除IP

  • 删除指定的IP:ip addr del 198.19.128.20/24 dev eth0
  • 删除所有的IP:ip address flush
  • 删除以eth0开头的IP:ip -4 addr flush label “eth*”
  • 删除动态的IPV6的IP:ip -6 addr flush dynamic

ip link

可以使用-s 来显示 网卡数据库的统计信息。

1
2
3
[root@xmxyk ~]#ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP mode DEFAULT qlen 1000
link/ether aa:aa:00:11:ce:b1 brd ff:ff:ff:ff:ff:ff

qdisc(queuing discipline)显示这个网络接口使用的排队算法。noqueue表示不对数据包进行排队;noop 表示这个网络接口出于黑洞模式,也就是所有进入本网络设备的数据会直接被丢弃。qlen 是网络接口传输队列的默认长度。

  • up表示该网络设备正在工作;
  • loopback表示这是一个回送设备,该接口发出的数据报不会被传到网络上;
  • broadcast表示该网络设备可以将数据报传送给子网内的所有主机;
  • pointtopoint表示该网络设备是一个点对点连接的一端,所有该设备发出的数据报都将被对端节点所接收,所有对端发出的数据报也将被本设备所接收。
  • multicast表示该网络设备具有接收和发送多目传送(multicast)的能力;
  • promisc表示网络设备处于混杂模式,这时该设备将进行监听并将监听到的数据传递给内核,即使这些数据不是发送给该主机的。通常用于网络探测。
  • allmulti表示网络设备将接收所有多目传送的数据报,通常用于多目传送路由器。
  • noapp 这个参数在使用不同的协议时具有不同的意义。但通常表示不需要地址解析。
  • dynamic 表示该网络设备可以动态的建立和删除。
  • slave表示该网络设备与其他网络设备绑定在一起,形成逻辑上的一个网络设备。
  • link/ether表示接口硬件类型,后面是网络设备的硬件地址;
  • brd 后面的是网络设备的硬件广播地址。
1
2
3
4
5
6
7
8
9
10
11
[root@xmxyk ~]#ip -s -s link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP mode DEFAULT qlen 1000
link/ether aa:aa:00:11:ce:b1 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
6702986527 6270099 0 0 0 0
RX errors: length crc frame fifo missed
0 0 0 0 0
TX: bytes packets errors dropped carrier collsns
6967040050 5248502 0 0 0 0
TX errors: aborted fifo window heartbeat transns
0 0 0 0 2

如上,RX和TX显示了接收和发送了多少数据。

  • bytes:表示已接收/发送的数据字节数
  • packets:表示已接收/发送的数据报数目
  • errors:表示在接收/发送时出现的错误次数,包括 too-long-frames 错误,Ring Buffer 溢出错误,crc 校验错误,帧同步错误,fifo overruns 以及 missed pkg 等等。
  • dropped:由于资源不足而丢弃的数据包总数
  • overrun:表示在接收数据包时,因为系统出现错误或系统反应太慢而导致丢包的数目
  • mcast:收到的组播数据包总数
  • carrier:表示物理连接出错的次数
  • collsns:表示出现以太冲突的次数
  • ip link set dev eth0 promisc on 开启混杂模式
  • ip link set eth0 up 启用网卡
1
2
3
4
5
6
[root@localhost tmp]# ip link set eth0 up
[ 8480.884740] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[root@localhost tmp]# [ 8484.435022] tg3 0000:01:00.0 eth0: Link is up at 1000 Mbps, full duplex
[ 8484.449675] tg3 0000:01:00.0 eth0: Flow control is off for TX and off for RX
[ 8484.465280] tg3 0000:01:00.0 eth0: EEE is disabled
[ 8484.475896] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
  • ip link set eth0 mtu 1500 设置MTU值,即设置最大传输单元
  • ip link set eth0 name vbird 设置网卡名,需要在网卡down的时候进行设置,意义不是很大
  • ip link set eth0 address aa:aa:aa:aa:aa:aa 设置MAC地址

ip route

用法

路由条目保存在内核的路由表中,它们包含寻找到其它网络节点的路径信息。路由表条目都包括一对网络地址/掩码长度以及可选的TOS值等信息。如果数据包目的地址位于属于路由条目的的范围,以及路由的TOS等于0或者等于数据包的TOS,它就匹配路由条目。

如果一个数据包匹配多个路由条目,系统内核将按照以下规则决定选择哪个路由:

  • 范围最小的优先匹配,较大的放弃;
  • 路由TOS等于数据包TOS的匹配,不等于的放弃;
  • 如果经过上面两步的选择,还有数个路由,就选择优先值最高的路由;
  • 如果还有数个路由可供选择,就重复进行第一步。

1、路由类型TYPE

路由的设置以及其它的可选属性都依赖于路由类型。最重要的路由类型是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:使用多播路由。在普通的路由表中,这种路由并不存在。

2、路由表table TABLEID

从Linux-2.2开始,内核把路由归纳到许多路由表中,这些表都进行了编号,
编号数字的范围是1到255。另外,为了方便,还可以在/etc/iproute2/rt_tables 中为路由表命名。

  • table 0:系统保留
  • table 253:称为默认路由表,表名为default。一般来说默认的路由都放在这张表。
  • table 254:默认情况下,所有的路由都会被插入到表main(编号254)中。在进行路由查询时,内核只使用路由表main。 main表中路由记录都是普通的路由记录。而且,使用ip route配置路由时,如果不明确制定要操作的路由表,默认情况下也是主路由表(表254)进行操作。我们使用ip route list 或 route -n 或 netstat -rn查看的路由记录,也都是main表中记录。
  • table 255:local。这个表保存本地和广播路由。内核会自动维护这个路由
    表,通常系统管理员没有必要对它进行修改,甚至不必看到。

3、路由协议RTPROTO

RTPROTO可以是一个数字,也可以是/etc/iproute2/rt_protos文件定义的一个字符串。如果使用时没有提供这个参数,ip命令就使用默认值boot(也就是说,ip命令认为添加路由的人不知道自己做了些什么)。有些协议值有其固定的解释:

  • redirect—路由是由ICMP重定向加入的;
  • kernel—路由是由内核在自动配置期间加入的;
  • boot—路由是启动过程中加入的。如果一个路由监控程序将要启动,这些路由都会被清除;
  • static—为了覆盖动态路由,由系统管理员手工添加的路由。路由监控程序也会优先考虑这类路由,甚至可能通告给其对端;
  • ra—路由是通过路由发现协议加入的 (Router Discovery Protocol) 。
  • 其它的值没有保留,系统管理员可以自由分配(或者不分配)给协议标记。至少,路由监控程序应该注意对一些唯一协议值的设置,这些协议值在rtnetlink.h文件或者rt_protos数据库中分配。

手工加的静态路由并没有显示路由协议,这是为什么呢?

显示路由信息

1
2
3
4
5
6
[root@localhost ~]# ip route show
default via 192.168.31.1 dev eth0
10.168.3.0/24 via 192.168.3.3 dev eth0
169.254.0.0/16 dev eth0 scope link metric 1002
192.168.3.0/24 dev eth0 proto kernel scope link src 192.168.3.23
192.168.31.0/24 dev eth0 proto kernel scope link src 192.168.31.32

添加路由信息

添加路由的可用参数如下:

  • 路由的目标前缀(prefix),是一个IP或者IPv6地址,也可以跟着一个斜杠和掩码长度。如果没有掩码长度,ip命令就假定是一个单一ip 地址。
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# ip route add 114.114.114.114 via 192.168.3.3
[root@localhost ~]# ip route add 10.168.0.0/16 via 192.168.3.3
[root@localhost ~]# ip route show
default via 192.168.31.1 dev eth0
10.168.0.0/16 via 192.168.3.3 dev eth0
10.168.3.0/24 via 192.168.3.3 dev eth0
114.114.114.114 via 192.168.3.3 dev eth0
169.254.0.0/16 dev eth0 scope link metric 1002
192.168.3.0/24 dev eth0 proto kernel scope link src 192.168.3.23
192.168.31.0/24 dev eth0 proto kernel scope link src 192.168.31.32
  • tos TOS:定义服务类型关键词。在进行路由匹配时,内核首先比较数据包的TOS 和route 的TOS,如果没有和数据包TOS相同的路由,还可以选择TOS等于0的路由。TOS或者是一个十六进制的数字, 或者是一个由/etc/iproute2/rt_dsfield文件定义的识别符。不常用。
  • metric NUMBER:定义路由的优先值,NUMBER时一个任意的32位数字。
  • table TABLEID:同路由表
  • dev NAME:指定网卡的名字
  • via ADDRESS:指定下一跳路由器的地址。实际上,这个域的可靠性取决于路由类型。对于通常的unicast 路由,它或者是真正的下一跳路由器地址。其实就是网关IP。
  • src ADDRESS:在向目的prefix发送数据包时选择的源地址。
  • mtu MTU:设置到达目的路径的最大传输单元(MTU)。
  • scope SCOPE_VAL:路由前缀(prefix)覆盖的范围。SCOPE_VAL 可以是一个数字,也可以是/etc/iproute2/rt_scope 文件定义的一个字符串。如果没有这个参数,ip命令就会根据具体情况猜测:对于经过网关的unicast 路由,就设置为global;对于直连的unicast 路由和广播路由,就设置为link;对于本地路由,就设置为host。

还有一些其他参数,不常用,就不介绍了。

删除路由

如下,网段也是可以简写的。

1
2
3
4
5
6
7
8
[root@localhost ~]# ip route del 114.114.114.114
[root@localhost ~]# ip route del 10.168.0.0/16
[root@localhost ~]# ip route del 10.168.3/24
[root@localhost ~]# ip route show
default via 192.168.31.1 dev eth0
169.254.0.0/16 dev eth0 scope link metric 1002
192.168.3.0/24 dev eth0 proto kernel scope link src 192.168.3.23
192.168.31.0/24 dev eth0 proto kernel scope link src 192.168.31.32

还可以使用ip route flush 批量删除路由。

1
2
3
4
5
ip route flush [dev IFACE] [VIA PREFIX]

[dev IFACE] :仅清空和某个接口相关联的路由,若省略,则表示所有的

[via PREFIX] :只清空或者显示与指定网关相关的

替换默认路由

1
2
3
[root@localhost ~]# ip route change 0.0.0.0/0 via 192.168.1.1
[root@localhost ~]# route -n |grep ^0
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0

ip rule

简介

在某些情况下,我们不只是需要通过数据包的目的地址决定路由,可能还需要通过其他一些域:源地址、IP协议、传输层端口甚至数据包的负载。这就叫做:策略路由(policy routing)。

基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应用或IP源地址等属性来选择转发路径。简单地来说,linux系统有多张路由表,而路由策略会根据一些条件,将路由请求转向不同的路由表。例如源地址在某些范围走路由表A,另外的数据包走路由表,类似这样的规则是有路由策略rule来控制。

在linux系统中,一条路由策略rule主要包含三个信息,即rule的优先级,条件,路由表。其中rule的优先级数字越小表示优先级越高,然后是满足什么条件下由指定的路由表来进行路由。在linux系统启动时,内核会为路由策略数据库配置三条缺省的规则,即rule 0,rule 32766, rule 32767(数字是rule的优先级),如下:

1
2
3
4
5
6
7
8
9
10
[root@instance-3 ~]# ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default

[root@instance-3 ~]# cat /etc/iproute2/rt_tables |grep -v "^#"
255 local
254 main
253 default
0 unspec
  • rule 0 :匹配任何条件的数据包,查询路由表local(table id = 255)。rule 0非常特殊,不能被删除或者覆盖。 查询路由表local(ID 255) | 路由表local 是一个特殊的路由表,包含对于本地和广播地址的高优先级控制路由。
  • rule 32766:匹配任何条件的数据包,查询路由表main(ID 254),路由表main(ID 254)是一个通常的表,包含所有的无策略路由。平时使用route add添加的路由都是加到这个表里面的。
  • rule 32767:匹配任何条件的数据包,查询路由表default(ID 253),路由表default(ID 253)是一个空表,它是为一些后续处理保留的。对于前面的缺省策略没有匹配到的数据包,系统使用这个策略进行处理这个规则也可以删除。

备注:在linux系统中是按照rule的优先级顺序依次匹配。假设系统中只有优先级为0,32766及32767这三条规则。那么系统首先会根据规则0在本地路由表里寻找路由,如果目的地址是本网络,或是广播地址的话,在这里就可以找到匹配的路由;如果没有找到路由,就会匹配下一个不空的规则,在这里只有32766规则,那么将会在主路由表里寻找路由;如果没有找到匹配的路由,就会依据32767规则,即寻找默认路由表;如果失败,路由将失败。

用法

1
2
3
4
5
6
7
8
Usage: ip rule [ list | add | del ] SELECTOR ACTION 
SELECTOR := [ from PREFIX 数据包源地址] [ to PREFIX 数据包目的地址] [ tos TOS 服务类型][ dev STRING 物理接口]
[ pref NUMBER 优先级 ] [fwmark MARK iptables 标签]

ACTION := [ table TABLE_ID 指定所使用的路由表] [ nat ADDRESS 网络地址转换][ prohibit 丢弃该表| reject 拒绝该包| unreachable 丢弃该包]
[ flowid CLASSID ]

TABLE_ID := [ local | main | default | NUMBER ]

SELECTOR具体参数如下:

  • From — 源地址
  • To — 目的地址(这里是选择规则时使用,查找路由表时也使用)
  • Tos — IP包头的TOS(type of sevice)域
  • Dev — 物理接口
  • Fwmark — 防火墙参数

ACTION动作:

  • Table 指明所使用的表
  • Nat 透明网关
  • Action prohibit 丢弃该包,并发送 COMM.ADM.PROHIITED的ICMP信息
  • Reject 单纯丢弃该包
  • Unreachable丢弃该包, 并发送 NET UNREACHABLE的ICMP信息

添加策略

1、指定优先级

第一条命令将向规则链增加一条规则,规则匹配的对象是所有的数据包,动作是选用路由表1的路由,这条规则的优先级是32800.

第二条命令将向规则链增加一条规则,规则匹配的对象是IP为192.168.3.112, tos等于0x10的包,使用路由表2,这条规则的优先级是32801,动作是丢弃。

1
2
3
4
5
6
7
8
[root@xmxyk ~]#ip rule add from 0/0 table 1 pref 32800
[root@xmxyk ~]#ip rule add from 192.168.3.112/32 tos 0x10 table 2 pref 32801 prohibit
[root@xmxyk ~]#ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
32800: from all lookup 1
32801: from 192.168.3.112 tos lowdelay lookup 2 prohibit

2、不指定优先级

而添加策略时,是可以不指定pref 优先级的,那么系统就会默认创建rule的ID,在main的前面往前移一位。

1
2
3
4
5
6
[root@xmxyk ~]#ip rule  add from 144.34.167.181 tab 200
[root@xmxyk ~]#ip rule
0: from all lookup local
32765: from 144.34.167.181 lookup 200
32766: from all lookup main
32767: from all lookup default

3、iptables 的 set-mark功能

还可以借助iptables来实现其他不一样的功能。

使用Netfilter的managle机制针对特定的数据包设置MARK值,在此将3389端口的数据包的MARK值设置为1,然后将fwmark 1的规则应用到ip rule上即可。这样就可以实现特定程序的流量走不同的路线。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@xmxyk ~]#iptables -t mangle -A OUTPUT -p tcp --dport 3389 -j MARK --set-mark 1
[root@xmxyk ~]#ip rule add fwmark 1 table 20 pref 20
[root@xmxyk ~]#ip route add default via 144.34.167.1 table 20
[root@xmxyk ~]#ip rule
0: from all lookup local
20: from all fwmark 0x1 lookup 20
32765: from 144.34.167.181 lookup 200
32766: from all lookup main
32767: from all lookup default
[root@xmxyk ~]#
[root@xmxyk ~]#
[root@xmxyk ~]#iptables -t mangle -nvL
Chain PREROUTING (policy ACCEPT 562 packets, 119K bytes)
pkts bytes target prot opt in out source destination

Chain INPUT (policy ACCEPT 562 packets, 119K bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3389 MARK set 0x1

Chain OUTPUT (policy ACCEPT 440 packets, 249K bytes)
pkts bytes target prot opt in out source destination

Chain POSTROUTING (policy ACCEPT 440 packets, 249K bytes)
pkts bytes target prot opt in out source destination

4、实例

公司内网要求192.168.0.100以内的使用 10.0.0.1 网关上网(电信),其他IP使用 20.0.0.1 (网通)上网。假定10.0.0.1以及20.0.0.1都是在同一张网卡上面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
ip route add default via 20.0.0.1 #添加默认网关,未指定table id,就是main表,
ip route add default via 10.0.0.1 table 20
ip rule add fwmark 20 table 20
iptable -t mangle -I PREROUTING -s 192.168.0.0-192.168.0.100 -j MARK --set-mark 2 #将源IP192.168.0.0~100在PREROUTING链就加上标记0x2

[root@localhost ~]# iptables -t mangle -nvL
Chain PREROUTING (policy ACCEPT 9 packets, 660 bytes)
pkts bytes target prot opt in out source destination

Chain INPUT (policy ACCEPT 9 packets, 660 bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 5 packets, 660 bytes)
pkts bytes target prot opt in out source destination
0 0 MARK all -- * * 0.0.0.0/0 0.0.0.0/0 owner GID match 1002 MARK set 0x45

Chain POSTROUTING (policy ACCEPT 5 packets, 660 bytes)
pkts bytes target prot opt in out source destination

[root@xmxyk ~]#ip rule
0: from all lookup local
20: from all fwmark 0x1 lookup 20
32765: from 144.34.167.181 lookup 200
32766: from all lookup main
32767: from all lookup default
[root@xmxyk ~]#ip route show tab 20 #没有路由,没有环境测试
[root@xmxyk ~]#

因为mangle的处理是优先于 nat 和fiter表的,所以相应数据包到达之后先打上标记,上例的标记为0x2,之后再通过ip rule规则。对应的数据包使用相应的路由表进行路由,查到有符合相应的ip rule规则,最后读取路由表id为2的信息,将数据包送出网关。

总结

不要混淆路由表(route)和规则(rule):ip rule规则指向路由表,多个规则可以引用一个路由表,而且某些路由表可以没有策略指向它。如果系统管理员删除了指向某个路由表的所有规则,这个表就没有用了,但是仍然存在,直到里面的所有路由都被删除,它才会消失。

经典用法:

1
2
ip route add default via 192.168.1.1 dev eth2 table 200
ip rule add from 192.168.1.195 lookup 200
  • 第一行表示,先建立一个路由表,其table名为200,这个表里面的默认路由是192.168.1.1
  • 第二行表示 ,新建一个ip的策略,从192.168.1.195发出来的流量都使用路由表200这张图。
  • 由于ip rule数字越低,其优先级最高,而路由main(254)表的ip rule规则是32766,如果没有指定ip rule的优先级,其默认是从32765开始加起来的,所以一般就认为,加IP策略会比route -n看到的优先级再高。如果要指定优先级,可以加上pref number参数。
  • linux上面的路由表只有255个,没有优先级的;而ip rule的策略表是没有限制的,数字越低,其优先级最高。

ip tunnel

简介

IP隧道技术:是路由器把一种网络层协议封装到另一个协议中以跨过网络传送到另一个路由器的处理过程。IP 隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。移动IPv4主要有三种隧道技术,它们分别是:IP in IP、最小封装以及通用路由封装。

Linux系统内核实现的IP隧道技术主要有三种(PPP、PPTP和L2TP等协议或软件不是基于内核模块的):ipip、gre、sit 。这三种隧道技术都需要内核模块 tunnel4.ko 的支持。

  • ipip 需要内核模块 ipip.ko ,该方式最为简单!但是你不能通过IP-in-IP隧道转发广播或者IPv6数据包。你只是连接了两个一般情况下无法直接通讯的IPv4网络而已。至于兼容性,这部分代码已经有很长一段历史了,它的兼容性可以上溯到1.3版的内核。据网上查到信息,Linux的IP-in-IP隧道不能与其他操作系统或路由器互相通讯。它很简单,也很有效。
  • GRE 需要内核模块 ip_gre.ko ,GRE是最初由CISCO开发出来的隧道协议,能够做一些IP-in-IP隧道做不到的事情。比如,你可以使用GRE隧道传输多播数据包和IPv6数据包。
  • sit 他的作用是连接 ipv4 与 ipv6 的网络。个人感觉不如gre使用广泛 。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
graph TB
subgraph ServerA
a1[eth0 192.168.189.129]
a2[eth1-192.168.20.20]
end
subgraph ServerB
b1[eth0 192.168.189.131]
b2[eth1 192.168.19.22]
end
subgraph ServerC
c1[eth0 没有IP]
c2[eth1-192.168.19.100]
end
a1---b1
b2---c2

如上图所示,有2台服务器eth0都是交换机互连,但eth1属于不同的网段,现在需要将2个网络打通。

在serverA上面做如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
modprobe ip_gre
ip tunnel add tun0 mode gre local 192.168.189.129 remote 192.168.189.131 ttl 64
ip link set tun0 up
ip route add 192.168.19.0/24 dev tun0
ip addr add 192.168.20.20 dev tun0
#ip addr add 192.168.20.20 peer 192.168.19.22 dev tun0

[root@localhost ~]# ip addr show tun0
7: tun0@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN
link/gre 192.168.189.129 peer 192.168.189.131
inet 192.168.20.20 peer 192.168.19.22/32 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::5efe:c0a8:bd81/64 scope link
valid_lft forever preferred_lft forever

在serverB上面做如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
modprobe ip_gre
ip tunnel add tun0 mode gre remote 192.168.189.129 local 192.168.189.131 ttl 64
ip link set tun0 up
ip route add 192.168.20.0/24 dev tun0
ip addr add 192.168.19.22 peer 192.168.20.20 dev tun0

[root@client ~]# ip addr show tun0
6: tun0@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN qlen 1
link/gre 192.168.189.131 peer 192.168.189.129
inet 192.168.19.22 peer 192.168.20.20/32 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::5efe:c0a8:bd83/64 scope link
valid_lft forever preferred_lft forever

这样配置之后,一条gre的隧道就打通了。同时,这2台的eth1的网络就可以互通了。从serverB上面Ping serverA,可以看到有4个包,一个request就有2个包,这是由于经过了gre,需要再次封装。

image

现在需要serverA 去访问serverC的资源,所以现在需要在serverB上面开启包转发功能,这样就可以通信了。

1
2
3
[root@client ~]# iptables -t nat -I POSTROUTING -s 192.168.20.20 -d 192.168.19.100 -j MASQUERADE
[root@client ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

但是C上面就没有办法跟A通信了。

ipv6 to ipv4

首先在https://tunnelbroker.net/上面注册一个账号,然后create tunnel即可。

1
2
3
4
5
6
modprobe ipv6
ip tunnel add he-ipv6 mode sit remote 66.220.18.42 local 66.98.118.159 ttl 255
ip link set he-ipv6 up
ip addr add 2001:470:c:1ad6::2/64 dev he-ipv6
ip route add ::/0 dev he-ipv6
ip -f inet6 addr

配置完成之后,可以在nginx开启监听ipv6的80口,就可以实现ipv6的通信了。

1
2
3
4
5
server
{
listen 80;
listen [::]:80;
server_name www.xmxyk.net xmxyk.net w6.xmxyk.net;

ip neighbour

用法

邻接(neighbour)对象实现同一网段协议地址和链路层地址的绑定。在内核中,这些条目被组织到表中。IPv4的相邻表也被叫做ARP表。ip neighbour命令支持对条目及其属性的显示、添加和删除。

1
2
3
4
5
6
7
8
9
ip [ OPTIONS ] neigh  { COMMAND | help }

ip neigh { add | del | change | replace } { ADDR [ lladdr LLADDR ] [ nud { permanent | noarp | stale | reachable } ] | proxy ADDR } [ dev DEV ]

ip neigh { show | flush } [ proxy ] [ to PREFIX ] [ dev DEV ] [ nud STATE ]

ip neighbour add -- 添加一个新的邻接条目
ip neighbour change--修改一个现有的条目
ip neighbour replace--替换一个已有的条目

显示邻居信息

1
2
3
[root@pxe-client2 ~]# ip neigh
172.16.4.8 dev eth0 lladdr 78:2b:cb:0c:e0:50 REACHABLE
172.16.4.252 dev eth0 lladdr 58:bc:27:49:e4:4a STALE
  • to ADDRESS(default):相邻的协议地址。可以是IPv4或者IPv6。
  • dev NAME:和相邻节点连接的设备。
  • lladdr LLADDRESS:邻居的链路层地址。LLADDRESS可以为空。
  • nud NUD_STATE 邻接条目的状态。nud 是Neighbour Unreachability
    Detection 的缩写。nud all 表示所有的状态。这个选项可以使用多次。如果缺少这个选项,ip 会列出除none和noarp 状态的所有条目。可能的状态包括:
    • none:网络邻居的状态为空。
    • incomplete:这个邻居正在被解析。
    • reachable:网络邻居有效并且可达。
    • stale:邻居有效,但是可能不可达。因此,内核将在首次传输时进行检查。
    • delay:一个数据包已经发到处于stale 的网络邻居,内核在等待应答信息。
    • probe:delay 计时器过期,还没有收到确认信息。内核开始使用ARP/NDISC消息包探测这个网络邻居。
    • failed:解析失败。
    • noarp:网络邻居有效,不必检查。
    • permanent:这是一个noarp 条目,只有系统管理员可以从邻接表中把它删除。
    • 在IPV6网络邻居可以有一个叫做router 的标志,它表示这个节点是一个IPv6路由器。

使用nud all来显示所有的邻居信息。

1
2
3
4
5
6
[root@localhost ~]# ip ne show nud all
ff02::1:ff00:2 dev eth0 lladdr 33:33:ff:00:00:02 NOARP
ff02::2 dev eth0 lladdr 33:33:00:00:00:02 NOARP
ff02::16 dev eth0 lladdr 33:33:00:00:00:16 NOARP
ff02::1:ff08:c660 dev eth0 lladdr 33:33:ff:08:c6:60 NOARP
192.168.31.1 dev eth0 lladdr fa:16:3e:f0:e1:73 REACHABLE

使用-statistics选项可以显示很多有用的信息

1
2
[root@localhost ~]# ip -s neigh show 192.168.31.1
192.168.31.1 dev eth0 lladdr fa:16:3e:f0:e1:73 ref 1 used 5/0/3 probes 1 REACHABLE

输出信息里面多了ref和用斜缸分开的三个时间。ref表示有多少用户使用这个条目;三个时间分别是使用时间、确认时间和刷新时间。上例表示条目5秒之前使用过,0秒之前确认过,3秒之前被更新过了。

增加邻居信息

在设备eth0上,为地址10.0.0.3添加一个permanent ARP条目

1
2
3
4
5
6
7
8
[root@localhost ~]# ip neigh add 10.0.0.3 lladdr 0:0:0:0:0:1 dev eth0 nud perm
[root@localhost ~]# ip neigh show
10.0.0.3 dev eth0 lladdr 00:00:00:00:00:01 PERMANENT
192.168.31.1 dev eth0 lladdr fa:16:3e:f0:e1:73 REACHABLE
[root@localhost ~]# ip neigh chg 10.0.0.3 dev eth0 nud reachable #把状态改为reachable
[root@localhost ~]# ip neigh show
10.0.0.3 dev eth0 lladdr 00:00:00:00:00:01 REACHABLE
192.168.31.1 dev eth0 lladdr fa:16:3e:f0:e1:73 REACHABLE

删除邻居信息

执行了删除命令之后,被删除的条目不会马上消失,它会在系统的下次垃圾收集时被删除。如果被操作的条目正在使用,将不能被删除。

1
2
3
4
[root@localhost ~]# ip neigh del 10.0.0.3 dev eth0
[root@localhost ~]# ip neigh show
10.0.0.3 dev eth0 FAILED
192.168.31.1 dev eth0 lladdr fa:16:3e:f0:e1:73 DELAY

如果试图删除或者手工修改一个由内核建立的noarp 条目,会导致一些不可预知的行为。

也可以使用flash这个命令来删除,其参数和ip neigh sh相同。不同之处是,如果没有参数,它什么也不会做。而且,默认情况下,被删除的条目不包括处于permanent和noarp状态的条目。

1
2
[root@localhost ~]# ip -s -s neigh flush 10.0.0.3
Nothing to flush.

参考资料

http://linux-ip.net/html/tools-ip-link.html

overrun的问题处理:https://blog.csdn.net/yujin2010good/article/details/78478982

http://blog.hyfather.com/blog/2013/03/04/ifconfig/

Linux 网络堆栈的排队机制: http://blog.jobbole.com/62917/

Linux流量控制:http://blog.chinaunix.net/uid/10167808/sid-1428-list-3.html

https://wiki.linuxfoundation.org/networking/iproute2

https://github.com/shemminger/iproute2

http://www.policyrouting.org/iproute2.doc.html

https://escapelife.github.io/posts/c0629c9.html

https://www.west.cn/www/info/18325-1.htm

Linux网卡包计数器清零(卸载/重加载驱动):https://blog.csdn.net/u013908944/article/details/79665223

重置linux网卡流量统计:https://hqidi.com/45.html

https://blog.csdn.net/wangjianno2/article/details/72853735

https://blog.csdn.net/u012758088/article/details/76255543

http://www.cnblogs.com/sammyliu/p/4713562.html

http://www.opstool.com/article/183

http://www.ttlsa.com/linux/create-a-gre-tunnel-linux/

http://www.361way.com/linux-tunnel/5199.html

https://wiki.linuxfoundation.org/networking/tunneling

https://onebitbug.me/2014/06/03/building-a-gateway-tunnel/

  • 本文作者: wumingx
  • 本文链接: https://www.wumingx.com/linux/ipcommand.html
  • 本文主题: IP命令详解
  • 版权声明: 本站所有文章除特别声明外,转载请注明出处!如有侵权,请联系我删除。
0%