ascjreddy/Enterprise-network-Project-phase-1
GitHub: ascjreddy/Enterprise-network-Project-phase-1
基于 OPNsense 的虚拟化多区域企业网络实验室,集成防火墙策略、QoS 流量整形、Ansible 自动化部署和 Python 健康监控,提供完整验证证据。
Stars: 0 | Forks: 0
# 企业网络安全与流量控制实验室
基于 OPNsense 构建的虚拟化多区域企业网络 —— 实现基于区域的防火墙策略、QoS 流量整形、通过 REST API 实现的 Ansible 自动化,以及带有 Slack 告警的 Python 健康监控。每一项安全控制都通过抓包和防火墙日志进行了验证。每一项带宽声明都有 iperf3 测量数据的支持。
## 架构
```
┌─────────────────┐
│ OPNsense FW │
│ 192.168.x.1 │
└────────┬────────┘
┌─────────────────┼─────────────────┐
│ │ │
┌──────▼──────┐ ┌───────▼──────┐ ┌──────▼──────┐
│ LAN │ │ Guest │ │ DMZ │
│192.168.10.0 │ │192.168.20.0 │ │192.168.30.0 │
│ /24 │ │ /24 │ │ /24 │
│ │ │ │ │ │
│ Employee │ │ Untrusted │ │ nginx web │
│ workstation │ │ users │ │ SSH server │
└─────────────┘ └──────────────┘ └─────────────┘
```
| 区域 | 子网 | 网关 | 信任级别 |
|------|--------|---------|-------------|
| LAN | 192.168.10.0/24 | 192.168.10.1 | 受信任 —— 完整的互联网访问,仅限通过 SSH/HTTP 访问 DMZ |
| Guest | 192.168.20.0/24 | 192.168.20.1 | 不受信任 —— 仅限互联网访问,5 Mbps 上限 |
| DMZ | 192.168.30.0/24 | 192.168.30.1 | 半信任 —— 托管内部服务器,禁止 Guest 访问 |
| WAN | NAT (VirtualBox) | — | 不受信任 —— 默认拒绝入站流量 |
## 实验环境
| 虚拟机 | 角色 | 操作系统 | 资源配置 |
|----|------|----|-----------|
| OPNsense-FW | 防火墙 / 路由器 | OPNsense 24.x (FreeBSD) | 2 核心, 2GB 内存 |
| LAN-Client | 员工工作站 | Ubuntu 22.04 Desktop | 1 核心, 1GB 内存 |
| Guest-Client | 访客用户 | Ubuntu 22.04 Desktop | 1 核心, 1GB 内存 |
| DMZ-Server | Web / SSH 服务器 | Ubuntu 22.04 Server | 1 核心, 1GB 内存 |
所有环境均运行在单台笔记本电脑的 VirtualBox 中。VirtualBox 内部网络用于模拟物理网段。OPNsense 位于网络中心,配备四个虚拟接口 —— 每个区域一个。
## 防火墙策略
规则按自上而下的顺序处理。最先匹配的规则生效。在每个接口上,阻止规则优先于允许规则。
| 接口 | 源地址 | 目的地址 | 动作 | 目的 |
|-----------|--------|-------------|--------|---------|
| Guest | 192.168.20.0/24 | 192.168.20.1 | 阻止 | 访客无法访问防火墙 |
| Guest | 192.168.20.0/24 | 192.168.10.0/24 | 阻止 | 访客无法访问员工区 |
| Guest | 192.168.20.0/24 | 192.168.30.0/24 | 阻止 | 访客无法访问服务器 |
| Guest | 192.168.20.0/24 | 任意 | 允许 TCP 80,443 | 仅限互联网浏览 |
| LAN | 192.168.10.0/24 | 192.168.20.0/24 | 阻止 | 员工无法访客访客区 |
| LAN | 192.168.10.0/24 | 192.168.30.10 | 允许 TCP 22 | 通过 SSH 连接到 DMZ 服务器 |
| LAN | 192.168.10.0/24 | 192.168.30.10 | 允许 TCP 80 | 通过 HTTP 连接到 DMZ 服务器 |
| LAN | 192.168.10.0/24 | 任意 | 允许 | 互联网访问 |
| WAN | 任意 | 任意 | 阻止 | 默认拒绝所有入站流量 |
### 验证
每条规则都通过了正向测试(应被允许的流量)和反向测试(应被阻止的流量)的验证。通过等效于 Wireshark 的 OPNsense 防火墙日志抓取了相关证据。
| 测试 | 结果 | 证据 |
|------|--------|---------|
| Guest → LAN ping | 100% 丢包 | 截图 —— 防火墙日志显示丢弃 |
| Guest → DMZ HTTP | 连接超时 | 截图 —— 浏览器超时 |
| Guest → google.com | 成功加载 | 截图 —— Firefox |
| LAN → DMZ nginx | nginx 欢迎页 | 截图 —— Firefox |
| LAN → DMZ SSH | 成功连接 | 截图 —— 终端 |
| LAN → Guest ping | 100% 丢包 | 截图 —— 防火墙日志显示丢弃 |
## QoS 流量整形
### 管道 —— 带宽容器
| 管道 | 带宽 | 应用于 |
|------|-----------|------------|
| Guest-Cap | 5 Mbps 硬性限制 | 所有 Guest 区域流量 |
| LAN-Guarantee | 20 Mbps 保证带宽 | 所有 LAN 区域流量 |
### 队列 —— LAN 管道内的优先级通道
| 队列 | 权重 | 拥塞时的共享比例 | 流量类型 |
|-------|--------|------------------------|--------------|
| Management | 100 | ~83% | SSH 端口 22 |
| Interactive | 20 | ~16% | HTTP/HTTPS 端口 80, 443 |
| Bulk | 1 | ~1% | 所有其他流量 |
权重仅在链路饱和时激活。在正常负载下,所有流量均可自由传输。
### 分类规则
五条浮动规则检查每一个数据包,并将其定向到正确的管道或队列:
1. Guest 接口,所有协议 → Guest-Cap 管道
2. LAN TCP 端口 22 → Management 队列
3. LAN TCP 端口 80 → Interactive 队列
4. LAN TCP 端口 443 → Interactive 队列
5. LAN 所有剩余流量 → Bulk 队列 (兜底规则)
### 测量结果
从 LAN-Client 到 DMZ-Server 持续 30 秒的 iperf3 测试:
```
[ ID] Interval Transfer Bitrate
[ 5] 0.00-30.03 sec 67.2 MBytes 18.8 Mbits/sec receiver
```
LAN 保持了约 19 Mbps 的速率,证实了 LAN-Guarantee 管道得到了严格执行。在测试过程中 SSH 保持响应,没有明显的延迟 —— 证实了 Management 队列的优先级在负载下正常工作。
## 自动化
### Ansible —— 防火墙规则部署
防火墙规则通过 Ansible playbook 调用 OPNsense REST API 进行部署。配置在 Git 中进行版本控制。在全新安装的 OPNsense 上运行该 playbook,可在几秒钟内重建整个安全策略。
```
ansible-playbook -i inventory.yml firewall_rules.yml
```
成功运行时的输出:
```
TASK [Block Guest to LAN] ✓ ok
TASK [Block Guest to DMZ] ✓ ok
TASK [Allow LAN to DMZ SSH] ✓ ok
TASK [Apply firewall rules] ✓ ok
PLAY RECAP: ok=4 failed=0
```
### Python —— 网络健康监控
`health_check.py` 在整个网络上运行 13 项检查,并向 Slack 发送完整的通过/失败报告。它基于生产环境的监控原则设计 —— 而不仅仅是简单的连通性检查。
| 检查项 | 检测内容 |
|-------|-----------------|
| 接口状态 (WAN/LAN/Guest/DMZ) | 区域连通性故障 |
| 按名称检测关键规则是否存在 | 安全策略被静默删除 |
| WAN 网关可达性 | 互联网中断 |
| CPU 使用率 < 80% | 防火墙性能下降 |
| 内存使用率 < 85% | 丢包风险 |
| DHCP 租约数量 (时间敏感) | 客户端连接故障 |
| 状态表使用率 < 80% | 连接跟踪耗尽 |
| DMZ nginx HTTP 响应 | 服务器可用性 |
DHCP 检查是时间敏感的 —— 凌晨 3 点零租约是正常的,但在工作时间为零则属于故障。这可以防止因夜间错误警报导致的告警疲劳。
状态表监控可以检测到大多数工程师都不知道存在的一种故障模式 —— 当连接跟踪表填满时,防火墙会静默丢弃新连接,且不提供任何错误消息。
```
python3 health_check.py
```
示例输出:
```
PASS!! | Interface WAN present | up
PASS!! | Interface LAN present | up
PASS!! | Interface Guest present | up
PASS!! | Interface DMZ present | up
PASS!! | Rule: Block Guest to LAN | found
PASS!! | Rule: Block Guest to DMZ | found
PASS!! | Rule: Allow LAN to DMZ SSH | found
PASS!! | WAN internet reachability | ping to 8.8.8.8
PASS!! | CPU usage | 0.0% used
PASS!! | Memory usage | 0.0% used
PASS!! | DHCP leases | 0 leases - off hours
PASS!! | State table | 115 active states
PASS!! | DMZ nginx | responding on port 80
Report sent to Slack.
```
Slack 告警截图 —— `screenshots/slack_health_report.png`
## 展示技能
| 技能 | 证据 |
|-------|---------|
| 基于区域的防火墙架构 | 具有强制性区域间策略的 4 区域网络 |
| 有状态防火墙规则设计 | 规则排序、默认拒绝,并通过抓包验证 |
| QoS 流量整形 | 管道、队列、分类规则 —— 通过 iperf3 测量验证 |
| 带宽强制限制 | 访客上限为 5 Mbps,LAN 保持在 19 Mbps |
| REST API 自动化 | Ansible 通过 OPNsense API 下发防火墙规则 |
| 基础设施即代码 | 规则在 Git 中进行版本控制,可从零开始复现 |
| 生产监控设计 | 状态表、规则完整性、时间敏感阈值、Slack 告警 |
| Linux 系统 | Ubuntu 虚拟机管理、服务管理、网络配置 |
| 故障排查 | 通过日志诊断 DHCP 冲突、DNS 故障、包锁定问题 |
## 仓库结构
```
├── scripts/
│ ├── firewall_rules.yml # Ansible playbook — deploys firewall rules via REST API
│ └── health_check.py # Python health monitor — 13 checks, Slack alerting
├── screenshots/ # Verification evidence for every firewall rule
└── configs/
└── opnsense_config.xml # Full OPNsense configuration backup
```
## 如何复现
**前提条件:** VirtualBox, OPNsense 24.x ISO, Ubuntu 22.04 ISO, Ansible, Python 3
1. 在 VirtualBox 中创建四个虚拟机,并按照架构表中的说明配置内部网络
2. 安装 OPNsense,分配接口,将 LAN IP 设置为 192.168.10.1
3. 在 LAN-Client、Guest-Client、DMZ-Server 上安装 Ubuntu
4. 在 DMZ-Server 上安装 nginx:`sudo apt install nginx -y`
5. 将你的 OPNsense API 密钥和密钥对添加到 `inventory.yml` 中
6. 运行:`ansible-playbook -i inventory.yml firewall_rules.yml`
7. 运行:`python3 health_check.py`
完整的 OPNsense 配置可在 `configs/opnsense_config.xml` 中找到 —— 通过 System → Configuration → Backups 恢复,即可复现完全相同的环境。
## 技术栈
- **OPNsense 24.x** —— 基于 FreeBSD 的企业级防火墙
- **Ansible** —— 通过 REST API 部署防火墙规则
- **Python 3** —— 健康监控与 Slack 集成
- **iperf3** —— 带宽测量与 QoS 验证
- **Ubuntu 22.04** —— 客户端与服务器虚拟机
- **VirtualBox** —— 用于整个实验室虚拟化的虚拟机监控程序
标签:Ansible自动化, Beacon Object File, DMZ, iperf3, IP 地址批量处理, MacOS取证, OPNsense, Python监控, QoS流量整形, REST API, Slack告警, Streamlit, 企业网络, 区域分割, 多区域隔离, 实验环境, 抓包分析, 流量控制, 系统提示词, 网络安全, 网络实验室, 网络架构, 虚拟化网络, 访问控制, 运维自动化, 防火墙, 隐私保护