带 Web 控制台的 HTTP(S)、WebSocket 抓包与调试代理,支持 HTTP 代理和 SOCKS5。
509
Eddy Proxy 是一个带 Web 控制台的 HTTP(S) 抓包与调试代理,适合调试浏览器、移动端、桌面应用和后端服务的网络请求。
镜像内已经包含前端和 Go 后端,不需要安装 Node.js、pnpm 或额外的 Web 服务器。
官方镜像提供 linux/amd64 和 linux/arm64 架构:
zzzgr/eddy-proxy:latest
docker run -d \
--name eddy-proxy \
--restart unless-stopped \
-p 8888:8888 \
-p 9090:9090 \
-v eddy-proxy-data:/data \
zzzgr/eddy-proxy:latest
启动后:
http://127.0.0.1:8888socks5://127.0.0.1:8888http://127.0.0.1:9090/healthz首次启动如果没有设置密码,随机密码只会打印在容器日志中:
docker logs eddy-proxy
请登录后立即修改密码。密码哈希保存在 /data/eddy.db 中,重启容器不会重新生成密码。
http://<主机地址>:9090/cert 下载证书。<主机地址>:8888。HTTPS 抓包需要在客户端信任该 CA。对于移动设备,还需要按照系统要求开启用户证书信任;部分 App 使用证书锁定,无法直接进行 MITM。
| 容器端口 | 用途 |
|---|---|
8888 | HTTP 代理和 SOCKS5 代理,默认共用并自动识别 |
9090 | Web 控制台、REST API、WebSocket 和健康检查 |
/data 是必须持久化的数据目录,包含:
生产环境建议使用 Docker named volume:
docker volume create eddy-proxy-data
不要删除该卷,否则会丢失抓包记录、密码哈希和 CA 私钥。CA 私钥具有敏感性,请限制卷的访问权限。
容器内端口默认固定为 8888 和 9090,只需要修改端口映射左侧:
docker run -d \
--name eddy-proxy \
--restart unless-stopped \
-p 18888:8888 \
-p 19090:9090 \
-v eddy-proxy-data:/data \
zzzgr/eddy-proxy:latest
此时访问控制台使用 http://127.0.0.1:19090,客户端代理使用 127.0.0.1:18888。
可以将配置文件挂载为 /data/config.yaml:
docker run -d \
--name eddy-proxy \
--restart unless-stopped \
-p 8888:8888 \
-p 9090:9090 \
-v eddy-proxy-data:/data \
-v "$PWD/config.yaml:/data/config.yaml:ro" \
zzzgr/eddy-proxy:latest
配置示例见项目中的 config.example.yaml。镜像默认使用以下部署配置:
Web 控制台:0.0.0.0:9090
HTTP 代理:0.0.0.0:8888
SOCKS5 代理:0.0.0.0:8888
数据目录:/data
也可以直接从镜像中导出配置模板:
docker run --rm --entrypoint /bin/cat zzzgr/eddy-proxy:latest \
cat /etc/eddy-proxy/config.example.yaml > config.example.yaml
镜像中的部署环境变量会覆盖 YAML 中同名配置。需要改变容器内监听地址时,请显式传入环境变量,并同步修改端口映射;通常只修改 -p 左侧即可满足部署需求。
Docker 镜像默认设置 EDDY_PROXY_PORTS_LOCKED=true,因此 Web 控制台不会修改容器内的代理端口;端口由 Docker 的 -p 参数管理。
常用环境变量示例:
docker run -d \
--name eddy-proxy \
-p 8888:8888 -p 9090:9090 \
-v eddy-proxy-data:/data \
-e EDDY_AUTH_PASSWORD='change-this-password' \
-e EDDY_CAPTURE_PERSIST=meta \
-e EDDY_RUNTIME_MEMLIMITMB=1024 \
zzzgr/eddy-proxy:latest
环境变量名称按配置的 YAML 路径转换,例如:
auth.password → EDDY_AUTH_PASSWORD
capture.maxFlows → EDDY_CAPTURE_MAXFLOWS
runtime.memLimitMB → EDDY_RUNTIME_MEMLIMITMB
log.level → EDDY_LOG_LEVEL
直接通过 -e EDDY_AUTH_PASSWORD=... 设置密码时,密码可能出现在 Shell 历史或容器检查信息中;更安全的做法是使用首次启动时生成的随机密码,登录后在控制台修改。
Web 管理端口拥有控制台和管理 API。不要在不设防的情况下将 9090 暴露到公网。
推荐方案:
8888 仅开放给需要抓包的客户端或内网/data 卷和 CA 私钥capture.persist 设置为 none 或 metaEddy Proxy 只能用于你有权调试的设备、服务和网络流量。
数据保存在独立的 Docker volume 中,升级镜像不会自动删除数据:
docker pull zzzgr/eddy-proxy:latest
docker rm -f eddy-proxy
docker run -d \
--name eddy-proxy \
--restart unless-stopped \
-p 8888:8888 -p 9090:9090 \
-v eddy-proxy-data:/data \
zzzgr/eddy-proxy:latest
正式环境建议固定到具体版本标签,并在升级前备份 /data。
docker build -t eddy-proxy:local .
运行本地镜像时,将上面命令中的 zzzgr/eddy-proxy:latest 替换为 eddy-proxy:local。
查看启动日志:
docker logs -f eddy-proxy
检查容器状态:
docker inspect --format='{{.State.Health.Status}}' eddy-proxy
curl http://127.0.0.1:9090/healthz
如果 HTTP 请求可以通过代理但 HTTPS 没有明文内容,通常是客户端尚未安装并信任 Eddy Proxy CA,或目标 App 启用了证书锁定。
Content type
Image
Digest
sha256:68f66a550…
Size
10.9 MB
Last updated
about 2 months ago
docker pull zzzgr/eddy-proxy