告别 ifconfig:为什么现代 Linux 系统推荐使用 ip 命令
ifconfig
指令已经被视为过时的工具,不再是查看和配置网络接口的推荐方式。 与 netstat
被 ss
替代类似。
本文简要介绍 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:
- 功能更完整 -
ip
支持更多现代网络特性,如策略路由、隧道配置等 - 语法更一致 -
ip
命令有更加一致的语法结构 - 持续维护 -
iproute2
包持续获得更新和维护 - 性能更好 -
ip
命令在处理大量网络接口时性能更佳 - 发行版支持 - 许多新的Linux发行版默认可能不再预装
ifconfig
其他被替代的网络工具:
netstat
→ss
route
→ip route
arp
→ip 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地址
注意:eno1
和eno2
表示主板板载网卡,不是"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)的工作原理
-
veth 对(Virtual Ethernet Pair):
- 当 Docker 创建一个容器时,它会创建一对虚拟网络接口
- 这对接口就像一个虚拟的"网线",两端分别连接在不同的网络命名空间
- 一端(这里的
vethce79824
)在主机命名空间中,序号为 6 - 另一端(引用的
if5
)在容器命名空间中,序号为 5
-
网络命名空间隔离:
- Linux 网络命名空间是网络栈的隔离实例
- 每个容器都有自己独立的网络命名空间
- 主机上的
ip addr
命令只能看到主机命名空间中的接口 - 容器内的接口只能在容器内部看到
-
接口命名约定:
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
了!