jp1337/easywall
GitHub: jp1337/easywall
基于 Go 和 nftables 的 Linux 防火墙 Web 管理工具,采用双进程隔离架构,通过可视化界面简化防火墙配置并提供多种内置安全防护模块。
Stars: 3 | Forks: 0
# 🔥 easywall
[](https://github.com/jp1337/easywall/actions/workflows/test.yml)
[](https://github.com/jp1337/easywall/actions/workflows/security.yml)
[](https://codecov.io/gh/jp1337/easywall)
[](https://www.gnu.org/licenses/gpl-3.0)
[](https://go.dev)
[](https://netfilter.org/projects/nftables/)
[](https://github.com/sponsors/jp1337)
[](https://ko-fi.com/jpylypiw)
[](https://paypal.me/JPylypiw)
**带有 Web 界面的 Linux 防火墙管理工具 —— 为 2026 年而打造。**
对原版 easywall(Python/Flask/iptables,在发生 CVE 后已归档)的完全重写。新架构:Go,通过直接 netlink 连接 nftables,双进程隔离,Argon2id 身份验证 —— 从根源上解决了安全问题。
📖 **文档:** [jp1337.github.io/easywall](https://jp1337.github.io/easywall)
## 🏗️ 架构
```
Browser ──HTTPS──► easywall-web (user: easywall, unprivileged)
│
Unix socket (mode 0660, group easywall)
Typed JSON protocol
│
easywall-core (root, CAP_NET_ADMIN only)
│
nftables kernel (via direct netlink — no nft subprocess)
```
Web 进程**从不直接接触防火墙**。所有更改都通过类型化的 socket 协议传递给具有高权限的核心守护进程 —— 从结构上杜绝了 Web 进程的权限提升。
## ✨ 功能特性
- **nftables 后端** — 通过 `google/nftables` 使用直接 netlink API,无子进程,无 shell,无注入风险
- **两步激活** — 应用规则,然后在可配置的时间窗口内通过 SSH 确认;超时自动回滚
- **Docker 共存** — 使用独立的 `inet easywall` 表,绝不触碰 Docker 的链;自动检测桥接网络
- **TCP/UDP 端口管理** — 支持为每条规则添加描述和配置 SSH 暴力破解路由
- **IP 黑名单与白名单** — 支持 IPv4/IPv6 CIDRs,在任何其他规则之前应用
- **端口转发** — 带有协议选择的 NAT 规则
- **自定义规则** — 原始 nftables 语法,在应用前进行验证
- **导出 / 导入** — 完整的 JSON 规则备份,可下载并重新上传
- **i18n** — 英语与德语,可通过 `locales/
.json` 扩展
- **浅色 / 深色模式** — 跟随系统偏好,支持手动切换
### 🛡️ 保护模块
| 模块 | 默认值 | 描述 |
|---|---|---|
| SSH 暴力破解 | ✅ 开启 | 限制每个源 IP 的连接数 |
| ICMP 泛洪 | ✅ 开启 | 限制每个源 IP 的速率 |
| SYN 泛洪 | ✅ 开启 | 限制新 TCP 连接的速率 |
| 端口扫描 | ✅ 开启 | 丢弃 NULL、FIN、XMAS、SYN+FIN 探测包 |
| 无效数据包 | ✅ 开启 | `ct state invalid` → DROP |
| IP 分片 | 关闭 | 丢弃分片数据包 |
| 伪造地址过滤 | 关闭 | 外部接口的 RFC-1918 地址 → DROP |
| 连接数限制 | 关闭 | 限制每个源 IP 的最大并发连接数 |
| TCP RST 泛洪 | 关闭 | 限制 RST 数据包的速率 |
| 广播丢弃 | 关闭 | `pkttype broadcast` → DROP |
| 多播丢弃 | 关闭 | `pkttype multicast` → DROP |
## 🛠️ 技术栈
| 组件 | 选择 | 备注 |
|---|---|---|
| **语言** | Go 1.25 | 单一二进制文件,无运行时依赖 |
| **HTTP 路由** | `go-chi/chi/v5` | 轻量级,符合惯用法的中间件链 |
| **模板** | `html/template` (标准库) | 自动转义 —— 从结构上防止 XSS |
| **nftables** | `google/nftables` | 直接 netlink —— 无需 `nft` 子进程 |
| **密码哈希** | `golang.org/x/crypto` Argon2id | 内存密集型,可抵御 GPU 破解 |
| **会话** | `gorilla/sessions` | HMAC 签名 cookie,600 秒有效期 |
| **CSRF** | `net/http.CrossOriginProtection` | Go 1.25 原生支持,无需表单令牌 |
| **速率限制** | `golang.org/x/time/rate` | 令牌桶算法,针对每个 IP 应用于 `/login` |
| **i18n** | `go-i18n/v2` | JSON 消息文件 |
| **配置** | `BurntSushi/toml` + JSON Schema | 使用 `taplo.toml` 提供编辑器自动补全 |
| **安全扫描** | `govulncheck` + `gosec` | CI 中的 CVE 扫描与安全代码检查 |
## 🚀 快速入门
### Debian / Ubuntu
```
wget https://github.com/jp1337/easywall/releases/latest/download/easywall_amd64.deb
sudo dpkg -i easywall_amd64.deb && sudo apt-get install -f
xdg-open https://localhost:12227
```
### Docker
```
git clone https://github.com/jp1337/easywall.git
cd easywall
docker compose up -d
xdg-open https://localhost:12227
```
### 手动安装(从源码)
#### 1. 前置条件
- Linux 内核 ≥ 3.13 且支持 nftables (`apt install nftables`)
- Go 1.25+
#### 2. 构建
```
git clone https://github.com/jp1337/easywall.git
cd easywall
make build
# 生成: bin/easywall-core bin/easywall-web
```
#### 3. 安装
```
sudo make install
sudo systemctl enable --now easywall-core easywall-web
xdg-open https://localhost:12227
```
首次访问将打开**设置向导**以设定您的用户名和密码。
## 📖 文档
完整文档请访问 **[jp1337.github.io/easywall](https://jp1337.github.io/easywall)**
| 指南 | 描述 |
|---|---|
| [系统要求](https://jp1337.github.io/easywall/installation/requirements/) | 内核版本,发行版兼容性矩阵 |
| [Debian / Ubuntu](https://jp1337.github.io/easywall/installation/debian/) | `.deb` 包安装 |
| [Docker](https://jp1337.github.io/easywall/installation/docker/) | Docker Compose 设置,`network_mode: host` |
| [手动安装](https://jp1337.github.io/easywall/installation/manual/) | 从源码构建 |
| [配置说明](https://jp1337.github.io/easywall/configuration/) | 所有 TOML 键的说明,JSON Schema |
| [防火墙过滤](https://jp1337.github.io/easywall/features/filters/) | 保护模块详情 |
| [Docker 共存](https://jp1337.github.io/easywall/features/docker/) | easywall 和 Docker 如何协同工作 |
| [导出与导入](https://jp1337.github.io/easywall/features/export-import/) | JSON 规则备份 |
| [安全模型](https://jp1337.github.io/easywall/security/) | 双进程隔离,CVE 历史 |
## 🔐 安全性
easywall 采用了**分层安全策略** —— 每一层都能独立限制爆炸半径:
| 威胁 | 缓解措施 |
|---|---|
| 规则/命令注入 | 直接 netlink API(无子进程,无字符串拼接)+ 类型化的 Go 结构体 |
| 权限提升 | Web 进程以非特权用户 `easywall` 运行 —— 无 root 权限 |
| 身份验证暴力破解 | 针对 `/login` 的速率限制(10 分钟内每个 IP 5 次请求),Argon2id |
| CSRF | `net/http.CrossOriginProtection` (Go 1.25 原生) |
| XSS | `html/template` 自动转义 + `Content-Security-Policy` 头 |
| 会话劫持 | 仅限 HTTPS cookie,`SameSite=Lax` |
| 锁定 | 两步激活与自动回滚 —— 错误规则不会导致您被永久锁定 |
| 已知 CVE | CI 中运行 `govulncheck`(每周及每次 PR) |
请通过 [GitHub 安全公告](https://github.com/jp1337/easywall/security/advisories/new) 报告漏洞 —— 请勿作为公开 issue 发布。参见 [SECURITY.md](SECURITY.md)。
## 📦 项目状态
| 阶段 | 状态 | 描述 |
|---|---|---|
| 阶段 1 — 基础 | ✅ 完成 | Go 模块,共享类型,IPC 协议,版本检查 |
| 阶段 2 — 核心守护进程 | ✅ 完成 | nftables 后端,规则存储,验收,Docker 共存 |
| 阶段 3 — Web 后端 | ✅ 完成 | chi 路由,Argon2id 身份验证,会话管理,所有处理程序 |
| 阶段 4 — Web 前端 | ✅ 完成 | 模板,CSS 自定义属性,HTMX,浅色/深色模式 |
| 阶段 5 — 部署 | ✅ 完成 | systemd 单元,Docker 多阶段构建,Debian 包 |
| 阶段 6 — 文档 | ✅ 完成 | MkDocs Material,GitHub Pages,自定义主题 |
| 阶段 7 — CI/CD | ✅ 完成 | 测试、安全、构建、发布、文档工作流 |
### 路线图
| 功能 | 备注 |
|---|---|
| 2FA / TOTP | Web UI 的双重身份验证 |
| Let's Encrypt ACME | 无需反向代理的自动 TLS 证书 |
| GeoIP 屏蔽 | 基于国家/地区的规则(需要 GeoIP 数据库) |
| REST API | 用于 Ansible 和自动化集成 |
## 📜 许可证
GPL-3.0 — 详见 [LICENSE](LICENSE)。
*这是一次旨在从根源上解决问题的重写,而非仅仅治标。*标签:Argon2id, Awesome, EVTX分析, Google搜索, Go语言, iptables替代, netlink, nftables, Web界面, 可视化管理, 后台管理, 开源, 日志审计, 程序破解, 系统管理, 系统运维, 网络安全, 网络配置, 请求拦截, 进程隔离, 防火墙, 隐私保护