ip命令的使用
# ip命令的使用
官网:http://www.policyrouting.org/
ip
命令是 Linux 中用于网络配置的强大工具,整合了ifconfig
和route
命令,用于取代旧的 ifconfig
命令。以下是一些常用的 ip
命令及其用法:
# 用法
$ ip --help
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
where OBJECT := { address | addrlabel | fou | help | ila | ioam | l2tp | link |
macsec | maddress | monitor | mptcp | mroute | mrule |
neighbor | neighbour | netconf | netns | nexthop | ntable |
ntbl | route | rule | sr | tap | tcpmetrics |
token | tunnel | tuntap | vrf | xfrm }
OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
-h[uman-readable] | -iec | -j[son] | -p[retty] |
-f[amily] { inet | inet6 | mpls | bridge | link } |
-4 | -6 | -M | -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 | -N[umeric] | -a[ll] |
-c[olor]}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
OPTIONS
选项
-V:显示指令版本信息;
$ ip -V ip utility, iproute2-5.15.0, libbpf 0.5.0
1
2-s:输出统计信息;可以使用多个
-s
来显示更多的信息;$ ip -s link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 RX: bytes packets errors dropped missed mcast 14454 184 0 0 0 0 TX: bytes packets errors dropped carrier collsns 14454 184 0 0 0 0
1
2
3
4
5
6
7-d:输出更多详细信息;
$ ip -d link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0 minmtu 0 maxmtu 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:84:84:1c brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 46 maxmtu 16110 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 parentbus pci parentdev 0000:02:01.0 altname enp2s1
1
2
3
4
5
6-r:显示主机时,不使用 IP 地址,而使用主机的域名;
$ ip -r a 1: lo: <LOOPBACK,UP,LOWER_UP> 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 localhost/8 scope host lo valid_lft forever preferred_lft forever inet6 ip6-localhost/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:84:84:1c brd ff:ff:ff:ff:ff:ff altname enp2s1 inet 11.dev.com/24 brd 192.168.122.255 scope global ens33 valid_lft forever preferred_lft forever inet6 dev/64 scope link valid_lft forever preferred_lft forever
1
2
3
4
5
6
7
8
9
10
11
12
13
14-h:更友好地输出,搭配
-s
;~$ ip -h -s link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 RX: bytes packets errors dropped missed mcast 16.0k 199 0 0 0 0 TX: bytes packets errors dropped carrier collsns 16.0k 199 0 0 0 0
1
2
3
4
5
6
7-j:以
JSON
形式输出;$ ip -j link show lo [{"ifindex":1,"ifname":"lo","flags":["LOOPBACK","UP","LOWER_UP"],"mtu":65536,"qdisc":"noqueue","operstate":"UNKNOWN","linkmode":"DEFAULT","group":"default","txqlen":1000,"link_type":"loopback","address":"00:00:00:00:00:00","broadcast":"00:00:00:00:00:00"}]
1
2-f:
-family { inet | inet6 | mpls | bridge | link }
强制使用指定的协议族;-4:
-family inet
的简写,指定使用的网络层协议是IPv4
协议;-6:
-family inet6
的简写,指定使用的网络层协议是IPv6
协议;-o:输出信息每条记录输出一行,即使内容较多也不换行显示;
OBJECT
对象
- address:IP 地址信息
- link:网卡信息
- help:查看帮助信息
- netns:网络 namespace
- route:路由表
- tunnel:IP 隧道
- tuntap:配置 tap/tun 设备
- addrlabel:协议地址选择的标签配置
- fou:UDP 接收端口配置
- ila
- ioam
- l2tp
- macsec
- maddress:多播地址
- monitor
- mptcp
- mroute:组播路由缓存条目
- mrule
- neighbor
- neighbour:邻居表
- netconf
- nexthop
- ntable
- ntbl
- rule:IP 策略
- sr
- tap
- tcpmetrics
- token
- vrf
- xfrm
# ip link 网络设备配置
ip link help:查看帮助信息
ip link show:查看设备信息
up:只显示运行的设备;
[link DEV | parentdev NAME] [ name ] NAME:NAME 指定要显示的网络设备。如果省略此参数,则列出所有设备;
$ ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:84:84:1c brd ff:ff:ff:ff:ff:ff altname enp2s1 # 通过 -s option 显示统计信息 $ ip -s link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 RX: bytes packets errors dropped missed mcast 14454 184 0 0 0 0 TX: bytes packets errors dropped carrier collsns 14454 184 0 0 0 0 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:0c:29:84:84:1c brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped missed mcast 408093 1124 0 0 0 0 TX: bytes packets errors dropped carrier collsns 125917 798 0 0 0 0 altname enp2s1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24ip link add:添加设备信息
ip link add [link DEV | parentdev NAME] [ name ] NAME [ txqueuelen PACKETS ] [ address LLADDR ] [ broadcast LLADDR ] [ mtu MTU ] [index IDX ] [ numtxqueues QUEUE_COUNT ] [ numrxqueues QUEUE_COUNT ] type TYPE [ ARGS ]
1
2
3
4
5
6
7
8例如添加一个 bond 设备
$ sudo ip link add ens37 type bond
1添加 veth 对
$ sudo ip l a veth0 type veth peer name veth1
1ip link set:配置设备
ip link set { DEVICE | dev DEVICE | group DEVGROUP }
1{ up | down }:将设备设置为 up 或 down;
arp { on | off }:更改设备的 NOARP 标志;
multicast { on | off }:更改设备的 MULTICAST 标志;
dynamic { on | off }:更改设备的 DYNAMIC 标志;
name NEWNAME:更改设备的名字,如果设备正在运行或者已经有一个配置好的地址,那么操作无效;
txqueuelen PACKETS:更改设备发送队列的长度;
mtu MTU:更改设备MTU;
address LLADDR:更改接口的站点地址
broadcast LLADDRESS,brd LLADDRESS,peer LLADDRESS:当接口为POINTOPOINT时,更改链路层广播地址或对等地址;
netns PID:将设备移动到与进程 PID 关联的网络命名空间;
# 将网卡设置到 network namespace $ sudo ip netns add ns0 $ sudo ip link set dev eth0 netns ns0
1
2
3alias NAME:给设备一个符号名以便于参考;
vf NUM:指定要配置的虚拟功能设备。必须使用 dev 参数指定关联的 pf 设备;
- 警告:如果请求更改多个参数,则在任何更改失败后立即中止 IP。这是 IP 能够将系统移动到不可预测状态的唯一情况。解决方案是避免使用一个 IP 链路集调用来更改多个参数。
查看网络接口:
ip addr show
1或者简写为:
ip a
1启用或禁用网络接口: 启用接口:
ip link set <interface> up
1禁用接口:
ip link set <interface> down
1添加 IP 地址:
ip addr add <IP_ADDRESS>/<SUBNET_MASK> dev <interface>
1例如:
ip addr add 192.168.1.10/24 dev eth0
1删除 IP 地址:
ip addr del <IP_ADDRESS>/<SUBNET_MASK> dev <interface>
1查看路由表:
ip route show
1或者简写为:
ip r
1添加路由:
ip route add <NETWORK>/<SUBNET_MASK> via <GATEWAY>
1删除路由:
ip route del <NETWORK>/<SUBNET_MASK> via <GATEWAY>
1查看邻居(ARP 表):
ip neigh show
1
这些只是 ip
命令的一部分功能,你可以使用 man ip
命令查看更详细的文档和选项。如果你需要某个特定用法的帮助,请告诉我!
# ip address IP 地址管理
ip address
用于设置设备的 IP 地址。每个设备必须有一个地址才能对外提供网络功能。
ip {a | addr | a list}:查看网卡信息
ip address show help:查看帮助信息
ip address show:显示 IP 协议地址
[dev IFNAME | IFNAME]:显示特定的设备信息
$ ip address show lo 1: lo: <LOOPBACK,UP,LOWER_UP> 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
1
2
3
4scope SCOPE-ID:仅列出具有此作用域的地址
to PREFIX:仅列出匹配 PREFIX 的地址
label LABEL:只列出与模式匹配的标签的地址
master DEVIC:只列出主地址
up:列出运行中的设备
type TYPE:根据类型列出设备。具体类型可以通过帮助信息查看
ip address [save|flush}:保存/刷新协议地址
此命令刷新由某些条件选择的协议地址。此命令具有与 show 相同的参数。不同之处在于,当不给出参数时,它不会运行
$ sudo ip address flush dev lo
1
ip address {add|change|replace} IFADDR dev IFNAME [ LIFETIME ]:为设备 新增/修改/替换 新的 IP 地址
IFADDR:指定 IP 地址
PREFIX | ADDR peer PREFIX:指定 IP 地址或 IP 加前缀
broadcast ADDR:接口的广播地址
label IFNAME:每个地址都可以用标签字符串标记。为了保持与 Linux2.0 网络别名的兼容性,此字符串必须与设备名称重合,或者必须以设备名后跟冒号作为前缀。
$ sudo ip addr add 192.168.204.11/24 dev ens36 label ens36:1 $ ip addr show dev ens36 3: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:84:84:26 brd ff:ff:ff:ff:ff:ff altname enp2s4 inet 192.168.204.10/24 brd 192.168.204.255 scope global ens36 valid_lft forever preferred_lft forever inet 192.168.204.11/24 scope global secondary ens36:1 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe84:8426/64 scope link valid_lft forever preferred_lft forever
1
2
3
4
5
6
7
8
9
10
11
12
13scope SCOPE-ID:地址有效的区域的范。可用的作用域列在文件
/etc/iproute2/rt_scopes
中。预定义的范围值是:- global:地址全局有效。
- site:(仅 IPv6)该地址为站点本地地址,即该地址在此站点内有效。
- link:该地址是本地链接,即它仅在此设备上有效。
- host:该地址仅在此主机内有效
dev IFNAME:指定设备的名称
# 为设备 ens36 增加一个 192.168.204.22/24 地址 $ sudo ip address add 192.168.204.22/24 dev ens36
1
2
ip address del IFADDR dev IFNAME [mngtmpaddr]
- IFADDR:指定 IP 地址
- dev IFNAME:指定设备名称
# 删除设备 ens36 的一个 192.168.204.22/24 地址 $ sudo ip address del 192.168.204.22/24 dev ens36
1
2
# ip route 路由表管理
ip route { list | show | flush } SELECTOR:查看/清空路由信息
$ ip route show default via 192.168.122.2 dev ens33 proto static 192.168.122.0/24 dev ens33 proto kernel scope link src 192.168.122.11 192.168.204.0/24 dev ens36 proto kernel scope link src 192.168.204.10 $ ip route list default via 192.168.122.2 dev ens33 proto static 192.168.122.0/24 dev ens33 proto kernel scope link src 192.168.122.11 192.168.204.0/24 dev ens36 proto kernel scope link src 192.168.204.10 # 清掉default路由 $ sudo ip route flush default
1
2
3
4
5
6
7
8
9
10
11
12
13ip route get [ ROUTE_GET_FLAGS ] ADDRESS:查看具体路由信息
$ ip route get 192.168.122.0 192.168.122.0 dev ens33 src 192.168.122.11 uid 1000 cache
1
2
3ip route { add | del | change | append | replace } ROUTE:添加、删除、修改、追加和替换路由
添加到达目标主机的路由记录:
ip route add {目标主机} via {网关} [dev {网卡}]
$ sudo ip route add 192.168.204.1 via 192.168.204.10 dev ens36
1添加到达网络的路由记录:
ip route add {目标网络/掩码} via {网关} [dev {网卡}]
$ sudo ip route add 192.168.205.0/24 via 192.168.204.10 dev ens36 $ sudo ip route append 192.168.205.0/24 via 192.168.204.10 dev ens36 $ sudo ip route replace 192.168.206.0/24 dev ens36
1
2
3添加默认路由:
ip route add default via {网关}
$ sudo ip route add default via 192.168.122.2 dev ens33
1删除路由:
ip route del {目标网络/掩码}
、ip route del default [via {网关s}]
$ sudo ip route del 192.168.205.0/24
1
SELECTOR
的类型:
SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]
[ table TABLE_ID ] [ vrf NAME ] [ proto RTPROTO ]
[ type TYPE ] [ scope SCOPE ]
2
3
TYPE
的类型:
TYPE := { unicast | local | broadcast | multicast | throw |
unreachable | prohibit | blackhole | nat }
2
OPTIONS
可选项:
OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ] [ as [ to ] ADDRESS ]
[ rtt TIME ] [ rttvar TIME ] [ reordering NUMBER ]
[ window NUMBER ] [ cwnd NUMBER ] [ initcwnd NUMBER ]
[ ssthresh NUMBER ] [ realms REALM ] [ src ADDRESS ]
[ rto_min TIME ] [ hoplimit NUMBER ] [ initrwnd NUMBER ]
[ features FEATURES ] [ quickack BOOL ] [ congctl NAME ]
[ pref PREF ] [ expires TIME ] [ fastopen_no_cookie BOOL ]
2
3
4
5
6
7
# ip netns 网络命名空间
ip netns help:查看帮助信息
ip netns list:显示所有命名的 network namesapce,其实就是显示
/var/run/netns
目录下的所有 network namespace 对象$ ip netns list ns1 $ ll /var/run/netns total 0 drwxr-xr-x 2 root root 60 Oct 21 13:32 ./ drwxr-xr-x 30 root root 900 Oct 21 12:55 ../ -r--r--r-- 1 root root 0 Oct 21 13:32 ns1
1
2
3
4
5
6
7
8ip netns add NAME:新增网络命名空间
$ sudo ip netns add ns1
1ip netns attach NAME PID:如果
/var/run/netns
下没有 NAME(命名空间的名字),该指令将进程 PID 的网络名称空间附加到 NAME,就像它是使用 ip netns 创建的一样。ip netns set NAME NETNSID:给 network namespace 设置 ID
$ sudo ip netns set ns1 1 dev@dev:~$ sudo ip netns list ns2 ns1 (id: 1)
1
2
3
4ip [-all] netns delete [NAME]:删除指定名称的 network namespace。如果指定
-all
选项,则尝试删除所有的 network namespaceip netns identify [PID]:用来查看进程的 network namespace。如果不指定 PID 就显示当前进程的 network namespace
$ sudo ip netns identify 1657 ns1 $ sudo ip netns identify
1
2
3ip netns pids NAME:用来查看指定的 network namespace 中的进程的 PID。这个命令其实就是去检查
/proc
下的所有进程,看进程的 network namespace 是不是指定的 network namespace$ sudo ip netns pids ns1 1657 1658 1659
1
2
3
4ip [-all] netns exec [NAME] cmd ...:在 network namespace 中执行命令
# 在 ns1 network namespace 启动 nginx $ sudo ip netns exec ns1 nginx
1
2ip netns monitor:用来监控对 network namespace 的操作。
# 比如我们新增一个 network namespace 时就会收到相应的通知 $ ip netns monitor add ns2
1
2
3
4ip netns list-id [target-nsid POSITIVE-INT] [nsid POSITIVE-INT]