Daaboulex/portmaster-nix

GitHub: Daaboulex/portmaster-nix

将 Portmaster 应用防火墙以 NixOS 原生服务方式部署,提供图形化与系统级网络管控。

Stars: 0 | Forks: 0

# portmaster-nix [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/2183ef52e6195652.svg)](https://github.com/Daaboulex/portmaster-nix/actions/workflows/ci.yml) [![License](https://img.shields.io/github/license/Daaboulex/portmaster-nix)](./LICENSE) [![NixOS](https://img.shields.io/badge/NixOS-unstable-78C0E8?logo=nixos&logoColor=white)](https://nixos.org) [![Last commit](https://img.shields.io/github/last-commit/Daaboulex/portmaster-nix)](https://github.com/Daaboulex/portmaster-nix/commits) [![Stars](https://img.shields.io/github/stars/Daaboulex/portmaster-nix?style=flat)](https://github.com/Daaboulex/portmaster-nix/stargazers) [![Issues](https://img.shields.io/github/issues/Daaboulex/portmaster-nix)](https://github.com/Daaboulex/portmaster-nix/issues) NixOS 软件包,用于 [Portmaster](https://safing.io/portmaster/) —— 由 [Safing](https://safing.io) 开发的免费开源应用防火墙。 此 flake 从源码构建 Portmaster **v2.1.7**(Go 核心 + Rust/Tauri 桌面 + Angular UI),并提供一个具备完整 systemd 集成和安全加固的 NixOS 模块。 ## 组件 | 组件 | 技术 | 描述 | |---|---|---| | `portmaster-core` | Go | 防火墙引擎 — DNS 解析器、网络过滤器、威胁情报 | | `portmaster`(桌面) | Rust / Tauri | 带有系统托盘集成的原生桌面应用 | | `portmaster-ui` | Angular | 由核心服务在 `127.0.0.1:817` 提供服务的 Web UI | ## 用法 ### 1. 添加 flake 输入 ``` # flake.nix inputs.portmaster = { url = "github:daaboulex/portmaster-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; ``` ### 2. 叠加 overlay ``` nixpkgs.overlays = [ inputs.portmaster.overlays.default ]; ``` ### 3. 导入 NixOS 模块 ``` imports = [ inputs.portmaster.nixosModules.default ]; ``` ### 4. 启用 Portmaster ``` services.portmaster = { enable = true; notifier.enable = true; # System tray icon (autostart on login) # autostart = true; # Start service on boot (default: true) # settings.devmode = true; # Web UI at 127.0.0.1:817 (default: true) # extraArgs = [ "--verbose" ]; }; ``` ## 模块选项 | 选项 | 类型 | 默认值 | 描述 | |---|---|---|---| | `services.portmaster.enable` | bool | `false` | 启用 Portmaster 防火墙服务 | | `services.portmaster.package` | package | `pkgs.portmaster` | 要使用的 Portmaster 软件包 | | `services.portmaster.autostart` | bool | `true` | 开机时启动服务。当为 `false` 时,服务会被安装但必须手动使用 `sudo systemctl start portmaster` 启动 | | `services.portmaster.notifier.enable` | bool | `false` | XDG 自动启动,用于系统托盘图标。仅在服务活跃时启动 | | `services.portmaster.notifier.delay` | int | `3` | 启动托盘图标前的等待秒数(让桌面系统托盘初始化) | | `services.portmaster.settings` | attrs | `{}` | 传递给 portmaster-core 的自由格式设置 | | `services.portmaster.settings.devmode` | bool | `true` | 在 `127.0.0.1:817` 启用 Web UI | | `services.portmaster.extraArgs` | list of str | `[]` | 传递给 portmaster-core 的额外 CLI 参数 | ## 安装内容 - **系统服务**:`portmaster.service` — 以 root 身份运行 `portmaster-core`,并具备适当的权限和 systemd 安全加固 - **桌面应用**:`portmaster` 二进制文件及 `.desktop` 文件 — 可从应用程序菜单启动 - **系统托盘**:可选的 XDG 自动启动项(通过 `notifier.enable`) — 在后台/仅托盘模式下启动,启动前会检查服务是否正在运行 - **Web UI**:当 `devmode` 启用时,在 `http://127.0.0.1:817` 可用 - **数据目录**:`/var/lib/portmaster/` — 通过 `systemd-tmpfiles` 管理 - **内核模块**:`netfilter_queue` — 自动加载以支持数据包过滤 ## 手动服务控制 当 `autostart = false` 时,Portmaster 不会在开机时启动,但仍然完整安装: ``` sudo systemctl start portmaster # Start the firewall sudo systemctl stop portmaster # Stop the firewall sudo systemctl status portmaster # Check status ``` 如果启用了托盘图标(`notifier.enable`),当服务未运行时,它会静默跳过启动 —— 不会出现“连接被拒绝”的弹窗。 ## NixOS 特定补丁 ### 跨重建的配置持久化 在 NixOS 上,每次系统重建都会生成新的 Nix 存储哈希值,从而改变所有二进制路径。如果没有干预,Portmaster 会将每次重建视为一个新应用并创建全新的配置 —— 导致每个应用的防火墙规则丢失。 此软件包包含一个 `nix_linux.go` 标签处理器(遵循与上游 Flatpak 处理器相同的模式),它会根据衍生包名称和二进制名称创建一个稳定的 `nix-pkg` 标签。配置会基于此标签进行匹配,而不是易变的存储路径,从而实现跨重建的规则持久化。 ### FHS 路径修复 Tauri 桌面应用硬编码了 FHS 路径(`/usr/bin/systemctl`、`/usr/bin/pkexec`),这些路径在 NixOS 上并不存在。此软件包会在构建时修补它们: | 上游路径 | NixOS 路径 | 用途 | |---|---|---| | `/sbin/systemctl` 等 | `${systemd}/bin/systemctl` | 服务状态检测 | | `/usr/bin/pkexec` | `/run/wrappers/bin/pkexec` | Polkit 权限提升(SUID 包装器) | | `/usr/bin/gksudo` | `/run/wrappers/bin/gksudo` | 备用权限提升 | 如果没有这些补丁,桌面应用将无法检测 `portmaster.service` 是否正在运行,且启动画面中的“启动服务”按钮也无法正常工作。 ## 架构支持 目前仅支持 `x86_64-linux`。上游的 Go 和 Rust 代码是与架构无关的,但 `aarch64-linux` 尚未经过测试。 ## 从 v1 迁移 如果之前使用的是 v1 软件包(通过二进制获取 + 自动更新方式): 1. 停止旧服务:`sudo systemctl stop portmaster-core` 2. 备份配置:`sudo cp -r /opt/safing/portmaster/config /tmp/portmaster-config-backup` 3. 使用新的 flake 重建(这会创建 `/var/lib/portmaster/`) 4. 可选地恢复配置:`sudo cp -r /tmp/portmaster-config-backup/* /var/lib/portmaster/config/` 5. 清理旧数据:`sudo rm -rf /opt/safing/portmaster` ## 致谢 - [Safing GmbH](https://safing.io) —— Portmaster 开发者 - [NixOS/nixpkgs#264454](https://github.com/NixOS/nixpkgs/pull/264454) 由 WitteShadovv 提供的早期 v1 软件包构建工作,为此源码构建方法提供了参考 ## 许可证 Portmaster 在 [GPL-3.0-only](https://www.gnu.org/licenses/gpl-3.0.html) 许可下由 Safing GmbH 授权。 本仓库中的 Nix 软件包表达式同样在 [GPL-3.0-only](LICENSE) 许可下授权 —— 参见 [LICENSE](LICENSE)。
标签:Angular, CI, DNS解析, flake, GitHub Advanced Security, Go, Grype, Linux防火墙, MacOS取证, NixOS, NixOS模块, Portmaster, Ruby工具, Rust, Safing, systemd, Tauri, 可视化界面, 后台服务, 威胁情报, 子域名枚举, 安全加固, 安全软件, 应用防火墙, 开发者工具, 开源防火墙, 开源项目, 日志审计, 桌面防火墙, 流量控制, 端口管理, 系统安全, 系统托盘, 系统托盘集成, 系统服务, 网络流量审计, 网络过滤, 网络防护, 自动启动, 跨平台防火墙, 防火墙