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 核心排查流程图
下面这张图是我自己总结的排查思路,你照着走一遍,大部分问题都能解决:
这张图我用了很多次,每次照着走一遍,基本都能找到根因。你把它保存下来,下次遇到类似问题直接拿出来用。