mcpField
C
configuring-firewalls

configuring-firewalls

github.com/ancoleman安全52595 次安装46 周前更新
代码仓库

关于 configuring-firewalls

面向工程师的防火墙配置技能,覆盖 Linux 主机、云网络和 Kubernetes,并提供工具选择建议、规则示例及防止误配置和失去访问的安全措施。

主要功能

  1. 01覆盖主机、云端和容器防火墙
  2. 02提供防火墙工具选择建议
  3. 03附带规则示例与配置模式
  4. 04提供防止失联的安全检查
  5. 05涵盖故障排查与迁移

适用场景

  1. 01限制新部署服务的网络访问
  2. 02配置云安全组和 NACL
  3. 03设置 Kubernetes Pod 网络策略
  4. 04排查连接受阻或防火墙规则问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ancoleman/ai-design-components --skill configuring-firewalls

安装后在 Claude Code 中输入/configuring-firewalls确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

outputs.yaml
examples/kubernetes/
default-deny-allow-dns.yaml
examples/nftables/
web-server.nft
examples/terraform-aws/
three-tier-architecture.tf
examples/ufw/
basic-web-server.sh
references/
aws-security-groups.md
azure-nsg.md
bastion-pattern.md
database-patterns.md
decision-tree.md
dmz-pattern.md
egress-filtering.md
gcp-firewall.md
iptables-patterns.md
k8s-networkpolicies.md
migration-guide.md
nftables-patterns.md
troubleshooting.md
ufw-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: 按规则编号顺序评估

通用最佳实践

  1. 默认拒绝: 从拒绝所有流量开始,明确允许所需流量
  2. 最小权限原则: 仅开放必要的端口/IP
  3. 敏感端口不允许 0.0.0.0/0: 绝不允许来自任意地址的 SSH/RDP/数据库访问
  4. 版本控制: 将防火墙规则存储在 Git 中
  5. 日志记录: 启用并监控防火墙日志
  6. 定期审计: 每季度审查规则,移除未使用的规则
  7. 不要混用工具: 避免同时运行 iptables 和 nftables
  8. 上线前测试: 先使用预发布环境

高级主题

堡垒主机架构: 单一入口模式请参阅 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 安全组和 NACL
  • examples/terraform-gcp/ - GCP 防火墙规则
  • examples/terraform-azure/ - Azure NSG
  • examples/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 - 工具选择可视化指南

评论

支持 Markdown