Linux Command: Ip

ip 是个命令, ip 命令的功能很多!基本上它整合了 ifconfigroute 这两个命令,不过 ip 的功能更强大。

ip命令用法

1
2
3
4
5
6
7
8
9
10
% sudo ip
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
where OBJECT := { link | addr | addrlabel | route | rule | neigh | ntable |
tunnel | maddr | mroute | mrule | monitor | xfrm | token }
OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
-h[uman-readable] | -iec |
-f[amily] { inet | inet6 | ipx | dnet | link } |
-o[neline] | -t[imestamp] | -b[atch] [filename] |
-rc[vbuf] [size]}

OPTIONS:选项

  • -s:显示出该设备的统计数据(statistics),例如总接受封包数等;

OBJECT:动作对象,就是是可以针对哪些网络设备对象进行动作。

  • link:关于设备 (device) 的相关设定,包括 MTU,MAC 地址等。
  • addr/address:关于额外的 IP 设定,例如多 IP 的实现等。
  • route :与路由有关的相关设定。

ip命令解释

ip link 可以设定与设备(device)有关的相关设定,包括MTU以及该网络设备的MAC等,当然也可以启动(up)或关闭(down)某个网络设备。

1
2
3
4
5
6
7
8
9
% sudo ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 4c:d9:8f:27:e7:d4 brd ff:ff:ff:ff:ff:ff
3: em2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 20:04:0f:e6:45:9b brd ff:ff:ff:ff:ff:ff
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 72:df:05:18:76:51 brd ff:ff:ff:ff:ff:ff

使用ip link show可以显示出整个设备的硬件相关信息,如上所示,包括MAC地址、MTU等。lo是主机内部自行设定的,如果加上-s的参数后,则这个网卡的相关统计信息就会被列出来,包括接收(RX)及传送(TX)的封包数量等,详细的内容与ifconfig所输出的结果相同。

ip address

如果说ip link是与OSI七层模型的第二层数据链路层有关的话,那么ip address/addr就是与第三层网络层有关的了。主要是在设定与 IP 有关的各项参数,包括 netmask, broadcast 等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
% sudo ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 4c:d9:8f:27:e7:d4 brd ff:ff:ff:ff:ff:ff
inet 172.16.10.88/24 brd 172.16.10.255 scope global em1
inet6 fe80::4ed9:8fff:fe27:e7d4/64 scope link
valid_lft forever preferred_lft forever
3: em2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 20:04:0f:e6:45:9b brd ff:ff:ff:ff:ff:ff
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 72:df:05:18:76:51 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
inet6 fe80::70df:5ff:fe18:7651/64 scope link
valid_lft forever preferred_lft forever

ip address [add|del] [IP参数] [dev 设备名] [相关参数]

[add|del]:

  • add|del:进行相关参数的增加(add)或删除(del)设定。
  • show:显示详细信息。

[IP 参数]:

主要就是网域的设定,例如 192.168.100.100/24 之类的设定。

[dev 设备名]:

IP 参数所要设定的设备,例如eth0, eth1等。

[相关参数]:

broadcast:设定广播位址,如果设定值是 + 表示让系统自动计算;

label:该设备的别名,例如eth0:0;

scope:这个设备的领域,默认global,通常是以下几个大类:

  • global:允许来自所有来源的连线;
  • site:仅支持IPv6 ,仅允许本主机的连接;
  • link:仅允许本设备自我连接;
  • host:仅允许本主机内部的连接;

ip route

路由的查看与设定。事实上ip route 的功能几乎与 route 这个命令一样,但是,它还可以进行额外的参数设置,例如MTU的规划等。

1
2
3
4
% sudo ip route
172.16.10.0/24 dev em1 proto kernel scope link src 172.16.10.88 metric 1
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.42.1
default via 172.16.10.1 dev em1 proto static
  • proto:此路由的路由协定,主要有redirect, kernel, boot, static, ra等,其中kernel是直接由核心判断自动设定。
  • scope:路由的范围,主要是link,是与本设备有关的直接连接。

ip route [add|del] [IP或网域] [via gateway] [dev 设备]

[add|del]:

  • add|del:增加(add)或删除(del)路由。
  • show:显示详细信息。

[IP或网域]:可使用192.168.50.0/24之类的网域或者是单纯的 IP 。

[via gateway]:从哪个gateway出去,不一定需要。

[dev 设备名]:所要设定的设备,例如eth0, eth1等。

用例

1
2
3
% sudo ip route add 192.168.12.0/24 dev eth1 #添加路由
% sudo ip route add 192.168.10.0/24 via 192.168.12.1 dev eth0 #添加通往外部路由
% sudo ip route del 192.168.10.0/24 dev eth0 #删除路由