ECS 安全组放行端口仍不通:先分清安全组、网络ACL、防火墙与监听四层
一、问题:安全组明明放行了,端口为什么还是不通
一台 ECS 上部署了网站,安全组入方向已经放行 80 端口,浏览器却还是打不开;或者放行了 22 端口,SSH 还是连不上。很多人第一反应是再加一条规则,或者把源地址改成 0.0.0.0/0,结果仍然不通。问题往往不在“有没有加规则”,而在流量到达端口之前被另一层拦住了。安全组只是四层防护中的一层,只有把四层逐层对齐,才能定位到真正断掉的那一环。
二、前提:先确认三件事,再动手改规则
第一,确认规则加在正确的实例和安全组上。同一账号下可能有多个安全组,实例加入的安全组才是生效的安全组;改了另一个安全组,实例本身的规则没有任何变化。先在实例详情里确认它绑定的安全组,再去改那个安全组。
第二,确认方向、协议和端口都没有写反。官方文档明确说明:安全组规则实际是网络流量访问策略,由入方向规则和出方向规则共同组成,用来控制流入、流出安全组内 ECS 实例的流量。外部访问实例要看入方向,实例访问外部要看 出方向;把入方向规则加到出方向里,外部流量根本不会被放行。协议也要对齐,网站用 TCP 80,规则写成 UDP 80 同样不通。
第三,确认优先级和策略的匹配顺序。官方文档说明:安全组规则优先级可选范围为 1 到 100,默认值为 1,即最高优先级,数字越小优先级越高;匹配流量时,首先按照优先级排序,其次按照策略排序,拒绝策略高于允许策略。也就是说,一条高优先级的拒绝规则会压过低优先级的允许规则,只看有没有允许规则是不够的。
三、分步操作:按四层顺序排查,不要跳层
第一步,查安全组。进入 ECS 控制台实例详情,找到网络、安全组,打开安全组规则配置,核对入方向规则:方向是入方向,协议是业务协议,端口是业务端口,源地址包含客户端地址,策略是允许,优先级没有被拒绝规则压住。如果源地址写的是某个固定 IP,就先确认客户端出口 IP 是不是这个 IP;如果客户端在公司 NAT 后面,出口 IP 可能和本机 IP 不同。
第二步,查网络 ACL。安全组对实例防护,网络 ACL 对整个子网防护。官方文档明确说明:网络 ACL 规则与安全组规则冲突时,优先匹配网络 ACL 规则,可能会导致安全组规则不生效。例如安全组入方向放通 80 端口,但子网关联的网络 ACL 拒绝 80 端口,流量会先被网络 ACL 拦住。去 VPC 子网详情里确认关联的网络 ACL,把对应协议端口放通,或者先确认网络 ACL 是不是默认放通状态。
第三步,查实例内防火墙。官方文档明确说明:安全组和防火墙都可以对实例进行防护,当在安全组中开通某个端口的访问时,ECS 的防火墙可能限制该端口的访问,需要关闭防火墙,或者在防火墙配置例外端口。Linux 上先看 firewalld 或 iptables 是否放行了端口,Windows 上看 Windows Defender 防火墙的入站规则。只改云上规则、不改系统内防火墙,是最常见的“规则已放行却不通”的原因。
第四步,查服务监听。官方文档明确说明:在安全组规则中放开某个端口后,还需要确保实例内对应的端口也已经放通,安全组规则才会对实例生效。Linux 上执行 ss -tlnp 或 netstat -an | grep 端口号,确认服务确实在监听目标端口,并且监听地址不是只绑定了 127.0.0.1;如果服务根本没有启动,或者只监听了本地回环,外部流量到了实例也没有人接。Windows 上执行 netstat -an | findstr 端口号,同样确认监听状态。
四、验证:分三段验证,不要只看浏览器
第一,实例内验证。登录实例后,先用 curl http://127.0.0.1:端口 或本地端口测试确认服务本身能响应,排除服务未启动的问题。
第二,内网验证。用同一 VPC 内另一台实例访问目标实例的内网 IP 和端口,确认内网路径通不通;内网通、外网不通,问题多在安全组源地址、EIP 绑定或公网入口;内网也不通,问题多在监听、防火墙或网络 ACL。
第三,公网验证。最后从外部访问 http://ECS 的弹性公网 IP 地址,或者用 telnet、nc 测试端口连通性。官方文档的验证方法也是这个顺序:先检查实例内端口,再用浏览器访问弹性公网 IP,访问成功才说明安全组规则已经生效。
五、常见坑:这五处最容易反复踩
第一,把方向写反。入方向和出方向是两条独立的控制线,外部访问实例只看入方向,实例主动访问外部只看出方向。
第二,只看允许规则,忽略拒绝规则。安全组遵循白名单原理,官方文档说明:当在规则中没有明确定义允许或拒绝某条流量时,安全组一律拒绝该流量流入或者流出实例;同时拒绝策略在同优先级下高于允许策略。
第三,源地址写得太窄或太宽。写得太窄会把真实客户端挡在外面,写成 0.0.0.0/0 又会把 22、3389 等高危端口暴露给全网。官方文档提醒:高危端口暴露到公网可能导致网络入侵,建议将安全组规则设置为仅允许已知的 IP 地址访问。调试时可以临时放宽,定位完成后务必收紧。
第四,忘了网络 ACL 这一层。安全组改对了,子网 ACL 拒绝,流量同样进不来;排查时要把子网 ACL 和安全组放在同一张表里对照。
第五,改完规则不验证监听和防火墙。云上放行只是第一步,系统内防火墙和服务监听才是最后两步,任何一步没对齐,端口都不会通。
六、小结清单
1. 先确认实例绑定的安全组是不是你改的那个安全组。
2. 核对方向、协议、端口、源地址、策略和优先级,拒绝规则会压过允许规则。
3. 查子网网络 ACL,网络 ACL 优先于安全组,冲突时安全组不生效。
4. 查实例内防火墙,放行端口或配置例外端口。
5. 查服务监听,确认服务已启动且不是只监听 127.0.0.1。
6. 按实例内、内网、公网三段验证,定位到断掉的那一层再改。
出处:华为云帮助中心《配置安全组规则》,https://support.huaweicloud.com/usermanual-ecs/zh-cn_topic_0030878383.html ;华为云帮助中心《为什么配置的安全组规则不生效?》,https://support.huaweicloud.com/vpc_faq/faq_security_0006.html
- 点赞
- 收藏
- 关注作者
评论(0)