Linux网络故障排查实战指南:从ping到tcpdump的完整流程

📅 2026/8/20 13:01:45
Linux网络故障排查实战指南:从ping到tcpdump的完整流程
这次我们来看一个 Linux 网络运维中绕不开的核心技能TCP/IP 连接故障排查。当你的服务无法访问、端口不通、连接超时或丢包严重时一通乱试往往事倍功半。本文不空谈理论直接提供一套从底层到应用层的系统性排查指南让你能快速定位问题根源无论是本地服务器还是云上实例都适用。本文的核心是实战。我们将从最基础的网络连通性检查开始逐步深入到 TCP 连接状态分析、端口监听、防火墙规则、路由追踪以及内核参数调优。你会看到一系列具体的命令、它们的输出解读以及针对不同现象如“Connection refused”、“No route to host”、连接超时的精准应对策略。目标是让你读完就能上手在下次遇到网络问题时能清晰地知道该敲哪条命令看哪个关键指标。1. 核心能力速览排查工具箱在深入细节前我们先快速浏览一下 Linux 系统为我们提供的核心网络排查工具。这些工具就像外科医生的手术刀各有专长。工具/命令核心用途关键信息ping检查基础网络层连通性ICMP延迟、丢包率、TTLtraceroute/tracepath追踪数据包路径定位网络中断点每一跳的延迟和节点netstat/ss查看网络连接、监听端口、路由表、接口统计TCP/UDP 连接状态、监听端口、收发字节数ip/ifconfig管理网络接口、IP地址、路由接口状态、IP/MAC地址、MTUnslookup/digDNS 域名解析测试解析出的IP、权威服务器、响应时间**telnet/nc(netcat)测试 TCP/UDP 端口连通性能否建立 TCP 三次握手tcpdump/wireshark网络抓包进行深度协议分析数据包内容、序列号、标志位、重传iptables/firewalld配置与管理防火墙规则规则链、策略、是否被拦截sar/nethogs监控网络流量与性能带宽占用、连接数趋势ss命令是现代替代netstat的首选因为它更快、信息更详细。本文后续将主要使用ss。2. 适用场景与使用边界这套排查方法适用于几乎所有涉及 Linux 服务器的网络问题场景服务无法访问Web 服务Nginx/Apache、数据库MySQL/Redis、API 接口等无法从外部或内部连接。连接不稳定间歇性超时、连接频繁断开、数据传输速度慢。性能瓶颈分析怀疑网络是系统性能的瓶颈需要量化分析。安全策略验证检查防火墙规则是否按预期生效是否存在不当放行或拦截。云环境与容器网络在 Kubernetes、Docker 或公有云 VPC 环境中诊断网络策略和路由问题。使用边界与注意事项权限要求大部分诊断命令需要root权限或sudo来执行特别是抓包 (tcpdump) 和查看所有连接 (ss -tulnp)。最小影响原则在生产环境进行抓包或修改防火墙规则前务必评估对业务的影响最好在业务低峰期或测试环境先行验证。信息合规使用tcpdump抓包可能捕获到敏感数据如密码明文务必遵守数据安全法规仅在必要时用于故障诊断并妥善处理抓包文件。3. 环境准备与前置条件开始排查前你需要一个可以访问的 Linux 环境并明确问题的基本描述。操作系统主流的 Linux 发行版均可如 CentOS/RHEL, Ubuntu/Debian, Rocky Linux 等。命令可能因发行版略有差异如包管理工具。权限准备root用户或具有sudo权限的账户。问题描述清晰定义问题现象例如“从机器 A 无法 SSH 到机器 B端口 22。”“外部用户访问不了服务器的 80 端口。”“应用连接数据库超时但数据库本机连接正常。”网络拓扑了解基本的网络结构。客户端和服务器在同一局域网吗中间有防火墙、负载均衡器或 NAT 设备吗4. 系统性排查流程与操作指南我们按照自底向上从物理层到应用层的逻辑构建一个标准的排查流程。4.1 第一步检查本地网络接口与配置问题可能出在服务器本身。首先确认网卡是否正常启动并配置了正确的 IP。# 查看所有网络接口的简要信息ip命令更强大推荐 ip addr show # 或使用传统命令 ifconfig -a关键检查点接口状态BROADCAST,MULTICAST,UP,LOWER_UP中的UP表示接口已启用。IP地址确认inet字段的 IP 地址是否正确是否是预期的内网/公网IP。子网掩码inet后面的scope global通常跟随着子网信息。如果接口是DOWN状态需要启动它sudo ip link set eth0 up # 假设网卡名为 eth0 # 或者使用传统方式 sudo ifconfig eth0 up4.2 第二步测试基础连通性 (ICMP)使用ping命令测试到目标地址或网关的基本连通性。# 测试到网关的连通性假设网关是 192.168.1.1 ping -c 4 192.168.1.1 # 测试到目标服务器的连通性例如 8.8.8.8 ping -c 4 8.8.8.8 # 测试域名解析和连通性 ping -c 4 www.example.com输出解读与应对Destination Host Unreachable通常表示本地路由表中没有到达目标网络的路由。检查ip route或route -n。Request timeout数据包发出但没有收到回复。可能对端防火墙禁用了 ICMP或者中间网络有阻断。高延迟或丢包如果能看到回复但延迟 (time) 很高或packet loss不为 0%说明网络质量不佳可能存在拥塞。注意很多云服务器或安全策略会禁止 ICMP (ping)因此 ping 不通不代表 TCP 端口一定不通但 ping 通是网络正常的一个强有力信号。4.3 第三步检查路由路径如果 ping 不通或想了解网络路径使用traceroute。# 追踪到目标 IP 的路径 traceroute 8.8.8.8 # 如果系统没有 traceroute可以使用 tracepath通常已安装 tracepath 8.8.8.8关键检查点查看输出中的每一跳。如果在某一跳之后出现连续的* * *通常表示网络在该节点中断或该节点不响应探测。关注跳数是否异常增多以及某一跳的延迟是否突然剧增。4.4 第四步检查 DNS 解析如果使用域名连接首先确保域名能正确解析为 IP 地址。# 使用 nslookup 查询 nslookup www.example.com # 使用 dig 查询信息更详细 dig www.example.com A short常见问题无返回结果可能是/etc/resolv.conf中配置的 DNS 服务器不可用。返回错误 IP可能是 DNS 缓存污染或本地 hosts 文件配置有误。检查/etc/hosts。解析慢可能是 DNS 服务器响应慢。可以临时修改/etc/resolv.conf将 nameserver 改为8.8.8.8Google DNS或114.114.114.114国内 DNS测试。4.5 第五步检查目标端口监听状态服务端视角这是最关键的一步。假设你是服务提供方Server需要确认你的服务进程是否在正确监听预期的端口。# 使用 ss 命令查看所有 TCP 和 UDP 监听端口并显示进程名-p sudo ss -tulnp # 常用组合-t (TCP), -u (UDP), -l (监听), -n (数字形式不解析服务名), -p (进程) # 例如只查看 TCP 监听端口 sudo ss -tlnp输出示例解读State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:((sshd,pid1234,fd3)) LISTEN 0 100 127.0.0.1:25 0.0.0.0:* users:((master,pid5678,fd13)) LISTEN 0 128 :::80 :::* users:((nginx,pid9012,fd6))Local Address:Port0.0.0.0:22表示监听所有 IPv4 接口的 22 端口。127.0.0.1:25表示只监听本机环回地址的 25 端口外部无法访问。:::80表示监听所有 IPv6 接口的 80 端口。进程信息users:((nginx,pid9012,fd6))明确告诉你这是 Nginx 进程在监听。如果服务没有在监听确认服务是否启动systemctl status nginx。检查服务配置文件看监听的 IP 和端口是否正确。查看服务日志journalctl -u nginx或tail -f /var/log/nginx/error.log。4.6 第六步测试远程端口连通性客户端视角假设你是客户端需要测试能否连接到服务器的某个端口。# 使用 telnet简单测试 TCP 端口 telnet 服务器IP 端口号 # 例如telnet 192.168.1.100 80 # 如果连接成功会显示 Connected to ...然后进入一个空白光标状态按 Ctrl] 然后输入 quit 退出。 # 如果失败会显示明确的错误信息。 # 使用 nc (netcat)更灵活 nc -zv 服务器IP 端口号 # -z: 扫描模式不发送数据 # -v: 详细输出 # 例如nc -zv 192.168.1.100 3306常见错误信息与含义Connection refused目标端口没有进程在监听。回到第五步检查服务端。No route to host本地没有到达目标主机的路由。检查客户端和服务器的网络配置、防火墙、安全组。Connection timed out连接请求发出后在超时时间内未收到响应。通常意味着数据包在途中被丢弃如被防火墙静默丢弃或者服务端过于繁忙无法响应 SYN 包。4.7 第七步检查防火墙规则防火墙是导致端口不通的最常见原因之一。需要同时检查服务器本机防火墙和网络中的安全组/硬件防火墙。1. 检查服务器本地防火墙 (iptables/nftables/firewalld)# 查看 iptables 规则CentOS 6/7, 旧版 Ubuntu sudo iptables -L -n -v # 查看 firewalld 当前区域和规则CentOS 7/8, RHEL, Fedora sudo firewall-cmd --list-all # 查看 nftables 规则新版 Debian/Ubuntu sudo nft list ruleset关键点查看 INPUT 链的规则是否允许目标端口的流量。一个常见的临时测试方法是谨慎地临时关闭防火墙仅用于测试生产环境勿用# 对于 firewalld sudo systemctl stop firewalld sudo systemctl disable firewalld # 禁止开机启动测试完记得 enable # 对于 ufw (Ubuntu) sudo ufw disable2. 检查云服务商安全组这是云环境下的“虚拟防火墙”。你需要登录云控制台检查关联到该云服务器的安全组Security Group规则确保入方向Inbound允许来自客户端 IP 或 CIDR 的对应端口流量如 TCP:22, TCP:80。4.8 第八步分析 TCP 连接状态与网络统计当连接建立后出现性能问题慢、断连时需要深入分析。# 查看所有 TCP 连接的状态统计 ss -t -a # 查看所有 TCP 连接并按状态分类计数非常有用 ss -t -a | grep -v State | awk {print $1} | sort | uniq -c # 输出类似 10 ESTAB 2 TIME-WAIT 50 LISTEN # 查看网络接口统计信息检查是否有错误包 ip -s link show eth0 # 关注 errors, dropped, overruns 字段如果持续增长表明存在硬件或驱动问题。理解关键 TCP 状态ESTABLISHED正常连接。TIME-WAIT连接已关闭等待处理网络中残留的数据包。大量出现是正常的但如果过多且持久可能需要调整内核参数net.ipv4.tcp_tw_reuse。CLOSE-WAIT表示本地应用没有及时关闭 socket。大量CLOSE-WAIT可能意味着应用有 Bug 或资源泄漏。SYN-SENT/SYN-RECV正在建立连接。大量出现可能是 SYN Flood 攻击或服务端处理能力不足。4.9 第九步高级诊断 - 网络抓包当以上步骤都无法定位问题时抓包是终极武器。tcpdump可以捕获经过指定网卡的数据包。# 捕获 eth0 网卡上所有与目标主机 192.168.1.100 的通信并写入文件 sudo tcpdump -i eth0 host 192.168.1.100 -w capture.pcap # 实时查看与特定端口如 80相关的流量 sudo tcpdump -i eth0 port 80 -nn -v # 在抓包的同时进行过滤只显示 TCP SYN 包用于观察连接建立 sudo tcpdump -i eth0 tcp[tcpflags] (tcp-syn) ! 0抓包完成后可以将capture.pcap文件下载到本地用图形化工具Wireshark进行分析可以清晰地看到 TCP 三次握手、数据传输、挥手过程以及任何异常的重传Retransmission、重复确认Dup ACK等。5. 常见问题排查清单当你遇到具体错误时可以按此清单快速定位。问题现象可能原因排查命令/步骤Connection refused1. 服务未启动。2. 服务监听地址错误如只监听了 127.0.0.1。3. 端口被其他进程占用。1.systemctl status service2.sudo ss -tlnp | grep :port3. 检查服务配置文件。No route to host1. 目标 IP 不存在或已关机。2. 本地路由表缺失。3. 中间防火墙阻断。1.ping target_ip2.ip route get target_ip3. 检查安全组/ACL。Connection timed out1. 对端防火墙丢弃 SYN 包静默丢弃。2. 网络拥塞或路由环路。3. 服务端负载过高backlog 队列满。1. 在服务端抓包看是否收到 SYN。2.traceroute target_ip3. 检查服务端netstat -s | grep listen和系统负载。能 ping 通但端口不通1. 服务端防火墙/安全组阻止了该端口。2. 服务进程未监听该端口。3. 监听在 IPv6 但客户端用 IPv4 访问或反之。1. 检查服务端iptables/firewalld和云安全组。2.sudo ss -tulnp3. 确认监听地址是0.0.0.0还是::。SSH 连接缓慢1. DNS 反查超时常见。2. GSSAPI 认证问题。3. 网络质量差。1. 在客户端 SSH 配置 (/etc/ssh/ssh_config) 添加GSSAPIAuthentication no和UseDNS no。2.ssh -v查看详细日志。已建立的连接随机断开1. 中间网络设备如 NAT会话超时。2. 内核参数tcp_keepalive设置不当。3. 应用层心跳未保持。1. 调整中间设备超时时间。2. 调整net.ipv4.tcp_keepalive_time。3. 应用层实现保活机制。6. 内核参数调优建议高级对于高并发、长连接场景可能需要调整 TCP/IP 内核参数。修改前请备份并在测试环境验证。# 查看当前内核参数 sysctl -a | grep net.ipv4.tcp # 临时修改参数重启失效 sudo sysctl -w net.ipv4.tcp_tw_reuse1 sudo sysctl -w net.ipv4.tcp_tw_recycle0 # 在 NAT 环境下建议为 0 sudo sysctl -w net.ipv4.tcp_fin_timeout30 sudo sysctl -w net.core.somaxconn1024 # 提高连接队列长度 # 永久修改编辑 /etc/sysctl.conf然后执行 sysctl -p 生效。重要提醒tcp_tw_recycle在 RFC 1323 时间戳和 NAT 环境下极易引起问题现代 Linux 内核已弃用强烈建议设置为 0。7. 总结与最佳实践网络故障排查是一项系统工程遵循清晰的流程可以极大提升效率。回顾一下核心步骤由近及远先从本机服务端的接口、服务、防火墙查起再逐步向外扩展到网络路径、对端配置。由底向上从物理连通性 (ping) 到路由 (traceroute)再到传输层端口 (telnet/nc)最后到应用层。善用工具ss代替netstatip代替ifconfigdig提供更清晰的 DNS 信息。二分法与对比法如果 A 能通 B 不能通对比两者的配置差异。如果昨天能通今天不能通思考中间发生了什么变更。日志是你的朋友系统日志 (/var/log/messages,journalctl)、服务日志、防火墙日志往往包含了关键的错误信息。变更管理任何对网络配置、防火墙规则的修改都必须有记录、有回滚方案。养成在服务部署完成后立即进行端口连通性测试的习惯并将本文中的核心检查命令如ss -tulnp,nc -zv纳入你的运维手册或自动化监控脚本中。当问题出现时你就能快速锁定战场而不是盲目尝试。