lyafence/flowdav
GitHub: lyafence/flowdav
flowdav 是一款将 WebDAV 存储作为传输层的轻量级 SOCKS5 代理,实现在受限网络环境中隐蔽地中转加密流量。
Stars: 1 | Forks: 0
# flowdav
一个轻量级的 SOCKS5 代理,使用 WebDAV 作为传输层。通过将 WebDAV 存储作为中介,当您连接到公共 Wi-Fi(咖啡馆、酒店等)时,可以通过您的家庭互联网连接路由您的流量。



## 功能
- **零开放端口** — 服务器没有用于数据的监听端口;所有通信都通过 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, 安全合规, 日志审计, 流量伪装, 网络代理, 网络安全, 请求拦截, 隐私保护