告别 ifconfig:为什么现代 Linux 系统推荐使用 ip 命令

发布于:2025-04-14 ⋅ 阅读:(18) ⋅ 点赞:(0)

告别 ifconfig:为什么现代 Linux 系统推荐使用 ip 命令

ifconfig 指令已经被视为过时的工具,不再是查看和配置网络接口的推荐方式。 与 netstatss 替代类似。
本文简要介绍 ip addr 命令的使用

简介ip

ifconfig 属于 net-tools 包,这个包在许多现代 Linux 发行版中被标记为废弃。官方推荐的替代命令是 ip,它来自 iproute2 包。

# 没有这个指令的话需要安装一下
sudo apt update
apt install -y iproute2

常见替换对照:

过时命令 现代替代 功能描述
ifconfig ip addr 显示所有网络接口
ifconfig eth0 ip addr show dev eth0 显示特定接口信息
ifconfig eth0 up ip link set eth0 up 启用网络接口
ifconfig eth0 down ip link set eth0 down 禁用网络接口
ifconfig eth0 192.168.1.2 ip addr add 192.168.1.2/24 dev eth0 设置IP地址

为什么应该使用 ip 而非 ifconfig:

  1. 功能更完整 - ip 支持更多现代网络特性,如策略路由、隧道配置等
  2. 语法更一致 - ip 命令有更加一致的语法结构
  3. 持续维护 - iproute2 包持续获得更新和维护
  4. 性能更好 - ip 命令在处理大量网络接口时性能更佳
  5. 发行版支持 - 许多新的Linux发行版默认可能不再预装ifconfig

其他被替代的网络工具:

  • netstatss
  • routeip route
  • arpip neigh

虽然出于向后兼容性考虑,许多系统仍然可以安装并使用 ifconfig,但在编写新的脚本或学习网络管理时,建议直接学习和使用 ip 命令,这样可以让被优化的时间来得更晚一些。

案例分析1:解读 ip addr 输出

让我们通过分析一个我的服务器的 ip addr 输出,来看看我们应该怎么读这个指令的输出。

ip addr

在这里插入图片描述

嚯,眼花缭乱,不要害怕,经过今天我们的学习,后面就清晰了

1. 回环接口详情

在这里插入图片描述

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

这是系统回环接口,用于本地通信。其中包含一些技术细节如队列规则(qdisc noqueue)、接口状态(state UNKNOWN)和地址生命周期信息(valid_lft forever),这些对日常使用而言通常无需关注。所以我们直接跳过。

2. 物理网卡状态

未连接网卡 (eno2)

在这里插入图片描述

2: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether d0:f4:05:1e:8c:bc brd ff:ff:ff:ff:ff:ff
    altname enp1s0

这是未连接的网络接口,可以通过以下特征识别:

  • 标识为 <NO-CARRIER,BROADCAST,MULTICAST,UP>,其中 NO-CARRIER 表示没有物理连接
  • 状态显示为 state DOWN,表示接口未激活
  • 下面没有额外信息,表示没有配置IP地址

注意:eno1eno2表示主板板载网卡,不是"eth number"的缩写,而是"Ethernet On-board"的缩写。

活动网卡 (eno1)

在这里插入图片描述

3: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether d0:f4:05:1e:8c:bb brd ff:ff:ff:ff:ff:ff
    altname enp0s31f6
    inet 192.168.1.202/24 brd 192.168.1.255 scope global noprefixroute eno1
       valid_lft forever preferred_lft forever
    inet6 2408:8207:30b2:e580:1814:a9b1:b54:e480/64 scope global temporary dynamic 
       valid_lft 259175sec preferred_lft 15083sec
    inet6 2408:8207:30b2:e580:dacc:3d78:526f:3fbc/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 259175sec preferred_lft 172775sec
    inet6 fe80::39fe:ddc1:60d4:59d8/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

这是当前活动的网络接口,可以通过以下特征识别:

  • 信息条目较长,包含完整的IP配置
  • 标识为 <BROADCAST,MULTICAST,UP,LOWER_UP>,表示接口已启用且物理连接正常
  • 状态显示为 state UP,表示接口处于活动状态
  • 配置了IP地址 192.168.1.202/24,这就是服务城在局域网中的内网IP

3. Docker网络接口

Docker默认网桥

在这里插入图片描述

4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:e9:cf:64:f0 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:e9ff:fecf:64f0/64 scope link 
       valid_lft forever preferred_lft forever

这是Docker的默认网桥接口:

  • 标识为 <BROADCAST,MULTICAST,UP,LOWER_UP>,表示网桥已启用且有活动连接
  • 配置了IP地址 172.17.0.1/16,作为容器网络的网关
  • 状态 state UP 表明Docker网络正常工作
  • 这是Docker自动创建的虚拟网桥,用于连接所有容器

4. 容器虚拟网络接口

在这里插入图片描述

6: vethce79824@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 72:68:6f:98:4b:3c brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::7068:6fff:fe98:4b3c/64 scope link 
       valid_lft forever preferred_lft forever

这是容器的虚拟网络接口,这个信息反映了我们是有一个docker服务在启用的,如果你有很多docker服务,你可以看到很多这这种veth的虚拟网卡信息:

  • 表示为 vethce79824@if5,是一个虚拟以太网设备
  • master docker0 表明它属于Docker默认网桥
  • link-netnsid 0 指示它连接到特定的网络命名空间
  • 状态为 UP,表示接口处于活动状态
  • 这个接口的存在表明系统上有正在运行的Docker容器

补充说明:

  • 每个运行的容器都会创建一个veth接口,与docker0网桥相连
  • 接口名称中的@if5表示它连接到容器内部的接口5,稍后我们会展开说一下这个接口5
  • 当容器停止时,这个虚拟接口会被自动删除

5. 彩蛋:消失的5号接口去哪儿了

在这里插入图片描述

接口 5 是存在的,但不在主机的网络命名空间中,而是在容器的网络命名空间内
我们可以从前面的信息知道 vethce79824@if5 中引用了这个接口。这里有一个网络概念需要解释:

veth 对(Virtual Ethernet Pair)的工作原理
  1. veth 对(Virtual Ethernet Pair)

    • 当 Docker 创建一个容器时,它会创建一对虚拟网络接口
    • 这对接口就像一个虚拟的"网线",两端分别连接在不同的网络命名空间
    • 一端(这里的 vethce79824)在主机命名空间中,序号为 6
    • 另一端(引用的 if5)在容器命名空间中,序号为 5
  2. 网络命名空间隔离

    • Linux 网络命名空间是网络栈的隔离实例
    • 每个容器都有自己独立的网络命名空间
    • 主机上的 ip addr 命令只能看到主机命名空间中的接口
    • 容器内的接口只能在容器内部看到
  3. 接口命名约定

    • vethce79824@if5 中的 @if5 表示"这个 veth 接口连接到 ID 为 5 的接口"
    • 这个标记让管理员知道这个 veth 接口的"另一头"在哪里
如何查看缺失的接口 5

如果想查看接口 5,需要进入容器的网络命名空间:

# 找到容器 ID
docker ps -a

# 查看容器网络命名空间中的接口
docker exec <容器ID> ip addr

在这里插入图片描述
看吧,找的啦!

注意接口 5(容器内的 eth0)引用了接口 6(主机上的 ethce79824)。这是一个双向引用,表明它们是一对 veth 接口。

ifconfig 其他替代指令对照表

为帮助过渡,这里列出常见 ifconfig 命令及其 ip 命令等效替代:

ifconfig 命令 ip 命令替代 功能
ifconfig ip addr 显示所有接口信息
ifconfig eth0 ip addr show dev eth0 显示特定接口信息
ifconfig eth0 up ip link set eth0 up 启用接口
ifconfig eth0 down ip link set eth0 down 禁用接口
ifconfig eth0 192.168.1.1 ip addr add 192.168.1.1/24 dev eth0 设置IP地址
ifconfig eth0 netmask 255.255.255.0 ip addr add 192.168.1.1/24 dev eth0 设置子网掩码
ifconfig eth0 hw ether AA:BB:CC:DD:EE:FF ip link set dev eth0 address AA:BB:CC:DD:EE:FF 设置MAC地址

结论

在现代 Linux 系统中,ip 命令已成为管理网络接口的首选工具。它不仅提供了更丰富、更精确的网络信息,而且拥有更强大的功能集和更一致的语法结构,能够满足现代网络环境(包括容器化、虚拟化等)的需求。

虽然出于习惯和兼容性考虑,许多系统管理员仍在使用 ifconfig,但为了更好地适应现代 Linux 系统的发展趋势,学习和使用 ip 命令将是一项值得的投资。无论是查看网络状态还是进行网络配置,ip 命令都能提供更全面的解决方案。

所以,是时候告别 ifconfig,拥抱 ip 了!


网站公告

今日签到

点亮在社区的每一天
去签到