关于 configuring-firewalls
面向工程师的防火墙配置技能,覆盖 Linux 主机、云网络和 Kubernetes,并提供工具选择建议、规则示例及防止误配置和失去访问的安全措施。
主要功能
- 01覆盖主机、云端和容器防火墙
- 02提供防火墙工具选择建议
- 03附带规则示例与配置模式
- 04提供防止失联的安全检查
- 05涵盖故障排查与迁移
适用场景
- 01限制新部署服务的网络访问
- 02配置云安全组和 NACL
- 03设置 Kubernetes Pod 网络策略
- 04排查连接受阻或防火墙规则问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ancoleman/ ai-design-components --skill configuring-firewalls安装后在 Claude Code 中输入/configuring-firewalls确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
outputs.yamlexamples/kubernetes/default-deny-allow-dns.yamlexamples/nftables/web-server.nftexamples/terraform-aws/three-tier-architecture.tfexamples/ufw/basic-web-server.shreferences/aws-security-groups.mdazure-nsg.mdbastion-pattern.mddatabase-patterns.mddecision-tree.mddmz-pattern.mdegress-filtering.mdgcp-firewall.mdiptables-patterns.mdk8s-networkpolicies.mdmigration-guide.mdnftables-patterns.mdtroubleshooting.mdufw-patterns.md详细介绍
配置防火墙
目的
指导工程师在基于主机(iptables、nftables、UFW)、基于云(AWS Security Groups、NACL)和基于容器(Kubernetes NetworkPolicies)的环境中配置防火墙,并提供实用的规则示例和安全模式,以防止失去访问权限和安全配置错误。
何时使用此技能
触发短语:
- “为 [server/service] 配置防火墙”
- “为 [AWS resource] 设置安全组”
- “允许防火墙通过端口 [X]”
- “封锁 IP 地址 [X.X.X.X]”
- “在 Ubuntu 服务器上设置 UFW”
- “创建 iptables/nftables 规则”
- “配置堡垒主机防火墙”
- “实施出口流量过滤”
常见场景:
- 初始服务器设置和加固
- 暴露新服务(Web 服务器、API、数据库)
- 实施网络分段
- 创建堡垒主机或跳板机
- 从 iptables 迁移到 nftables
- 配置云安全组
- 排查连接问题
决策框架:选择哪种防火墙工具?
云环境
AWS:
- 实例级控制 → Security Groups(有状态,仅允许规则)
- 子网级强制执行 → Network ACLs(无状态,包含允许和拒绝规则)
- 同时使用两者进行纵深防御
GCP:
- 使用 VPC Firewall Rules(有状态,基于优先级)
Azure:
- 使用 Network Security Groups(NSG)(有状态,基于优先级)
基于主机的 Linux 防火墙
Ubuntu/Debian + 简洁配置:
- 使用 UFW(Uncomplicated Firewall)——推荐大多数用户使用
- iptables/nftables 的前端,语法更简单
RHEL/CentOS/Fedora:
- 使用 firewalld(Red Hat 生态系统的默认工具)
- 基于区域的配置,支持动态更新
现代发行版 + 高级控制:
- 使用 nftables(性能最佳的现代标准)
- 性能为 O(log n),而 iptables 为 O(n)
- 统一的 IPv4/IPv6/NAT 语法
旧版系统:
- 使用 iptables(条件允许时迁移到 nftables)
- 较旧的内核(< 4.14)必需
Kubernetes/容器
- 使用 NetworkPolicies(需要 CNI 插件:Calico、Cilium、Weave)
- 参见 references/k8s-networkpolicies.md
有状态与无状态
有状态(大多数情况下推荐):
- 自动允许返回流量
- 配置更简单
- 示例:Security Groups、UFW、nftables 默认配置
无状态(特殊用途):
- 必须显式允许两个方向的流量
- 控制更精细,状态跟踪更少
- 示例:Network ACL、定制 nftables 规则
快速入门示例
UFW(Ubuntu/Debian)
# 1. Set defaults
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 2. CRITICAL: Allow SSH before enabling (prevent lockout)
sudo ufw allow ssh
sudo ufw limit ssh # Rate-limit to prevent brute force
# 3. Allow web traffic
sudo ufw allow http # Port 80
sudo ufw allow https # Port 443
# 4. Allow from specific IP (e.g., database access)
sudo ufw allow from 192.168.1.100 to any port 5432
# 5. Enable firewall
sudo ufw enable
# 6. Verify rules
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;
# Accept loopback
iif "lo" accept
# Accept established connections (stateful)
ct state established,related accept
# Drop invalid packets
ct state invalid drop
# Allow SSH
tcp dport 22 accept
# Allow HTTP/HTTPS
tcp dport { 80, 443 } accept
# Log dropped packets
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 Security Groups(Terraform)
# Web server security group
resource "aws_security_group" "web" {
name = "web-server-sg"
description = "Security group for web servers"
vpc_id = aws_vpc.main.id
# Allow HTTP/HTTPS from anywhere
ingress {
description = "HTTPS from anywhere"
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
# Allow SSH from bastion only
ingress {
description = "SSH from bastion"
from_port = 22
to_port = 22
protocol = "tcp"
security_groups = [aws_security_group.bastion.id]
}
# Allow all outbound
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "web-server-sg"
}
}
Security Groups 与 NACL 的指南请参见 references/aws-security-groups.md
安全检查清单
启用任何防火墙之前:
- 始终先允许 SSH,再启用防火墙(防止失去访问权限)
- 启用前测试规则(尽可能进行试运行)
- 启用日志记录以便调试
- 将规则记录在版本控制系统(Git)中
- 使用 nmap 从外部验证:
nmap -Pn <server-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 # Office IP
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
nftables: 完整示例请参见 references/nftables-patterns.md
AWS Security Group: Terraform 模块请参见 references/aws-security-groups.md
模式 2:数据库服务(私有)
要求:
- 仅允许应用层访问数据库端口(5432、3306 等)
- 不允许访问公共互联网
- 仅允许通过堡垒机进行 SSH 访问
实现方法请参阅 references/database-patterns.md
模式 3:堡垒主机(跳板机)
用途: 为 SSH 访问提供单一的加固入口
完整实现方法请参阅 references/bastion-pattern.md
模式 4:出口流量过滤
用途: 控制出站流量,防止数据外泄
实现方法请参阅 references/egress-filtering.md
核心概念
有状态防火墙
跟踪连接状态(已建立、相关、新建):
- 自动允许返回流量
- 规则配置更简单
- 用于:安全组、UFW、nftables(默认)
无状态防火墙
不跟踪连接:
- 必须明确允许两个方向的流量
- 必须允许临时端口(1024-65535)用于返回流量
- 用于:网络 ACL
深度防御
分层部署多种防火墙控制:
- 云端: 安全组 + NACL
- 主机: UFW/nftables + fail2ban
- 容器: NetworkPolicies
规则评估
安全组(AWS): 评估所有规则,采用限制最宽松的规则 网络 ACL(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: Pod 间隔离请参阅 references/k8s-networkpolicies.md
将 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 <port> - 从外部测试:
nmap -Pn <ip> -p <port> - 检查日志:
/var/log/ufw.log或journalctl -u nftables
AWS:临时端口问题:
- NACL 需要允许返回流量:允许入站端口 1024-65535
- 安全组是有状态的(无需配置临时端口)
Kubernetes Pod 无法通信:
- 检查 NetworkPolicies:
kubectl get networkpolicies -n <namespace> - 确认 CNI 插件支持 NetworkPolicies(Calico、Cilium)
- 先在不应用策略的情况下测试
完整的故障排查指南请参阅 references/troubleshooting.md
应避免的常见错误
❌ 在 SSH/RDP 上允许 0.0.0.0/0 → 使用堡垒机或 VPN ❌ 忘记启用防火墙 → 已配置规则,但未激活 ❌ 启用前不进行测试 → 有被锁在系统外的风险 ❌ NACL 中缺少临时端口 → 返回流量被阻止 ❌ 同时运行 iptables 和 nftables → 产生冲突,行为不可预测 ❌ 没有日志记录 → 无法调试或审计 ❌ 端口范围过大 → 增加不必要的攻击面 ❌ 未记录规则 → 日后容易造成混淆
特定工具的命令
UFW
# Status
sudo ufw status verbose
sudo ufw status numbered
# Add rules
sudo ufw allow <port>/<protocol>
sudo ufw allow from <ip> to any port <port>
sudo ufw limit ssh # Rate limiting
# Delete rules
sudo ufw delete <rule-number>
sudo ufw delete allow 80/tcp
# Logging
sudo ufw logging on
tail -f /var/log/ufw.log
# Reset (disable and remove all rules)
sudo ufw reset
nftables
# List ruleset
sudo nft list ruleset
# Load config
sudo nft -f /etc/nftables.conf
# Flush all rules
sudo nft flush ruleset
# Add rule dynamically
sudo nft add rule inet filter input tcp dport 8080 accept
# Enable on boot
sudo systemctl enable nftables
iptables
# List rules
sudo iptables -L -v -n
sudo iptables -L INPUT --line-numbers
# Add rule
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Delete rule
sudo iptables -D INPUT <rule-number>
# Save rules
sudo netfilter-persistent save # Debian/Ubuntu
sudo service iptables save # RHEL/CentOS
AWS CLI
# List security groups
aws ec2 describe-security-groups --group-ids sg-xxxxx
# List NACLs
aws ec2 describe-network-acls --network-acl-ids acl-xxxxx
# Add rule to security group
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 安全组和 NACLexamples/terraform-gcp/- GCP 防火墙规则examples/terraform-azure/- Azure NSGexamples/kubernetes/- NetworkPolicy 清单
集成点
相关技能:
-
security-hardening - 防火墙是服务器加固的一个组成部分。有关 SSH 加固、fail2ban、auditd 和 SELinux,请参阅 security-hardening 技能。
-
building-ci-pipelines - CI 运行器需要访问代码仓库和制品存储。为可自托管的运行器配置防火墙规则。
-
deploying-applications - 应用需要防火墙规则来开放服务。有关集成方式,请参阅 deploying-applications。
-
infrastructure-as-code - 使用 Terraform/CloudFormation 将防火墙作为代码管理。有关 IaC 最佳实践,请参阅 infrastructure-as-code。
-
kubernetes-operations - 超越基础 NetworkPolicy 的高级 K8s 网络配置。有关 Services、Ingress 和 CNI 配置,请参阅 kubernetes-operations。
-
network-architecture - 更广泛的网络设计模式。有关 VPC 设计、子网和路由,请参阅 network-architecture。
参考文件
工具专用指南:
- 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 - 使用 Terraform 配置安全组与 NACL
- 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 - 工具选择可视化指南