Linux 防火墙配置加固:iptables 与 firewalld 实战指南

在 Web 安全体系中,服务器防火墙是抵御外部攻击的第一道防线。无论是应对端口扫描、暴力破解,还是限制恶意 IP 的访问,合理配置防火墙都能显著降低风险。Linux 平台下最常用的两种防火墙管理工具是 iptablesfirewalld,前者是传统的底层工具,后者是 CentOS 7+/RHEL 7+ 默认的动态防火墙管理器。本文将系统讲解两者的配置方法与加固实践,帮助你构建更安全的服务器环境。

一、iptables 基础与加固规则

iptables 通过表(table)和链(chain)来管理规则。默认的 filter 表包含 INPUTFORWARDOUTPUT 三条链。加固的核心原则是:默认拒绝所有入站流量,仅放行必要端口

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

三、防火墙加固最佳实践

  1. 最小化开放端口:只放行业务必需的端口,关闭 3306、6379 等数据库端口的外网访问。
  2. 修改默认 SSH 端口:将 22 改为非标准端口,减少自动化扫描。
  3. 限制管理来源:通过富规则或 source 参数,仅允许公司出口 IP 访问 SSH。
  4. 启用日志:记录被拒绝的流量,便于分析攻击行为。
    iptables -A INPUT -j LOG --log-prefix "IPT-DROP: "
    
  5. 定期审计规则:使用 iptables -L -n --line-numbersfirewall-cmd --list-all-zones 检查冗余规则。
  6. 结合 Fail2ban:自动分析日志并动态封禁暴力破解 IP,与防火墙形成互补。

四、与 Web 应用安全的协同

防火墙只能控制网络层访问,无法防御 XSS、SQL 注入等应用层攻击。因此需要与代码层防护结合:

  • XSS 防御:对用户输入进行 HTML 实体编码,使用 CSP 响应头限制脚本来源。
  • SQL 注入防御:使用参数化查询(Prepared Statement),避免字符串拼接 SQL。
  • 服务器加固清单:关闭不必要的服务、及时更新补丁、最小权限运行 Web 进程、配置 WAF 作为第二道防线。

防火墙是纵深防御体系中的关键一环,但绝非唯一手段。只有将网络层、系统层、应用层的安全措施有机结合,才能真正提升整体安全水位。

结语

无论是选择 iptables 还是 firewalld,核心思路都是一致的:默认拒绝、按需放行、限制来源、记录异常。建议在生产环境变更前先在测试机验证规则,避免因误封导致服务不可用。掌握本文的配置方法后,你可以根据业务特点定制更精细的防火墙策略,为 Web 应用构建坚实的网络边界。

未经允许不得转载:任鹏个人博客 » Linux 防火墙配置加固:iptables 与 firewalld 实战指南

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏