name: 配置防火墙 description: 配置主机基础防火墙(iptables、nftables、UFW)和云安全组(AWS、GCP、Azure),提供常见场景如Web服务器、数据库和堡垒主机的实用规则。用于服务暴露、服务器加固或实施网络分段防御策略。
配置防火墙
目的
指导工程师通过配置防火墙,涵盖主机基础(iptables、nftables、UFW)、云基础(AWS安全组、NACLs)和容器基础(Kubernetes NetworkPolicies)环境,提供实用规则示例和安全模式,以防止锁定和安全配置错误。
何时使用此技能
触发短语:
- “为[服务器/服务]配置防火墙”
- “为[AWS资源]设置安全组”
- “允许端口[X]通过防火墙”
- “阻止IP地址[X.X.X.X]”
- “在Ubuntu服务器上设置UFW”
- “创建iptables/nftables规则”
- “配置堡垒主机防火墙”
- “实施出口过滤”
常见场景:
- 初始服务器设置和加固
- 暴露新服务(Web服务器、API、数据库)
- 实施网络分段
- 创建堡垒主机或跳转盒
- 从iptables迁移到nftables
- 配置云安全组
- 故障排除连接问题
决策框架:选择哪个防火墙工具?
云环境
AWS:
- 实例级控制 → 安全组(有状态,仅允许规则)
- 子网级执行 → 网络ACLs(无状态,允许 + 拒绝规则)
- 两者结合用于深度防御
GCP:
- 使用 VPC防火墙规则(有状态,基于优先级)
Azure:
- 使用 网络安全组(NSGs)(有状态,基于优先级)
主机基础Linux防火墙
Ubuntu/Debian + 简单性:
- 使用 UFW(简化防火墙)- 推荐给大多数用户
- iptables/nftables的前端,简化语法
RHEL/CentOS/Fedora:
- 使用 firewalld(Red Hat生态系统的默认)
- 基于区域的配置,动态更新
现代发行版 + 高级控制:
- 使用 nftables(最佳性能,现代标准)
- O(log n) 性能 vs iptables O(n)
- 统一IPv4/IPv6/NAT语法
遗留系统:
- 使用 iptables(可行时迁移到nftables)
- 旧内核(< 4.14)必需
Kubernetes/容器
- 使用 NetworkPolicies(需要CNI插件:Calico、Cilium、Weave)
- 参见references/k8s-networkpolicies.md
有状态 vs 无状态
有状态(推荐大多数情况):
- 自动允许返回流量
- 配置更简单
- 示例:安全组、UFW、nftables默认
无状态(专用用途):
- 必须明确允许双向流量
- 更细粒度控制,较少状态跟踪
- 示例:网络ACLs、自定义nftables规则
快速启动示例
UFW(Ubuntu/Debian)
# 1. 设置默认
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 2. 关键:在启用前允许SSH(防止锁定)
sudo ufw allow ssh
sudo ufw limit ssh # 速率限制以防止暴力攻击
# 3. 允许Web流量
sudo ufw allow http # 端口80
sudo ufw allow https # 端口443
# 4. 允许来自特定IP(例如数据库访问)
sudo ufw allow from 192.168.1.100 to any port 5432
# 5. 启用防火墙
sudo ufw enable
# 6. 验证规则
sudo ufw status verbose
完整UFW模式,见references/ufw-patterns.md
nftables(现代Linux)
#!/usr/sbin/nft -f
# /etc/nftables.conf
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# 接受回环
iif "lo" accept
# 接受已建立连接(有状态)
ct state established,related accept
# 丢弃无效数据包
ct state invalid drop
# 允许SSH
tcp dport 22 accept
# 允许HTTP/HTTPS
tcp dport { 80, 443 } accept
# 记录丢弃的数据包
log prefix "nftables-drop: " drop
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
应用:sudo nft -f /etc/nftables.conf
启动时启用:sudo systemctl enable nftables
高级模式(集合、映射),见references/nftables-patterns.md
AWS安全组(Terraform)
# Web服务器安全组
resource "aws_security_group" "web" {
name = "web-server-sg"
description = "Web服务器安全组"
vpc_id = aws_vpc.main.id
# 允许来自任何地方的HTTP/HTTPS
ingress {
description = "来自任何地方的HTTPS"
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
# 仅允许来自堡垒的SSH
ingress {
description = "来自堡垒的SSH"
from_port = 22
to_port = 22
protocol = "tcp"
security_groups = [aws_security_group.bastion.id]
}
# 允许所有出站
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "web-server-sg"
}
}
安全组与NACLs指南,见references/aws-security-groups.md
安全检查清单
启用任何防火墙前:
- [ ] 总是在启用前允许SSH(防止锁定)
- [ ] 在启用前测试规则(尽可能干运行)
- [ ] 启用日志记录以调试
- [ ] 在版本控制(Git)中记录规则
- [ ] 外部验证使用nmap:
nmap -Pn <服务器-ip> - [ ] 拥有控制台访问(云)或物理访问(本地)
- [ ] 从默认拒绝开始,明确允许所需流量
- [ ] 对SSH使用速率限制(
ufw limit ssh)
常见模式
模式1:基础Web服务器
要求:
- 允许来自任何地方的HTTP(80)和HTTPS(443)
- 仅允许来自特定IP或堡垒的SSH
- 默认拒绝所有其他入站流量
UFW:
sudo ufw default deny incoming
sudo ufw allow from 203.0.113.0/24 to any port 22 # 办公室IP
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
nftables: 见references/nftables-patterns.md完整示例
AWS安全组: 见references/aws-security-groups.md Terraform模块
模式2:数据库服务器(私有)
要求:
- 仅允许来自应用层的数据库端口(5432、3306等)
- 无公共互联网访问
- 仅允许来自堡垒的SSH
见references/database-patterns.md实现
模式3:堡垒主机(跳转盒)
目的: SSH访问的单一加固入口点
见references/bastion-pattern.md完整实现
模式4:出口过滤
目的: 控制出站流量以防止数据泄露
见references/egress-filtering.md实现
关键概念
有状态防火墙
跟踪连接状态(已建立、相关、新):
- 自动允许返回流量
- 规则配置更简单
- 使用:安全组、UFW、nftables(默认)
无状态防火墙
无连接跟踪:
- 必须明确允许双向流量
- 必须为返回流量允许临时端口(1024-65535)
- 使用:网络ACLs
深度防御
多层防火墙控制:
- 云: 安全组 + NACLs
- 主机: UFW/nftables + fail2ban
- 容器: NetworkPolicies
规则评估
安全组(AWS): 所有规则评估,最宽松者胜 网络ACLs(AWS): 顺序评估,首次匹配胜 nftables/iptables: 顺序,首次匹配胜 UFW: 按规则编号顺序
通用最佳实践
- 默认拒绝: 从拒绝所有开始,明确允许所需流量
- 最小权限原则: 仅打开必要端口/IP
- 不在敏感端口上使用0.0.0.0/0: 永远不允许来自任何地方的SSH/RDP/数据库
- 版本控制: 在Git中存储防火墙规则
- 日志记录: 启用并监控防火墙日志
- 定期审计: 每季度审查规则,移除未使用
- 不要混合工具: 避免同时运行iptables和nftables
- 在生产前测试: 首先使用暂存环境
高级主题
堡垒主机架构: 见references/bastion-pattern.md单一入口点模式
DMZ(非军事区): 见references/dmz-pattern.md网络分段
出口过滤: 见references/egress-filtering.md出站流量控制
Kubernetes NetworkPolicies: 见references/k8s-networkpolicies.md Pod到Pod隔离
迁移iptables到nftables: 见references/migration-guide.md转换过程
云防火墙比较:
- AWS:references/aws-security-groups.md
- GCP:references/gcp-firewall.md
- Azure:references/azure-nsg.md
故障排除
“我通过SSH锁定了自己”:
- 云:使用控制台/会话管理器访问
- 本地:物理控制台访问或IPMI/iLO
- 预防:总是在启用防火墙前允许SSH
连接超时:
- 检查防火墙是否阻止流量:
sudo ufw status或sudo nft list ruleset - 验证服务是否监听:
ss -tuln | grep <端口> - 外部测试:
nmap -Pn <ip> -p <端口> - 检查日志:
/var/log/ufw.log或journalctl -u nftables
AWS:临时端口问题:
- NACLs需要返回流量:允许1024-65535入站
- 安全组是有状态(无需临时配置)
Kubernetes Pods无法通信:
- 检查NetworkPolicies:
kubectl get networkpolicies -n <命名空间> - 验证CNI插件支持NetworkPolicies(Calico、Cilium)
- 先测试无策略
完整故障排除指南,见references/troubleshooting.md
常见错误避免
❌ 在SSH/RDP上允许0.0.0.0/0 → 使用堡垒或VPN ❌ 忘记启用防火墙 → 规则配置但未激活 ❌ 不在启用前测试 → 锁定风险 ❌ 在NACLs中遗漏临时端口 → 返回流量被阻止 ❌ 同时运行iptables + nftables → 冲突和不可预测行为 ❌ 无日志记录 → 无法调试或审计 ❌ 大端口范围 → 不必要的攻击面 ❌ 不记录规则 → 未来混淆
工具特定命令
UFW
# 状态
sudo ufw status verbose
sudo ufw status numbered
# 添加规则
sudo ufw allow <端口>/<协议>
sudo ufw allow from <ip> to any port <端口>
sudo ufw limit ssh # 速率限制
# 删除规则
sudo ufw delete <规则编号>
sudo ufw delete allow 80/tcp
# 日志记录
sudo ufw logging on
tail -f /var/log/ufw.log
# 重置(禁用并移除所有规则)
sudo ufw reset
nftables
# 列出规则集
sudo nft list ruleset
# 加载配置
sudo nft -f /etc/nftables.conf
# 刷新所有规则
sudo nft flush ruleset
# 动态添加规则
sudo nft add rule inet filter input tcp dport 8080 accept
# 启动时启用
sudo systemctl enable nftables
iptables
# 列出规则
sudo iptables -L -v -n
sudo iptables -L INPUT --line-numbers
# 添加规则
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 删除规则
sudo iptables -D INPUT <规则编号>
# 保存规则
sudo netfilter-persistent save # Debian/Ubuntu
sudo service iptables save # RHEL/CentOS
AWS CLI
# 列出安全组
aws ec2 describe-security-groups --group-ids sg-xxxxx
# 列出NACLs
aws ec2 describe-network-acls --network-acl-ids acl-xxxxx
# 添加规则到安全组
aws ec2 authorize-security-group-ingress \
--group-id sg-xxxxx \
--protocol tcp \
--port 443 \
--cidr 0.0.0.0/0
基础设施即代码方法,使用Terraform(见references/aws-security-groups.md)
示例目录
完整工作示例可在:
examples/ufw/- UFW配置脚本examples/nftables/- nftables规则集examples/iptables/- iptables规则脚本examples/terraform-aws/- AWS安全组和NACLsexamples/terraform-gcp/- GCP防火墙规则examples/terraform-azure/- Azure NSGsexamples/kubernetes/- NetworkPolicy清单
集成点
相关技能:
-
security-hardening - 防火墙是服务器加固的组成部分。见security-hardening技能用于SSH加固、fail2ban、auditd和SELinux。
-
building-ci-pipelines - CI运行器需要网络访问仓库和工件存储。为自托管运行器配置防火墙规则。
-
deploying-applications - 应用程序需要服务暴露的防火墙规则。见deploying-applications集成。
-
infrastructure-as-code - 使用Terraform/CloudFormation将防火墙作为代码管理。见infrastructure-as-code用于IaC最佳实践。
-
kubernetes-operations - 超越基础NetworkPolicies的K8s网络。见kubernetes-operations用于服务、Ingress和CNI配置。
-
network-architecture - 更广泛的网络设计模式。见network-architecture用于VPC设计、子网和路由。
参考文件
工具特定指南:
- references/ufw-patterns.md - 完整UFW指南及示例
- references/nftables-patterns.md - nftables语法、集合、映射、日志记录
- references/iptables-patterns.md - iptables基础及迁移路径
- references/migration-guide.md - 转换iptables到nftables
云提供商指南:
- references/aws-security-groups.md - 安全组与NACLs及Terraform
- references/gcp-firewall.md - GCP VPC防火墙规则
- references/azure-nsg.md - Azure网络安全组
高级模式:
- references/bastion-pattern.md - 跳转盒架构
- references/dmz-pattern.md - 网络分段与DMZ
- references/egress-filtering.md - 出站流量控制
- references/k8s-networkpolicies.md - Kubernetes Pod隔离
支持:
- references/troubleshooting.md - 常见问题及解决方案
- references/decision-tree.md - 工具选择视觉指南