| name | configuring-pfsense-firewall-rules |
| description | 配置 pfSense 防火墙规则、NAT 策略、VPN 隧道和流量整形,以强制实施网络分段(network segmentation)、 控制流量,并保护企业及中小型企业环境中的内部网络区域。
|
| domain | cybersecurity |
| subdomain | network-security |
| tags | ["network-security","pfsense","firewall","nat","network-segmentation"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
配置 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:备份和测试配置
导航:Diagnostics > Backup & Restore
下载 XML 配置文件
curl -I https://10.10.20.10
curl -I https://10.10.40.5
curl -I https://www.google.com
curl -I https://10.10.20.10
nslookup google.com 10.10.20.10
ssh 10.10.1.50
导航: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 设备(生命体征监护仪、影像设备)。预算限制要求使用开源解决方案。
方法:
- 在 Netgate 4100 设备上部署 pfSense,配备四个物理接口(WAN、LAN、DMZ、MGMT)
- 为员工(VLAN 10)、EHR 服务器(VLAN 20)、访客 WiFi(VLAN 30)和医疗设备(VLAN 40)创建 VLAN
- 配置严格规则:员工 VLAN 只能通过 HTTPS 访问 EHR 服务器;医疗设备只能通过特定端口与 EHR 服务器通信;访客 WiFi 获得仅互联网访问权限,无内部路由
- 使用医疗行业特定威胁源和恶意软件域名阻断启用 pfBlockerNG
- 配置出站 NAT,防止内部 IP 地址泄露到互联网
- 启用全面日志记录,通过 syslog 将所有防火墙日志转发到 SIEM
- 设置自动配置备份并记录规则库以供审计合规
常见陷阱:
- 创建过于宽松的规则("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)