ljzsdut
GitHubToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeBack to homepage

01 IP 命令用法归纳

解读 ip 命令展示的网络连接信息

$ ip 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 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: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
 link/ether 00:1e:4f:c8:43:fc brd ff:ff:ff:ff:ff:ff
 inet 192.168.0.24/24 brd 192.168.0.255 scope global dynamic enp0s25
 valid_lft 57295sec preferred_lft 57295sec
 inet6 fe80::2c8e:1de0:a862:14fd/64 scope link
 valid_lft forever preferred_lft forever

为什么是 enp0s25 而不是 eth0

如果你想知道为什么它在这个系统上被称为 enp0s25,而不是可能更熟悉的 eth0,那我们可以稍微解释一下。

新的命名方案被称为“ 可预测的网络接口(Predictable Network Interface)”。 它已经在基于systemd 的 Linux 系统上使用了一段时间了。 接口名称取决于硬件的物理位置。 en 仅仅就是 “ethernet” 的意思,就像 “eth” 用于对应 eth0,一样。 p 是以太网卡的总线编号,s 是插槽编号。 所以 enp0s25 告诉我们很多我们正在使用的硬件的信息。

<BROADCAST,MULTICAST,UP,LOWER_UP> 这个配置串告诉我们:

BROADCAST   该接口支持广播
MULTICAST   该接口支持多播
UP          网络接口已启用
LOWER_UP    网络电缆已插入,设备已连接至网络

列出的其他值也告诉了我们很多关于接口的知识,但我们需要知道 brdqlen 这些词代表什么意思。 所以,这里显示的是上面展示的 ip 信息的其余部分的翻译。

mtu 1500                                    最大传输单位(数据包大小)为1,500字节
qdisc pfifo_fast                            用于数据包排队
state UP                                    网络接口已启用
group default                               接口组
qlen 1000                                   传输队列长度
link/ether 00:1e:4f:c8:43:fc                接口的 MAC(硬件)地址
brd ff:ff:ff:ff:ff:ff                       广播地址
inet 192.168.0.24/24                        IPv4 地址
brd 192.168.0.255                           广播地址
scope global                                全局有效
dynamic enp0s25                             地址是动态分配的
valid_lft 80866sec                          IPv4 地址的有效使用期限
preferred_lft 80866sec                      IPv4 地址的首选生存期
inet6 fe80::2c8e:1de0:a862:14fd/64          IPv6 地址
scope link                                  仅在此设备上有效
valid_lft forever                           IPv6 地址的有效使用期限
preferred_lft forever                       IPv6 地址的首选生存期

您可能已经注意到,ifconfig 命令提供的一些信息未包含在 ip a 命令的输出中 —— 例如传输数据包的统计信息。 如果您想查看发送和接收的数据包数量以及冲突数量的列表,可以使用以下 ip 命令:

$ ip -s link show enp0s25
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
 link/ether 00:1e:4f:c8:43:fc brd ff:ff:ff:ff:ff:ff
 RX: bytes packets errors dropped overrun mcast
 224258568 418718 0 0 0 84376
 TX: bytes packets errors dropped carrier collsns
 6131373 78152 0 0 0 0

另一个 ip 命令提供有关系统路由表的信息。

$ ip route show
default via 192.168.0.1 dev enp0s25 proto static metric 100
169.254.0.0/16 dev enp0s25 scope link metric 1000
192.168.0.0/24 dev enp0s25 proto kernel scope link src 192.168.0.24 metric 100

ip 命令是非常通用的。 您可以从 ip 命令及其来自Red Hat的选项获得有用的备忘单。

接口信息查看

查看接口状态和详细统计

比如所有网卡上传输的字节数和报文数,错误或丢弃的报文数等

#ip -s link show [dev <接口名>]  #不指定接口则显示所有接口的详细统计。
#ip -d -s -s link show [dev <接口名>]

$ ip -s link show enp0s25
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
 link/ether 00:1e:4f:c8:43:fc brd ff:ff:ff:ff:ff:ff
 RX: bytes packets errors dropped overrun mcast
 224258568 418718 0 0 0 84376
 TX: bytes packets errors dropped carrier collsns
 6131373 78152 0 0 0 0

[root: ~]# ip -d -s -s link show ens34
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 88:32:9b:ca:3f:4a brd ff:ff:ff:ff:ff:ff promiscuity 0 addrgenmode eui64 
    RX: bytes  packets  errors  dropped overrun mcast   
    581645     6100     0       0       0       0       
    RX errors: length   crc     frame   fifo    missed
               0        0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    3743584    3939     0       0       0       0       
    TX errors: aborted  fifo   window heartbeat transns
               0        0       0       0       2    

IP 地址设置

查看接口 IP 地址

ip [-6] addr show [dev <接口名>]  #不指定接口则显示所有接口的 IPV4/IPV6 地址。简写:ip a

[root: ~]# ip addr add 192.168.1.111/24 dev ens34
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 88:32:9b:ca:3f:4a brd ff:ff:ff:ff:ff:ff
    inet 10.16.1.2/24 brd 10.16.1.255 scope global ens34
       valid_lft forever preferred_lft forever
    inet 192.168.1.111/24 scope global ens34
       valid_lft forever preferred_lft forever
    inet6 fe80::f65c:89ff:fecd:3ab5/64 scope link 
       valid_lft forever preferred_lft forever

为接口添加 IP 地址

为网卡分配 IP 地址以及其他网络信息

ip [-6] addr add <IP 地址/前缀长度> [broadcast <广播地址>] dev <接口名>

[linuxtechi@localhost]$ sudo ip addr add 192.168.0.50/255.255.255.0 dev enp0s3  #设置ip地址
[linuxtechi@localhost]$ sudo  ip addr add broadcast 192.168.0.255 dev enp0s3  # 设置广播地址
[linuxtechi@localhost]$  sudo ip addr add 192.168.0.10/24 brd + dev enp0s3 #根据 IP 地址设置标准的广播地址

对应的ifconfig命令:

ifconfig eth0 add 192.168.0.50

为接口删除 IP 地址

ip [-6] addr del <IP 地址/前缀长度> dev <接口名>

[linuxtechi@localhost]$ sudo ip addr del 192.168.0.10/24 dev enp0s3

对应的ifconfig命令:

$ ifconfig eth0 del 192.9.203.21

为网卡添加别名

假设网卡名为 enp0s3

[linuxtechi@localhost]$  sudo ip addr add 192.168.0.20/24 dev enp0s3 label enp0s3:1 

接口设置

启用接口

ip link set <接口名> up

[linuxtechi@localhost]$ sudo ip link set enp0s3 up 

禁用接口

ip link set <接口名> down

[linuxtechi@localhost]$ sudo ip link set enp0s3 down 

设置接口 MAC 地址

设置前请先禁用接口。

ip link set <接口名> address <值>

设置接口 MTU

设置前请先禁用接口。

ip link set <接口名> mtu <值>

#把 ens33 的 MTU 改成 9000 并检查。
[root: ~]# ip link show dev ens33 #修改前
2: ens33: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT qlen 1000
    link/ether 88:32:9b:ca:3f:49 brd ff:ff:ff:ff:ff:ff

[root: ~]# ip link set ens33 mtu 9000

[root: ~]# ip link show dev ens33  #修改后
2: ens33: <BROADCAST,MULTICAST> mtu 9000 qdisc pfifo_fast state DOWN mode DEFAULT qlen 1000
    link/ether 88:32:9b:ca:3f:49 brd ff:ff:ff:ff:ff:ff

启用或禁用组播

对于 ip,使用 set 子命令与设备(dev)以及一个布尔值和 multicast 选项:

# ip link set dev eth0 multicast on

对应的ifconfig命令:

# ifconfig eth0 multicast

开启或关闭地址解析功能(ARP)

使用 ip,你可以将 arp 属性设置为 onoff

# ip link set dev eth0 arp on

对应的ifconfig命令:

# ifconfig eth0 arp

VLAN 设置

添加 802.1Q VLAN 子接口

ip link add link <接口名> name <子接口名> type vlan id <VLAN ID>


# 为 ens33 添加 VLAN100 子接口并检查。
[root: ~]# ip link add link ens33 name ens33.100 type vlan id 100

[root: ~]# ip -d -s -s link show ens33.100
7: ens33.100@ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP mode DEFAULT qlen 1000
    link/ether 88:32:9b:ca:3f:aa brd ff:ff:ff:ff:ff:ff promiscuity 0 
    vlan protocol 802.1Q id 100 <REORDER_HDR> addrgenmode eui64 
    RX: bytes  packets  errors  dropped overrun mcast   
    0          0        0       0       0       0       
    RX errors: length   crc     frame   fifo    missed
               0        0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    738        9        0       0       0       0       
    TX errors: aborted  fifo   window heartbeat transns
               0        0       0       0       3 

删除 802.1Q VLAN 子接口

ip link del <接口名>

路由表设置

查看路由表

不指定接口则显示所有接口的路由表。

ip route show [dev <接口名>]

查看指定目标地址用的是哪条路由表

ip route get <目标 IP>

#查看目标地址为 8.8.8.8 用的是哪条路由表。
[root: ~]# ip route get 8.8.8.8
8.8.8.8 via 192.168.1.1 dev ens33  src 192.168.1.143 
    cache 
#下一跳是 192.168.1.1,出接口是 ens33,接口的 IP 是 192.168.1.143。

添加路由表

ip route add <目标 IP 地址/前缀长度> via <下一跳> [dev <出接口>]

添加默认网关

ip route add default via <默认网关> [dev <出接口>]

[linuxtechi@localhost]$ sudo ip route add default via 192.168.0.150/24 
#若要修改某个网卡的默认路由,通过via 192.168.0.150/24定位路由条目
[linuxtechi@localhost]$ sudo ip route add 172.16.32.32 via 192.168.0.150/24 dev enp0s3 

删除路由表

ip route del <目标 IP 地址/前缀长度> via <下一跳> [dev <出接口>]

[linuxtechi@localhost]$  sudo ip route del 192.168.0.150/24 

注意: 用上面方法修改的默认路由只是临时有效的,在系统重启后所有的改动都会丢失。要永久修改路由,需要修改或创建 route-enp0s3 文件。将下面这行加入其中:

[linuxtechi@localhost]$  sudo vi /etc/sysconfig/network-scripts/route-enp0s3

172.16.32.32 via 192.168.0.150/24 dev enp0s3 

保存并退出该文件。

若你使用的是基于 Ubuntu 或 debian 的操作系统,则该要修改的文件为 /etc/network/interfaces,然后添加 ip route add 172.16.32.32 via 192.168.0.150/24 dev enp0s3 这行到文件末尾。

ARP 设置

查看 ARP 表

不指定接口则显示所有接口的 ARP 表。

ip neigh show [dev <接口名>] 

添加永久 ARP 条目

ip neigh add <IP 地址> lladdr <以冒号分割的 MAC 地址> dev <接口名> nud permanent

[linuxtechi@localhost]$ sudo ip neigh add 192.168.0.106 lladdr 33:1g:75:37:r3:84 dev enp0s3

把动态 ARP 条目转换为永久 ARP 条目(仅限已存在条目)

ip neigh change <IP 地址> dev <接口名> nud permanent

[linuxtechi@localhost]$ sudo ip neigh add 192.168.0.150 lladdr 33:1g:75:37:r3:84 dev enp0s3 nud perm 

这里 nud 的意思是 “neghbour state”(网络邻居状态),它的值可以是:

  • perm - 永久有效并且只能被管理员删除
  • noarp - 记录有效,但在生命周期过期后就允许被删除了
  • stale - 记录有效,但可能已经过期
  • reachable - 记录有效,但超时后就失效了

删除 ARP 条目

ip neigh del <IP 地址> dev <接口名>

[linuxtechi@localhost]$ sudo ip neigh del 192.168.0.106 dev enp0s3 

清空 ARP 表(不影响永久条目)

ip neigh flush all

linxu-bridge

查看网桥上的slave

ip link show master docker0