12k
All articles

Linux 网络必备命令

Linux 网络命令指南,涵盖接口、路由、DNS、端口和排障,使用 ip、ss、dig、ping、traceroute、tcpdump。

OpenReplay Team
OpenReplay Team
Linux 网络必备命令

在现代 Linux 系统上,网络排查的核心命令来自 iproute2 套件:ip 用于查看网卡与路由,ss 用于列出套接字和监听端口,ip neigh 用于读取 ARP 缓存。

如果你曾经登录进一个刚创建好的容器,出于纯粹的肌肉记忆敲下 ifconfig,结果换回一句 command not found,原因就在这里。这些肌肉记忆比对应的二进制文件多活了整整十来年。

它们取代了更早的 net-tools 系列工具(ifconfigroutenetstatarp)。Red Hat 已将这些命令列入”不应再使用”的清单,而且在当前的主流发行版中它们往往根本没有预装。本文按你要完成的任务对命令进行分组(查看网卡、路由、连通性、DNS、端口和流量),并在最后给出一套可以从头跟到尾的”症状到命令”排障流程。

要点速览

  • 在现代 Linux 上,ss 取代 netstat,ip addr 取代 ifconfig,ip route 取代 route,ip neigh 取代 arp。这四个命令都来自默认随系统发布的 iproute2 套件。
  • 想知道某个端口被谁占用,执行 ss -tulnp | grep :8080;-p 参数会打印出持有该套接字的进程 PID 和进程名。
  • ssnetstat 更快,因为它通过 netlink 直接向内核查询,而不是解析 /proc/net 下的文本文件。
  • 使用 ping 时务必限定次数(ping -c 5 example.com),这样它会发送五个数据包后退出,而不是一直跑下去。
  • 要区分是 DNS 本身故障还是本地解析器出了问题,可以直接向公共解析器发起查询:dig +short example.com @8.8.8.8

在 Linux 上,是什么取代了 ifconfig、netstat 和 route?

自 2000 年代初起,net-tools 就已被视为过时项目,iproute2 是其处于活跃开发状态的替代品openSUSE 的 net-tools-deprecated 软件包给出了标准的一对一映射关系:

旧命令(net-tools)新命令(iproute2)用途
ifconfigip addrip link网卡与地址
routeip route路由表
netstatss套接字与端口
arpip neighARP/邻居缓存

优先使用 iproute2 形式的命令。在精简容器或全新服务器上,旧版二进制文件可能根本不存在,因此调用 ifconfignetstat 的脚本会直接因 command not found 而中断。

网卡与地址

ip addr(或别名 ip a)会显示每个网卡及其分配的 IPv4/IPv6 地址,是 ifconfig 的现代等价物。用 ip link 启用或禁用某个网卡,用 hostname -I 只打印本机的 IP 地址。

ip addr                       # all interfaces + addresses (alias: ip a)
ip addr show eth0             # one interface only
sudo ip link set eth0 down    # take an interface offline
sudo ip link set eth0 up      # bring it back online
hostname -I                   # print all IP addresses, space-separated

单个二进制文件 ip 就覆盖了地址、网卡、路由和隧道。如果脚本中需要取得一个 IP 地址,hostname -I 是最快的方式,无需解析 ip addr 的输出。

路由

ip route 用于查看和修改内核路由表,取代旧版的 route 命令。不带参数运行即可看到流量的去向以及哪条是默认网关。

ip route                                      # view the routing table
ip route get 1.1.1.1                          # show which route a destination uses
sudo ip route add 10.0.0.0/24 via 192.168.1.1 # add a static route

要回答”这个目标地址会走哪个网卡和网关?“,ip route get 是最快的办法。当一台主机在某个网络中可达、在另一个网络中却不可达时,这个命令尤其有用。

连通性与路径

ping 测试主机是否响应;traceroutemtr 显示数据包的行进路径以及在哪一跳中断。使用 ping 时务必限定次数:ping -c 5 example.com 会发送五个数据包后退出,而不是无限运行。

ping -c 5 example.com     # send 5 ICMP echoes, then stop
traceroute example.com    # trace the hop-by-hop path
sudo traceroute -T -p 443 example.com  # trace using TCP to port 443
mtr example.com           # live ping + traceroute in one view

在默认情况下,traceroute 会在 30 跳后放弃,并将每个探测包的大小设为 IPv4 下 60 字节、IPv6 下 80 字节。加上 -T 会把默认的 UDP 探测包换成 TCP 探测包,从而穿过那些会丢弃默认探测包的防火墙。mtr example.compingtraceroute 合并到一个实时视图中,可以实时观察每一跳的丢包率变化。注意 traceroutemtr 通常不是预装的:在 Debian/Ubuntu 上用 sudo apt install mtr traceroute 安装,在 RHEL/Fedora 上用 sudo dnf install mtr traceroute

DNS 查询

dig 是进行 DNS 查询的首选工具;+short 会把输出精简为答案本身,-x 执行反向查询,@server 则指定某个特定的解析器。nslookuphost 覆盖相同的场景,但输出更为简洁。

dig +short example.com            # just the resolved A record(s)
dig -x 8.8.8.8                    # reverse lookup: IP -> hostname
dig +short example.com @8.8.8.8   # query Google's public resolver directly
host example.com                  # terse forward/reverse lookup
nslookup example.com              # interactive-capable lookup

显式指定解析器是关键的隔离步骤:要区分是 DNS 故障还是本地解析器有问题,执行 dig +short example.com @8.8.8.8;如果这条命令能解析而你的默认解析器不能,问题就出在解析器上,而不是域名本身。

如何在 Linux 上查出是谁占用了某个端口?

要查出哪个进程占用了某个端口,执行 ss -tulnp | grep :8080-p 参数会打印持有该套接字的进程 PID 和进程名。当服务器或容器无法绑定端口、报出 “port already in use” 错误时,这就是解决办法。

ss -tlnp                    # all listening TCP sockets + owning process
ss -tulnp | grep :8080      # what's bound to port 8080 (TCP + UDP)

各参数含义为:t=TCP,u=UDP,l=监听中(listening),n=数字形式(不做名称解析),p=进程。查看不属于自己的套接字的进程名需要 root 权限,因此要加上 sudo 前缀。ssnetstat 的现代替代品,netstat 自己的 man 手册页就称该命令基本已过时,并建议在繁忙服务器需要列出大量套接字时改用基于 netlink 的 ss。速度差异正源于此:ss 通过 netlink 向内核查询,而 netstat 读取 /proc/net 下的文本文件。拿到 PID 之后,用 kill <pid> 结束该进程。

流量与传输

tcpdump 抓取实时数据包,而 curlwgetnc 用于测试可达性和传输文件。当更高层的工具给不出答案时,用 tcpdump 可以看清链路上究竟传输了什么。

sudo tcpdump -i eth0 port 80    # capture HTTP traffic on eth0
curl -v https://example.com     # verbose HTTP request, headers and TLS
wget -O out.html https://example.com  # download to a file
nc -zv example.com 443          # check if a port is open (no data sent)

tcpdump 从网卡上抓包需要提升权限,实际操作中意味着通过 sudo 运行(或者给该二进制文件授予 CAP_NET_RAW 能力)。nc -zv host port 是最快的单行端口检测:-z 表示只扫描不发送数据,-v 输出结果。在 Docker Desktop 上,host.docker.internal 可以自行解析,因此在容器内执行 nc -zv host.docker.internal 8080 就能连到宿主机。而在 Linux 版 Docker Engine 上,你必须自己做映射,即启动容器时加上 --add-host=host.docker.internal:host-gateway(自 Docker Engine 20.10 起支持)。

排障流程:从症状到命令

把症状对应到一条决策路径上,从本机开始向外逐层排查。

  • 主机不可达 → 先用 ping -c 5 host 测试可达性,再用 traceroute hostmtr host 找出数据包在哪里中断,然后用 ip route 确认存在有效的路由和网关。
  • “port already in use” → 用 ss -tulnp | grep :<port> 找到占用端口的 PID,然后 kill <pid> 或改用其他端口绑定。
  • DNS 解析失败 → 先用 dig +short example.com 走你自己的解析器,再用 dig +short example.com @8.8.8.8 走公共解析器;如果只有公共查询能解析,故障就在本地解析器。
  • 链路缓慢或已饱和 → 用 sudo iftopbmon 实时查看每个连接的带宽占用(通过 sudo apt install iftop bmon 安装)。

这些链条中的每条命令都会确认或排除一个层次(链路、路由、名称解析、套接字),从而逐步缩小故障范围,而不是靠猜。

优先使用 iproute2 工具(ipssip neigh),只在仍然自带 net-tools 的系统上才退回旧工具;下一次遇到端口绑定失败或主机失联时,照着上面的”症状到命令”路径走一遍即可。

常见问题

ss 和 netstat 有什么区别,二者可以互换使用吗?

它们不能互换。ss 是现代替代品,而 netstat 自己的 man 手册页就把该命令描述为基本已过时,并转而推荐 ss。ss 通过 netlink 向内核请求套接字数据,而 netstat 读取 /proc/net 下的文本文件,这就是 ss 在套接字数量庞大的服务器上表现更好的原因。两者都能列出连接和监听端口,但脚本中应调用 ss,因为 netstat 可能根本没有安装。

在 Linux 上如何找到并结束占用特定端口的进程?

执行 ss -tulnp | grep :8080 找到绑定在该端口上的套接字;-p 参数会打印持有者的 PID 和进程名。查看不属于自己的套接字的进程名需要 root 权限,因此要加上 sudo 前缀。拿到 PID 后,用 kill 加上该 PID 结束进程。当服务器或容器无法绑定端口时,这就能解决 'port already in use' 错误。

为什么在我的服务器上执行 ifconfig 会返回 command not found?

因为 ifconfig 属于 net-tools 软件包,而许多现代发行版已不再默认安装它。Red Hat 把 ifconfig 和 route 列入被 iproute2 取代的命令清单,RHEL 从版本 7 起就在默认安装中跳过了 net-tools,Debian 自 Debian 9 起也是如此。请改用 ip addr 查看网卡和地址,或者在旧脚本确实需要旧版二进制文件时手动安装 net-tools。

如何判断 DNS 问题出在域名本身还是我的本地解析器?

用 dig +short example.com @8.8.8.8 直接向公共解析器发起查询,再与使用默认解析器的 dig +short example.com 结果对比。如果公共查询能解析而默认解析器不能,故障就在本地解析器,而不是域名。@server 语法会强制 dig 绕过已配置的解析器,从而在不修改任何系统配置的情况下把故障隔离到其中一侧。

为什么我的系统上没有安装 traceroute 或 mtr?

traceroute、mtr、whois、nmap 和 iftop 往往不包含在精简安装或默认安装中,因此会返回 command not found。在 Debian 和 Ubuntu 上用 sudo apt install mtr traceroute 安装,在 RHEL 和 Fedora 上用 sudo dnf install mtr traceroute。与默认随 iproute2 一同发布的 ip 和 ss 不同,这些路径追踪和扫描工具通常必须通过包管理器额外安装。

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — self-hosted, with full data ownership.

Star on GitHub

We use cookies to improve your experience. By using our site, you accept cookies.