arikari93/firewall-engineering-lab
GitHub: arikari93/firewall-engineering-lab
一个生产风格的pfSense防火墙工程实验室,用于学习和测试多区域网络分段、安全策略及合规映射。
Stars: 0 | Forks: 0
# pfSense 防火墙工程实验室
[](https://www.pfsense.org/)
[](https://opnsense.org/)
[](https://csrc.nist.gov/publications/detail/sp/800-41/rev-1/final)
[](https://www.cisecurity.org/)
[](LICENSE)
## ⚡ 快速开始(30秒概览)
**这是什么?** 一个生产环境风格的防火墙实验室,实现了多区域网络分段、有状态防火墙策略、站点到站点及远程访问VPN、NAT/路由,以及自动化日志转发至 Wazuh SIEM——所有内容均按企业标准记录。
**关键指标:**
- 🔒 **5个网络区域**,具有显式的VLAN间策略执行能力(默认拒绝基准)
- 📋 跨所有接口的**47条防火墙规则**,并记录了商业理由
- 🌐 **OpenVPN远程访问** + **IPSec站点到站点** 隧道配置
- 📊 日志转发至 Wazuh SIEM,延迟<1秒(可与安全运营实验室集成)
- 🛡️ **pfBlockerNG** 用于IP/DNS威胁情报拦截(30,000+被阻止的IOC)
- 📝 所有主要策略均进行了**NIST SP 800-41 / CIS Controls** 合规性映射
- 🔄 带有前后验证清单的**自动化固件修补**工作流
## 🏗️ 架构概览
### 网络区域设计
```
┌─────────────────────────────────────┐
│ INTERNET / WAN │
│ (ISP Modem/Gateway) │
└────────────────┬────────────────────┘
│ WAN (em0)
│
┌────────────────▼────────────────────┐
│ │
│ pfSense CE 2.7.2 │
│ (Protectli FW4B — 4-port Intel) │
│ │
│ ┌──────────┐ ┌────────────────┐ │
│ │pfBlockerNG│ │ Suricata IPS │ │
│ │ 30k IOCs │ │ (inline mode) │ │
│ └──────────┘ └────────────────┘ │
│ │
└──────────┬───────────────────────────┘
│ LAN (em1) → Trunk to Switch
│
┌───────────────▼────────────────────────────┐
│ NETGEAR GS308E Managed Switch │
│ (802.1Q VLAN Trunking) │
└──┬──────────┬──────────┬──────────┬────────┘
│ │ │ │
VLAN 10 │ VLAN 20 │ VLAN 30 │ VLAN 40 │ VLAN 99
│ │ │ │
┌────────▼──┐ ┌─────▼───┐ ┌───▼────┐ ┌───▼────┐ ┌──▼──┐
│ TRUSTED │ │ IoT │ │ DMZ │ │SEC LAB │ │MGMT │
│ LAN │ │ DEVICES │ │SERVERS │ │(Pi 5 + │ │ │
│192.168.10 │ │192.168.2│ │10.0.30 │ │Laptop) │ │MGMT │
│ .0/24 │ │ 0.0/24│ │ .0/24 │ │10.0.40 │ │ONLY │
└───────────┘ └─────────┘ └────────┘ └────────┘ └─────┘
```
### 与安全运营实验室集成
```
[pfSense Firewall] ──── syslog/514 ────► [Wazuh Manager (Laptop)]
│ ▲
│ SPAN port mirroring │
▼ │
[Raspberry Pi 5 NIDS] ── Wazuh Agent ────────────┘
(Suricata + Pi-hole)
```
**双层防御:** pfSense 提供边界执行和有状态包检测;Raspberry Pi NIDS 对内部流量提供被动深度包检测。来自两个来源的告警在 Wazuh 中进行关联。
## 🛡️ 技术栈
| 组件 | 技术 | 用途 |
|-----------|-----------|---------|
| **防火墙OS** | pfSense CE 2.7.2 | 有状态防火墙、路由、NAT |
| **硬件** | Protectli FW4B (4端口Intel网卡) | 专用防火墙设备 |
| **VLAN交换** | NETGEAR GS308E (802.1Q) | 网络区域分段 |
| **威胁情报** | pfBlockerNG 3.x | IP/DNS阻止列表执行 |
| **内联IPS** | Suricata (pfSense包) | WAN口内联包检测 |
| **VPN — 远程访问** | OpenVPN (TLS 1.3, AES-256-GCM) | 远程访问客户端连接 |
| **VPN — 站点到站点** | IPSec IKEv2 | 实验室间隧道(文档) |
| **日志转发** | syslog → Wazuh | SIEM集成 |
| **DNS安全** | DNS解析器 (Unbound) + DNSBL | 恶意软件/钓鱼域名阻止 |
| **证书颁发机构** | pfSense内部CA | VPN客户端证书 |
## 🔐 防火墙策略设计
### 区域信任模型
| 区域 | VLAN | 子网 | 信任级别 | 互联网入站 |
|------|------|--------|-------------|----------------------|
| 可信局域网 | 10 | 192.168.10.0/24 | 高 | 拒绝(默认) |
| 物联网 | 20 | 192.168.20.0/24 | 低 | 拒绝 |
| 非军事区 | 30 | 10.0.30.0/24 | 中 | 有限(特定端口) |
| 安全实验室 | 40 | 10.0.40.0/24 | 高 | 拒绝 |
| 管理区 | 99 | 10.0.99.0/24 | 管理员 | 拒绝 |
### VLAN间策略矩阵
```
FROM ↓ TO → | LAN | IoT | DMZ | SecLab | MGMT | WAN
─────────────────────────────────────────────────────────────────
TRUSTED LAN | — | ✗ | ✓* | ✓ | ✗ | ✓
IoT | ✗ | — | ✗ | ✗ | ✗ | ✓†
DMZ | ✗ | ✗ | — | ✗ | ✗ | ✓‡
Security Lab | ✓ | ✓(ro)| ✓ | — | ✓(ro)| ✓
Management | ✗ | ✗ | ✗ | ✗ | — | ✗
WAN (inbound) | ✗ | ✗ | ✓§ | ✗ | ✗ | —
✓ = Permitted ✗ = Default Deny * = Specific services only
† = Internet only (no RFC1918) ‡ = Established outbound only
§ = NAT port-forward rules only ro = Read/monitor access only
```
**设计理由:**
- **物联网隔离** 防止被入侵的智能设备转向攻击可信主机
- **非军事区** 可以接收入站NAT,但不能发起到内部区域的连接
- **安全实验室** 拥有广泛的读取访问权限以支持监控和威胁搜寻
- **管理VLAN** 仅限管理员;禁止互联网访问以防C2数据窃取
详见 [`docs/FIREWALL_POLICY.md`](docs/FIREWALL_POLICY.md) 获取包含每条规则商业理由的完整规则文档。
## 🔧 工程成果
### 1. 有状态防火墙策略实施
**挑战:** 设计一个默认拒绝的规则库,既能强制执行区域隔离,又不中断跨区域边界(如DNS、NTP、DHCP)的合法流量。
**解决方案:** 在默认拒绝规则之前,为必需的基础设施服务实施显式允许规则,并在所有拒绝命中时启用日志记录。
**关键规则:**
```
# 允许所有区域向pfSense解析器发起DNS查询(DNS重绑定保护)
Pass | Any internal | pfSense:53 | UDP | "DNS to local resolver"
# 允许所有区域向pfSense NTP服务器进行NTP同步
Pass | Any internal | pfSense:123 | UDP | "NTP sync"
# 阻止IoT网络到RFC1918地址段通信(防止横向移动)
Block+Log | VLAN20 | RFC1918 | Any | "IoT isolation — lateral movement prevention"
# 仅允许IoT网络接入互联网
Pass | VLAN20 | !RFC1918 | 80,443 | "IoT internet access"
```
**结果:** 零合法流量中断;47条规则均100%记录了理由。防火墙日志分析在24小时内确认了正确执行。
### 2. pfBlockerNG威胁情报集成
**挑战:** 实施主动的IP和DNS阻止,同时避免造成干扰浏览或服务的误报。
**实施:**
- **IP阻止列表:** Spamhaus DROP/EDROP, Firehol Level 1, Abuse.ch Feodo Tracker
- **DNSBL:** EasyList, EasyPrivacy, Steven Black's unified hosts, Malware Domain List
- **自定义列表:** 附加了来自Wazuh威胁情报源的已知恶意IP
**调优过程:**
1. 以“仅警报”模式部署72小时——审查了1,847个潜在阻止项
2. 识别出12个误报(合法服务的CDN范围)
3. 添加到白名单,切换至“拒绝”模式
4. 结果:执行30,000+个IOC,误报率<0.1%
**DNSBL查询统计(30天窗口):**
| 类别 | 被阻止查询 | 占总DNS查询百分比 |
|----------|----------------|----------------|
| 广告/追踪器 | 18,432 | 22.1% |
| 恶意软件域名 | 43 | 0.05% |
| 钓鱼 | 12 | 0.01% |
| **总计阻止** | **18,487** | **22.2%** |
### 3. OpenVPN远程访问配置
**目标:** 使用基于证书的身份验证,为实验室资源提供安全的远程管理访问。
**配置:**
- **协议:** UDP 1194(受限网络环境下可回退至TCP 443)
- **数据加密:** AES-256-GCM / AES-128-GCM (AEAD),TLS 1.3控制通道
- **控制通道:** tls-crypt(加密 + 认证TLS通道)
- **密钥交换:** 通过ECDSA P-384证书的ECDHE — `dh none`
- **身份验证:** 证书 + 用户名/密码(双因素)
- **DNS推送:** 内部Unbound解析器推送给客户端(分离DNS)
- **路由:** 分离隧道 — 仅通过VPN路由RFC1918地址范围
- **客户端隔离:** 故意省略`client-to-client` — VPN客户端之间无法互访
**证书颁发机构设置:**
```
CA: Lab-Internal-CA (ECDSA P-384, 10yr validity)
└── Server: openvpn-server (ECDSA P-384, 10yr validity)
└── Client: analyst-workstation (ECDSA P-384, 1yr validity)
└── Client: mobile-admin (ECDSA P-384, 1yr validity)
```
**验证:**
- 从外部4G热点连接 — 确认可完全访问实验室
- 通过pfSense Unbound确认DNS解析(无DNS泄漏)
- 通过`ip route`和Wireshark捕获验证流量路由
详见 [`docs/VPN_CONFIGURATION.md`](docs/VPN_CONFIGURATION.md) 获取完整设置指南。
### 4. 固件补丁管理工作流
**挑战:** 应用pfSense固件更新时实现零计划外停机,并具备回滚能力。
**标准补丁程序:**
1. **补丁前备份** — 导出完整配置XML + 包列表
2. **验证备份完整性** — 重新导入到测试实例(GNS3/VM)
3. **审查补丁说明** — 检查规则集语法或包API是否有破坏性变更
4. **在维护窗口内应用** — pfSense系统 > 更新
5. **补丁后验证** — 对所有VLAN和VPN运行连接性检查
6. **记录** — 记录补丁版本、日期、验证结果
**已应用更新:**
| 版本 | 日期 | 变更类型 | 停机时间 | 问题 |
|---------|------|------------|----------|--------|
| 2.7.0 → 2.7.1 | 2025-11-14 | 安全 + 错误修复 | 4分12秒 | 无 |
| 2.7.1 → 2.7.2 | 2026-01-08 | 安全 | 3分58秒 | 无 |
详见 [`docs/PATCH_MANAGEMENT.md`](docs/PATCH_MANAGEMENT.md) 获取完整程序和清单。
### 5. SIEM集成与日志关联
**架构:** pfSense将syslog转发至Wazuh Manager;Wazuh解码pfSense防火墙日志格式并生成结构化告警。
**pfSense Syslog配置:**
```
Remote syslog server: 192.168.10.50 (Wazuh Manager)
Port: 514/UDP
Facility: LOG_LOCAL0
Content: Firewall events, DHCP, VPN, System
```
**Wazuh自定义解码器(pfSense防火墙日志):**
```
filterlog
(\w+),(\d+),,,(\w+),(\w+),(\d+),(\w+),(\w+),(\S+),(\S+),(\d+),(\d+)
action,interface,proto,direction,length,ttl,id,src_ip,dst_ip,src_port,dst_port
```
**关联告警示例:**
- pfSense阻止IP → Wazuh交叉引用同一IP的Suricata告警 → 创建复合事件
- pfBlockerNG DNSBL命中 → Wazuh生成包含威胁类别和请求主机的告警
详见 [`configs/wazuh/pfsense-decoder.xml`](configs/wazuh/pfsense-decoder.xml)
和 [`configs/wazuh/pfsense-rules.xml`](configs/wazuh/pfsense-rules.xml) 获取
完整的解码器和关联规则配置。
## 📋 合规性与文档
### NIST SP 800-41 Rev. 1 对齐
| NIST控制措施 | 实施情况 |
|-------------|---------------|
| 3.1 — 防火墙策略 | 记录规则库,每条规则包含商业理由(见 `docs/FIREWALL_POLICY.md`) |
| 3.2 — 网络架构 | 多区域设计,具有明确的信任边界(见架构部分) |
| 3.3 — 路由控制 | 静态路由 + 防火墙规则强制执行区域边界 |
| 4.1 — 操作程序 | 补丁管理SOP、备份程序、变更日志维护 |
| 4.2 — 测试程序 | 月度规则审查、季度渗透测试模拟 |
| 4.3 — 事件处理 | Wazuh告警 + 已记录的事件响应模板 |
详见 [`docs/COMPLIANCE_MAPPING.md`](docs/COMPLIANCE_MAPPING.md) 获取完整的NIST和CIS Controls映射。
### PCI DSS相关性(持卡人数据环境模拟)
DMZ区域(VLAN 30)旨在模拟持卡人数据环境(CDE)边界,实施:
- 互联网与可信内部区域之间无直接连接
- 所有入站流量仅通过显式NAT规则
- 防火墙日志保留(90天syslog归档至Wazuh)
- 所有规则修改的变更文档
## 🧪 验证与测试
### 连接性矩阵测试
```
# 从每个区域验证允许和拒绝的通信路径
# 安全实验室 → TRUSTED LAN(应允许通过)
ping 192.168.10.1 -c 3
# IoT → TRUSTED LAN(应被阻止)
ping 192.168.10.1 -c 3 # Expected: 100% packet loss
# IoT → 互联网(应允许通过,仅限HTTP/HTTPS协议)
curl -I https://example.com # Expected: 200 OK
curl telnet://192.168.10.1:22 # Expected: refused
```
**测试结果:**
| 测试ID | 源区域 | 目标 | 预期结果 | 实际结果 |
|---------|------------|------------|----------|--------|
| FW-001 | LAN | 互联网 (HTTPS) | 通过 | ✅ |
| FW-002 | 物联网 | LAN (任意) | 阻止 | ✅ |
| FW-003 | 物联网 | 互联网 (HTTPS) | 通过 | ✅ |
| FW-004 | 物联网 | 互联网 (SSH) | 阻止 | ✅ |
| FW-005 | 非军事区 | LAN (任意) | 阻止 | ✅ |
| FW-006 | 非军事区 | 互联网 (已建立连接) | 通过 | ✅ |
| FW-007 | WAN | 非军事区 (端口 443) | 通过 (NAT) | ✅ |
| FW-008 | WAN | LAN (任意) | 阻止 | ✅ |
| FW-009 | 安全实验室 | 任意 (监控) | 通过 | ✅ |
| FW-010 | VPN客户端 | LAN (分离隧道) | 通过 | ✅ |
### 防火墙日志分析
```
# 解析pfSense过滤日志并生成威胁狩猎摘要报告
python3 configs/scripts/parse-firewall-logs.py --file filter.log --report
# 被阻止次数最多的前10个源IP地址(威胁狩猎)
python3 configs/scripts/parse-firewall-logs.py --file filter.log --action block --top-src 10
```
## 📂 仓库结构
```
firewall-engineering-lab/
├── README.md # This file
├── docs/
│ ├── FIREWALL_POLICY.md # Full rule documentation with justifications
│ ├── VPN_CONFIGURATION.md # OpenVPN + IPSec setup guides
│ ├── NAT_AND_ROUTING.md # NAT rules, static routes, DNS, DHCP
│ ├── PATCH_MANAGEMENT.md # Firmware update SOP and change log
│ ├── COMPLIANCE_MAPPING.md # NIST SP 800-41 / CIS Controls alignment
│ └── INCIDENT_RESPONSE.md # IR templates and a sample report
└── configs/
├── firewall-rules/
│ └── firewall-rules-documented.xml # Rule base, XML-structured docs
├── nat/
│ └── nat-rules.xml # Outbound NAT + port forwards (docs)
├── vlan/
│ └── vlan-design.md # 802.1Q VLANs, switch + SPAN config
├── vpn/
│ ├── openvpn-server.conf # OpenVPN server config
│ ├── client-analyst-workstation.ovpn.example # Sanitized client template
│ └── ipsec-site-to-site.conf # IPSec IKEv2 Phase 1/2 config
├── suricata/
│ └── lab-custom.rules # Custom NIDS rules (MITRE-mapped)
├── wazuh/
│ ├── pfsense-decoder.xml # pfSense filterlog decoder
│ └── pfsense-rules.xml # Correlation + composite alert rules
├── scripts/
│ ├── backup-config.sh # Encrypted config backup workflow
│ └── parse-firewall-logs.py # pfSense log parser / analyzer
└── templates/
└── change-request.md # Firewall change request template
```
## 📚 经验教训
### 挑战1:VLAN间的不对称路由
**问题:** 在安全实验室(VLAN 40)和非军事区(VLAN 30)之间启用VLAN间路由后,返回流量丢失。即使规则允许,非军事区中的主机也无法访问安全实验室主机。
**根本原因:** 非军事区主机上的静态路由指向默认网关(pfSense非军事区接口),但pfSense在LAN主干接口上接收返回流量,并针对错误的接口检查状态。有状态防火墙将返回数据包视为新的、未跟踪的连接。
**解决方案:**
```
# 在pfSense浮动规则中添加显式状态跟踪规则
Pass | Direction: Any | Interface: DMZ,SecLab | State: Keep State
```
**启示:** 在多接口pfSense部署中,不对称路由问题几乎总是状态跟踪问题。在假设规则错误之前,请先检查`诊断 > 状态`。
### 挑战2:pfBlockerNG中断本地DNS解析
**问题:** 启用DNSBL后,一些内部服务停止通过主机名解析。pfSense Unbound解析器对某些内部`.local`域名返回NXDOMAIN。
**根本原因:** DNSBL设置为“Null Block”模式,对被阻止的域名响应NXDOMAIN。某个阻止列表中的通配符条目匹配了内部主机名的模式(短单标签名称)。
**解决方案:**
- 将DNSBL阻止模式从“Null Block”切换为“IP Block”(返回0.0.0.0)
- 将内部域名后缀添加到DNSBL白名单
- 启用“Python模式”以更好地处理误报
**启示:** 在强制执行之前,始终在“仅警报”模式下测试DNSBL 48–72小时。DNS故障通常最具破坏性,也最难快速诊断。
### 挑战3:Windows上的OpenVPN客户端DNS泄漏
**问题:** VPN连接成功,但Windows客户端上的DNS查询仍发送至ISP解析器,而非pfSense Unbound。DNS泄漏测试确认分离DNS未生效。
**根本原因:** Windows 10/11使用“智能多宿主名称解析”——它同时向所有可用接口发送DNS查询并接受最快的响应。ISP解析器比VPN隧道更快。
**解决方案:**
```
# 通过组策略禁用智能多宿主名称解析
# 计算机配置 → 管理模板 → 网络 → DNS客户端
# "关闭智能多宿主名称解析" → 已启用
```
同时在OpenVPN客户端配置中添加`block-outside-dns`指令,以在驱动程序级别强制通过隧道进行DNS查询。
**启示:** Windows DNS行为在VPN环境中不符合RFC。VPN设置后务必运行DNS泄漏测试,并将其视为安全验证步骤,而非可选步骤。
## 🔮 路线图
- [ ] **高可用性 (HA):** 使用第二个Protectli单元配置pfSense CARP以实现故障转移
- [ ] **Zeek集成:** 在pfSense span上添加协议级行为分析
- [ ] **GNS3实验室环境:** 构建虚拟化副本,用于在生产部署前进行安全的规则测试
- [ ] **pfSense API自动化:** 通过REST API自动化规则备份和审计报告生成
- [ ] **QoS / 流量整形:** 实施HFSC流量整形以优先处理安全监控流量
- [ ] **802.1X端口认证:** 为有线端口添加基于RADIUS的网络访问控制
- [ ] **Snort3对比:** 在pfSense内联IPS模式下对Suricata与Snort3进行基准测试
## 🎓 展示的技能
**防火墙工程:**
- 有状态防火墙策略设计与实施
- 具有记录商业理由的默认拒绝规则库
- 多区域网络架构(5个信任级别)
- 防火墙规则审计与审查程序
**网络工程:**
- 802.1Q VLAN设计与管理型交换机配置
- NAT(出站伪装 + 端口转发)
- 静态路由和基于策略的路由
- DNS安全(DNSBL、DNS重绑定保护、分离DNS)
**VPN与远程访问:**
- 使用基于证书认证(PKI)的OpenVPN远程访问
- IPSec IKEv2站点到站点隧道文档
- 分离隧道和DNS推送配置
**合规性与文档:**
- NIST SP 800-41 Rev. 1 防火墙策略对齐
- CIS Controls映射
- PCI DSS持卡人数据环境边界设计
- 变更管理文档(请求 → 批准 → 实施 → 审查)
**安全运营:**
- 威胁情报集成(pfBlockerNG,30k+ IOC)
- SIEM日志转发和自定义解码器开发
- 事件响应文档和报告
- 具有回滚能力的补丁管理SOP
## 👤 关于
**项目负责人:** Ari Said
**认证:** ISC2 CC | CompTIA Security+
**相关项目:** [安全运营实验室](https://github.com/arikari93/security-operations-lab) (NIDS + SIEM)
**LinkedIn:** [与我联系](https://www.linkedin.com/in/ari-said92)
标签:CIS Controls, IPSec VPN, Metaprompt, NAT配置, NIST SP 800-41, OISF, OpenVPN, OPNsense, pfBlockerNG, pfSense, SIEM集成, VLAN分段, VPN配置, Wazuh, 企业防火墙, 合规映射, 固件补丁, 威胁情报, 安全合规, 安全策略, 开发者工具, 提示词设计, 日志管理, 端口转发, 网络代理, 网络分段, 网络安全, 网络安全实验室, 网络架构, 网络隔离, 自动化补丁, 防火墙工程, 防火墙规则, 隐私保护, 默认拒绝策略