速查表

Linux 网络命令:ip、ss、ping、traceroute、dig 和 curl 网络诊断指南

更新于: · Skillaria.Top

Linux 常用网络命令包括:ip(地址、接口和路由)、ss(监听端口和连接)、ping 与 traceroute(主机是否可达及经过的路径)、dig(DNS 检查)和 curl(访问 HTTP 服务)。排查时按层进行:接口与地址、路由、DNS、端口可达性、应用响应。

Linux 网络命令几乎覆盖了日常的全部诊断工作:ip 显示地址和路由,ss 显示开放的端口和连接,ping 与 traceroute 检查主机是否可达,dig 查询 DNS,curl 检查 Web 服务的响应。下面是一份带选项的速查表,以及在“网络不通”时按顺序查找原因的步骤。

速查表:Linux 网络命令一览

任务命令
所有接口的 IP 地址ip -br addr
接口状态(UP/DOWN)ip -br link
路由表ip route
数据包到某地址会经过哪个网关ip route get 8.8.8.8
邻居表(ARP 表)ip neigh
监听中的端口及进程sudo ss -tulpn
已建立的 TCP 连接ss -tn state established
检查主机是否可达ping -c 4 example.com
数据包到主机的路径traceroute example.com、mtr example.com
域名解析为 IPdig +short example.com
查询指定的 DNS 服务器dig @1.1.1.1 example.com
检查 HTTP 响应curl -I https://example.com
连接和 TLS 的详细信息curl -v https://example.com
TCP 端口是否开放nc -zv host 443
主机名hostnamectl、hostname -I

ip:地址、接口和路由

ip 命令来自 iproute2 软件包,它取代了过时的 ifconfig 和 route。子命令可以缩写:ip a 等同于 ip addr,ip r 等同于 ip route。参数 -br 输出简洁格式,-c 则为输出添加颜色。

$ ip -br addr
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0             UP             192.168.1.25/24 fe80::a00:27ff:fe4e:66a1/64
docker0          DOWN           172.17.0.1/16

如果接口没有所需网段的地址,或者处于 DOWN 状态,就不必再往下查了,问题出在这一层。

如何添加 IP 地址并启用接口

sudo ip link set eth0 up
sudo ip addr add 192.168.1.50/24 dev eth0
sudo ip addr del 192.168.1.50/24 dev eth0

通过 ip 所做的更改只在重启前有效。永久配置要写入系统配置中:Ubuntu 使用 netplan,Fedora 和 RHEL 使用 NetworkManager(nmcli),服务器上常用 systemd-networkd。

路由与默认网关

$ ip route
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.25

$ ip route get 10.20.0.5
10.20.0.5 via 192.168.1.1 dev eth0 src 192.168.1.25 uid 1000

default via 这一行就是网关,所有没有匹配到更精确路由的流量都会发往这里。如果没有这一行,即使局域网正常,也无法访问互联网。添加路由的命令是:sudo ip route add 10.20.0.0/16 via 192.168.1.254。

ss:哪些端口开放,由谁监听

ss 取代了 netstat,速度更快。最常用的组合是 ss -tulpn:

参数含义
-t / -uTCP / UDP
-l仅显示监听中的套接字
-p显示进程(查看其他用户的进程需要 sudo)
-n不将端口和地址解析为名称
-a所有套接字,包括已建立的连接
-s汇总统计信息
$ sudo ss -tulpn
Netid State  Recv-Q Send-Q Local Address:Port  Peer Address:Port Process
tcp   LISTEN 0      511          0.0.0.0:80         0.0.0.0:*     users:(("nginx",pid=812,fd=6))
tcp   LISTEN 0      128          0.0.0.0:22         0.0.0.0:*     users:(("sshd",pid=640,fd=3))
tcp   LISTEN 0      151        127.0.0.1:3306       0.0.0.0:*     users:(("mysqld",pid=901,fd=21))

注意地址列:0.0.0.0 表示服务接受来自所有接口的连接,127.0.0.1 表示仅限本机访问。这往往是数据库从其他机器“无法连接”的常见原因。

如何查出是谁占用了端口

sudo ss -ltnp 'sport = :8080'
sudo ss -tn dst 10.0.0.7          # 与某个具体地址之间的连接
ss -tan state time-wait | wc -l   # 处于 TIME-WAIT 状态的套接字数量

ping:主机是否可达

ping 发送 ICMP echo 请求,显示响应时间和丢包情况。在 Linux 上它会一直运行下去,因此请用 -c 参数指定数据包数量。

$ ping -c 4 8.8.8.8
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=12.4 ms
...
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 12.1/12.5/13.0/0.3 ms

常用参数:-i 0.2 设置间隔,-W 2 设置响应超时,-4/-6 指定协议版本,-s 1472 -M do 在不分片的情况下检测 MTU。请记住,许多服务器和云平台会屏蔽 ICMP:没有 ping 响应并不代表主机不可用。

traceroute 和 mtr:数据包在哪里丢失

traceroute 显示到目标的每一跳。个别跳上出现星号是正常的,可能是中间路由器不响应。令人警惕的情况是某一跳之后所有的响应都是星号。

traceroute -n example.com        # 不解析 DNS 名称,速度更快
sudo traceroute -T -p 443 example.com   # 使用 TCP 代替 UDP,可以穿过防火墙
tracepath example.com            # 无需 root,同时显示 MTU

mtr 将 ping 和 traceroute 合二为一,实时更新每一跳的丢包统计。生成报告:mtr -rwc 50 example.com。

dig:检查 DNS

dig 来自 dnsutils 软件包(RHEL 中为 bind-utils),是检查 DNS 的主要工具。短格式只返回结果:

$ dig +short example.com
93.184.215.14

$ dig example.com MX +short
$ dig @8.8.8.8 example.com A       # 查询指定的服务器
$ dig -x 8.8.8.8 +short            # 反向解析(PTR)
$ dig +trace example.com           # 从根服务器开始逐级查询

在完整输出中关注 status 字段:NOERROR 表示找到了记录,NXDOMAIN 表示域名不存在,SERVFAIL 表示服务器无法应答(常见原因是 DNSSEC 问题或权威服务器不可达)。如果 dig @8.8.8.8 能得到结果,而普通的 dig 不能,问题出在本地解析器上:请检查 /etc/resolv.conf 和 resolvectl status。

注意,dig 不读取 /etc/hosts。要像应用程序那样检查名称解析,请使用 getent hosts example.com。

curl:检查 HTTP 和 API

curl 回答最后一个问题:服务是否响应,以及它返回了什么内容。

命令作用
curl -I URL仅获取响应头(HEAD 请求)
curl -v URL详细输出:DNS、连接、TLS、响应头
curl -L URL跟随重定向
curl -o file URL保存到文件
curl -X POST -H 'Content-Type: application/json' -d '{"a":1}' URL发送 JSON
curl -k URL不校验证书(仅用于调试)
curl --resolve site.ru:443:10.0.0.5 https://site.ru绕过 DNS,直接访问指定服务器
curl -s -o /dev/null -w '%{http_code} %{time_total}\n' URL响应代码和耗时
$ curl -s -o /dev/null -w '%{http_code} %{time_connect} %{time_total}\n' https://example.com
200 0.041 0.187

curl 的错误信息能很好地指示问题所在的层:Could not resolve host 说明是 DNS 问题,Connection refused 表示端口关闭或没有进程在监听,Connection timed out 表示防火墙丢弃了数据包或没有路由,SSL certificate problem 表示证书有问题。

排查步骤:“网络不通”时怎么办

  1. 接口和地址:ip -br addr,确认接口为 UP 且有地址。
  2. 网关:ip route,确认有 default via;然后 ping -c 3 <网关>。
  3. 按 IP 测试外网:ping -c 3 1.1.1.1。如果能通,说明路由没有问题。
  4. DNS:dig +short example.com。如果结果为空或出错,而按 IP 的 ping 正常,问题出在解析器上。
  5. 端口:nc -zv host 443 或 curl -v。在服务器上使用 ss -tulpn,确认服务是否在监听以及监听的地址。
  6. 防火墙:sudo nft list ruleset、sudo iptables -L -n、sudo ufw status。
  7. 应用:curl -I 以及服务日志(journalctl -u nginx)。

请从下往上逐层检查,不要跳过步骤。这样几分钟内就能判断问题位于哪一层,而不是盲目地把所有东西都重启一遍。

旧命令与新命令

过时命令(net-tools)现代替代命令
ifconfigip addr、ip link
route -nip route
arp -nip neigh
netstat -tulpnss -tulpn
nslookupdig

新版发行版中往往根本不装 net-tools,因此请尽早习惯使用新命令。

总结

日常诊断只需要六个 Linux 网络命令:ip、ss、ping、traceroute、dig 和 curl。按层排查——地址、路由、DNS、端口、应用——就能快速定位故障。Linux 课程中会结合实践讲解网络命令以及常见故障的分析方法。

常见问题

为什么系统中没有 ifconfig 命令?

它属于过时的 net-tools 软件包,现代发行版默认不安装该包。请使用 ip addr,或手动安装 net-tools。

如何在终端中查看自己的公网 IP 地址?

执行 curl ifconfig.me 或 curl -4 icanhazip.com:外部服务会返回你访问互联网时使用的地址。ip addr 只显示接口地址,通常是内网地址。

ping 和检查端口有什么区别?

ping 通过 ICMP 检查主机是否可达,但不能说明某项具体服务是否正常。要检查服务器是否接受某个端口的连接,请使用 nc -zv 主机 端口 或 curl。

如何查看网络接口的速度和负载?

ip -s link 显示字节数和错误计数;实时负载可以用 iftop、nload 或 bmon 查看。两台机器之间的带宽则用 iperf3 测量。

如何临时更改 DNS 服务器?

在使用 systemd-resolved 的系统中,执行 sudo resolvectl dns eth0 1.1.1.1。若只是临时检查,直接在查询中指定服务器更简单:dig @1.1.1.1 example.com。

通过视频学习本主题

课程“Linux: с нуля до уверенного администрирования”结合实践详细讲解了这一主题。

前往课程