
核心要点(TL;DR)
- 云安全组在主机之外过滤流量,firewalld与iptables在主机内部生效,两层都要放行。
- firewalld是iptables的前端管理工具,规则最终仍落到netfilter。
- 端口不通先查安全组入方向,再查本机防火墙与监听状态。
- 临时用iptables -I插入规则验证,确认后再持久化保存。
半夜被告警叫醒,SSH 连不上、网站 502,第一反应是服务挂了,结果折腾半小时才发现是防火墙把端口拦了。很多运维和站长对「服务器防火墙是什么」只有模糊印象,不清楚云安全组、firewalld、iptables 谁先谁后,于是排查时到处试。本文按分层结构讲清三者关系,并给出可直接执行的命令和检查清单,帮你十分钟内定位是哪里在丢包。
一、三层防护:流量到底先经过谁
一台云服务器的入站流量大致按以下顺序被检查:
| 层级 | 组件 | 作用范围 | 典型管理方式 |
|---|---|---|---|
| 外层 | 云安全组 | 实例网卡之外,平台侧过滤 | 控制台/API/CLI |
| 主机层 | firewalld / iptables | 操作系统内核 netfilter | firewall-cmd / iptables |
| 应用层 | 服务监听与访问控制 | 进程本身 | 配置文件、bind 地址 |
关键结论:安全组和主机防火墙是串联关系,任何一层拒绝,连接都失败。firewalld 只是 iptables/nftables 的前端管理工具,规则最终仍落到内核 netfilter 执行,所以不存在「两套防火墙同时生效」的冲突,关键是不要混着改。
二、先确认本机用的是哪套防火墙
动手前先判断现状,避免改了 iptables 却被 firewalld 覆盖:
systemctl status firewalld
firewall-cmd --state
iptables -L -n -v --line-numbers- firewalld 处于 running:统一用
firewall-cmd管理,不要直接改 iptables。 - firewalld 未运行但 iptables 有规则:说明使用原生 iptables,注意规则持久化(如 iptables-persistent、iptables-save)。
- 两者都空:可能依赖云安全组,或使用了 nftables 直接管理,用
nft list ruleset确认。
三、端口不通的四步排查法
按「由外到内」顺序排查,避免盲目改配置:
- 查安全组入方向:确认协议、端口、源 IP 段是否放行,注意安全组默认拒绝所有入站。
- 查本机防火墙:
firewall-cmd --list-all看 ports/services;或iptables -L INPUT -n -v看是否有 DROP/REJECT 计数增长。 - 查服务监听:
ss -lntp | grep 8080,若显示 127.0.0.1:8080,说明只监听本机,外部自然不通。 - 查路由与回程:
traceroute、tcpdump -i eth0 port 8080看包是否到达、是否有回包。
经验:iptables 规则里的 pkts 计数持续增长而连接失败,基本可判定为本机防火墙拦截;计数为 0 则问题在更外层或服务未监听。
四、放行端口的正确操作
firewalld 方式
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
firewall-cmd --list-portsiptables 方式(临时验证)
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
iptables -L INPUT -n -v --line-numbers
iptables -D INPUT 1 # 测试后删除注意:-I 插入链首立即生效,适合快速验证是否为防火墙问题;确认无误后应通过 firewalld 或配置管理工具持久化,避免重启丢失或遗留宽松规则。修改 SSH 相关规则前,务必保留一个已登录会话,并先放行当前管理 IP 的 22 端口。
五、上线前检查清单
- 安全组入方向仅放行必要端口,源 IP 尽量收窄,管理端口不暴露 0.0.0.0/0。
- 主机防火墙与安全组规则保持一致,避免「安全组开了、本机拦了」的隐性故障。
- 规则变更后立即新开窗口验证登录与业务端口,确认后再关闭旧会话。
- 开启规则变更记录,定期用
firewall-cmd --list-all与iptables-save备份。 - 对高风险端口做访问频率限制与日志审计,及时发现扫描行为。
在防护建议上,若你希望减少手工维护规则的成本,可关注 AegisX 提供的统一安全策略与访问控制能力,把安全组与主机层规则纳入同一套管理视图,降低漏配风险。
六、行动建议
今天花十分钟做三件事:一是用 systemctl status firewalld 确认本机防火墙类型;二是导出当前安全组与主机规则做一次对照;三是把「安全组→本机防火墙→监听→路由」的排查顺序写成团队便签。防火墙分层不可怕,可怕的是不知道流量在哪一层被拦。把顺序固化下来,下次故障就能少走弯路。
常见问题(FAQ)
服务器防火墙到底是什么,和云安全组是一回事吗?
不是一回事。云安全组是云平台在网络层为实例提供的虚拟防火墙,流量在到达主机前就被过滤;而服务器防火墙(firewalld、iptables)运行在操作系统内部,属于主机层防护。两者是串联关系,任何一层拒绝,连接都会失败,所以放行端口时两层都要检查。
为什么安全组已放行端口,服务还是连不上?
最常见原因是本机防火墙仍拦截。先用 ss -lntp 确认服务在监听,再执行 firewall-cmd --list-all 或 iptables -L -n -v 查看是否有拒绝规则。若本机放行后仍不通,再检查服务是否只监听127.0.0.1、路由与回程是否正常。
firewalld 和 iptables 需要同时配置吗?
通常不需要。firewalld 是 iptables/nftables 的前端管理工具,规则最终仍由内核 netfilter 执行。启用 firewalld 时用 firewall-cmd 管理即可,直接改 iptables 可能被覆盖。确认当前使用哪套:systemctl status firewalld,运行中就用 firewalld 统一管理。
临时测试端口能否用 iptables 直接放行?
可以,但要谨慎。用 iptables -I INPUT -p tcp --dport 8080 -j ACCEPT 插入到链首可立即生效,便于验证是否为防火墙拦截。测试完成后用 iptables -D 删除对应规则,避免遗留宽松规则。生产环境应通过 firewalld 或配置管理工具持久化。
如何避免防火墙规则把自己锁在服务器外?
改规则前先保留一个已登录的SSH会话,并确认放行当前管理IP的22端口;使用 firewall-cmd --add-service=ssh --permanent 后再 reload,不要直接清空规则。云主机还可通过控制台VNC或救援模式兜底,改完立即新开窗口验证登录。