firewalld通过区域(Zone)分层隔离实现最小权限访问控制,需按服务敏感度划分public、trusted、internal等区域,结合富规则限制源IP与连接频率,并验证配置闭环。

Linux 防火墙不是“开个端口就完事”的开关,而是分层设防的控制中枢。关键服务(如 SSH、HTTP、数据库)必须放在不同信任层级里保护,而不是全扔在 public 区域或裸露在默认规则下。核心是:按服务敏感度划分访问边界,用最小权限原则控制谁、从哪、以什么方式能连进来。
按服务类型划分防火墙区域
firewalld 的 zone 机制天然适配分层策略。不要把所有服务塞进同一个 public 区域:
- 面向公网的 Web 服务(80/443)保留在 public 区,但仅开放必要端口,禁用 ICMP 回显和无关服务(如 ftp、telnet)
- 管理接口(如 SSH)应绑定到独立区域,例如 trusted 或自定义的 admin 区,并限制只允许运维 IP 段接入
- 内部服务(如 Redis、PostgreSQL)部署在 internal 或 dmz 区,禁止 public 区直接访问,仅允许应用服务器所在网段通信
- 数据库监听地址应设为 127.0.0.1 或内网 IP,避免 bind 到 0.0.0.0 —— 防火墙再严,也挡不住本机直连的误配置
用富规则精准控制关键端口
单纯开放端口(firewall-cmd --add-port)不够安全。对高危服务(如 SSH、数据库),必须叠加源地址和连接频率控制:
- 只允许可信 IP 访问 SSH:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.45" port port="22" protocol="tcp" accept' - 对 PostgreSQL(5432)限制来源:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.20.0/24" port port="5432" protocol="tcp" accept' - 拒绝整个恶意网段:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="198.51.100.0/24" reject' - 所有 rich-rule 必须加
--permanent并执行firewall-cmd --reload才生效
iptables 作为底层兜底防线
即使使用 firewalld,也要确保底层 iptables 规则不冲突。尤其当某些工具(如 Docker)会自动插入规则时:
- 检查当前 INPUT 链默认策略:
iptables -nL INPUT | head -2,理想状态是POLICY DROP - 确认 ESTABLISHED/RELATED 规则存在,避免断连:
iptables -C INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 2>/dev/null || echo "缺失状态跟踪规则" - 禁止直接修改 /etc/sysconfig/iptables 文件 —— firewalld 管理的系统应统一用
firewall-cmd操作,否则 reload 时会被覆盖 - 如需精细控制(如限速、geoip 过滤),可在 raw 或 mangle 表中补充规则,但需明确标注用途并文档留存
验证与持续防护闭环
配置完不等于安全了,必须验证+监控形成闭环:
- 用
firewall-cmd --list-all和ss -tlnp对照:确认监听端口与防火墙开放端口一致,且无意外暴露(如 25、110、143) - 从外部 IP 尝试 telnet 或 curl 测试,验证限制是否生效;用
journalctl -u firewalld --since "1 hour ago"查看拦截日志 - 搭配 fail2ban 监控 auth.log,对 SSH 暴力尝试自动封禁 IP;对数据库登录失败也启用类似规则
- 每月运行一次
lynis audit system,检查防火墙状态、未授权开放端口、规则冗余等问题


















