如何在 Linux 上使用 ip 命令

在Linux系统中,ip 命令是一个强大的工具,可以用来即时配置IP地址、网络接口以及路由规则。本文将介绍如何使用这个现代化的替代工具,它取代了传统且现已废弃的 ifconfig 命令。

ip 命令的工作原理

ip 命令允许您精细地调整Linux计算机处理IP地址的方式,管理网络接口控制器 (NIC),以及设定路由规则。这些更改会立即生效,无需重启系统。ip 命令的功能远不止这些,但本文将重点介绍其最常见的用途。

ip 命令包含多个子命令,每个子命令针对一个特定的对象,例如IP地址或路由。这些对象又各自拥有多种选项。正是这种丰富的功能,使得 ip 命令可以执行细粒度的任务。它不是一把大斧头,而是一套精细的手术刀工具。

我们将重点关注以下对象:

  • 地址:IP地址及其范围。
  • 链接:网络接口,如以太网连接和Wi-Fi适配器。
  • 路由:管理数据包通过接口(链接)发送到目标的规则。

ip 命令与地址对象的使用

首先,了解当前的网络设置至关重要。要查看计算机上的IP地址,可以使用带有 address 对象的 ip 命令。默认操作是显示信息,这将列出所有IP地址。您可以省略 show 操作,或者将 address 缩写为 addr 甚至 a

以下命令是等效的:

ip address show
ip addr show
ip addr
ip a

从输出中,我们可以看到两个IP地址以及其他详细信息。每个IP地址都与一个网络接口控制器(NIC)相关联。ip 命令会尽可能提供有关接口的详细信息。

第一个IP地址是用于计算机内部通信的回环地址。第二个是计算机在局域网(LAN)上的实际外部IP地址。

下面详细解读一下输出信息:

  • lo: 网络接口名称,字符串形式。
  • : 这是一个回环接口。它处于UP状态,表示其已启动并运行。 物理网络层 (第一层) 也处于活动状态。
  • mtu 65536: 最大传输单元。指此接口可以传输的最大数据包大小。
  • qdisc noqueue: qdisc是一种排队机制,用于调度数据包的传输。不同的排队技术被称为学科。noqueue学科表示“立即发送,不进行排队”。这是虚拟设备(如回环地址)的默认qdisc规则。
  • 状态 UNKNOWN:状态可以是DOWN(网络接口未运行)、UNKNOWN(网络接口可运行但未连接任何设备)或UP(网络可运行且已连接)。
  • group default: 接口可以进行逻辑分组。默认情况下,所有接口都被放置在一个名为“default”的组中。
  • qlen 1000: 传输队列的最大长度。
  • link/loopback: 媒体访问控制 (MAC) 地址。
  • inet 127.0.0.1/8: IP版本4地址。斜杠 (/) 后面的数字使用无类别域间路由 (CIDR) 表示法表示子网掩码。它指示子网掩码中前导连续设置为1的位数。8表示子网掩码有8位设置为1,即二进制的255,因此子网掩码为255.0.0.0。
  • 范围主机: IP地址的范围。此IP地址仅在计算机(“主机”)内部有效。
  • lo: 与此IP地址关联的接口。
  • valid_lft: 有效生命周期。对于通过动态主机配置协议 (DHCP) 分配的IP版本4地址,这是IP地址被视为有效且可以发出和接受连接请求的时间长度。
  • preferred_lft: 首选生命周期。对于DHCP分配的IP版本4地址,这是可以不受限制地使用IP地址的时间量。它不应大于 valid_lft 值。
  • inet6: IP版本6地址、范围、valid_lftpreferred_lft

物理接口的信息通常更有趣,如下所示:

  • enp0s3:网络接口名称,字符串形式。“en”代表以太网,“p0”是网卡的总线号,“s3”是插槽号。
  • :该接口支持广播多播。接口状态为UP,表示可操作且已连接。网络的硬件层(第一层)也处于UP状态。
  • mtu 1500:此接口支持的最大传输单元。
  • qdisc fq_codel: 调度程序正在使用一种称为“公平排队,受控延迟”的规则。它旨在为使用队列的所有流量提供公平的带宽份额。
  • 状态 UP:接口可操作且已连接。
  • group default:此接口属于“default”接口组。
  • qlen 1000:传输队列的最大长度。
  • link/ether:接口的MAC地址。
  • inet 192.168.4.26/24:IP版本4地址。“/24”表示子网掩码中有24个连续的前导位设置为1。这意味着有三组8位。一个8位二进制数等于255,因此子网掩码为255.255.255.0。
  • brd 192.168.4.255:此子网的广播地址
  • 范围全局:IP地址在整个网络中都有效。
  • dynamic:如果接口关闭,IP地址将丢失。
  • noprefixroute:添加此IP地址时,不要在路由表中创建路由。如果有人想使用此IP地址进行路由,必须手动添加。同样,如果删除此IP地址,请不要寻找要删除的路由。
  • enp0s3:与此IP地址关联的接口。
  • valid_lft:有效生命周期。IP地址被视为有效的时间,86,240秒等于23小时57分钟。
  • preferred_lft:首选生命周期。IP地址可以无限制使用的时间长度。
  • inet6:IP版本6地址、范围、valid_lftpreferred_lft

仅显示IPv4或IPv6地址

如果需要将输出限制为IP版本4地址,可以使用 -4 选项,如下所示:

ip -4 addr

要将输出限制为IP版本6地址,可以使用 -6 选项:

ip -6 addr

显示单个接口的信息

若要查看单个接口的IP地址信息,可以使用 showdev 选项,并指定接口名称,如下所示:

ip addr show dev lo
ip addr show dev enp0s3

您可以使用 -4-6 标志进一步筛选输出,以仅显示感兴趣的内容。

例如,要查看接口 enp0s3 上的IP版本4信息,可以输入以下命令:

ip -4 addr show dev enp0s3

添加IP地址

您可以使用 adddev 选项为接口添加IP地址。您只需指定要添加的IP地址以及要添加到的接口。

例如,我们将IP地址 192.168.4.44 添加到 enp0s3 接口,同时需要指定子网掩码的CIDR表示法。

输入以下命令:

sudo ip addr add 192.168.4.44/24 dev enp0s3

再次查看此接口上的IP版本4地址:

ip -4 addr show dev enp0s3

可以看到,新的IP地址已添加到网络接口。我们可以在另一台计算机上通过 ping 命令测试该IP地址是否可以响应:

ping 192.168.4.44

新的IP地址成功响应了ping请求。通过简单的 ip 命令,新的IP地址即可正常工作。

删除IP地址

删除IP地址的命令与添加的命令类似,只需将 add 替换为 del

sudo ip addr del 192.168.4.44/24 dev enp0s3

使用以下命令进行验证,可以看到新添加的IP地址已被删除:

ip -4 addr show dev enp0s3

ip 命令与网络接口的使用

您可以使用 link 对象来查看和操作网络接口。输入以下命令以查看计算机上安装的接口:

ip link show

要查看单个网络接口,只需将接口名称添加到命令中:

ip link show enp0s3

启动和停止链接

可以使用带有 updown 选项的 set 操作来启动或停止网络接口。您需要使用 sudo,如下所示:

sudo ip link set enp0s3 down

查看网络接口状态:

ip link show enp0s3

网络接口的状态为 DOWN。使用 up 选项可以重新启动网络接口:

sudo ip link set enp0s3 up

再次快速检查网络接口的状态:

ip link show enp0s3

网络接口已重新启动,状态为 UP

ip 命令与路由的使用

使用 route 对象,可以查看和操作路由。路由定义了网络流量如何转发到不同的IP地址,以及通过哪个网络接口。

如果目标计算机或设备与发送计算机共享网络,则发送计算机可以将数据包直接转发给它。

如果目标设备未直接连接,则发送计算机会将数据包转发到默认路由器。然后,路由器决定将数据包发送到哪里。

要查看计算机上定义的路由,输入以下命令:

ip route

以下是输出信息的解读:

  • default: 默认路由规则。如果没有其他规则匹配发送的数据,则会使用此路由。
  • via 192.168.4.1: 数据包通过IP地址为192.168.4.1的设备进行路由。这是当前网络中默认路由器的IP地址。
  • dev enp0s3: 使用此网络接口将数据包发送到路由器。
  • proto dhcp: 路由协议标识符。DHCP 表示路由将动态确定。
  • metric 100:与其他路由相比的优先级指示。指标较低的路由优先于指标较高的路由。您可以使用此指标来优先选择有线网络接口而不是Wi-Fi接口。

第二条路由管理发往IP地址范围 169.254.0.0/16 的流量。这是一个零配置网络,这意味着它会尝试进行自我配置,以便在内网中进行通信。但是,不能用它在直接网络之外发送数据包。

零配置网络背后的原理是,它们不依赖于DHCP和其他服务。它们只需要查看TCP/IP协议即可在网络上相互识别。

详细信息如下:

  • 169.254.0.0/16:此路由规则管辖的IP地址范围。如果计算机在此IP范围内进行通信,则会使用此规则。
  • dev enp0s3:此路由管理的流量将使用的网络接口。
  • 范围链接:范围是链接,这意味着范围仅限于本地直接连接的网络。
  • metric 1000:这是一个高指标,不是首选路由。

第三条路由管理发往IP地址范围 192.168.4.0/24 的流量。这是此计算机连接的局域网的IP地址范围。它用于在该网络之间以及网络内部进行通信。

详细信息:

  • 192.168.4.1/24:此路由规则管辖的IP地址范围。如果计算机在此IP范围内进行通信,则此规则将触发并控制数据包路由。
  • dev enp0s3:此路由用于发送数据包的接口。
  • proto kernel:内核在自动配置时创建的路由。
  • 范围链接:范围是链接,这意味着范围仅限于此计算机连接的直接网络。
  • src 192.168.4.26: 此路由发送的数据包源自的IP地址。
  • metric 100:低指标表示这是一个首选路由。

显示单个路由的信息

如果想要查看特定路由的详细信息,可以在命令中添加 list 选项和路由的IP地址范围:

ip route list 192.168.4.0/24

添加路由

假设我们在这台计算机上添加了一个新的网卡。执行以下命令,可以看到该接口显示为 enp0s8

ip link show

现在,我们将为此计算机添加一条新路由,以使用这个新接口。首先,将IP地址与接口关联:

sudo ip addr add 192.168.121.1/24 dev enp0s8

将为新接口添加一条使用现有IP地址的默认路由。可以使用 delete 选项删除路由,同时提供其详细信息:

sudo ip route delete default via 192.168.4.1 dev enp0s8

现在使用 add 选项添加新路由。新接口将处理发往IP地址范围 192.168.121.0/24 的网络流量。设置指标为100;因为这将是处理此流量的唯一路由,所以该指标并不重要。

输入以下命令:

sudo ip route add 192.168.121.0/24 dev enp0s8 metric 100

查看当前路由设置:

ip route

新路由已生效。但仍然有一条指向接口 enp0s8192.168.4.0/24 路由,使用以下命令将其删除:

sudo ip route delete 192.168.4.0/24 dev enp0s8

现在应该有一条新路由,将所有发往IP地址范围 192.168.121.0/24 的流量通过接口 enp0s8 发送。并且这条路由应该是唯一使用我们新接口的路由。

使用以下命令进行验证:

ip route

临时修改,无需永久化

这些命令的一个优点是,它们不会永久生效。要清除这些更改,只需重新启动系统即可。这意味着您可以在测试这些命令,直到它们按照预期工作。如果你把系统搞乱了,也没关系,简单的重启就能恢复正常。

另一方面,如果需要永久生效,则需要进行更多操作。这取决于具体的发行版本,通常涉及修改配置文件。

总之,这种方式允许你在永久化修改之前先进行命令的测试。