CentOS 防火墙保护 Web 服务器的实用方案
一 基础防护思路
- 在 CentOS 7/8 上默认使用 firewalld 管理防火墙,遵循“最小暴露面”原则:只开放业务必需端口(如 HTTP 80/TCP、HTTPS 443/TCP),其余端口默认拒绝;同时将 SSH 22/TCP 按需开放并尽量限制来源。若系统未安装或未运行 firewalld,应先安装并启动服务,再设置开机自启。以上做法可显著降低被扫描与入侵的风险。
二 快速配置步骤 firewalld
- 启动与开机自启
- 启动:sudo systemctl start firewalld
- 开机自启:sudo systemctl enable firewalld
- 查看状态:firewall-cmd --state
- 放行 Web 与 SSH
- 推荐按“服务”放行:sudo firewall-cmd --permanent --add-service=http
- sudo firewall-cmd --permanent --add-service=https
- sudo firewall-cmd --permanent --add-service=ssh
- 使配置生效:sudo firewall-cmd --reload
- 验证规则
- 查看当前区域规则:firewall-cmd --list-all(应看到 services 中包含 http、https、ssh)
- 按需开放自定义端口
- 例如仅开放 8080/TCP:sudo firewall-cmd --permanent --add-port=8080/tcp && sudo firewall-cmd --reload
- 常用维护
- 移除端口:sudo firewall-cmd --permanent --remove-port=8080/tcp && sudo firewall-cmd --reload
- 查询端口:firewall-cmd --zone=public --list-ports
以上命令覆盖最常用的 Web 场景,适合 Apache/Nginx 部署。
三 进阶安全控制
- 限制来源 IP 访问
- 仅允许 192.168.1.100 访问 80/TCP:sudo firewall-cmd --permanent --zone=public --add-rich-rule=‘rule family=“ipv4” source address=“192.168.1.100” port protocol=“tcp” port=“80” accept’ && sudo firewall-cmd --reload
- 限制连接频率缓解暴力扫描
- 全局限制新连接速率(示例为每 5 分钟最多 5 个新连接):sudo firewall-cmd --permanent --add-rich-rule=‘rule family=“ipv4” source address=“0.0.0.0/0” limit value=“5/m” accept’ && sudo firewall-cmd --reload
- 区域与接口精细化
- 将管理网口放入更可信区域(如 trusted):sudo firewall-cmd --permanent --zone=trusted --change-interface=eth1
- 查看与切换默认区域:firewall-cmd --get-zones / sudo firewall-cmd --set-default-zone=public
- 开启日志便于审计
- 编辑 /etc/firewalld/firewalld.conf:log-level=info,log-prefix=firewall:;重启服务:sudo systemctl restart firewalld
以上措施在不影响正常业务的前提下,有效降低暴力尝试与滥用风险。
四 与云环境及系统配合
- 云服务器需同时配置“系统防火墙 + 云安全组/NACL”,两者是叠加关系;仅放行 80/443(以及必要的 22)到 Web 实例,数据库、缓存等后端端口禁止从公网直达。
- 若使用 Apache,在 firewalld 放行后,按需调整 SELinux 布尔值以允许网络访问(如反向代理、数据库连接等):sudo setsebool -P httpd_can_network_connect 1;如涉及发信,可开启 httpd_can_sendmail。完成后重启 httpd 服务。
- 远程管理端口(如 22)建议结合来源 IP 白名单、禁用 root 登录、使用密钥登录,并考虑端口变更与 fail2ban 联动,进一步降低暴力破解成功率。
五 验证与排错清单
- 规则是否生效:firewall-cmd --list-all(核对 services/ports/rich rules)
- 端口连通性:ss -tlnp | grep -E ‘:(80|443|22)’; 外部可用 curl -I http://服务器IP 或 openssl s_client -connect 服务器IP:443 测试
- 服务状态:systemctl status firewalld(确保 Active: running)
- 日志排查:journalctl -u firewalld -f(结合 firewalld.conf 的日志级别)
- 若之前使用 iptables 且切换回 firewalld,注意避免规则冲突;必要时停用 iptables 服务并使用 firewalld 统一管理。