
1. 先搞清楚问题在哪从现象到初步定位Linux 网络问题排查最怕的就是上来就一通命令乱敲结果越查越乱。一个 TCP/IP 连接故障背后可能是本地配置、中间网络、远端服务、防火墙策略、系统资源等多个环节的问题。这篇文章不讲空泛的理论直接给你一套从现象出发层层递进的实战排查流程。无论你是运维、开发还是刚接触 Linux 的同学这套方法都能帮你快速定位问题而不是在搜索引擎里大海捞针。核心思路很简单由近及远从简到繁。先确认本地机器本身有没有问题再检查到目标地址的网络路径是否通畅最后验证远端服务的端口和协议是否可达。整个过程就像医生看病先量体温本地状态再检查血管网络路由最后看器官功能服务端口。2. 本地自查你的机器“健康”吗在怀疑网络之前必须先确保本地系统的基础状态是正常的。很多“网络不通”的假象根源其实在本地。2.1 检查网络接口与 IP 配置首先你得知道自己的“门牌号”IP地址和“门”网络接口是不是对的。使用ip命令推荐功能更强大或传统的ifconfig。# 查看所有网络接口的详细状态 ip addr show # 或者查看特定接口如 eth0 或 ens33 ip addr show eth0你需要关注几个关键信息接口状态state UP表示接口已启用。如果是state DOWN那问题就在本地需要检查网线、虚拟机网络设置或使用ip link set eth0 up启动。IP地址确认分配的 IP 地址是否符合你的网络环境如是否在正确的网段。如果是127.0.0.1本地环回那显然无法访问外网。子网掩码确保掩码正确否则路由计算会出错。如果发现没有 IP 或 IP 不对可能是 DHCP 未成功或静态配置错误。对于使用NetworkManager的系统如 CentOS 8/RHEL 8、Rocky Linux、Ubuntu 桌面版可以用nmcli检查连接状态nmcli connection show。2.2 确认路由表网关有了 IP还得知道数据包该从哪个“大门”出去这就是网关。使用ip route或route -n查看路由表。ip route show # 或 route -n重点关注default via这一行它指明了默认网关。例如default via 192.168.1.1 dev eth0。如果这一行缺失你的机器就无法访问非本地子网的其他任何地址。网关地址必须是你本地网络可达的通常是路由器地址。2.3 检查本地防火墙这是最容易被忽略的环节之一。本地防火墙如firewalld或iptables/nftables可能会阻止出站或入站连接。即使你能ping通目标TCP 连接也可能被防火墙规则拦截。对于 firewalld (CentOS/RHEL/Rocky/Fedora):# 查看防火墙状态和活跃区域 sudo firewall-cmd --state sudo firewall-cmd --list-all对于 iptables (较老系统或通用检查):# 查看所有规则 sudo iptables -L -n -v一个快速验证方法临时完全关闭防火墙仅用于测试生产环境谨慎。firewalld:sudo systemctl stop firewalldiptables:sudo iptables -F(清空所有规则)关闭防火墙后重试你的 TCP 连接。如果通了那就证明问题出在防火墙规则上你需要去配置放行相应的服务端口如 80, 443, 22, 3306等而不是简单地永久关闭它。2.4 检查 DNS 解析如果你连接的是域名如www.example.com而非 IP 地址那么 DNS 解析失败也会导致连接失败。使用nslookup或dig进行测试。nslookup www.example.com # 或 dig www.example.com如果返回server can‘t find或超时说明 DNS 解析有问题。检查/etc/resolv.conf文件中的 nameserver 配置是否正确或者尝试更换为公共 DNS如8.8.8.8Google或114.114.114.114国内。注意ping一个域名如果失败首先要区分是“域名无法解析”还是“解析后 IP 不可达”。ping命令本身会先做 DNS 解析。所以看到ping: unknown host时先查 DNS。3. 网络路径探测数据包能走到哪一步本地检查无误后下一步是探测到目标主机的网络路径。这里主要用两个工具ping和traceroute或tracepath,mtr。3.1 使用 Ping 测试基础连通性ping使用 ICMP 协议是测试网络层连通性的最基本工具。ping -c 4 目标IP或域名能通说明到目标主机的网络层路由是通的且目标主机或其网关响应了 ICMP 请求。但这不意味着你的 TCP 端口如 80, 22是通的因为防火墙可能放行 ICMP 但拦截 TCP。不通请求超时可能目标主机禁用了 ICMP 回应很多云服务器默认如此。可能中间某个路由器或防火墙丢弃了 ICMP 包。可能路由根本不存在。所以ping不通不代表 TCP 一定不通但ping通通常是个好兆头。3.2 使用 Traceroute 诊断路由路径当ping不通或连接缓慢时你需要知道数据包在哪一跳丢失或延迟激增。traceroute会显示数据包到达目标经过的每一跳路由器。# 常用方式 traceroute 目标IP或域名 # 如果系统没有traceroute可以安装或使用tracepath tracepath 目标IP或域名 # 更强大的工具是 mtr (My TraceRoute)它结合了 ping 和 traceroute mtr 目标IP或域名解读结果看到一系列 IP 和延迟最终到达目标路径正常。在某一跳之后出现连续的* * *数据包在该节点之后被丢弃。问题可能出在该节点也可能是后续节点不回应探测包。某几跳延迟特别高可能网络拥塞或线路质量不佳。mtr的优势在于它是持续运行的可以更直观地看到丢包率和延迟波动对于诊断间歇性网络问题特别有用。4. 端口与服务探测目标“开门”了吗这是 TCP/IP 连接排查的核心。网络层通了但传输层TCP/UDP的端口可能没开。这里主要使用telnet、nc(netcat) 和nmap。4.1 使用 Telnet 或 Netcat 进行手动 TCP 连接这是最直接的方法模拟一个真实的 TCP 连接。# 使用 telnet (如果未安装yum install telnet 或 apt install telnet) telnet 目标IP 端口号 # 例如telnet 192.168.1.100 22 # 使用 nc (netcat)功能更强大 nc -zv 目标IP 端口号 # 例如nc -zv www.example.com 443连接成功telnet会进入一个空白会话对于 SSH、HTTP 等协议可能会显示服务标识nc -zv会显示succeeded!。这证明 TCP 三次握手完成端口是开放的并且没有被中间防火墙阻断。连接失败Connection refused目标主机明确拒绝了连接。通常意味着目标主机上没有服务监听在该端口或者主机防火墙如目标服务器的 iptables拒绝了连接。Connection timed out连接超时。这比refused更常见意味着你的 SYN 包没有收到 SYN-ACK 回应。可能的原因包括目标主机防火墙丢弃了 SYN 包、中间网络设备如安全组、ACL拦截、目标主机宕机、或者路由在最后一跳失效。4.2 使用 Nmap 进行专业端口扫描nmap是功能更全面的网络探测工具可以扫描端口状态、服务版本甚至操作系统。# 快速扫描常用端口 nmap -F 目标IP # 扫描特定端口范围 nmap -p 1-1000 目标IP # 扫描单个端口并尝试识别服务版本 nmap -sV -p 22 目标IPnmap输出的端口状态open端口开放有服务监听。closed端口关闭能收到 RST 复位包说明主机可达但没服务。filtered端口被过滤防火墙、ACL等nmap无法确定其状态收不到任何回应。这是排查防火墙问题的重要线索。unfiltered端口可访问但无法确定是开放还是关闭用于 ACK 扫描。重要提醒未经授权扫描他人网络或服务器可能是非法的。仅在你的授权环境或对自己管理的服务器进行扫描。4.3 检查本地端口占用与监听有时候问题不是出在远端而是本地端口已被占用导致你的服务无法启动监听。使用ss推荐或netstat查看。# 查看所有 TCP 监听端口 ss -tlnp # 查看指定端口的占用情况例如 8080 ss -tlnp | grep :8080输出会显示监听地址0.0.0.0表示所有接口、端口、进程名和 PID。如果发现你期望的端口被其他进程占用就需要决定是停止那个进程还是为你的服务更换端口。5. 连接建立后的深度排查与工具如果 TCP 连接能建立但数据传输异常慢、中断、报错就需要更深入的排查工具。5.1 使用 tcpdump 进行抓包分析这是终极武器。当所有常规手段都无法定位问题时抓取原始网络数据包进行分析。# 监听特定网卡如eth0的所有流量CtrlC停止 sudo tcpdump -i eth0 # 监听与特定主机的所有通信 sudo tcpdump -i eth0 host 目标IP # 监听特定端口的流量 sudo tcpdump -i eth0 port 80 # 将抓包结果写入文件方便用Wireshark分析 sudo tcpdump -i eth0 -w capture.pcap抓包后你可以看到 TCP 三次握手SYN, SYN-ACK, ACK、数据传输PSH和连接终止FIN, RST的每一个细节。例如能看到 SYN 包发出但没收到 SYN-ACK问题在对方或中间链路。能看到大量重传Retransmission网络丢包严重。连接被 RST 复位可能是服务进程崩溃或防火墙发送了 RST 包。对于复杂问题将.pcap文件下载到本地用图形化工具 Wireshark 分析会更直观。5.2 系统连接状态查询ss 命令详解ss是netstat的现代替代品速度更快信息更详细。用于查看当前系统的所有 socket 连接状态。# 查看所有 TCP 连接 ss -t # 查看所有 TCP 监听端口 ss -tl # 查看所有 UDP 连接 ss -u # 显示进程信息 ss -tlnp在排查“连接数过多”、“TIME_WAIT 堆积”或“端口被谁占用”这类问题时ss是你的主要工具。例如ss -s可以显示总结信息快速了解各种状态的连接数。5.3 内核参数与连接限制有时连接失败是由于系统级限制造成的需要检查内核参数。临时端口范围cat /proc/sys/net/ipv4/ip_local_port_range。当作为客户端高并发连接时会使用这个范围的端口。如果范围太小可能导致端口耗尽。连接跟踪表大小对于有状态防火墙如 iptables 的conntrack模块连接跟踪表满会导致新建连接失败。查看当前用量cat /proc/sys/net/netfilter/nf_conntrack_count查看最大值cat /proc/sys/net/netfilter/nf_conntrack_max。文件描述符限制每个 TCP 连接都会占用一个文件描述符。检查系统级和进程级限制ulimit -n当前用户cat /proc/sys/fs/file-max系统总限制。6. 实战故障排查清单与流程把上面的工具串联起来形成一个标准化的排查流程。下次遇到“网络连不上”的问题就按这个顺序来可以节省大量时间。第一步明确现象与目标记录故障现象是完全不通时断时续还是速度慢明确连接四要素源IP、源端口、目标IP、目标端口。第二步本地健康检查ip addr show检查接口状态和 IP。ip route show检查默认网关。ping 127.0.0.1检查本地协议栈。sudo systemctl stop firewalld或iptables -F临时测试排除本地防火墙干扰。nslookup 目标域名检查 DNS 解析。第三步网络路径检查ping 目标IP测试基础连通性。如果不通进行下一步。traceroute 目标IP或mtr 目标IP定位数据包在哪一跳丢失。第四步端口与服务检查telnet 目标IP 端口或nc -zv 目标IP 端口直接测试 TCP 端口。成功问题可能不在网络而在应用层协议或数据交互。失败记录错误信息refused或timeout。可选nmap -p 端口 目标IP获取更详细的端口状态open/filtered/closed。第五步深入分析如果telnet通但应用不通使用tcpdump在客户端或服务端抓包分析应用层协议交互。如果连接数多或性能问题使用ss -s查看连接统计检查conntrack计数和文件描述符限制。检查服务端日志如/var/log/messages,/var/log/syslog或应用自身的日志看是否有错误记录。第六步隔离测试换一个客户端测试同一个服务判断问题是普遍性的还是仅限于本机。从本机测试另一个服务如curl baidu.com判断问题是出站通用问题还是特定目标问题。我个人的经验是90% 的 TCP/IP 连接问题通过前四步就能定位到大致方向。真正需要动用到tcpdump抓包分析的都是些顽固的、涉及中间设备策略或协议兼容性的疑难杂症。养成按流程排查的习惯比记住所有命令更重要。每次排查后记得把临时关闭的防火墙重新按需配置打开并将有效的解决方案记录下来形成你自己的知识库。