ip addr show比ifconfig更可靠,因其通过Netlink直接读取内核网络状态,能识别veth等新式接口、不遗漏DHCP分配的secondary IP;而ifconfig依赖过时ioctl,常漏显或误显地址,且无scope字段无法区分global/link/host范围。

直接看 ip -br addr show,它显示的非 lo 接口上 scope global 的 IPv4 地址,就是你当前能被局域网其他设备访问到的“真实内网IP”。公网IP不在本机网卡配置里,得靠外部服务查。
为什么 ip addr show 比 ifconfig 更可靠
现代 Linux 内核通过 Netlink 直接暴露网络状态,ip 命令正是读取这个接口;而 ifconfig 依赖过时的 ioctl 调用,无法识别新式虚拟接口(如 veth、macvlan)、可能漏掉 DHCP 动态分配的 secondary IP,且在容器或云主机中常显示空或错误地址。
-
ifconfig在 Ubuntu 22.04+、CentOS 8+ 默认不预装,执行会报command not found -
ip addr show输出中的scope global明确标识该地址可被路由,scope link(如 fe80::/64)和scope host(如 127.0.0.1)不是“真实对外IP” - 若看到多个
inet行(比如 Docker 启动后多了docker0),只认非lo且非虚拟桥接口的那条 —— 通常是ens33、eth0或enp0s3
hostname -I 适合脚本但有隐藏限制
它快、轻量、不依赖额外包,输出是空格分隔的 IPv4 列表,但有两个关键前提:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 只返回 scope global 的 IPv4 地址,自动过滤掉 loopback 和 link-local,这点比肉眼 grep
inet更干净 - 如果系统启用了 IPv6 并且 DNS 解析优先走 IPv6,
hostname -I仍只出 IPv4 —— 这是优点也是缺点:你永远看不到它是否绑定了 IPv6 地址 - 某些精简版容器镜像(如 Alpine + musl)里
hostname不带-I选项,会静默忽略参数或报错
别把 ifconfig 的 inet 当成唯一答案
很多人复制粘贴 ifconfig | grep "inet ",结果拿到的是 127.0.0.1 或 172.17.0.1(Docker 网桥),误以为是本机地址。真正要确认“本机对外通信用哪个IP”,得结合路由判断:
- 运行
ip route | grep default,看默认网关从哪个接口出去,比如default via 192.168.1.1 dev ens33→ 那就重点查ens33的inet -
ifconfig输出里没有 scope 字段,无法区分192.168.1.100是 global 还是 deprecated,容易在多地址场景下选错 - 云服务器(如阿里云 ECS)的内网IP虽写在网卡上,但实际通信走的是 metadata 路由,
ifconfig显示的可能是辅助地址,ip -br addr show才反映 kernel 当前激活的真实绑定
最易被忽略的一点:所有本地命令查到的都是“内网IP”或“私有IP”。如果你要确认服务对外暴露的地址,必须用 curl ifconfig.me 这类方式——因为 NAT、SLB、安全组策略会让本机配置和实际可达地址完全脱节。

















