CFGoodNet 是一个本地 MITM 代理,支持基于规则的上游转发。
项目会打包成单文件运行:
dist/app.cjsdist/app.cjs.map(调试用 Source Map)
常用命令:
pnpm build
pnpm start
pnpm dev运行时配置文件:config/config.yml
首次启动时,如果不存在会自动生成:
config/config.ymlconfig/mitm-cert.pemconfig/mitm-key.pem
示例:
server:
listen: 3000
cfProxy: http://test.com/
# 可选:覆盖 cfProxy 的连接目标 IP
# 支持域名 / IPv4 / IPv6
cfGoodIp: freeyx.cloudflare88.eu.org
# 可选:命中 cfProxy 时追加 X-Forwarded-For 请求头
# 支持域名 / IPv4 / IPv6(域名会在启动时解析为 IP)
cfXForwardedForHeader: 1.32.234.15
httpProxy:
host: 127.0.0.1
port: 7897
# 可选,格式:"username:password"
auth:
rules:
- DOMAIN,ad.com,REJECT
- DOMAIN-SUFFIX,google.com,cfProxy
- DOMAIN-KEYWORD,youtube,httpProxy
- DOMAIN-WILDCARD,*.google.com,cfProxy
- DOMAIN-REGEX,^abc.*com,DIRECT
- MATCH,DIRECTserver.listen: 本地代理监听端口,默认3000cfProxy:cfProxy动作使用的上游 URLcfGoodIp: 可选,覆盖cfProxy的实际 TCP 连接目标cfXForwardedForHeader: 可选,命中cfProxy时为上游请求追加X-Forwarded-ForhttpProxy.host:httpProxy动作使用的代理主机httpProxy.port:httpProxy动作使用的代理端口httpProxy.auth: 可选,username:password,会自动转成Proxy-Authorizationrules: 规则列表,按顺序匹配,命中第一条即生效
规则格式:
- 普通规则:
TYPE,PATTERN,ACTION - 兜底规则:
MATCH,ACTION
支持的 TYPE:
DOMAIN: 完全匹配域名。例:DOMAIN,api.example.com,DIRECTDOMAIN-SUFFIX: 后缀匹配。例:DOMAIN-SUFFIX,example.com,cfProxyDOMAIN-KEYWORD: 子串匹配。例:DOMAIN-KEYWORD,google,httpProxyDOMAIN-WILDCARD: 通配符匹配(*/?)。例:DOMAIN-WILDCARD,*.example.com,DIRECTDOMAIN-REGEX: 正则匹配。例:DOMAIN-REGEX,^api\d+\.example\.com$,DIRECTMATCH: 匹配全部,通常放最后作为兜底。
支持的 ACTION:
REJECT: 拒绝请求(返回 403)cfProxy: 通过cfProxy上游转发httpProxy: 通过httpProxy.host:port转发DIRECT: 直连目标地址
rules按顺序生效,建议把更具体的规则放前面,把MATCH,...放最后。httpProxy动作只有在httpProxy.host和httpProxy.port都配置时才会生效,否则自动回退DIRECT。cfProxy动作只有在cfProxy配置为合法 URL 时才会生效,否则自动回退DIRECT。- 本项目会进行 MITM,浏览器如提示证书错误,需要信任
config/mitm-cert.pem,或仅在开发调试时使用浏览器忽略证书错误参数。
当配置了 cfGoodIp:
-
启动阶段:
- 若是 IP(v4/v6),直接使用该 IP
- 若是域名,启动时解析一次并使用解析结果
- 会打印日志:
[proxy] cfGoodIp: <ip>
-
命中
cfProxy时:Host/ TLSSNI仍然使用cfProxy的域名- 但 TCP 实际连接会改为
cfGoodIp指定(或解析得到)的 IP - HTTP(S) 与 WebSocket 都会应用该策略
若 cfGoodIp 未配置或解析失败,则回退为 cfProxy 的默认 DNS 解析。
当配置了 cfXForwardedForHeader:
-
启动阶段:
- 若是 IP(v4/v6),直接使用该 IP
- 若是域名,启动时解析一次并使用解析结果
- 会打印日志:
[proxy] cfXForwardedForHeader: <ip>
-
命中
cfProxy的 HTTP/HTTPS 请求时:- 自动追加
X-Forwarded-For: <ip>请求头
- 自动追加
若 cfXForwardedForHeader 未配置或解析失败,则不会追加该请求头。
当规则命中 cfProxy 时,HTTP/HTTPS 目标会映射为 cfProxy 路径:
https://target->https://cfProxy/.../https://target...http://target->https://cfProxy/.../http://target...(当cfProxy为https://)
cfProxy 协议映射:
http://cfProxy-> 上游http://cfProxyhttps://cfProxy-> 上游https://cfProxy
当规则命中 cfProxy 时,WebSocket 目标会映射为 cfProxy 路径:
wss://target->wss://cfProxy/.../https://target...ws://target->wss://cfProxy/.../http://target...(当cfProxy为https://)
cfProxy 协议映射:
http://cfProxy-> 上游ws://cfProxyhttps://cfProxy-> 上游wss://cfProxy
代理日志格式:
[PORXY] <action> <proxyRul>
<url>
示例:
[PORXY] DOMAIN-KEYWORD,youtube,httpProxy localhost
http://xxx
[PORXY] DOMAIN-KEYWORD,youtube,httpProxy https://cfprox.com/
http://xxx
每一行会按当前终端宽度截断,避免超出一行。
项目会进行 HTTPS MITM。
如需浏览器正常访问 HTTPS,请将 config/mitm-cert.pem 导入系统/浏览器信任证书。
# 构建单文件产物
pnpm build
# 运行生产产物
pnpm start
# 开发模式(打包 watch + 应用 watch)
pnpm dev
# 测试 / 修复 / 格式化 / 清理
pnpm test
pnpm fix
pnpm format
pnpm clean