ip addr show 是最可靠查看内网IP的起点,需过滤私有地址段(192.168.x.x、10.x.x.x、172.16–31.x.x),避免误读lo或DOWN接口;ifconfig 已弃用且不可靠;外网命令如 curl ifconfig.me 返回公网IP,与内网无关。

ip addr show 能看到所有网卡的内网 IP,但得会过滤
Linux 里没有“直接查内网 IP”的单一命令,ip addr show 是最可靠起点。它列出所有接口的 IPv4/IPv6 地址,包括 192.168.x.x、10.x.x.x、172.16.x.x–172.31.x.x 这三类私有地址。
常见错误是只看 lo(回环)或漏掉没启用的接口。实际用时建议加过滤:
ip -4 addr show | grep -E 'inet.*192\.168\.|inet.*10\.|inet.*172\.1[6-9]\.|inet.*172\.2[0-9]\.|inet.*172\.3[0-1]\.'- 更简洁:用
ip -4 route | grep '^192\.168\|^10\.\|^172\.(1[6-9]|2[0-9]|3[0-1])\.' | head -n1 | awk '{print $9}'(取默认路由所在子网的本机地址) - 注意:
inet6行不能用,IPv6 链路本地地址(fe80::)不是内网通信用的
ifconfig 已被弃用,但很多老脚本还在用
ifconfig 在多数新系统(如 Ubuntu 22.04+、CentOS 8+)里默认不装,属于 net-tools 包,而现代发行版主推 iproute2(ip 命令)。强行装 ifconfig 不仅多一层依赖,还可能显示过时信息(比如不显示某些新驱动的接口)。
- 如果必须用:
ifconfig | grep -A1 'inet addr:' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d':' -f2(不稳定,字段位置易变) -
ifconfig不显示 UP 状态但已配置 IP 的接口(比如 DHCP 暂未获取到地址),ip addr show会如实显示DOWN或NO-CARRIER - 某些容器环境(如 LXC)里
ifconfig根本看不到宿主机网卡,ip可能也受限,得看命名空间上下文
curl ifconfig.me 这类外网服务查不到内网 IP
像 curl ifconfig.me、curl icanhazip.com 返回的是你出口 NAT 后的公网 IP,和局域网内部地址完全无关。这招在排查“别人能不能访问我”时有用,但对“我的机器在局域网里叫什么”毫无帮助。
- 这类请求走的是默认路由 + 外网 DNS,一旦网络不通、DNS 污染或防火墙拦截,就直接失败,不能作为内网定位依据
- 有些公司内网禁用外连 HTTP,运行这些命令会卡住或报
Failed to connect - 真正要确认服务是否能被局域网其他机器访问,应该在另一台机器上
ping或nc -zv <code>你的内网IP端口,而不是查外网接口
systemd-networkd 或 NetworkManager 管理的设备,IP 可能动态变化
如果你用的是桌面版 Ubuntu 或带桌面的 CentOS,大概率是 NetworkManager 在管网络;服务器上可能是 systemd-networkd 或传统 /etc/network/interfaces。它们都可能导致 IP 不是静态写死的,而是由 DHCP 分配或根据策略生成。
- 查当前生效方式:
systemctl list-units | grep -E 'network|NetworkManager' - DHCP 地址可能几分钟后就变,别把
ip addr show结果硬编码进脚本;需要稳定地址就该配静态 IP 或保留 DHCP lease -
ip addr show中标着dynamic的 IPv4 行,说明是 DHCP 获取的,下次重启或租期到期可能不同










