3、防火墙与安全组:常见的拦截原因,如何排查?

说到「Remote end closed connection without response」这个报错,防火墙和安全组绝对是头号嫌疑犯。我这些年排查过的案例里,至少有一半最后都指向了它们。说白了,就是你的请求包发出去了,但中间被某个网络设备悄悄扔掉了,连个拒绝的回应都没给。

3.1 防火墙到底在拦什么?

防火墙和安全组,本质上都是做访问控制的。它们会检查每个经过的数据包,然后决定放行还是丢弃。我个人习惯把它们分成两类:

  • 网络层防火墙:比如 iptables、硬件防火墙。它们看 IP、端口、协议。
  • 应用层防火墙:比如 WAF、安全组规则。它们会深入检查 HTTP 头部、请求体。

你想想看,如果客户端发了一个 SYN 包过去,防火墙直接把这个包丢了,那服务端根本不知道有人来过。客户端等了一会儿,发现没回应,就会报「Remote end closed connection without response」。

核心判断依据:如果连接是 超时 而不是 被拒绝,大概率是被防火墙静默丢弃了。

3.2 常见的拦截场景

我在项目中遇到过好几次这样的情况:开发说「我本地能连,上了服务器就不行」。嗯,十有八九是安全组没配好。下面列几个最常见的:

场景 表现 典型原因
端口未开放 连接超时,无任何响应 安全组入站规则没加 3306、8080 等端口
源IP限制 部分客户端能连,部分不能 安全组只允许了特定 IP 段
状态防火墙 请求能出去,响应回不来 防火墙没开启状态跟踪,回包被当成非法连接
连接数限制 间歇性断连 防火墙触发了最大连接数阈值

注意:云服务商的安全组默认是 白名单机制。你没显式放行的流量,全部会被丢弃。这不是 bug,是设计。

3.3 如何排查?我的三板斧

排查防火墙问题,我有一套固定的流程。每次遇到「连接无响应」,我就按这个顺序来:

3.3.1 先确认是不是防火墙在作怪

最简单的办法:换个端口试试。比如你连 8080 超时,试试 22 端口(SSH)能不能通。如果能通,那基本确定是防火墙拦了 8080。

另一个技巧:用 telnet 或 nc 测试端口。如果卡住不动直到超时,就是被丢了。如果立刻返回「Connection refused」,那是服务端主动拒绝的,跟防火墙无关。

# 测试端口是否可达
telnet 192.168.1.100 8080

# 或者用 nc,更直观
nc -zv 192.168.1.100 8080

3.3.2 检查安全组/防火墙规则

云环境的话,登录控制台看安全组。我建议你重点关注三点:

  • 入站规则:有没有放行你的源 IP 和目标端口?
  • 出站规则:有些安全组连出站也限制,回包可能被拦。
  • 规则优先级:有没有更高优先级的拒绝规则覆盖了你的放行规则?

如果是自建防火墙,用 iptables 查看:

# 查看所有规则
iptables -L -n -v

# 查看 NAT 表(有时候问题出在这里)
iptables -t nat -L -n -v

小技巧:我曾经遇到一个案例,iptables 规则看起来没问题,但就是连不上。后来发现是 conntrack 表满了,新的连接无法建立。清一下 conntrack 表就好了。

3.3.3 抓包确认

如果上面两步还找不到原因,那就抓包吧。在客户端和服务端同时抓,对比一下:

# 在客户端抓
tcpdump -i eth0 host 192.168.1.100 and port 8080 -w client.pcap

# 在服务端抓
tcpdump -i eth0 port 8080 -w server.pcap

打开抓包文件,看有没有 SYN 包到达服务端。如果客户端发了 SYN,服务端没收到,那问题出在网络中间。如果服务端收到了但没回 SYN-ACK,那就是服务端本地的问题(比如防火墙、iptables)。

3.4 避坑指南

我踩过不少坑,分享几个给你:

  • 别信「我关了防火墙」:很多系统默认跑着多个防火墙。比如 Linux 上,你关了 iptables,可能还有 firewalld 在跑。Windows 上,关了系统防火墙,第三方安全软件可能还在拦。
  • 安全组有状态 vs 无状态:AWS 的安全组是有状态的,你放行了入站,出站自动放行。但某些云厂商的安全组是无状态的,出站规则也得配。这个坑我掉进去过两次。
  • 防火墙日志要开:很多防火墙默认不记丢弃日志。你排查的时候两眼一抹黑。我建议你先把日志打开,看看有没有 DROP 记录。

一句话总结:防火墙导致的「Remote end closed connection without response」,特征就是 静默丢弃。客户端收不到任何回应,只能等超时。排查时,从端口可达性入手,配合抓包,基本能定位。

3.5 核心排查流程图

下面这张图是我自己总结的排查思路,你照着走一遍,大部分问题都能解决:

防火墙/安全组排查流程图 收到连接超时报错 telnet 端口通吗? (nc -zv 测试) 是 不是防火墙问题 检查应用层 否 防火墙大概率 在拦截 云环境? 是 检查安全组规则 入站/出站/优先级 否 检查 iptables firewalld / conntrack 抓包确认:客户端 vs 服务端 定位到具体拦截规则 → 修复 注:超时 = 静默丢弃,拒绝 = 有回应但拒绝

这张图我用了很多次,每次照着走一遍,基本都能找到根因。你把它保存下来,下次遇到类似问题直接拿出来用。

可可精品资料库