Linux ifconfig 与 ip addr 对比

1次阅读

ip addr 是当前唯一应使用的网络配置命令,因 ifconfig 已被主流发行版事实性弃用,且功能受限、不支持 ipv6/arp/vlan 等现代特性,而 ip 命令功能完整、输出规范、兼容性强、适合自动化

Linux ifconfig 与 ip addr 对比

ip addr 是当前唯一该用的命令

ifconfig 已不是“过时”,而是事实性弃用:ubuntu 22.04+、centos 8+、Fedora 默认不装 net-tools,你运行 ifconfig 很可能直接报 command not found。这不是配置问题,是发行版主动移除。而 ip 属于 iproute2,所有现代 linux 内核默认集成,持续更新,脚本里用它不会在新环境突然失效。

常见错误现象:ifconfig 看不到 IPv6 地址、查不到 ARP 表、改不了多 IP、配不了 VLAN —— 它压根不支持这些,不是你命令写错,是它能力边界就到这儿了。

  • ip addr 原生显示 inet6 地址,并标注 scope linkscope global,区分用途
  • ifconfigHWaddr 字段在 ip addr 中统一为 link/ether,更准确(MAC 不只用于以太网)
  • 想查 ARP 缓存?ip neigh;查路由?ip route show;查策略路由?ip rule —— ifconfig 连边都摸不到

看 IP 地址时,别被 ifconfig 的“已启用”误导

ifconfig 默认只显示“已启用(UP)”的接口ifconfig -a 才列全;而 ip addr 默认列出所有接口及其所有地址(包括临时地址、deprecated 地址),且每条地址带生命周期标记:valid_lft foreverpreferred_lft 3599sec —— 这对排查 DHCP 续租失败、IPv6 隐私扩展失效特别关键。

使用场景:容器或云主机常有多个临时 IP 或 secondary IP,ifconfig 只显示第一个主 IP,容易漏掉实际通信用的地址。

  • ip addr show eth0 显示该接口全部 IPv4/IPv6 地址,含 label(如 eth0:web)和 scope
  • ifconfig eth0 可能只显示一条 inet addr,哪怕你用 ip addr add 加了三个 IP
  • 要过滤出主 IPv4 地址?用 ip -4 addr show eth0 | grep -oP 'inet K[d.]+',比正则匹配 ifconfig 输出稳定得多

配 IP 时,CIDR 和多地址是分水岭

ifconfig eth0 192.168.1.50 netmask 255.255.255.0 是过去式;ip addr add 192.168.1.50/24 dev eth0 才是现在时。区别不只是写法:前者只能设一个主 IP,后者可叠加任意数量同网段/跨网段地址,且支持精确删除、label 标记、lifetime 控制。

容易踩的坑:用 ifconfig 配完 IP,再用 ip addr 查,会发现多出一条 “secondary” 标记的地址——因为 ifconfig 底层调用的是 ip addr add 的兼容路径,但自己不暴露这个事实。

  • 加第二个 IP:ip addr add 192.168.1.51/24 dev eth0 label eth0:backup
  • 删指定地址:ip addr del 192.168.1.50/24 dev eth0ifconfig 没对应操作)
  • 设临时地址(重启消失):ip addr add 10.0.0.1/24 dev eth0 preferred_lft 0

自动化脚本里还用 ifconfig,等于埋定时炸弹

很多旧脚本用 ifconfig eth0 | grep "inet addr" | awk '{print $2}' | cut -d: -f2 提取 IP,看似能跑,但一遇到 IPv6、docker 的 veth 接口、systemd-networkd 的 predictible Interface name(如 ens33 而非 eth0),就解析失败。而 ip 输出结构稳定、字段明确、支持 jsonip -j addr),适合机器读取。

性能影响不大,但兼容性风险极高:某次系统升级后,ifconfig 被彻底卸载,脚本卡在 command not found,而运维还在翻老文档找安装命令。

  • 提取主 IPv4 地址(推荐):ip -4 addr show scope global | grep -oP 'inet K[d.]+' | head -n1
  • 提取所有 IPv4 地址(含 secondary):ip -4 addr | grep -oP 'inet K[d.]+' | sort -u
  • CI/CD 流水线中,一律用 ip,别给未来自己留 debug 夜晚

最易被忽略的一点:有些设备(比如 OpenWrt 或某些嵌入式 Linux)仍默认只装 net-tools,没装 iproute2。这不是“应该用哪个”,而是“你得先确认有没有”。查一下 which ipwhich ifconfig,比背命令更重要。

text=ZqhQzanResources