# Configuring Pfsense Firewall Rules

> 配置 pfSense 防火墙规则、NAT 策略、VPN 隧道和流量整形，以强制实施网络分段（network segmentation）、 控制流量，并保护企业及中小型企业环境中的内部网络区域。

- Skill: `killvxk/configuring-pfsense-firewall-rules` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add killvxk/configuring-pfsense-firewall-rules`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/configuring-pfsense-firewall-rules/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/configuring-pfsense-firewall-rules

---

# 配置 pfSense 防火墙规则

## 适用场景

- 部署边界或内部防火墙（firewall）以分段和保护网络区域（DMZ、内部、访客、IoT）
- 创建细粒度访问控制规则，限制 VLAN 和网络分段之间的流量
- 配置 NAT 规则，将端口转发到暴露于互联网的内部服务
- 使用 IPsec 或 OpenVPN 建立站点到站点或远程访问 VPN 隧道
- 实施流量整形和带宽管理以满足服务质量（QoS）需求

**不适用于**：替代单个系统上的基于主机的防火墙、无专用硬件加速的 SSL/TLS 深度包检测，或作为不配合 IDS/IPS 的唯一安全控制。

## 前置条件

- pfSense 2.7+ 安装在专用硬件或虚拟机上，至少有两个网络接口
- 访问 pfSense WebConfigurator（默认：https://192.168.1.1）
- 显示所有接口、VLAN 和期望流量流向的网络拓扑图
- 为每个网络区域规划好 DNS 和 DHCP 配置
- 了解 TCP/IP、NAT 和有状态防火墙概念

## 工作流程

### 步骤 1：配置网络接口和 VLAN

访问 pfSense WebConfigurator 并定义接口：

```
导航：Interfaces > Assignments

WAN 接口（igb0）：
  - 类型：来自 ISP 的 DHCP 或静态 IP
  - 阻止私有网络：启用
  - 阻止 bogon 网络：启用

LAN 接口（igb1）：
  - IPv4：10.10.1.1/24
  - 描述：CORPORATE_LAN

创建 VLAN：
  导航：Interfaces > VLANs > Add
  - igb1 上的 VLAN 10：DMZ（10.10.10.1/24）
  - igb1 上的 VLAN 20：SERVERS（10.10.20.1/24）
  - igb1 上的 VLAN 30：GUEST（10.10.30.1/24）
  - igb1 上的 VLAN 40：IOT（10.10.40.1/24）

分配 VLAN：
  导航：Interfaces > Assignments > 为每个 VLAN 添加
  启用每个接口并分配网关 IP
```

### 步骤 2：为每个区域配置 DHCP 和 DNS

```
导航：Services > DHCP Server

CORPORATE_LAN（10.10.1.0/24）：
  范围：10.10.1.100 - 10.10.1.200
  DNS：10.10.20.10（内部 DNS 服务器）
  网关：10.10.1.1

DMZ（10.10.10.0/24）：
  范围：10.10.10.100 - 10.10.10.200
  DNS：10.10.20.10
  网关：10.10.10.1

GUEST（10.10.30.0/24）：
  范围：10.10.30.100 - 10.10.30.200
  DNS：1.1.1.1, 8.8.8.8（仅公共 DNS）
  网关：10.10.30.1

导航：Services > DNS Resolver
  在除 GUEST 外的所有接口上启用 DNS Resolver
  启用 DNSSEC
  配置向上游 DNS 服务器转发
```

### 步骤 3：创建防火墙规则别名

```
导航：Firewall > Aliases

RFC1918_Networks：
  类型：网络
  值：10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16

WebPorts：
  类型：端口
  值：80, 443

ManagementPorts：
  类型：端口
  值：22, 3389, 5900

CriticalServers：
  类型：主机
  值：10.10.20.10, 10.10.20.11, 10.10.20.12

BlockedCountries：
  类型：URL 表
  URL: https://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
  更新：每 24 小时
```

### 步骤 4：按区域实施防火墙规则

```
导航：Firewall > Rules

=== WAN 规则 ===
# 默认阻止所有入站（隐式拒绝）
# 允许已建立/相关流量（pfSense 有状态模式下自动处理）

# 允许入站到 DMZ Web 服务器（通过 NAT）
动作：Pass | 接口：WAN | 协议：TCP
来源：任意 | 目标：WAN 地址 | 端口：80, 443
描述：允许 HTTP/HTTPS 到 DMZ Web 服务器

=== LAN 规则 ===
# 允许 LAN 访问内部服务器
动作：Pass | 接口：LAN | 协议：TCP
来源：LAN net | 目标：SERVERS net | 端口：WebPorts, 3306, 5432
描述：允许 LAN 访问内部 Web 和数据库服务器

# 允许 LAN 访问互联网
动作：Pass | 接口：LAN | 协议：任意
来源：LAN net | 目标：! RFC1918_Networks
描述：允许 LAN 访问互联网（通过 RFC1918 排除阻止 VLAN 间流量）

# 阻止 LAN 到 IoT（在隐式允许前明确拒绝）
动作：Block | 接口：LAN | 协议：任意
来源：LAN net | 目标：IOT net
描述：阻止 LAN 到 IoT 的直接通信

=== DMZ 规则 ===
# 允许 DMZ Web 服务器查询内部 DNS
动作：Pass | 接口：DMZ | 协议：TCP/UDP
来源：DMZ net | 目标：10.10.20.10 | 端口：53
描述：允许 DMZ DNS 查询到内部解析器

# 仅允许 DMZ 访问互联网进行更新
动作：Pass | 接口：DMZ | 协议：TCP
来源：DMZ net | 目标：任意 | 端口：80, 443
描述：允许 DMZ 出站 HTTP/HTTPS 进行更新

# 阻止所有其他 DMZ 流量
动作：Block | 接口：DMZ | 协议：任意
来源：DMZ net | 目标：任意
描述：DMZ 默认拒绝

=== GUEST 规则 ===
# 仅允许访客访问互联网（DNS 和 Web）
动作：Pass | 接口：GUEST | 协议：TCP/UDP
来源：GUEST net | 目标：! RFC1918_Networks | 端口：53, 80, 443
描述：仅允许访客访问互联网

# 阻止所有访客到内部的流量
动作：Block | 接口：GUEST | 协议：任意
来源：GUEST net | 目标：RFC1918_Networks
描述：阻止访客访问所有内部网络

=== IOT 规则 ===
# 允许 IoT 访问特定云端点
动作：Pass | 接口：IOT | 协议：TCP
来源：IOT net | 目标：! RFC1918_Networks | 端口：443, 8883
描述：允许 IoT HTTPS 和 MQTT 到云端

# 阻止 IoT 设备间通信
动作：Block | 接口：IOT | 协议：任意
来源：IOT net | 目标：IOT net
描述：防止 IoT 横向移动

# 阻止 IoT 到所有内部网络
动作：Block | 接口：IOT | 协议：任意
来源：IOT net | 目标：RFC1918_Networks
描述：阻止 IoT 访问内部
```

### 步骤 5：配置 NAT 规则

```
导航：Firewall > NAT > Port Forward

# DMZ 中的 Web 服务器
接口：WAN | 协议：TCP
目标：WAN 地址 | 端口：443
重定向目标 IP：10.10.10.50 | 端口：443
NAT 反射：启用
描述：HTTPS 到 DMZ Web 服务器

# SSH 跳板机（非标准端口）
接口：WAN | 协议：TCP
目标：WAN 地址 | 端口：2222
重定向目标 IP：10.10.20.11 | 端口：22
描述：通过端口 2222 SSH 到内部跳板机

导航：Firewall > NAT > Outbound
模式：混合出站 NAT
# 添加规则使 DMZ 服务器使用专用公网 IP
接口：WAN | 来源：10.10.10.0/24
转换地址：<dedicated_public_ip>
描述：DMZ 通过专用 IP 出站 NAT
```

### 步骤 6：启用日志记录和监控

```
导航：Status > System Logs > Settings
  远程日志：启用
  远程日志服务器：10.10.20.15:514（Syslog/SIEM）
  记录防火墙默认阻止：启用

导航：Firewall > Rules
  在关键规则上启用日志记录：
  - 所有 BLOCK 规则
  - WAN 入站 PASS 规则
  - VLAN 间 PASS 规则

导航：Diagnostics > pfTop
  监控实时连接状态和带宽使用

安装 pfBlockerNG 包：
  导航：System > Package Manager > Available Packages
  安装 pfBlockerNG-devel
  配置 IP 黑名单（Spamhaus DROP、Emerging Threats）
  配置 DNSBL 进行恶意软件域名阻断
```

### 步骤 7：备份和测试配置

```bash
# 导出配置备份
导航：Diagnostics > Backup & Restore
下载 XML 配置文件

# 从每个区域测试规则
# 从 LAN：
curl -I https://10.10.20.10  # 应成功（LAN 到 SERVERS）
curl -I https://10.10.40.5   # 应失败（LAN 到 IOT 被阻止）

# 从 GUEST：
curl -I https://www.google.com  # 应成功（互联网访问）
curl -I https://10.10.20.10     # 应失败（访客到内部被阻止）

# 从 DMZ：
nslookup google.com 10.10.20.10  # 应成功（允许 DNS）
ssh 10.10.1.50                    # 应失败（DMZ 到 LAN 被阻止）

# 验证日志记录
导航：Status > System Logs > Firewall
检查被阻止和通过的流量是否正确记录

# 计划自动配置备份
导航：Diagnostics > AutoConfigBackup
启用自动备份到 Netgate 云或本地存储
```

## 核心概念

| 术语 | 定义 |
|------|------------|
| **有状态防火墙（Stateful Firewall）** | 跟踪网络连接状态的防火墙，自动允许已建立会话的返回流量，无需明确规则 |
| **别名（Alias）** | pfSense 中 IP 地址、网络或端口的命名组，简化规则管理并提高可读性 |
| **NAT（网络地址转换）** | 内部和外部网络之间的 IP 地址转换，包括入站访问内部服务的端口转发 |
| **浮动规则（Floating Rules）** | 同时跨多个接口应用的 pfSense 规则，在每接口规则之前处理 |
| **pfBlockerNG** | 集成 IP 信誉黑名单和基于 DNS 的黑名单进行自动威胁阻断的 pfSense 包 |
| **规则处理顺序** | pfSense 在每个接口标签内从上到下评估规则；第一个匹配优先，未匹配的流量默认被阻止 |

## 工具与系统

- **pfSense 2.7+**：基于 FreeBSD 的开源防火墙和路由器平台，具有 Web 管理和丰富的包生态系统
- **pfBlockerNG**：用于自动化威胁情报集成的 IP 和 DNS 黑名单包
- **Snort/Suricata 包**：作为 pfSense 包提供的 IDS/IPS 集成，用于内联流量检查
- **OpenVPN/IPsec**：内置 VPN 实现，用于站点到站点和远程访问连接
- **Netgate AutoConfigBackup**：pfSense 灾难恢复的基于云的配置备份服务

## 常见场景

### 场景：使用 pfSense 为小型企业网络分段

**场景背景**：一家医疗实践机构需要对其网络进行分段以满足 HIPAA 要求。他们有一个互联网连接、一台电子健康记录（EHR）服务器、员工工作站、访客 WiFi 网络和医疗 IoT 设备（生命体征监护仪、影像设备）。预算限制要求使用开源解决方案。

**方法**：
1. 在 Netgate 4100 设备上部署 pfSense，配备四个物理接口（WAN、LAN、DMZ、MGMT）
2. 为员工（VLAN 10）、EHR 服务器（VLAN 20）、访客 WiFi（VLAN 30）和医疗设备（VLAN 40）创建 VLAN
3. 配置严格规则：员工 VLAN 只能通过 HTTPS 访问 EHR 服务器；医疗设备只能通过特定端口与 EHR 服务器通信；访客 WiFi 获得仅互联网访问权限，无内部路由
4. 使用医疗行业特定威胁源和恶意软件域名阻断启用 pfBlockerNG
5. 配置出站 NAT，防止内部 IP 地址泄露到互联网
6. 启用全面日志记录，通过 syslog 将所有防火墙日志转发到 SIEM
7. 设置自动配置备份并记录规则库以供审计合规

**常见陷阱**：
- 创建过于宽松的规则（"allow any any"）而非基于特定端口的规则
- 忘记规则处理顺序——将宽泛的 PASS 规则放在特定 BLOCK 规则之上
- 关键规则未启用日志记录，导致事件调查无法进行
- 允许 IoT 设备不受限制地访问互联网，创造潜在的数据外泄路径

## 输出格式

```
## pfSense 防火墙配置报告

**设备**: pfSense 2.7.2（Netgate 4100）
**接口**: WAN (igb0), LAN (igb1), DMZ (igb2), MGMT (igb3)
**VLAN**: 已配置 4 个（员工、服务器、访客、IoT）
**总规则数**: 所有接口共 28 条活跃规则

### 各接口规则摘要

| 接口 | Pass 规则 | Block 规则 | 已启用日志 |
|-----------|-----------|-------------|-----------------|
| WAN | 2 | 1（默认） | 是 |
| LAN | 4 | 2 | 是（阻止） |
| DMZ | 3 | 1（默认） | 是 |
| GUEST | 1 | 2 | 是 |
| IOT | 1 | 3 | 是 |

### 安全控制
- pfBlockerNG：12 个 IP 黑名单 + 已启用 DNSBL
- Snort IDS：在 WAN 和 LAN 接口上运行
- VPN：已配置带 MFA 的 OpenVPN 远程访问
- 日志：所有流量转发至 SIEM（10.10.20.15）
```

