Linux 网络命令:ip、ss、ping、traceroute、dig 和 curl 网络诊断指南
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 |
| 域名解析为 IP | dig +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 / -u | TCP / 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 表示证书有问题。
排查步骤:“网络不通”时怎么办
- 接口和地址:
ip -br addr,确认接口为 UP 且有地址。 - 网关:
ip route,确认有default via;然后ping -c 3 <网关>。 - 按 IP 测试外网:
ping -c 3 1.1.1.1。如果能通,说明路由没有问题。 - DNS:
dig +short example.com。如果结果为空或出错,而按 IP 的 ping 正常,问题出在解析器上。 - 端口:
nc -zv host 443或curl -v。在服务器上使用ss -tulpn,确认服务是否在监听以及监听的地址。 - 防火墙:
sudo nft list ruleset、sudo iptables -L -n、sudo ufw status。 - 应用:
curl -I以及服务日志(journalctl -u nginx)。
请从下往上逐层检查,不要跳过步骤。这样几分钟内就能判断问题位于哪一层,而不是盲目地把所有东西都重启一遍。
旧命令与新命令
| 过时命令(net-tools) | 现代替代命令 |
|---|---|
ifconfig | ip addr、ip link |
route -n | ip route |
arp -n | ip neigh |
netstat -tulpn | ss -tulpn |
nslookup | dig |
新版发行版中往往根本不装 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。