lyafence/flowdav

GitHub: lyafence/flowdav

flowdav 是一款将 WebDAV 存储作为传输层的轻量级 SOCKS5 代理,实现在受限网络环境中隐蔽地中转加密流量。

Stars: 1 | Forks: 0

# flowdav 一个轻量级的 SOCKS5 代理,使用 WebDAV 作为传输层。通过将 WebDAV 存储作为中介,当您连接到公共 Wi-Fi(咖啡馆、酒店等)时,可以通过您的家庭互联网连接路由您的流量。 ![Go](https://img.shields.io/badge/go-1.26.4-blue) ![License](https://img.shields.io/badge/license-MIT-green) ![Release](https://img.shields.io/github/v/release/lyafence/flowdav) ## 功能 - **零开放端口** — 服务器没有用于数据的监听端口;所有通信都通过 WebDAV 存储进行(可选的 loopback 健康检查端点) - **端到端加密** — 对所有数据进行 AES-256-GCM + HMAC-SHA256 加密,存储上没有任何明文 - **TLS 指纹伪装** — uTLS 伪装为 Chrome 133,在所有 WebDAV 请求上使用浏览器 User-Agent - **自适应轮询** — 空闲退避最高可达 60 秒并带有抖动,检测到活动时即时重置,无会话时零 API 调用 - **速率限制保护** — HTTP 429 触发独立冷却,会话自动迁移到另一个后端 - **多账户轮换** — 随机会话分配,跨独立后端的轮询上传回退 - **DNS 泄露保护** — 在客户端使用原生解析器,显式阻止 UDP - **配置加密** — PBKDF2 + AES-256-GCM,密钥从不以明文存储 ## 工作原理 ``` [SOCKS5 Client] ←→ [flowdav -c] ←→ [WebDAV Storage] ←→ [flowdav -s] ←→ [Destination] (encrypt, mux) (passive store) (decrypt, demux) ``` 1. SOCKS5 客户端(浏览器/应用)连接到 `127.0.0.1:1080` 上的 flowdav 客户端 2. 客户端将数据封装在加密信封中(AES-256-GCM + HMAC-SHA256) 3. 客户端将加密数据上传到 WebDAV 存储 4. 服务器轮询 WebDAV,下载并解密信封 5. 服务器打开与目标的真实 TCP 连接 6. 响应通过 WebDAV 流回客户端 ## 快速开始 ### 前置条件 - 一个 WebDAV 存储(任何提供商均可 — rclone、NextCloud、ownCloud 或专用的 WebDAV 服务) - 共享同一个 WebDAV 的两台机器:家里的**服务器**(连接到目标),咖啡馆的**客户端**(您的代理入口点)。为了进行测试,两者可以在同一台机器上运行。 ``` # 1. 安装(自动检测操作系统和架构) curl -sSf https://raw.githubusercontent.com/lyafence/flowdav/main/scripts/get-flowdav.sh | sh # 2. 生成配置(交互式 — 3个提示用于 URL、login 和 token) ./flowdav -g config.json # 3. 启动服务器(在 home,轮询 WebDAV) ./flowdav -s config.json # 4. 启动客户端(在 cafe,SOCKS5 位于 127.0.0.1:1080) ./flowdav -c config.json # 5. 测试代理 curl -s --proxy socks5h://127.0.0.1:1080 https://api.ipify.org ``` 所有加密密钥都会自动生成。该二进制文件会为您生成全新的 `enc_key`/`hmac_key` — 无需手动使用 `openssl`。 ## 配置 要完全控制每个字段,请手动创建或编辑配置。 ### 生成加密密钥 客户端和服务器上的密钥必须相同: ``` openssl rand -base64 32 # enc_key openssl rand -base64 32 # hmac_key ``` ### 示例配置 ``` { "listen_addr": "127.0.0.1:1080", "webdav": { "url": "https://your-webdav:8080", "login": "username", "token": "YOUR_TOKEN", "base_path": "data_sync" }, "enc_key": "paste enc_key here", "hmac_key": "paste hmac_key here" } ``` 必填项:`webdav.url`、`webdav.login`、`webdav.token`、`enc_key`、`hmac_key`。有关所有可选字段,请参见[配置参考](#config-reference)。 ### 多后端 将单个后端替换为 `backends` 数组以进行账户轮换: ``` { "webdav": { "backends": [ { "url": "https://webdav1.example.com", "login": "user", "token": "pass" }, { "url": "https://webdav2.example.com", "login": "user", "token": "pass" } ] } } ``` ### 加密配置 ``` ./flowdav -e config.json # encrypt ./flowdav -c config.json.enc -p secret # run encrypted FLOWDAV_PASSWORD=secret ./flowdav -c config.json.enc # or via env ``` ## Docker 镜像发布在 [GitHub Container Registry](https://github.com/lyafence/flowdav/pkgs/container/flowdav) 上。 将所需的模式(`-c`, `-s`, `-e`)作为命令传递: ``` # 启动服务器(在 home) docker run --rm -v ./config.json:/app/configs/config.json \ ghcr.io/lyafence/flowdav flowdav -s /app/configs/config.json # 启动客户端(在 cafe) docker run --rm -v ./config.json:/app/configs/config.json \ ghcr.io/lyafence/flowdav flowdav -c /app/configs/config.json # 加密现有配置 docker run --rm -v ./config.json:/app/configs/config.json \ -e FLOWDAV_PASSWORD=secret \ ghcr.io/lyafence/flowdav flowdav -e /app/configs/config.json # 使用加密配置运行 docker run --rm -v ./config.json.enc:/app/configs/config.json.enc \ -e FLOWDAV_PASSWORD=secret \ ghcr.io/lyafence/flowdav flowdav -c /app/configs/config.json.enc ``` ## 配置文件 | 文件 | 类型 | listen_addr | 健康检查端口 | |------|------|-------------|-------------| | `flowdav.json.example` | 通用 | `127.0.0.1:1080` | — | ### 配置参考 | 字段 | 类型 | 默认值 | 客户端 | 服务器 | 描述 | |-------|------|---------|--------|--------|-------------| | `storage_type` | string | `"webdav"` | ✓ | ✓ | 后端类型 | | `webdav` | object | — | ✓ | ✓ | WebDAV 连接(见示例) | | `webdav.base_path` | string | `""` | ✓ | ✓ | 用于存放文件的 WebDAV 子目录 | | `enc_key` | string | — | ✓ | ✓ | 32 字节 AES-256 密钥,base64 编码 | | `hmac_key` | string | — | ✓ | ✓ | 32 字节 HMAC-SHA256 密钥,base64 编码 | | `listen_addr` | string | `"127.0.0.1:1080"` | ✓ | | SOCKS5 监听器 (`host:port`) | | `log_level` | string | `"info"` | ✓ | ✓ | 日志级别 (`debug`, `info`, `warn`, `error`) | | `socks5_user` | string | `""` | ✓ | | SOCKS5 认证用户名 | | `socks5_pass` | string | `""` | ✓ | | SOCKS5 认证密码 | | `max_connections` | int | `100` | ✓ | | 最大并发 SOCKS5 连接数 | | `refresh_rate_ms` | int | `500` | ✓ | ✓ | 轮询间隔 | | `min_poll_ms` | int | `500` | ✓ | ✓ | 最小轮询间隔(空闲退避下限) | | `max_poll_ms` | int | `60000` | ✓ | ✓ | 最大轮询抖动上限(空闲退避) | | `flush_rate_ms` | int | `500` | ✓ | ✓ | 刷新间隔 | | `max_sessions` | int | `0` (∞) | ✓ | ✓ | 最大 WebDAV 会话数 | | `idle_timeout_ms` | int | `10000` | ✓ | ✓ | 会话空闲超时(毫秒);0 = 默认 10 秒 | | `max_message_size` | int | `16777216` | ✓ | ✓ | 最大负载(字节) | | `tls_fingerprint` | string | `"chrome"` | ✓ | ✓ | TLS 指纹配置 (`chrome`, `chrome_auto`) | | `padding_size` | int | `0` (关闭) | ✓ | ✓ | 尾部填充桶大小(字节);向存储观察者隐藏确切的负载大小。会增加开销;在使用公共 WebDAV 提供商时尝试设置为 `4096` 或 `16384`。 | | `hold_ms` | int | `0` (关闭) | ✓ | ✓ | 刷新前服务器端的最大随机延迟(毫秒)。会增加延迟。 | | `health_port` | string | `""` | ✓ | ✓ | 健康检查端点 (`host:port`) | 仅限客户端的字段(`listen_addr`、`socks5_user`、`socks5_pass`、`max_connections`)在服务器配置中不存在。未设置的字段使用默认值。 ## 健康检查 客户端和服务器都支持可选的 HTTP 健康检查端点。在配置中设置 `health_port` 以启用它(例如,`"127.0.0.1:9191"`)。端点 `GET /health` 返回包含引擎统计信息的 JSON: ``` { "active_sessions": 0, "closed_sessions": 0, "processed_files": 0, "upload_retries": 0, "download_retries": 0, "tx_queue_bytes": 0, "tx_queue_sessions": 0, "poll_ticker_ms": 500, "flush_ticker_ms": 500, "role": "client", "backends": [ {"url": "http://webdav1:8080", "available": true, "failures": 0, "rate_limited": false, "rate_limit_remain_sec": 0} ] } ``` - `active_sessions` / `closed_sessions` — 当前和已完成的 WebDAV 会话。 - `upload_retries` / `download_retries` — 累积的存储重试计数器(重启时重置)。 - `tx_queue_bytes` / `tx_queue_sessions` — 传输缓冲区背压:有多少数据正在等待上传。 - `backends` — 多 WebDAV 设置中每个后端的健康状态(断路器 + 速率限制状态)。对于单后端配置省略此项。 ## 安全性 - **加密:** AES-256-GCM + HMAC-SHA256(在 config.json 中配置) - **SOCKS5 认证:** 用户名/密码(如果在 config.json 中指定) - **DNS 泄露保护:** 原生解析器(无本地 DNS 查找) - **阻止 UDP:** 仅支持 TCP 流量 ## 故障排除 - **第一次请求可能需要几秒钟** — 客户端每 500 毫秒轮询一次 WebDAV;空闲退避可能会在冷启动时增加延迟。 - **HTTPS 站点失败但 HTTP 正常** — 从您的服务器机器检查 DNS 解析。服务器负责解析目标主机名。 - **“无法加载配置”** — 如果文件已加密,请使用 `-p` 标志或 `FLOWDAV_PASSWORD` 环境变量。如果未加密,请检查 JSON 语法。 - **活动浏览期间连接重置** — 使用 `-l debug` 启用调试日志以查看会话级别的错误。 ## Android 从 [GitHub Releases](https://github.com/lyafence/flowdav/releases) 下载 `flowdav-android.apk`。 该应用通过文件选择器接受加密的配置文件(`.json.enc`),或者手动输入 WebDAV 和加密密钥字段。 SOCKS5 代理在配置的地址上运行(默认为 `127.0.0.1:1080`)。 ## 发布归档 多平台发布归档由 CI 在每个标签(`v*`)上自动构建。 从 [GitHub Releases](https://github.com/lyafence/flowdav/releases) 下载最新的归档。 每个归档包含:一个单一的 `flowdav` 二进制文件(统一:客户端、服务器、加密)、一个示例配置(`flowdav.json.example`)和 README。 运行 `flowdav --version` 以打印发布版本;运行 `flowdav --help` 查看所有模式。 ## 类似项目 - [webdav-tunnel](https://github.com/spkprsnts/webdav-tunnel) — 基于 WebDAV 的 TCP 隧道,具有自托管模式(嵌入式服务器)和 yamux 多路复用。使用不同的通信协议,与 flowdav **不兼容**。 ## 许可证 MIT — 有关详细信息,请参见 [LICENSE](./LICENSE)。 Flowdav 是一个独立的实现,灵感来自 [NullLatency/FlowDriver](https://github.com/NullLatency/FlowDriver) 的概念。 原项目未指定许可证;flowdav 根据其自己的条款发布。
标签:DNS 反向解析, EVTX分析, Go, Ruby工具, SOCKS5, WebDAV, 安全合规, 日志审计, 流量伪装, 网络代理, 网络安全, 请求拦截, 隐私保护