网络排查工具速查手册
工作中常用的网络问题排查工具和方法总结。
1. telnet — 测试端口连通性
作用: 最基础的 TCP 端口可达性测试工具。通过发起 TCP 连接来验证目标主机的指定端口是否开放并可访问。也常用于测试简单应用层协议(如 SMTP、HTTP)。
常用用法:
# 测试目标主机端口是否开放
telnet <host> <port>
# 测试 HTTP 服务(连接后手动输入请求)
telnet example.com 80
GET / HTTP/1.1
Host: example.com
# 测试 SMTP 服务
telnet mail.example.com 25
示例:
# 测试百度 443 端口是否可达
$ telnet baidu.com 443
Trying 110.242.68.66...
Connected to baidu.com.
Escape character is '^]'.
^]
telnet> quit
# 端口不通时(如 8080 未开放)
$ telnet baidu.com 8080
Trying 110.242.68.66...
telnet: connect to address 110.242.68.66: Connection refused
注意: Windows 系统默认未安装 telnet 客户端,需在”启用或关闭 Windows 功能”中勾选”Telnet 客户端”,或通过 pkgmgr /iu:"TelnetClient" 安装。Linux/macOS 通常预装。
2. netstat — 查看网络连接与端口监听
作用: 显示网络连接(TCP/UDP)、路由表、网络接口统计等信息。用于排查端口监听状态、连接数量异常、以及进程与端口的关联关系。
常用用法:
# 列出所有监听中的端口
netstat -lntp # Linux
netstat -an | findstr LISTEN # Windows
# 查看所有连接(含进程信息)
netstat -anp # Linux
netstat -ano # Windows
示例:
# 查看哪些端口在监听
$ netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5678/nginx
tcp6 0 0 :::443 :::* LISTEN 9012/httpd
# 查看当前有哪些 IP 正在连接你的服务器
$ netstat -ant | grep ESTABLISHED
tcp 0 0 10.0.0.5:22 192.168.1.100:54321 ESTABLISHED
tcp 0 0 10.0.0.5:80 203.0.113.10:45678 ESTABLISHED
tcp 0 0 10.0.0.5:80 203.0.113.11:45679 ESTABLISHED
tcp 0 0 10.0.0.5:443 198.51.100.20:33456 ESTABLISHED
# 统计每个 IP 的连接数(排查异常连接)
$ netstat -ant | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
47 203.0.113.10 # ← 这个 IP 连接数异常高,可能是在攻击或爬虫
12 198.51.100.20
3 192.168.1.100
1 192.168.1.101
# 统计连接状态分布
$ netstat -ant | awk 'NR>2 {print $6}' | sort | uniq -c | sort -nr
238 ESTABLISHED
34 TIME_WAIT
12 LISTEN
3 SYN_RECV # SYN_RECV 过多可能是在 SYN Flood 攻击
# Windows 上查看当前连接
> netstat -ano | findstr ESTABLISHED
TCP 10.0.0.5:80 203.0.113.10:45678 ESTABLISHED 12345
TCP 10.0.0.5:443 198.51.100.20:33456 ESTABLISHED 56789
# 查看 ESTABLISHED 状态连接数量
$ netstat -ant | grep ESTABLISHED | wc -l
238
# Windows 上找出占用 8080 端口的进程
> netstat -ano | findstr :8080
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 12345
> tasklist | findstr 12345
java.exe 12345 Console ...
注意: ss 是 netstat 的现代替代品,在 Linux 上建议优先使用 ss(见下一节)。Windows 和 macOS 的 netstat 参数略有差异。
3. ss — 更快的 socket 统计工具
作用: netstat 的现代替代品,直接从内核 netlink 读取 socket 信息,性能远优于 netstat(尤其在连接数庞大时)。显示 TCP、UDP、UNIX socket 的详细信息。
常用用法:
# 列出所有监听中的 TCP 端口
ss -tln
# 列出所有建立的 TCP 连接(含进程信息)
ss -tunp
# 按状态过滤
ss -t state established
ss -t state time-wait
ss -t state closed
# 按目标地址/端口过滤
ss -t dst 10.0.0.1
ss -t dport = :80
# 显示 socket 使用摘要
ss -s
示例:
# 查看当前有哪些 IP 在连接你的服务器(重点关注 Peer Address 列)
$ ss -tunp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 10.0.0.5:80 203.0.113.10:45678 users:(("nginx",pid=5678))
ESTAB 0 0 10.0.0.5:80 203.0.113.11:45679 users:(("nginx",pid=5678))
ESTAB 0 0 10.0.0.5:22 192.168.1.100:54321 users:(("sshd",pid=1234))
ESTAB 0 0 10.0.0.5:443 198.51.100.20:33456 users:(("httpd",pid=9012))
TIME-WAIT 0 0 10.0.0.5:443 198.51.100.22:33457
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234))
# 统计每个 IP 的连接数(从多到少排序,找出异常 IP)
$ ss -tun | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
47 203.0.113.10 # ← 这个 IP 有 47 个连接,判断是否正常
12 198.51.100.20
3 192.168.1.100
# 只看连接到 80 端口的 IP
$ ss -tun state established dport = :80
ESTAB 0 0 10.0.0.5:80 203.0.113.10:45678
ESTAB 0 0 10.0.0.5:80 203.0.113.11:45679
# 查看连接状态分布(判断是否被攻击)
$ ss -s
Total: 452 (kernel 468)
TCP: 284 (established 238, closed 12, orphaned 0, synrecv 0, timewait 34, ...)
# SYN_RECV 异常多 → 可能被 SYN Flood 攻击
# TIME_WAIT 异常多 → 连接频繁创建/关闭,需优化长连接
# 查看当前所有 TCP 连接和监听端口
$ ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234))
LISTEN 0 511 *:80 *:* users:(("nginx",pid=5678))
# 查看所有 TIME_WAIT 状态的连接
$ ss -t state time-wait
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 10.0.0.5:54326 192.168.1.1:80
对比 netstat vs ss:
| 场景 | netstat | ss |
|---|---|---|
| 大量连接(>10000) | 慢,可能卡死 | 快,毫秒级返回 |
| UNIX socket | 支持 | 更详细的显示 |
| 按状态/地址过滤 | 需 grep | 原生支持 |
注意: Linux 系统推荐优先使用 ss;macOS 需通过 brew install iproute2mac 安装。
4. ssh — SSH 连接问题排查
作用: SSH 不仅是远程登录工具,更是排查网络连通性、认证问题和代理隧道的利器。以下侧重排查场景,涵盖从网络层到认证层的调试方法。
调试级别: -v(基础)→ -vv(详细)→ -vvv(最详细,含密钥交换和认证细节)
常用排查用法:
# 基本连通性测试(-T 不分配伪终端,纯测试连接,不进入 shell)
ssh -T -vvv user@host
# 成功输出:debug1: Authentication succeeded ...
# 失败输出:具体在哪一步卡住
# 测试端口是否开放(非 ssh 协议也能判断网络层通不通)
ssh -T -vvv user@host -p 22
# 指定密钥文件测试
ssh -T -vvv -i ~/.ssh/id_rsa user@host
# 只跑认证,不执行任何命令(验证密码/密钥是否正确)
ssh -T -o PasswordAuthentication=no user@host
# 禁用密码登录,如果密钥认证失败直接退出,不等超时
配合排查的工具:
# 看 sshd 日志(排查服务端问题)
tail -f /var/log/auth.log # Debian/Ubuntu
tail -f /var/log/secure # CentOS/RHEL
# 检查 sshd 是否在监听
ss -tlnp | grep :22
# 测试端口(telnet 只测网络层,不涉及 SSH 协议)
telnet 10.0.0.5 22
# 如果 telnet 通但 ssh 不通 → 问题在 SSH 协议或认证层
# 如果 telnet 不通 → 网络层问题
~/.ssh/config 常用排查配置(写入后每次自动生效):
Host *
ServerAliveInterval 60 # 每 60s 发心跳保活
ServerAliveCountMax 3 # 连续 3 次心跳无响应则断开
StrictHostKeyChecking ask # 首次连接提示确认
UserKnownHostsFile ~/.ssh/known_hosts
# 以下优化连接速度
UseDNS no
GSSAPIAuthentication no
ConnectTimeout 10 # 连接超时 10 秒
5. tcpdump — 抓包分析网络流量
作用: 命令行网络抓包工具,截取网络接口上的数据包并分析。是排查网络层和应用层问题的核心工具,支持 BPF(Berkeley Packet Filter)表达式进行精确过滤。
常用用法:
# 抓取指定接口的所有流量
tcpdump -i eth0
# 抓取指定端口的流量
tcpdump -i eth0 port 80
# 抓取主机之间的流量
tcpdump -i eth0 host 10.0.0.1
tcpdump -i eth0 src host 10.0.0.1 # 指定源
tcpdump -i eth0 dst host 10.0.0.1 # 指定目标
# 保存抓包文件供后续分析
tcpdump -i eth0 -w capture.pcap
# 读取抓包文件
tcpdump -r capture.pcap
# 显示包内容(hex + ASCII)
tcpdump -i eth0 -nn -X # -X 同时显示 hex 和 ASCII
# 按协议过滤
tcpdump -i eth0 icmp # 只抓 ICMP(ping)
tcpdump -i eth0 arp # 只抓 ARP
常用参数说明:
| 参数 | 含义 | 示例效果 |
|---|---|---|
-nn |
-n 两次连写:不解析主机名 + 不解析端口名 |
10.0.0.1.443(而非 server.example.com.https) |
-i eth0 |
指定抓包接口 | 用 tcpdump -D 列出所有可用接口 |
-w file.pcap |
写入文件(供 Wireshark 打开) | 二进制格式,人类不可读 |
-r file.pcap |
从文件读取并解析 | 配合过滤条件可二次过滤 |
-s 0 |
抓取完整包(默认截断到 262144 字节) | 不丢 payload |
-X |
以 hex + ASCII 显示包内容 | 看 HTTP 请求体、TLS 握手 |
-c N |
抓 N 个包后自动退出 | 避免一直跑按 Ctrl+C |
示例:
# 抓取访问 10.0.0.1 的 HTTP 流量
$ tcpdump -i eth0 -nn host 10.0.0.1 and port 80
# 抓取来源 IP 10.1.1.1 访问本机 443 端口的 HTTPS 流量
$ tcpdump -i eth0 -nn src host 10.1.1.1 and dst port 443
# 抓取 DNS 查询和响应
$ tcpdump -i eth0 -nn port 53
# 抓取 ping(ICMP Echo)包
$ tcpdump -i eth0 -nn icmp
# 抓取并保存为 Wireshark 可读的文件
$ tcpdump -i eth0 -nn -s 0 -w debug.pcap host 10.0.0.1
# 然后用 Wireshark 打开 debug.pcap 可视化分析
6. ip — Linux 网络配置管理(iproute2)
作用: iproute2 工具集的主命令,取代了已废弃的 ifconfig、route、arp 等传统工具。用于查看和管理网络接口、IP 地址、路由表、ARP 缓存等。
常用用法:
# 查看网络接口信息
ip addr # 等价于 ifconfig -a
ip link show # 只看接口状态(不显示 IP)
# 查看路由表
ip route
ip route show default # 查看默认路由
# 添加/删除 IP 地址
ip addr add 10.0.0.5/24 dev eth0
ip addr del 10.0.0.5/24 dev eth0
# 启用/禁用接口
ip link set eth0 up
ip link set eth0 down
# 查看 ARP 表(邻居表)
ip neigh
# 查看统计信息
ip -s link show eth0 # 接口流量统计(丢包、错误等)
示例:
# 排查路由问题:检查默认网关
$ ip route show default
default via 10.0.0.1 dev eth0 proto dhcp src 10.0.0.5 metric 100
# 排查丢包:查看接口错误统计
$ ip -s link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP ...
RX: bytes packets errors dropped overrun mcast
12345678 12345 0 12 0 0
TX: bytes packets errors dropped carrier collsns
9876543 9876 0 3 0 0
# TX dropped > 0 可能表示发送队列满,需检查 txqueuelen
# 查看所有已知邻居(ARP 表)
$ ip neigh
10.0.0.1 dev eth0 lladdr 00:50:56:12:34:56 REACHABLE
10.0.0.2 dev eth0 lladdr 00:50:56:78:90:12 STALE
7. mtr — 持续追踪路由与丢包检测
作用: 融合 traceroute 和 ping 的功能,持续追踪数据包到达目标所经过的路由节点,并实时统计每一跳的丢包率和延迟。是定位”网络慢在哪一跳”的最佳工具。
常用用法:
# 基本使用,持续追踪目标
mtr example.com
# 只跑 10 次探测后自动退出
mtr -r -c 10 example.com
# 不解析主机名(提高速度)
mtr -n example.com
# 指定端口(配合 -T)
mtr -T -P 443 example.com
# 报告模式,输出单次结果
mtr -r -c 5 -n example.com > report.txt
8. iptables — Linux 防火墙规则管理
作用: Linux 内核 netfilter 框架的用户态管理工具,用于配置 IPv4 包过滤规则、NAT 转换、端口转发等。排查网络连通性问题时,经常需要检查 iptables 规则是否拦截了流量。
常用用法:
# 查看当前所有规则(详细)
iptables -nvL
# 查看特定表的规则
iptables -t nat -L -n -v # NAT 表
iptables -t mangle -L -n -v # Mangle 表
# 查看规则链的默认策略
iptables -L | grep policy
# 临时开放端口
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
# 保存规则(不同发行版命令不同)
iptables-save > /etc/iptables/rules.v4 # Debian/Ubuntu
service iptables save # CentOS 6
9. lsof — 查看进程打开的文件和网络连接
作用: 列出当前系统上被进程打开的文件(Linux 中一切皆文件)。常用来查找”哪个进程占用了端口”、”谁在使用某个文件”等。
常用用法:
# 查看哪个进程监听了指定端口
lsof -i :80
# 查看所有网络连接
lsof -i
# 查看特定协议/状态的连接
lsof -i TCP
lsof -i UDP
示例:
# 端口被占用:找出占用 8080 端口的进程
$ lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 12345 root 78u IPv6 123456 0t0 TCP *:8080 (LISTEN)
# PID 12345 的 java 进程占用了 8080
# 查看所有已建立的 TCP 连接
$ lsof -i TCP -s TCP:ESTABLISHED
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chrome 23456 user 45u IPv4 234567 0t0 TCP 192.168.1.5:54321->93.184.216.34:443 (ESTABLISHED)
# 排查文件删除后磁盘空间未释放
$ rm bigfile.log
$ df -h # 磁盘空间没变!文件可能被进程持续占用
$ lsof | grep deleted
java 12345 root 5w REG 8,1 1073741824 123456 /var/log/bigfile.log (deleted)
# 重启 java 进程或 `> /proc/12345/fd/5` 可释放空间
# 查看某个 IP 相关的连接
$ lsof -i @10.0.0.1
10. nslookup — DNS 查询工具
作用: 查询域名系统(DNS)记录,将域名解析为 IP 地址。用于排查域名解析失败、DNS 记录是否正确生效、以及确认当前使用的 DNS 服务器。
常用用法:
# 基本域名解析(查询 A 记录)
nslookup example.com
# 指定 DNS 服务器查询
nslookup example.com 8.8.8.8
# 查询特定记录类型
nslookup -type=A example.com # IPv4 记录(默认)
nslookup -type=AAAA example.com # IPv6 记录
nslookup -type=CNAME example.com # 别名记录
nslookup -type=MX example.com # 邮件交换记录
nslookup -type=NS example.com # 权威 DNS 服务器
nslookup -type=TXT example.com # TXT 记录
# 反向解析(IP 查域名)
nslookup 8.8.8.8
# 调试模式
nslookup -debug example.com
示例:
# 基本查询
$ nslookup baidu.com
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
Name: baidu.com
Address: 110.242.68.66
Name: baidu.com
Address: 39.156.66.10
# 指定使用公共 DNS 查询
$ nslookup github.com 8.8.8.8
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: github.com
Address: 20.205.243.166
# 查询 MX 记录(邮件服务器)
$ nslookup -type=MX gmail.com
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
gmail.com mail exchanger = 5 gmail-smtp-in.l.google.com.
gmail.com mail exchanger = 10 alt1.gmail-smtp-in.l.google.com.
# 反向解析
$ nslookup 8.8.8.8
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
8.8.8.8.in-addr.arpa name = dns.google.
# 排查 DNS 解析问题:对比不同 DNS 服务器的结果
$ nslookup example.com 8.8.8.8 # Google DNS — 正常
$ nslookup example.com 114.114.114.114 # 国内公共 DNS — 异常
# 结果不一致说明可能存在 DNS 劫持或污染
补充——dig 命令: dig 比 nslookup 更强大,是 Linux 上推荐的 DNS 排查工具:
# dig 基本用法(信息更详细)
dig example.com
# 指定记录类型 + DNS 服务器
dig @8.8.8.8 example.com A +short # 简洁输出
dig @8.8.8.8 example.com MX
# 追踪完整解析路径
dig +trace example.com
# 批量查询
dig -f domain_list.txt
对比 nslookup vs dig vs host:
| 工具 | 优点 | 缺点 |
|---|---|---|
nslookup |
跨平台,Windows/Linux 都可用 | 输出格式不够友好,功能较少 |
dig |
输出详尽,功能强大,调试友好 | Linux/macOS 预装,Windows 需安装 |
host |
简洁,适合脚本 | 信息量少 |
附录:问题排查思路速查
| 现象 | 排查命令 | 排查方向 |
|---|---|---|
| 端口通不通 | telnet、nc -zv |
防火墙、服务是否启动 |
| 谁占用了端口 | lsof -i :port、ss -tlnp |
进程冲突、端口被占用 |
| 连接数异常 | ss -s、netstat -ant |
攻击、连接泄漏、连接池耗尽 |
| 网络延迟高 | mtr、ping |
路由绕远、国际链路、丢包 |
| 丢包分析 | tcpdump、mtr |
链路故障、带宽瓶颈、拥塞 |
| DNS 解析失败 | nslookup、dig |
DNS 服务器、记录配置、污染 |
| 路由不通 | ip route、traceroute |
路由表、默认网关、策略路由 |
| 防火墙拦截 | iptables -L -n -v |
规则顺序、默认策略、conntrack 满 |
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏