为什么要有 ip 命令
很多人的 Linux 网络排障三板斧就是 ifconfig、route、arp,再加上 netstat。这套组合在 20 年前是好用的,但它的维护已经基本停止了。Linux 网络子系统在内核 2.2 之后就引入了 iproute2(新的网络工具集),而 ip 命令就是 iproute2 的核心工具。它用一个命令就能完成 ifconfig + route + arp + netstat 的全部功能,而且输出更清晰、功能更强大、配置更灵活。
我第一次从 ifconfig 切换到 ip 命令其实是被逼的。当时在一台新装的 CentOS 7 上,ifconfig 默认没装,网络排查时只好用 ip 命令。刚开始觉得 "不就是查个 IP 嘛,有必要换工具吗"。结果用了半天之后就回不去了。ip 命令不仅能看到 ifconfig 能看到的,还能做很多 ifconfig 完全做不到的事,完全不是一个量级的东西。
看看你的系统上是否已经安装了 iproute2:
# 确认 ip 命令可用,大部分发行版默认已安装
which ip
# 查看 iproute2 的版本
ip -V
# 如果没有的话可以安装(但极少发生)
# sudo apt install iproute2 # Ubuntu/Debian
# sudo yum install iproute # CentOS/RHEL
如果你的系统里 ifconfig 还在,可以把它放到一边了。不要觉得用习惯了就舍不得换,ip 命令只会让你的网络操作更高效。后面每个月你至少会用到它几十次。
ip addr:查看和配置 IP 地址
这是最常用的子命令,查看 IP 地址信息:
# 查看所有网络接口的 IP 地址配置
ip addr
# 简写形式,效果一样
ip a
# 只看 IPv4 地址
ip -4 addr
# 只看某个接口的信息
ip addr show eth0
# 只看 lo(本地回环)接口
ip addr show lo
ip addr 的输出比 ifconfig 更结构化,每条记录都包含接口名称、MAC 地址、IPv4/IPv6 地址、状态等:
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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:0a:1b:2c brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global noprefixroute dynamic eth0
valid_lft 84843sec preferred_lft 84843sec
inet6 fe80::216:3eff:fe0a:1b2c/64 scope link noprefixroute
valid_lft forever preferred_lft forever
从输出里你能看到:接口状态(UP/DOWN)、MTU(Maximum Transmission Unit,最大传输单元)、MAC 地址、IP 地址和子网掩码(/24 格式)、广播地址等。这些信息和 ifconfig 看到的基本一致,但格式更规整。
添加和删除 IP 地址也很直观:
# 给 eth0 添加一个辅助 IP(多网卡多IP场景)
sudo ip addr add 192.168.1.200/24 dev eth0
# 删除 IP 地址
sudo ip addr del 192.168.1.200/24 dev eth0
# 刷新接口上的所有 IP(相当于重新获取 DHCP 分配的地址)
sudo ip addr flush dev eth0
在生产环境配辅助 IP 时我就用 ip addr add。这个操作比在网卡配置文件里加第二个 IP 要快得多,而且不需要重启网络服务,瞬间生效。
⚠️ 安全提醒:如果你在远程(SSH)修改网络配置,一定要小心。改了 IP 或者禁用了网卡,你的 SSH 连接就会断掉,再也连不上。建议的做法是:要么在控制台操作,要么写一个脚本并设置超时回滚,要么在修改之前先写好恢复命令放旁边,出问题了让别人帮你跑。我曾经在远程改防火墙规则时把自己锁在外面过一次,那感觉绝对不想体验第二次。
ip link:网卡控制
ip link 子命令管理网络接口本身的开关状态:
# 查看所有网卡(包括 down 的)
ip link
# 只看某个接口
ip link show eth0
# 启用一个网卡(类似 ifconfig eth0 up)
sudo ip link set eth0 up
# 禁用一个网卡(类似 ifconfig eth0 down)
sudo ip link set eth0 down
# 修改网卡的 MAC 地址(需要先 down 再 up)
sudo ip link set eth0 down
sudo ip link set eth0 address 00:11:22:33:44:55
sudo ip link set eth0 up
# 设置 MTU(有些网络链路需要调大 MTU)
sudo ip link set eth0 mtu 9000
# 查看网卡的统计数据(收发包、错误、丢弃等)
ip -s link show eth0
ip -s link 会显示每个网卡的统计计数:收发的包数、字节数、错误、丢弃、超时等。这个比 ifconfig 的计数器更详细,能帮你快速判断网卡有没有丢包或者硬件问题。
我遇到过的一个场景是某台服务器的网卡"间歇性"掉线。传统的 ifconfig 看不出什么,但 ip -s link show eth0 显示 errors 一栏的数字在持续增长。这说明物理层有问题,换了网线之后恢复正常。
ip route:路由配置
如果你还在用 route 命令,ip route 可以完全替代它,而且输出更清晰:
# 查看路由表(等价于 route -n)
ip route
# 查看 IPv6 路由表
ip -6 route
# 格式更紧凑的展示
ip route show
# 添加默认路由(设置网关)
sudo ip route add default via 192.168.1.1 dev eth0
# 添加静态路由
sudo ip route add 10.0.0.0/8 via 192.168.1.254 dev eth0
# 删除路由
sudo ip route del 10.0.0.0/8
# 查看某个特定目的地址的路由匹配结果
ip route get 10.0.0.5
ip route get 这个命令非常实用。你可以用它快速查看某个 IP 地址在路由表中的匹配结果,包括从哪个网卡出去、下一跳是谁。排错的时候比 traceroute 更快:
# 排查一个 IP 的路由走向,看走哪个网关
ip route get 203.0.113.5
# 输出类似:203.0.113.5 via 192.168.1.1 dev eth0 src 192.168.1.100
# 非常清晰地显示了路由路径
我在工作中经常遇到一种场景:服务器有多个网卡分别连接内网和外网,路由配置可能发生"路由不对"的问题。用 ip route get 配合 ip route show 能很快定位到是多了一条错误的默认路由还是缺少某条必要的静态路由。
路由表还有个小知识:Linux 支持多路由表(通过 ip rule 配合)。这是策略路由(policy routing)的基础,可以用来实现按源 IP 地址走不同的出口。这个比较深,初学阶段先掌握基本的 ip route get 和 ip route add/del 就够了。
ip neigh:查看 ARP 表
ip neigh(neighbour)替代了 arp 命令:
# 查看 ARP 表(邻居缓存)
ip neigh
# 查看某个接口的邻居
ip neigh show dev eth0
# 手动添加一个静态 ARP 条目(很少用,但某些特殊场景需要)
sudo ip neigh add 192.168.1.50 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
# 删除某个 ARP 条目(如果发现 ARP 冲突)
sudo ip neigh del 192.168.1.50 dev eth0
# 刷新 ARP 缓存(排查通信故障时经常用)
sudo ip neigh flush all
ip neigh 的输出包含三列:IP 地址、MAC 地址、状态。状态有 REACHABLE(可达)、STALE(过期但未验证)、DELAY(延迟检测)、PERMANENT(永久)等。当一台服务器通信异常时,检查 ARP 表状态是一个很好的排查方向。
比如你 ping 不通某台机器,但网络又是通的。用 ip neigh 看目标 IP 的状态如果是 FAILED 或者 INCOMPLETE,说明 ARP 解析失败了。那就不是路由问题,而是二层(链路层)问题,比如交换机端口配置不对或者 VLAN(虚拟局域网)隔离。
ip netns:网络命名空间简介
网络命名空间(network namespace)是 Linux 容器网络的基础。Docker 和 Kubernetes 的容器隔离就是靠它实现的:
# 创建一个网络命名空间
sudo ip netns add test-ns
# 列出所有网络命名空间
sudo ip netns list
# 在命名空间中执行命令,比如查看它自己的网络配置
sudo ip netns exec test-ns ip addr
# 在命名空间中执行任意命令
sudo ip netns exec test-ns ping 8.8.8.8
# 在两个命名空间之间创建 veth pair(虚拟网线),模拟直连
sudo ip link add veth-a type veth peer name veth-b
sudo ip link set veth-a netns test-ns
sudo ip link set veth-b netns other-ns
# 删除命名空间
sudo ip netns delete test-ns
ip netns 让你的 PC 变成了一台"虚拟路由器实验室"。你可以在同一个物理机器上创建多个完全隔离的网络拓扑,用来测试网络配置、搭建实验环境,不需要折腾虚拟机。
就我个人经验,掌握 ip netns 的基本用法对理解容器网络很有帮助。Docker 本质上就是用 ip netns 和 iptables 实现网络隔离的。当你理解了 veth pair(虚拟网线对)的作用,再看 Docker 的 bridge 网络模型就豁然开朗了。
ip 配合 ss 查看 socket
ss(socket statistics)是 iproute2 套件中的另一个重要工具,替代传统的 netstat:
# 查看所有 TCP 连接(类似 netstat -ant)
ss -t
# 查看所有监听状态的端口(类似 netstat -tlnp)
ss -tlnp
# 查看所有 socket 连接包括进程信息
ss -tunap
# 实战:查看哪个进程在占用端口
ss -tlnp | grep 8080
# 查看 socket 统计信息
ss -s
ss 比 netstat 快得多。netstat 读取 /proc 下的多个文件,ss 直接读取内核 socket 信息,对于大量连接的场景(比如有上万个 TCP 连接),ss 的查询速度比 netstat 快一个数量级。
日常排查端口占用的问题,我直接:
# 查看 80 端口是哪个进程在监听
sudo ss -tlnp | grep ':80 '
# 查看特定端口的连接数
ss -t state established | grep :80 | wc -l
所有 netstat 能做的事,ss 都能做,而且更快。建议直接养成用 ss 而不是 netstat 的习惯。
ip 命令常见场景组合
场景一:检查网卡是不是在 UP 状态
# 只查看 UP 状态的接口
ip link show up
# 检查特定接口状态
ip addr show eth0 | grep "state" | awk '{print $9}'
# 如果是 UP 表示正常,如果是 DOWN 说明网卡被禁用了
场景二:排查无法访问外网
# 第一步:看看有没有默认路由
ip route show default
# 第二步:检查网关能不能通
ping -c 1 $(ip route show default | awk '{print $3}')
# 第三步:检查 DNS 有没有问题
cat /etc/resolv.conf
# 第四步:排除本地防火墙
sudo iptables -L -n
场景三:临时更改网络配置测试
# 给 eth0 加一个临时 IP,只保留到下次重启
sudo ip addr add 192.168.1.50/24 dev eth0
# 加一条临时默认路由
sudo ip route add default via 192.168.1.1 dev eth0
# 确认配置
ip a show eth0
ip route
# 测试联通性
ping 192.168.1.1
临时配置适合用来做网络连通性测试。确认新配置能正常工作之后,再写到网卡配置文件里永久化。不应该是先改配置再重启网络,那太慢了。
总结
ip 命令是 Linux 网络的"瑞士军刀"。练好 ip addr、ip link、ip route、ip neigh 这四个子命令,ifconfig、route、arp 就可以彻底退休了。再加上 ss 替换 netstat,你会发现网络相关的操作效率至少提升一倍。建议这几天每天在工作中刻意使用 ip 命令,一周后你就会形成肌肉记忆,再也回不去了。