Amazon Linux 防火墙完全指南:从基础到最佳实践

Amazon Linux 是 AWS 推出的专为云环境优化的 Linux 发行版,广泛用于 EC2 实例及其他 AWS 服务中。作为服务器安全的第一道防线,防火墙负责控制网络流量的进出,是保护实例免受未授权访问和恶意攻击的关键组件。

本文将深入解析 Amazon Linux 中的防火墙解决方案,包括 firewalld(Amazon Linux 2 及以上版本默认工具)和 iptables(Amazon Linux 1 及传统场景)的核心概念、配置方法、最佳实践及实战案例。无论你是刚接触 Amazon Linux 的新手,还是需要优化现有防火墙策略的运维人员,本文都将为你提供系统且实用的指导。

目录#

  1. 简介
  2. Amazon Linux 防火墙解决方案概述
  3. firewalld 详解与实践
  4. iptables 基础与适用场景
  5. 最佳实践
  6. 常见问题与故障排除
  7. 总结
  8. 参考资料

2. Amazon Linux 防火墙解决方案概述#

Amazon Linux 的防火墙工具选择与其版本密切相关。不同版本默认使用的工具不同,功能和使用方式也有差异。

2.1 Amazon Linux 版本与防火墙工具差异#

Amazon Linux 版本默认防火墙工具特点
Amazon Linux 1iptables轻量、功能强大,但配置复杂,规则需手动保存,不支持动态更新。
Amazon Linux 2firewalld动态防火墙管理工具,支持规则实时生效、分区管理,兼容 iptables 底层。
Amazon Linux 2023firewalld延续 Amazon Linux 2 的设计,默认启用 firewalld,增强安全性和易用性。

注意:Amazon Linux 2 及以上版本虽然默认使用 firewalld,但仍可通过 iptables 命令直接操作底层规则(需谨慎,避免与 firewalld 冲突)。

2.2 firewalld vs iptables:核心区别#

特性firewalldiptables
动态更新支持规则实时生效,无需重启服务。规则更新需重启服务或刷新链,可能中断连接。
配置方式基于“区域”(Zone)和“服务”(Service),抽象度高。直接操作“链”(Chain)和“规则”(Rule),更底层。
规则持久化内置 --permanent 参数,自动保存到配置文件。需手动执行 iptables-save 或通过服务保存。
适用场景快速配置、日常管理、动态环境。复杂规则、定制化需求、脚本自动化。

3. firewalld 详解与实践#

firewalld 是 Amazon Linux 2/2023 的默认防火墙工具,设计目标是简化防火墙管理并支持动态规则更新。

3.1 firewalld 基础概念#

  • 区域(Zone):预定义的规则集合,用于快速切换防火墙策略(如 public、internal、dmz 等)。每个区域包含允许的端口/服务和源 IP 限制。
    • public:默认区域,适用于公网环境,仅允许必要服务(如 SSH)。
    • internal:适用于内部网络,允许更多信任服务(如文件共享)。
  • 服务(Service):预定义的端口集合(如 ssh 对应 22 端口,http 对应 80 端口),简化端口配置。
  • 富规则(Rich Rule):支持更复杂的条件匹配(如 IP 段、端口范围、日志记录)。

3.2 安装与启动 firewalld#

Amazon Linux 2/2023 默认已预装 firewalld,若未安装可手动安装:

# 安装 firewalld
sudo yum install firewalld -y
 
# 启动并设置开机自启
sudo systemctl start firewalld
sudo systemctl enable firewalld
 
# 检查状态(running 表示正常运行)
sudo systemctl status firewalld

3.3 常用 firewalld 命令#

功能命令
查看当前区域sudo firewall-cmd --get-active-zones
查看区域规则sudo firewall-cmd --list-all [--zone=public]
切换默认区域sudo firewall-cmd --set-default-zone=internal
允许 SSH 服务(临时)sudo firewall-cmd --add-service=ssh
允许 8080 端口(TCP)sudo firewall-cmd --add-port=8080/tcp
拒绝 ICMP(ping)sudo firewall-cmd --add-rich-rule='rule protocol value=icmp drop'
允许特定 IP 访问 3306sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'

3.4 配置永久规则#

临时规则(未加 --permanent)在防火墙重启后失效,永久规则需添加 --permanent 参数并重新加载:

# 永久允许 HTTP/HTTPS 服务
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
 
# 永久开放 8080 端口(TCP)
sudo firewall-cmd --permanent --add-port=8080/tcp
 
# 重新加载规则(使永久规则生效)
sudo firewall-cmd --reload
 
# 验证永久规则
sudo firewall-cmd --permanent --list-all

3.5 案例:Web 服务器防火墙配置#

需求:某 Amazon Linux 2 EC2 实例作为 Web 服务器,需开放 80(HTTP)、443(HTTPS)端口,仅允许管理员 IP(10.0.0.100)通过 SSH 登录,拒绝其他所有流量。

配置步骤:

  1. 设置默认区域为 public(公网环境):

    sudo firewall-cmd --set-default-zone=public
  2. 永久允许 HTTP/HTTPS 服务:

    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --permanent --add-service=https
  3. 仅允许指定 IP 访问 SSH:

    # 先移除默认 SSH 规则(若存在)
    sudo firewall-cmd --permanent --remove-service=ssh
    # 添加富规则限制源 IP
    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.100" service name="ssh" accept'
  4. 默认拒绝其他入站流量(public 区域默认策略已为 drop,无需额外配置)。

  5. 重载规则并验证:

    sudo firewall-cmd --reload
    sudo firewall-cmd --list-all

验证结果:

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: http https
  ports: 
  protocols: 
  forward: no
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
    rule family="ipv4" source address="10.0.0.100" service name="ssh" accept

4. iptables 基础与适用场景#

iptables 是传统的 Linux 防火墙工具,适用于 Amazon Linux 1 或需要复杂规则定制的场景。其核心是通过“表”和“链”过滤网络流量。

4.1 iptables 链与表结构#

  • 表(Table):按功能分类的规则集合,常用表:

    • filter(默认):用于过滤流量(INPUT/OUTPUT/FORWARD 链)。
    • nat:用于网络地址转换(如端口映射)。
    • mangle:用于修改数据包(如 TTL)。
  • 链(Chain):按流量方向定义的规则序列,常用链:

    • INPUT:入站流量(目标为本机)。
    • OUTPUT:出站流量(源为本机)。
    • FORWARD:转发流量(通过本机转发)。
  • 规则(Rule):对数据包的操作(ACCEPT/DROP/REJECT),按顺序匹配,命中即停止。

4.2 常用 iptables 命令#

功能命令
查看规则(filter 表)sudo iptables -L -n --line-numbers(-n 数字显示 IP/端口,--line-numbers 显示序号)
允许 SSH 入站sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
允许已建立的连接sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
默认拒绝入站流量sudo iptables -P INPUT DROP
删除第 3 条规则sudo iptables -D INPUT 3
限制单 IP 并发连接数sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT

4.3 保存与恢复规则#

iptables 规则默认保存在内存中,重启后丢失,需手动保存:

# Amazon Linux 1 保存规则(通过 service 命令)
sudo service iptables save  # 规则保存到 /etc/sysconfig/iptables
 
# 手动保存到文件
sudo iptables-save > /etc/iptables/rules.v4
 
# 恢复规则
sudo iptables-restore < /etc/iptables/rules.v4

4.4 案例:限制 SSH 登录频率#

需求:通过 iptables 限制单 IP 5 分钟内最多 3 次 SSH 登录尝试(防止暴力破解)。

配置步骤:

  1. 加载 recent 模块(用于跟踪 IP 连接记录):

    sudo modprobe xt_recent
  2. 添加规则:

    # 允许已建立的 SSH 连接
    sudo iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT
     
    # 限制 5 分钟内(300 秒)最多 3 次尝试
    sudo iptables -A INPUT -p tcp --dport 22 -m recent --name ssh_limit --rcheck --seconds 300 --hitcount 3 -j DROP
    sudo iptables -A INPUT -p tcp --dport 22 -m recent --name ssh_limit --set -j ACCEPT
  3. 保存规则(Amazon Linux 1):

    sudo service iptables save

5. 最佳实践#

5.1 最小权限原则#

仅开放必要的端口/服务,例如:

  • Web 服务器无需开放 3306(MySQL)端口给公网,仅允许应用服务器 IP 访问。
  • 生产环境禁用 ICMP(ping)响应,避免被网络扫描。

5.2 规则持久化与备份#

  • firewalld:始终使用 --permanent 参数,定期备份配置文件(/etc/firewalld/)。
  • iptables:通过 iptables-save 保存规则到文件,定期备份至 S3 或本地。

5.3 结合 AWS Security Groups#

AWS Security Groups 是实例级别的防火墙(网络层),主机防火墙(firewalld/iptables)是补充:

  • Security Groups:控制 VPC 内外的流量(如只允许公司 IP 段访问 SSH)。
  • 主机防火墙:精细化控制实例内部流量(如限制特定进程的端口访问)。

示例:Security Groups 开放 22 端口给 0.0.0.0/0(测试环境),主机防火墙进一步限制仅允许管理员 IP 登录。

5.4 定期审计与更新#

  • 每周使用 firewall-cmd --list-all 或 iptables -L 审计规则,移除冗余规则。
  • 结合 AWS Config 或第三方工具(如 Wazuh)监控防火墙配置变更。

6. 常见问题与故障排除#

6.1 规则不生效问题#

  • firewalld:
    • 忘记添加 --permanent 或未执行 firewall-cmd --reload。
    • 规则顺序错误(如拒绝规则在允许规则之前)。
  • iptables:
    • 默认策略为 ACCEPT(未执行 iptables -P INPUT DROP)。
    • 未允许已建立的连接(缺少 -m state --state ESTABLISHED,RELATED 规则)。

6.2 服务冲突排查#

  • 同时运行 firewalld 和 iptables 会导致规则冲突,需关闭其中一个:
    # 关闭 iptables(若使用 firewalld)
    sudo systemctl stop iptables && sudo systemctl disable iptables

6.3 日志分析#

  • firewalld:通过 journalctl 查看日志:
    sudo journalctl -u firewalld -f  # 实时查看防火墙日志
  • iptables:添加 LOG 规则记录被拒绝的流量:
    sudo iptables -A INPUT -j LOG --log-prefix "DROP: " --log-level 6  # 记录到 /var/log/messages

7. 总结#

Amazon Linux 防火墙是实例安全的重要保障,选择 firewalld 还是 iptables 需根据版本和需求:

  • firewalld:适合快速配置、动态更新,推荐 Amazon Linux 2/2023 用户使用。
  • iptables:适合复杂规则、脚本自动化,适用于 Amazon Linux 1 或定制化场景。

无论使用哪种工具,核心原则是最小权限、规则持久化、多层防御(结合 AWS Security Groups),并定期审计和更新规则,确保实例安全。

8. 参考资料#

  1. Amazon Linux 2 官方文档 - 防火墙
  2. firewalld 官方指南
  3. iptables 手册
  4. AWS Security Best Practices
  5. Amazon Linux 2023 防火墙配置