FreezeJ' Blog

Linux问题排查-网络篇

2026-07-04

网络排查工具速查手册

工作中常用的网络问题排查工具和方法总结。


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 ...

注意: ssnetstat 的现代替代品,在 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 工具集的主命令,取代了已废弃的 ifconfigroutearp 等传统工具。用于查看和管理网络接口、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 — 持续追踪路由与丢包检测

作用: 融合 tracerouteping 的功能,持续追踪数据包到达目标所经过的路由节点,并实时统计每一跳的丢包率和延迟。是定位”网络慢在哪一跳”的最佳工具。

常用用法:

# 基本使用,持续追踪目标
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 命令: dignslookup 更强大,是 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 简洁,适合脚本 信息量少

附录:问题排查思路速查

现象 排查命令 排查方向
端口通不通 telnetnc -zv 防火墙、服务是否启动
谁占用了端口 lsof -i :portss -tlnp 进程冲突、端口被占用
连接数异常 ss -snetstat -ant 攻击、连接泄漏、连接池耗尽
网络延迟高 mtrping 路由绕远、国际链路、丢包
丢包分析 tcpdumpmtr 链路故障、带宽瓶颈、拥塞
DNS 解析失败 nslookupdig DNS 服务器、记录配置、污染
路由不通 ip routetraceroute 路由表、默认网关、策略路由
防火墙拦截 iptables -L -n -v 规则顺序、默认策略、conntrack 满
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏