在 Web 安全体系中,服务器防火墙是抵御外部攻击的第一道防线。无论是应对端口扫描、暴力破解,还是限制恶意 IP 的访问,合理配置防火墙都能显著降低风险。Linux 平台下最常用的两种防火墙管理工具是 iptables 和 firewalld,前者是传统的底层工具,后者是 CentOS 7+/RHEL 7+ 默认的动态防火墙管理器。本文将系统讲解两者的配置方法与加固实践,帮助你构建更安全的服务器环境。
一、iptables 基础与加固规则
iptables 通过表(table)和链(chain)来管理规则。默认的 filter 表包含 INPUT、FORWARD、OUTPUT 三条链。加固的核心原则是:默认拒绝所有入站流量,仅放行必要端口。
1. 查看与清空现有规则
iptables -L -n -v # 查看当前规则
iptables -F # 清空所有规则
iptables -X # 删除自定义链
iptables -Z # 计数器归零
2. 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
注意:在远程 SSH 连接下,直接设置 INPUT DROP 可能导致自己断连。建议先放行 SSH 端口再修改默认策略。
3. 放行必要服务
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接和相关流量
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 放行 SSH(建议修改默认端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 放行 HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许 ICMP ping(可选)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
4. 防御常见攻击
# 限制 SSH 暴力破解:每分钟最多 4 个新连接
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
# 阻止非法 TCP 标志组合(如 XMAS 扫描)
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# 限制 ICMP 洪水
iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A INPUT -p icmp -j DROP
5. 保存规则
# Debian/Ubuntu
iptables-save > /etc/iptables/rules.v4
# CentOS 7 之前
service iptables save
二、firewalld 配置与加固
firewalld 引入了 zone(区域)概念,支持运行时与永久配置分离,更适合动态环境。
1. 基本操作
systemctl start firewalld
systemctl enable firewalld
firewall-cmd --state
2. 区域与接口管理
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone=public
firewall-cmd --zone=public --list-all
3. 放行服务与端口
# 永久放行 HTTP/HTTPS
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 放行自定义端口
firewall-cmd --permanent --add-port=8080/tcp
# 重新加载使永久规则生效
firewall-cmd --reload
4. 富规则(Rich Rules)实现精细控制
# 仅允许 192.168.1.0/24 访问 MySQL
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
# 拒绝某恶意 IP
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.5" reject'
# 限制 SSH 连接频率
firewall-cmd --permanent --add-rich-rule='rule service name="ssh" limit value="4/m" accept'
5. 应急封禁 IP
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="198.51.100.7" drop'
firewall-cmd --reload
三、防火墙加固最佳实践
- 最小化开放端口:只放行业务必需的端口,关闭 3306、6379 等数据库端口的外网访问。
- 修改默认 SSH 端口:将 22 改为非标准端口,减少自动化扫描。
- 限制管理来源:通过富规则或
source参数,仅允许公司出口 IP 访问 SSH。 - 启用日志:记录被拒绝的流量,便于分析攻击行为。
iptables -A INPUT -j LOG --log-prefix "IPT-DROP: " - 定期审计规则:使用
iptables -L -n --line-numbers或firewall-cmd --list-all-zones检查冗余规则。 - 结合 Fail2ban:自动分析日志并动态封禁暴力破解 IP,与防火墙形成互补。
四、与 Web 应用安全的协同
防火墙只能控制网络层访问,无法防御 XSS、SQL 注入等应用层攻击。因此需要与代码层防护结合:
- XSS 防御:对用户输入进行 HTML 实体编码,使用 CSP 响应头限制脚本来源。
- SQL 注入防御:使用参数化查询(Prepared Statement),避免字符串拼接 SQL。
- 服务器加固清单:关闭不必要的服务、及时更新补丁、最小权限运行 Web 进程、配置 WAF 作为第二道防线。
防火墙是纵深防御体系中的关键一环,但绝非唯一手段。只有将网络层、系统层、应用层的安全措施有机结合,才能真正提升整体安全水位。
结语
无论是选择 iptables 还是 firewalld,核心思路都是一致的:默认拒绝、按需放行、限制来源、记录异常。建议在生产环境变更前先在测试机验证规则,避免因误封导致服务不可用。掌握本文的配置方法后,你可以根据业务特点定制更精细的防火墙策略,为 Web 应用构建坚实的网络边界。
未经允许不得转载:任鹏个人博客 » Linux 防火墙配置加固:iptables 与 firewalld 实战指南


朋友圈点赞图在线生成源码