Amazon Linux 防火墙完全指南:从基础到最佳实践
Amazon Linux 是 AWS 推出的专为云环境优化的 Linux 发行版,广泛用于 EC2 实例及其他 AWS 服务中。作为服务器安全的第一道防线,防火墙负责控制网络流量的进出,是保护实例免受未授权访问和恶意攻击的关键组件。
本文将深入解析 Amazon Linux 中的防火墙解决方案,包括 firewalld(Amazon Linux 2 及以上版本默认工具)和 iptables(Amazon Linux 1 及传统场景)的核心概念、配置方法、最佳实践及实战案例。无论你是刚接触 Amazon Linux 的新手,还是需要优化现有防火墙策略的运维人员,本文都将为你提供系统且实用的指导。
目录#
- 简介
- Amazon Linux 防火墙解决方案概述
- firewalld 详解与实践
- 3.1 firewalld 基础概念
- 3.2 安装与启动 firewalld
- 3.3 常用 firewalld 命令
- 3.4 配置永久规则
- 3.5 案例:Web 服务器防火墙配置
- iptables 基础与适用场景
- 4.1 iptables 链与表结构
- 4.2 常用 iptables 命令
- 4.3 保存与恢复规则
- 4.4 案例:限制 SSH 登录频率
- 最佳实践
- 5.1 最小权限原则
- 5.2 规则持久化与备份
- 5.3 结合 AWS Security Groups
- 5.4 定期审计与更新
- 常见问题与故障排除
- 总结
- 参考资料
2. Amazon Linux 防火墙解决方案概述#
Amazon Linux 的防火墙工具选择与其版本密切相关。不同版本默认使用的工具不同,功能和使用方式也有差异。
2.1 Amazon Linux 版本与防火墙工具差异#
| Amazon Linux 版本 | 默认防火墙工具 | 特点 |
|---|---|---|
| Amazon Linux 1 | iptables | 轻量、功能强大,但配置复杂,规则需手动保存,不支持动态更新。 |
| Amazon Linux 2 | firewalld | 动态防火墙管理工具,支持规则实时生效、分区管理,兼容 iptables 底层。 |
| Amazon Linux 2023 | firewalld | 延续 Amazon Linux 2 的设计,默认启用 firewalld,增强安全性和易用性。 |
注意:Amazon Linux 2 及以上版本虽然默认使用 firewalld,但仍可通过 iptables 命令直接操作底层规则(需谨慎,避免与 firewalld 冲突)。
2.2 firewalld vs iptables:核心区别#
| 特性 | firewalld | iptables |
|---|---|---|
| 动态更新 | 支持规则实时生效,无需重启服务。 | 规则更新需重启服务或刷新链,可能中断连接。 |
| 配置方式 | 基于“区域”(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 firewalld3.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 访问 3306 | sudo 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-all3.5 案例:Web 服务器防火墙配置#
需求:某 Amazon Linux 2 EC2 实例作为 Web 服务器,需开放 80(HTTP)、443(HTTPS)端口,仅允许管理员 IP(10.0.0.100)通过 SSH 登录,拒绝其他所有流量。
配置步骤:
-
设置默认区域为 public(公网环境):
sudo firewall-cmd --set-default-zone=public -
永久允许 HTTP/HTTPS 服务:
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https -
仅允许指定 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' -
默认拒绝其他入站流量(public 区域默认策略已为
drop,无需额外配置)。 -
重载规则并验证:
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.v44.4 案例:限制 SSH 登录频率#
需求:通过 iptables 限制单 IP 5 分钟内最多 3 次 SSH 登录尝试(防止暴力破解)。
配置步骤:
-
加载
recent模块(用于跟踪 IP 连接记录):sudo modprobe xt_recent -
添加规则:
# 允许已建立的 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 -
保存规则(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),并定期审计和更新规则,确保实例安全。