SysAdminDoc/HostsGuard

GitHub: SysAdminDoc/HostsGuard

基于 .NET 10 构建的 Windows 网络隐私管理工具,通过实时 DNS 监控、hosts 文件管理和防火墙规则控制来拦截不需要的网络连接。

Stars: 0 | Forks: 0

# HostsGuard ![Version](https://img.shields.io/badge/version-0.12.0-blue) ![License](https://img.shields.io/badge/license-MIT-green) ![Platform](https://img.shields.io/badge/platform-Windows%2010%2F11-0078D4) ![.NET](https://img.shields.io/badge/.NET-10.0-512BD4?logo=dotnet&logoColor=white) ![Status](https://img.shields.io/badge/status-active-success) ## 截图 实时的 DNS 活动流,带有精选的域名用途标注、每个根域的 24 小时迷你图以及 `field:value` 搜索 DSL —— 包含深色和浅色主题: ![主机活动 — 深色主题](https://static.pigsec.cn/wp-content/uploads/repos/cas/56/5666f04e47de5d3d35913a03a8fc5ec462e3897b65f6a0c9fef5f318841f238e.png) ![主机活动 — 浅色主题](https://static.pigsec.cn/wp-content/uploads/repos/cas/13/13d096c74903556b2abdbf1d1be4a1faac7435a3f399b2ff82dec20b73aaa4ab.png) ## 架构 HostsGuard 是一款基于 .NET 10 (LTS) 构建的**信任分离的双进程**应用程序: ``` ┌───────────────────────────────┐ gRPC over Named Pipe ┌────────────────────────────────────┐ │ HostsGuard.App (WPF) │ (ACL'd pipe, per-session │ HostsGuard.Service (LocalSystem) │ │ UNELEVATED desktop UI │◄────token authentication)───────►│ Windows Service — owns ALL │ │ tray · dashboards · prompts │ unary + server-streaming │ privileged mutation │ └───────────────────────────────┘ │ · hosts file (transactional) │ │ · Windows Firewall COM rules │ ┌───────────────────────────────┐ same contract │ · ETW DNS / IPHLPAPI connections │ │ HostsGuard.Cli │─────────────────────────────────►│ · tamper watch · scheduler │ │ block/allow/status/export… │ │ · SQLite (ProgramData) │ └───────────────────────────────┘ └────────────────────────────────────┘ ``` 提权逻辑驻留在一个随操作系统启动的 LocalSystem 服务中,因此 UI **无需 UAC**,所有修改操作都是集中且可审计的,防篡改自愈功能即使在无人登录时也会运行,并且每次 OS 调用都是类型化的 Windows API(Firewall COM、ETW、IPHLPAPI),而不是解析子进程。 ## 安装 1. 从 [Releases](https://github.com/SysAdminDoc/HostsGuard/releases) 下载 `HostsGuard-vX.Y.Z-dotnet-Setup.exe`。 2. 运行它(安装程序会提权一次以注册 `HostsGuardSvc` 服务;应用程序本身以非提权状态运行)。 3. 从开始菜单或托盘启动 **HostsGuard**。 **系统要求:** Windows 10/11,x64。该服务依赖于 Windows 防火墙服务(MpsSvc)。卸载时会停止服务,恢复默认的防火墙姿态,并移除所有 `HG_` 规则。 ### 从 Python 构建版本 (v3.x) 迁移 `HostsGuard.Migrator.exe` 会将 Python 时代的配置文件进行一次性导入 —— 包括 `hostsguard.db`(域名、订阅源、事件日志、配置文件、防火墙状态)、`config.json`(计划任务、允许列表、DoH 状态、学习信任集)和 `doh_resolvers.json` —— 并转换至新 schema。`HG_` 防火墙规则会通过 COM 实时重新发现并自动延续。迁移是幂等的,并支持 `--dry-run`。 最终的 Python 构建版本 (v3.17.0) 保留在 [`python-eol`](https://github.com/SysAdminDoc/HostsGuard/releases/tag/python-eol) 标签中。 ## 功能 ### 授权提示(连接前询问) | 功能 | 描述 | |---------|-------------| | 过滤模式 | **Normal**(静默拦截)、**Notify**(针对新的出站连接弹出提示)、**Learning**(自动允许并记录)—— 可从托盘切换 | | 授权窗口 | 在拦截出站尝试时置顶显示提示,包含进程路径、签名者、解析出的主机名、GeoIP 国家、威胁情报判定以及域名用途 | | 作用域 + 持续时间 | 按程序、远程 IP 或端口进行允许/拦截 —— 可永久生效或在限定时间窗口内生效 | | 已知安全基线 | 操作系统核心二进制文件(Windows Update、Defender、内核、LSA)会被自动允许,从而使提示聚焦于值得关注的流量 | | 绑定身份的规则 | 规则会记录二进制文件的 SHA-256 和签名者;位于白名单路径下的重命名冒充程序会再次触发提示,而移动到新版本目录的自动更新程序会被识别为同一个应用 | | 信任的发布者 / 文件夹 | 自动允许由受信任的 Authenticode 发布者签名的未来软件,或受信任安装文件夹下的任何二进制文件 —— 可在提示中开启 | | 入站授权 | 可选择对无规则的**入站**连接也进行提示,从而生成限定作用域的入站规则(默认关闭,以避免未请求入站带来的干扰) | | 决策历史 | 每一项授权决策都会被记录并可供审查 | | 姿态护栏 | 启用 Notify/Learning 会针对每个配置文件设置默认的出站 Block;切回 Normal 或停止服务时会恢复之前的姿态 | | 辅助功能 | 提供完整的 AutomationProperties 覆盖、明确的 Tab 顺序、实时区域的威胁横幅、键盘/屏幕阅读器焦点管理 | ### 主机活动 | 功能 | 描述 | |---------|-------------| | 实时 DNS 流 | ETW `Microsoft-Windows-DNS-Client` 事件会在域名解析时将其展示出来 —— 无需轮询 | | 域名拦截 | 通过 hosts 文件(`0.0.0.0` 条目)拦截单个域名或整个根域 | | 域名用途 | 在数据流和提示中内联展示精选的离线域名→用途注释(“Microsoft 遥测”、“Akamai CDN”、“Google Analytics”) | | 24 小时迷你图 | 按根域渲染的每小时命中汇总内联活动迷你图 | | 临时允许 | 允许某个域名 15 分钟 / 1 小时 / 8 小时,到期后自动恢复为拦截状态 | | 隐藏 / 隐藏根域 | 在活动流中隐藏域名,重启后依然保持生效 | | 高级搜索 | `field:value`、`!term` 和 `field!=value` 过滤器,适用于所有表格 | | 研究链接 | 右键点击任何域名即可打开 Google、VirusTotal、who.is 等链接 | ### 防火墙活动 | 功能 | 描述 | |---------|-------------| | 实时连接 | 通过 IPHLPAPI 扩展表实现实时出站 TCP/UDP 视图(带 PID 属性,无需提权) | | 按应用分组 + 搜索 | 使用 `field:value` 搜索 DSL(`port:443 country!=US`,`fw:threat`)进行可折叠的按进程分组 | | 服务归属 | 由 svchost 托管的连接会显示负责的 Windows 服务(通过 SCM 枚举) | | 拦截连接监视 | 安全事件日志 5157/5152 检测反馈给授权代理 | | 状态叠加 | 每个连接都会显示被 hosts/防火墙/威胁拦截的状态,对于没有预先进行 DNS 查询的原始 IP 拨号,还会显示 **DIRECT-IP** | | 快速拦截 | 拦截任何远程 IP 或程序,或者将程序的作用域限制在 Internet / LAN / localhost / inbound | | GeoIP + 威胁情报 | 离线 MMDB 国家/ASN 解析,外加 URLhaus/Feodo 已知恶意覆盖层 | | 连接历史 | 保留期限受限的过去连接的可搜索日志(默认为 30 天) | | 每个应用的带宽 | 通过 ETW 内核字节计数器显示排名前 5 的进程带宽时间线 | | 解释 / 查询连接 | 右键点击连接进行查询 —— 在解析出的域名上查询 VirusTotal、who.is、Google;在 IP 上查询 AbuseIPDB | | 学习审查 | 批量提升、撤销或丢弃 Learning 模式下的自动决策 | ### Hosts 文件 | 功能 | 描述 | |---------|-------------| | 托管域名 | 基于数据库的域名管理,包含状态、来源、命中跟踪和规范原因 | | 原始编辑器 | 直接编辑 `drivers\etc\hosts`,提供清理并保存(去重、验证、规范化)功能 | | 备份 / 还原 | 带时间戳的备份,支持一键还原和紧急重置为 Windows 默认设置 | | 拦截列表导入 | 12+ 种精选社区拦截列表(HaGezi、StevenBlack、OISD、URLhaus 等),合并时允许列表优先 | | 允许列表订阅 | 白名单远程允许列表中的域名,且优先级高于拦截列表 | | 拦截服务 | 一键切换以拦截 YouTube、TikTok、Facebook、Discord、Netflix 等 | | 遥测预设 | 一键拦截约 28 个 Microsoft 遥测 endpoint,可作为一个整体撤销 | | 篡改监视 | SHA-512 完整性跟踪可区分 HostsGuard 的写入与外部写入;可选自动还原 | ### 防火墙规则 | 功能 | 描述 | |---------|-------------| | 完整规则查看器 | 显示所有 Windows 防火墙规则,包含名称、方向、操作、协议、地址和程序 | | `HG_` 前缀跟踪 | 可识别并批量管理 HostsGuard 创建的规则 | | 安全规则保护 | 可选的篡改保护:如果任何 `HG_` 规则在后台被删除或禁用,服务会重新创建或重新启用它(仅限 HostsGuard 自己的规则 —— 绝不会触碰您的其他配置) | | 孤立检测 + 重新绑定 | 标记其可执行文件已移动的程序规则,并在重新绑定前通过预览建议签名身份匹配项 | | 规则组 | 将 `HG_` 规则分配给一个命名组,并原子地开启/关闭整个组;组设置可通过可移植策略进行往返同步 | | 规则编写 | 具有方向、操作、协议、地址和程序的自定义规则 —— 使用 COM API,无需 PowerShell 拨号 | ### 工具 | 功能 | 描述 | |---------|-------------| | DNS 绕过防御 | 拦截 QUIC/UDP-443,拦截已知的 DoH 引导解析器,以及 DoT/DoQ 端口 853(您自己的解析器除外),从而防止应用程序通过隧道绕过 hosts 拦截 | | CNAME 伪装防护 | 可选的响应式拦截,针对通过 CNAME 解析到被拦截追踪器的第一方主机 | | DNS 解析器切换器 | 一键切换至 Cloudflare、Google、Quad9、AdGuard DNS 或 NextDNS 并刷新 DNS | | DoH 情报 | 可刷新的、经过 SHA-256 验证的 DoH 解析器列表,与 Windows 已知服务器合并 | | 计划拦截 | 在每周重复的计划上拦截域名、服务或**防火墙规则**(`fw:` 目标)(时间窗口可跨越午夜) | | 网络配置文件 | 保存/切换命名的规则集,并根据加入网络的指纹(网关 MAC)实现**自动切换** | | 设置锁定 | 使用可选的定时解锁功能,通过密码锁定模式/姿态/规则更改;一键开启 hosts 文件写保护 | | 全局出站 | 托盘提供 Block-all / Allow-all 出站姿态选择器(无需重启) | | VPN kill-switch | 监视选定的 VPN 适配器;每当它断开时,在每个配置文件上强制执行默认的出站 Block,确保没有任何内容泄漏到隧道之外,重新连接时恢复(需主动开启) | | Loopback API | 可选(`HG_LOOPBACK_API=1`)的 token 认证 `127.0.0.1` JSON-RPC/OpenAPI 接口 | | 事件 webhooks | 可选的引擎事件签名 HTTP(S) POST(`X-HG-Signature` HMAC-SHA256,限定重试次数),通过 loopback API 配置 | | Defender 排除助手 | 处理拦截 Microsoft 遥测时出现的 `HostsFileHijack` 误报 | | 支持包 | 脱敏的诊断 zip —— 包含配置、数据库完整性、日志、事件历史、防火墙摘要(不含 token、webhooks、私有域名或远程 IP) | | 事件分类 | 结构化、可过滤的事件日志,记录每一次拦截、允许、防火墙和策略操作 | ### CLI ``` HostsGuard.Cli status HostsGuard.Cli block [reason] HostsGuard.Cli allow [reason] HostsGuard.Cli unblock HostsGuard.Cli export [path.json] HostsGuard.Cli mode [normal|notify|learning] HostsGuard.Cli release-smoke ``` CLI 通过与应用相同的已验证管道契约与服务进行通信,因此它也可以在非提权状态下运行。 ## 数据位置 | 路径 | 用途 | |------|---------| | `%ProgramData%\HostsGuard\` | 策略状态:`hostsguard.db` (SQLite WAL)、授权状态、DoH 情报 —— 通过 DACL 锁定为仅 SYSTEM+Admins 可访问 | | `%APPDATA%\HostsGuard\` | 每用户的 UI 设置(`config.json`:主题、UI 缩放)和日志 | ## 从源码构建 ``` git clone https://github.com/SysAdminDoc/HostsGuard.git cd HostsGuard dotnet build HostsGuard.sln # requires .NET 10 SDK dotnet test HostsGuard.sln # 774 tests, no elevation needed build\publish.ps1 # single-file self-contained win-x64 -> dist\dotnet\ winget install --id JRSoftware.InnoSetup -e & "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" installer-dotnet.iss # 生成 installer_output/HostsGuard-v0.12.0-dotnet-Setup.exe ``` 解决方案布局:`HostsGuard.Core`(纯领域,无 OS 依赖)、`HostsGuard.Contracts`(gRPC protos)、`HostsGuard.Windows`(Firewall COM / ETW / IPHLPAPI / ACL 互操作)、`HostsGuard.Service`(提权引擎)、`HostsGuard.App`(WPF UI)、`HostsGuard.Cli`、`HostsGuard.Migrator`,以及位于 `tests/` 下的各项目测试套件。 ## 安全 .NET 引擎锁定了其运行时和依赖姿态: - **运行时维护基准:** 该解决方案目标为 **.NET 10 (LTS,支持至 8 年 11 月)**,并且构建会解析最新的维护补丁 (`TargetLatestRuntimePatch`),因此自包含的工件会捆绑当前的 运行时。 - **依赖项 CVE:** `dotnet list package --vulnerable --include-transitive` 保持整洁无异常。原生 SQLite 捆绑包被锁定为 `SQLitePCLRaw.bundle_e_sqlite3` 3.0.3,以清除 GHSA-2m69-gcr7-jv3q (CVE-2025-6965);Google.Protobuf ≥ 3.35 包含了递归深度的修复;.NET 10 SDK 裁剪了框架提供的 传递依赖,淘汰了旧有的仅用于测试的 4.3.0 基准版本。 - **提权表面:** LocalSystem 服务的数据目录 (`%ProgramData%\HostsGuard`)在任何状态文件被写入之前, 已通过 DACL 锁定为仅 SYSTEM+Admins 可访问;客户端的 blocklist URL 在服务获取它们之前, 会经过 SSRF 防护(拒绝 loopback/RFC1918/链路本地/CGNAT/ULA/元数据); gRPC 控制管道经过 ACL 保护,并使用基于会话的 token 进行了身份验证。 请通过 GitHub issue 提交漏洞报告,并附带脱敏后的支持包 (工具 → **导出支持包**)。 ## 常见问题 / 故障排除 **问:应用程序需要管理员权限吗?** 不需要。UI 和 CLI 在非提权状态下运行;所有特权工作都在安装程序注册的 `HostsGuardSvc` LocalSystem 服务中完成(安装过程本身会提权一次)。 **问:我拦截了一个域名,但它仍然可以解析** 刷新 DNS 缓存(工具选项卡)或等待缓存过期。某些应用程序维护着独立于 OS 的自己的 DNS 缓存 —— DNS 绕过防御(QUIC 拦截、DoH blocklist)封堵了常见的隧道。 **问:我该如何撤销所有操作?** Hosts 文件选项卡 → **还原** 会恢复最近的备份;**紧急重置** 将 hosts 文件重写为 Windows 默认设置;防火墙规则选项卡 → **删除 HG 规则** 会移除所有由 HostsGuard 创建的防火墙规则。卸载操作会自动执行所有这些操作,并恢复您之前的防火墙姿态。 **问:Windows Defender 将 hosts 文件标记为威胁** 拦截 Microsoft 遥测域名会导致 Defender 报告 `SettingsModifier:Win32/HostsFileHijack`。这是一个误报 —— HostsGuard 是有意修改 hosts 文件的。请为 `C:\Windows\System32\drivers\etc\hosts` 添加一个排除项;HostsGuard 在导入会触发此情况的列表之前会发出警告。 **问:Python 版本怎么了?** HostsGuard v3.x 曾是一个 Python/PySide6 应用程序。它已被停用,转而采用这款 .NET 10 重写版本,后者移除了 PowerShell 子进程调用(改为类型化的 Windows API)、仅运行时的错误呈现(编译的核心)以及 127 MB 的 PyInstaller 捆绑包(改为小型自包含二进制文件 + 真正的 Windows 服务)。最终的 Python 构建版本保留在 `python-eol` 标签中,且 `HostsGuard.Migrator` 可导入 v3.x 的配置文件。 ## 许可证 MIT 许可证 —— 详情请参阅 [LICENSE](LICENSE)。 ## 贡献 欢迎提交 issue 和 PR。如果报告 bug,请附上脱敏后的支持包(工具 → **导出支持包**)。
标签:DNS监控, Python工具, 桌面应用, 系统运维, 网络隐私管理, 防火墙管理