johnnyh1975/ha_sophos_fw

GitHub: johnnyh1975/ha_sophos_fw

该项目是一个 Home Assistant 自定义集成,通过 XML API 和 SNMP 将 Sophos 防火墙接入智能家居平台,实现本地监控与自动化控制。

Stars: 0 | Forks: 2

# Sophos Firewall — Home Assistant 集成 [![HACS Custom](https://img.shields.io/badge/HACS-Custom-orange.svg)](https://github.com/hacs/integration) [![Version](https://img.shields.io/badge/Version-1.0.2-green)](https://github.com/johnnyh1975/ha_sophos_fw/releases) [![HA Version](https://img.shields.io/badge/HA-2024.9%2B-blue)](https://www.home-assistant.io) [![Quality Scale](https://img.shields.io/badge/Quality_Scale-Gold-gold)](https://www.home-assistant.io/docs/quality_scale/) Home Assistant Custom Integration,适用于 Sophos Firewall (SFOS 20.x / 22.x)。通过 XML API 和 SNMP 将 HA 与防火墙连接 —— 无需云服务,无需第三方。 ## 功能 | 类别 | 实体 | |---|---| | **网络接口** | PortA, PortB — 已连接/已断开, Zone, IP-Assignment | | **防火墙规则** | 开关(带写入权限)或只读传感器 — 位于配置区域 | | **DHCP** | 组合传感器:服务器状态 + 租约数量 + 作为属性的完整租约列表 | | **系统** | RAM, Disk, Swap (%), 运行时间 (`"77 d 14 h"`), 备份频率 | | **连接** | HTTP-, SMTP-, IMAP-, POP3 连接, FTP 命中, Captive-Portal 用户 | | **服务** | 聚合传感器:`"19 / 21 running"` — `running`/`stopped` 列表作为属性 | | **VPN 隧道** | 带有连接状态的 IPSec 隧道 | | **高可用性** | HA 集群状态(活动/非活动),此节点和对等节点的角色(主/从/独立/…) | | **许可证** | 聚合传感器:`"8 / 9 OK"` — 下一个到期日期,详细信息作为属性 | | **安全** | Web 过滤器默认操作, IPS 签名版本, Webcat 版本 | | **硬件健康** | CPU/NPU 温度, 风扇转速, 电源状态(仅限物理设备) | | **控制** | 触发备份(按钮),切换防火墙规则和 Web 过滤器 | ### 配置区域 (EntityCategory.CONFIG) 防火墙规则和 Web 过滤器策略出现在设备页面的配置区域 —— 而不是在标准视图中。它们仍然可以完全切换并可用于自动化。 ## 前置条件 - Home Assistant 2024.9+ - Sophos Firewall SFOS 20.x 或 22.x - Python 3.12+ (puresnmp 2.x,pysnmp 不兼容) - API 访问:**网络 → 管理 → 设备访问 → 启用 HTTPS 管理** - 可选 SNMP:**系统 → 管理 → SNMP → 配置 Community-String** ## 安装说明 ### 通过 HACS(推荐) 1. HACS → 集成 → ⋮ → 自定义仓库 2. URL:`https://github.com/johnnyh1975/ha_sophos_fw`,类别:集成 3. 搜索集成:“Sophos Firewall” → 安装 4. 重启 HA ### 手动安装 ``` cp -r custom_components/sophos_firewall \ /config/custom_components/sophos_firewall ``` 重启 HA。 ## 设置 **设置 → 设备与服务 → 添加集成 → “Sophos Firewall”** 设置向导将引导您完成 4 个步骤: **步骤 1 — 连接:**主机/IP,API 端口(默认:4444),用户名,密码,SSL 验证 **步骤 2 — SNMP(可选):**启用 SNMP 以获取系统指标、服务、VPN 隧道和许可证。配置 Community-String 和 SNMP 版本(1 或 2c)。 **步骤 3 — 写入访问(可选):**允许从 HA 切换防火墙规则和 Web 过滤器策略。开启写入访问:显示为开关。不开启:显示为只读传感器。 **步骤 4 — 轮询配置:**轮询间隔和活动端点 —— 按 Tier 分组。所有默认值均已优化预设。 ## 轮询间隔 (Tiered Polling) | Tier | 默认 | XML 端点 | SNMP 端点 | |---|---|---|---| | ⚡ 实时 | 30s | 网络接口 | 统计信息, 服务 | | 🔄 快速 | 120s | — | VPN 隧道, HA 状态 | | 🔧 运营 | 600s | 防火墙规则 | 系统健康 | | 🗄 静态 | 1800s | DHCP, Web 过滤器, 备份 | 许可证 | | 🔁 一次 | 启动时 | 管理设置 | 设备信息 | 写入操作(开关、按钮)总是会立即触发受影响 Tier 的刷新。 ## 技术架构 ### 数据源 **XML API**(端口 4444,HTTPS):网络接口,防火墙规则,DHCP 服务器 + 静态租约,Web 过滤器,备份,管理设置。 **SNMP**(端口 161,UDP,puresnmp 2.x):系统统计信息,服务 (21),VPN 隧道,许可证(9 个模块),硬件健康,设备信息(型号,固件,IPS 版本,Webcat 版本)。 OID 基础:`1.3.6.1.4.1.2604.5.1`(Sophos 专有 MIB,SFOS 22.x,在 APIVersion 2200.1 上测试) ### 会话管理 持久的 `aiohttp.TCPConnector` 会话,带有 `force_close=True` 和 `asyncio.Semaphore(2)`。防止因服务器端 Keep-Alive 分离导致的超时,并将并行请求限制为 2 个。 ### SNMP 特性 使用 `puresnmp 2.x` 而不是 pysnmp(在 Python 3.12+ 上不兼容)。安全插件发现在启动时于 Executor 线程中执行一次并被缓存 —— HA Event Loop 中没有阻塞式 I/O。 ### 虚拟机检测 (SFVH) 在虚拟设备上,温度和风扇 OID 不可用。集成会在第一次健康抓取后自动检测到这一点,并永久禁用硬件健康轮询。 ### 多防火墙支持 实体 ID 基于防火墙主机名 —— 在多个实例中无冲突: ``` sensor.5heynexg_system_dienste sensor.buero_fw_system_dienste ← zweite Firewall, kein Konflikt ``` ## DHCP 租约传感器 每个 DHCP 服务器一个组合传感器: ``` Netz · DHCP Main_DHCP → In Betrieb · 3 Leases Netz · DHCP Guest VLAN → In Betrieb · 0 Leases Netz · DHCP DMZ → Außer Betrieb ``` 作为属性的完整租约列表 —— 可直接用于自动化: ``` {{ state_attr('sensor.5heynexg_dhcp_leases_main_dhcp', 'leases') | selectattr('MACAddress', 'eq', 'aa:bb:cc:dd:ee:ff') | map(attribute='IPAddress') | first }} ``` ## 服务聚合传感器 使用一个包含完整概览的传感器代替 21 个单独的 Binary Sensor: ``` System · Dienste → 19 / 21 running Attribute: running: [Antivirus, DNS, HTTP-Proxy, IPS, ...] stopped: [Anti-Spam, HA-Service] ``` 用于自动化: ``` {{ 'Anti-Spam' in state_attr('sensor.5heynexg_system_dienste', 'stopped') }} ``` ## 自动化示例 **许可证到期时通知:** ``` trigger: - platform: template value_template: > {{ state_attr('sensor.5heynexg_sicherheit_lizenzen', 'problem') | length > 0 }} action: - service: notify.mobile_app data: message: > Sophos Lizenz-Problem: {{ state_attr('sensor.5heynexg_sicherheit_lizenzen', 'problem') | join(', ') }} ``` **回家时启用防火墙规则:** ``` trigger: - platform: state entity_id: person.jean_christoph to: home action: - service: switch.turn_on target: entity_id: switch.5heynexg_rule_homeautomation_to ``` ## 高级指南 | 指南 | 描述 | |---|---| | [Top-25 拦截连接仪表板](docs/top25_blocked_connections.md) | 使用 Sophos syslog + HACS Syslog Receiver + pyscript 构建一个实时的“拦截的前 25 个源 IP”卡片 —— 无需更改此集成 | ## 兼容性 | 设备 / 版本 | 状态 | 测试于 | |---|---|---| | SFVH(虚拟设备) | ✅ 完全兼容 | KV01, SFOS 22.0.0 GA-Build411 | | XGS 系列(硬件) | ✅ 支持 | 硬件健康已激活 | | SFOS 20.x | ✅ 支持 | API 兼容 | | SFOS 22.x | ✅ 已测试 | APIVersion 2200.1 | | HA 2024.9+ | ✅ 必需 | 配置流程中的 Sections API | ## 故障排除 **启动后所有实体均显示“未知”** → 首次抓取需要 30-45 秒。重新加载后请稍等片刻。 **SNMP 传感器保持“未知”状态** → 检查 Community String:系统 → 管理 → SNMP **设置时提示“Cannot connect”** → 检查 API 访问权限:网络 → 管理 → 设备访问 → 启用 HTTPS 管理 **缺少温度传感器** → 在 SFVH(虚拟设备)上正常。已自动识别 —— 这不是故障。 **HA 日志中出现 Blocking I/O** → 仅在安装后首次启动时出现。若持续存在:请重启 HA。 ## 更新日志 | 版本 | 更改内容 | |---|---| | **v1.0.2** | **新实体:** 高可用性集群(来自 adi-debug99 的 Issue)—— `SophosHAEnabledSensor`、`SophosHAStateSensor`、`SophosHAPeerStateSensor`(通过 ENUM 获取角色,已本地化);电源状态(`SophosPSUSensor`,仅限物理设备);IMAP 和 POP3 连接传感器。**错误修复(来自代码审查):** `trigger_backup()` 现在会检查响应状态 —— 失败的备份不再被静默吞没,而是作为可见错误报告;真正实现了 `RestoreEntity`(开关/传感器在重启后显示最后的状态,而不是 `unavailable`);响应级别状态码 532/534/535(API 被禁用 / IP 被封锁 / 认证)会被识别,而不是作为空响应漏过;乐观的开关状态(即时 UI 反馈,出错时回滚);`_get_tag` 跳过损坏的单个记录,而不是丢弃整个列表;删除了死代码和未使用的导入。**强化:** 集中的 `field_str()` 保护,防止损坏的 XML 字段值(防止在值为 `None`/嵌套时导致平台崩溃);健康查询中强大的 OID 解析;异常容忍的 HTTP 会话关闭;防止无效轮询间隔导致的 Busy-Loop;在并行的多防火墙设置中对 SNMP 插件补丁使用 Thread-Lock。**测试:** 从约 120 个扩展到 164 个,全套测试运行无需取消选择。 | | **v1.0.1** | 错误修复(来自 taracraft 的 Issue):Config-Flow 和 Options-Flow 中的 SNMP 连接测试*总是*以 "snmp_cannot_connect" 失败,与真实的凭据/可达性无关 —— `preload()` 从未在 `test_connection()` 之前被调用,产生的 `RuntimeError` 被 `_get()` 的通用异常处理器吞没了。修复:现在正确调用了 `preload()`;来自 `_get_client()` 的 `RuntimeError` 在 `_get`/`_multiget`/`_walk` 中被单独作为 `WARNING` 记录,而不是与正常的超时混在一起作为 `DEBUG` 记录。额外发现并修复了:`SophosUptimeSensor` 在运行时间 <24 小时的情况下显示了错误的分钟数(例如 "3 h 205 min" 而不是 "3 h 25 min")。测试套件首次使用 pytest 完全执行,而不是仅进行语法检查 —— 并在此过程中修正了两个过时的测试预期。 | | **v1.0.0** | 完全符合 Quality Scale Gold:`exception-translations`(所有异常都使用 `translation_key`/`translation_domain`),`strict-typing`(`SophosData` TypedDict, `DataUpdateCoordinator[SophosData]`)。完整的 Config-Flow 测试:新增 `test_config_flow.py`(user/snmp/write_access/polling/reauth/reconfigure 包括所有错误路径)。DHCP 传感器测试适应了 ENUM 模式。 | | **v0.10.0** | 错误修复:实现了 `async_step_reauth()` —— HA 现在在发生身份验证错误时显示 UI 对话框,而不是出现 `UnknownStep` 崩溃。重新登录后重置 Tier 时间戳。按 Tier 进行 SNMP 错误处理(一个失败的 OID 不再中断所有其他 Tier)。针对网络接口、防火墙规则、VPN 隧道、DHCP 服务器和开关的陈旧实体清理。DHCP 传感器可本地化(`SensorDeviceClass.ENUM`,`lease_count` 属性)。修复了 `CONF_SNMP_ENABLED` 字面量错误。新测试。 | | **v0.9.0** | 5 层协调器:实时/快速/运营/静态/一次。可通过 Options-Flow 配置轮询间隔和来源。SNMP 信号量并发。虚拟机检测 (SFVH)。配置流程中的 Sections-API。重新配置流程。Quality Scale Silver。 | | **v0.8.1** | Quality Scale Silver:`async_migrate_entry()`,配置条目上的 `unique_id`。IPS 和 Webcat 版本传感器。更新了 README。 | | **v0.8.0** | 错误修复:Switch-Tier-Force,按时间顺序排列的许可证日期,XML 转义。运行时间显示为 `"77 d 14 h"`。FTP 传感器。RestoreEntity。`DEFAULT_POLL_SNMP_HA=False`。`hacs.json`。 | | **v0.7.0** | 用于服务和许可证的传感器。用于规则和 Web 过滤器的 EntityCategory.CONFIG。实体名称中的排序前缀。组合的 DHCP 传感器。 | | **v0.6.6** | 修复:通过 `mod.create()` 正确创建了 SNMP SecurityModel 实例 | | **v0.6.5** | 修复:缓存了 puresnmp 安全插件加载器 —— 不再有阻塞式 I/O | | **v0.6.4** | 修复:修复了实体 ID 重复 `5heynexg_5heynexg_...` 的问题 | | **v0.6.2** | 用于配置流程的 Sections API —— 分组的轮询配置 | | **v0.5.8** | 虚拟机检测 (SFVH) —— 如果没有数据,则永不创建硬件传感器 | | **v0.5.6** | 用于多防火墙设置的基于主机名的实体 ID | ## 许可证 MIT —— 使用风险自负。写入访问权限可以更改防火墙配置。
标签:Home Assistant, Sophos防火墙, 智能家居, 网络设备集成, 计算机取证, 逆向工具