Fiddler Everywhere 与 Classic Web 调试手册
先决定你运行的是 Everywhere 还是 Classic
Linux 起步路径采用 Everywhere 官方 Linux 入门列出的 Ubuntu 22+ x64 桌面、至少 400 MB 空间,以及能访问 Telerik 登录端点的网络。先从官方页面下载对应 AppImage,取得获准使用的账号与试用或订阅资格;受限内网还要放通官方列出的认证域名。以下在下载该文件的普通用户终端 A 执行,把变量值换成实际文件的绝对路径:
APPIMAGE=/实际/绝对路径/FiddlerEverywhere.AppImage
test -f "$APPIMAGE" && chmod u+x "$APPIMAGE" && "$APPIMAGE"终端若报缺少 libfuse.so.2,先用 . /etc/os-release; printf '%s %s\n' "$ID" "$VERSION_ID" 确认发行版。Ubuntu 24.04 发行版的包名是 libfuse2t64,与 Fiddler 安装页仍写的 libfuse2 不同;AppImage 故障说明和 Ubuntu 包目录可核对。只在该错误及版本条件成立时执行 sudo apt update && sudo apt install libfuse2t64,随后重试原 AppImage 命令;其他发行版先查自身包名,不照搬。不要给 GUI 本身加 sudo。Fiddler 官方 Linux 指引对特定 SUID sandbox helper 错误还列出 --no-sandbox 兼容启动参数,但它会降低进程隔离,不应成为日常默认命令;受管设备先核对安全策略与应用打包状态。登录成功后,界面 Home 显示账号与许可信息。到 Settings > Connections 读取 Fiddler listens on port,再打开 Live Traffic;下面的 8866 只代表官方默认值。
“打开 Fiddler”在团队里可能指两套不同产品线。Fiddler Everywhere 是 Windows、macOS 和 Linux 上的跨平台桌面产品,账号、订阅、Rules、Composer、共享能力和应用自己的本地状态都属于它的控制面。Fiddler Classic 是 Windows 上的遗留桌面工具,FiddlerScript、扩展、WinINET 行为和 .saz 工作流积累较多。两者都能观察 HTTP(S),但菜单、规则格式、授权、自动化和升级路径不能互换。
新建跨平台团队基线时优先确认 Fiddler Everywhere 的实际版本和许可;只有现有脚本、扩展或支持流程明确依赖 Classic 时才继续保留 Classic。问题单必须写清产品名和版本,不能只写“Fiddler 抓不到”。同一台 Windows 机器同时运行两者还会争用系统代理或监听端口,先关闭另一套产品再做最小实验。
Fiddler Everywhere 启动后的系统捕获默认先处理非加密 HTTP。选择系统捕获前,用一个显式代理请求证明监听端点存在,比依赖桌面应用自动修改系统代理更容易分型。界面没有会话时,依次确认 capture source、监听端口、客户端代理来源、VPN/虚拟网卡、localhost 绕过和界面过滤器。Fiddler 已接管系统代理不代表 Java、容器、命令行或自带网络栈的应用一定跟随。
终端 B 把 FIDDLER_PORT 改成界面实际值后发送不带身份信息的 HTTP 请求。-q 排除本机 curlrc,--noproxy '' 防止代理绕过规则吞掉显式代理;不要用一个已有系统代理的成功请求代替这个对照。
FIDDLER_PORT=8866
curl -q --noproxy '' --fail-with-body \
--proxy "http://127.0.0.1:$FIDDLER_PORT" \
--connect-timeout 3 --max-time 8 \
-o /dev/null -w 'status=%{http_code}\n' http://example.com/正常情况下打印 status=200,Live Traffic 中出现 host 为 example.com 的 HTTP 会话。若连接 8866 失败,先核对设置中的端口与 Fiddler 进程;若是 HTTP 错误,另用 curl -q --noproxy '*' --fail-with-body http://example.com/ 对照直连结果,再分清代理端和上游端。显式请求已进入 Live Traffic 而目标应用未出现时,检查该应用的代理选择;Filters 也可能把已有会话隐藏,排障初期先清空过滤条件。
HTTPS 捕获有两份信任判断
Fiddler Everywhere 的 Settings > HTTPS 管理 HTTPS 解密。首次启动默认关闭 Capture HTTPS traffic。Windows 和 macOS 可以选择 User Store,Windows 还可以选择需要管理员权限的 Machine Store;Linux 的系统捕获需要导出应用生成的根证书,再按发行版的信任库规则安装。这个根一旦进入系统信任库,影响的不只是 Fiddler 窗口,还包括读取该信任库的其他进程;不要在共享或受管主机上未经批准执行。
Windows/macOS 个人开发机优先使用 User Store。Machine Store 会让同机所有用户都可能信任该 CA,只有共享机器确有需求、拥有审批和回收责任时才使用。Reset 更换 CA 后,原来安装的公开根不再对应新根;Linux 手工信任的源文件也必须单独检查和更新。Remove 针对应用管理的证书状态,不能代替删除操作者手工加入的 Linux 信任文件。
Ubuntu 测试桌面可按 Fiddler 官方 CA 指引在 Settings > HTTPS > Export 选择 PEM,将公开证书导出到可辨认的绝对路径。这里特意使用 PEM,是因为 Ubuntu 本地 CA 信任源要求单证书 PEM 内容与 .crt 文件名。终端 B 以普通用户检查导出文件与指纹;FIDDLER_CA_SRC 必须替换为实际导出的文件:
FIDDLER_CA_SRC=/实际/绝对路径/Fiddler_Root_Certificate_Authority.pem
test -f "$FIDDLER_CA_SRC" &&
! grep -q 'PRIVATE KEY' "$FIDDLER_CA_SRC" &&
openssl x509 -in "$FIDDLER_CA_SRC" -noout -subject -issuer -fingerprint -sha256输出应能识别本次由 Fiddler 导出的根证书;若文件不是有效 PEM、身份不符或含私钥,停止操作,不把未知证书加入系统。记录完整 SHA-256 指纹供撤销时核对。只有具备本机信任库变更权限并确认该主机允许安装调试根时,才继续:
FIDDLER_CA_CREATED=0
if ! test -f "$FIDDLER_CA_SRC" || grep -q 'PRIVATE KEY' "$FIDDLER_CA_SRC" ||
test "$(grep -c '^-----BEGIN CERTIFICATE-----$' "$FIDDLER_CA_SRC")" -ne 1; then
printf '拒绝安装:导出文件缺失、含私钥或不是单证书 PEM\n' >&2
else
FIDDLER_CA_FP="$(openssl x509 -in "$FIDDLER_CA_SRC" -noout -fingerprint -sha256 | sed 's/.*=//; s/://g')"
if test "${#FIDDLER_CA_FP}" -ne 64; then
printf '拒绝安装:无法读取单个 PEM 证书指纹\n' >&2
else
FIDDLER_CA_DST="/usr/local/share/ca-certificates/fiddler-lab-${FIDDLER_CA_FP}.crt"
if test -e "$FIDDLER_CA_DST"; then
printf '目标已存在,停止并核对:%s\n' "$FIDDLER_CA_DST" >&2
elif sudo install -m 0644 -- "$FIDDLER_CA_SRC" "$FIDDLER_CA_DST"; then
FIDDLER_CA_CREATED=1
sudo update-ca-certificates
printf 'FIDDLER_CA_DST=%s\nFIDDLER_CA_FP=%s\n' "$FIDDLER_CA_DST" "$FIDDLER_CA_FP"
fi
fi
fi目标已存在时不要覆盖;核对其来源和指纹后再判断是否可以复用。新安装后,在同一终端检查目标指纹与导出值一致,再验证系统信任:
test "$FIDDLER_CA_CREATED" -eq 1 &&
test "$(openssl x509 -in "$FIDDLER_CA_DST" -noout -fingerprint -sha256 | sed 's/.*=//; s/://g')" = "$FIDDLER_CA_FP" &&
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt "$FIDDLER_CA_DST"正常输出为该文件路径后接 OK。若验证失败,先检查导出格式、文件内容与 update-ca-certificates 输出,不要改用 curl -k 或关闭上游证书校验。保存打印的路径和指纹,结束实验时还要用它们撤销这次信任。没有管理员权限时,可改用官方的独立浏览器或终端捕获模式,不把这条系统信任路径伪装成普通用户操作。
在 Fiddler 勾选 Capture HTTPS traffic 并保存,保持前面同一监听端口。终端 B 用不含身份信息的页面验证:
curl -q --noproxy '' --fail-with-body \
--proxy "http://127.0.0.1:$FIDDLER_PORT" \
--connect-timeout 3 --max-time 8 \
-o /dev/null -w 'status=%{http_code}\n' https://example.com/预期 status=200,Live Traffic 和 Inspectors 中能看到 HTTPS 会话的请求与响应字段;只看到 CONNECT 而无明文时,检查是否启用 HTTPS 捕获、当前客户端是否信任本次根、目标是否使用证书固定或绕过代理。这个正例没有证明“不受信客户端”的行为;负例应换未导入该根的独立客户端验证证书错误,不为制造失败反复移除共享系统根。换成自己控制的测试服务时,可以加入唯一调试头,并与服务端日志对照请求是否到达。
Fiddler 还要验证 Fiddler 到真实服务的上游证书。Ignore server certificate errors 会关闭或缩小这一安全判断,不能用来掩盖测试服务的错误链。若确需验证一个已知开发端点,应只把该 endpoint 放入允许范围,并在结束后删除;空列表配合启用开关可能忽略全部上游错误,会让 Fiddler 自身暴露在错误服务身份或另一次拦截中。
浏览器能解密而 Java 不能,通常不是 Fiddler 会话问题,而是 Java 使用自己的 truststore。应给目标 JVM 指定临时 truststore,记录 java.home、alias 和指纹,再按 keytool 的方法回收。移动设备需要把代理指向开发机,并单独安装 CA;开放远程客户端时同时限制监听网卡、主机防火墙和测试设备来源,不能把一个无认证代理暴露给整段网络。
Inspectors 负责读事实,Filters 只改变视野
Live Traffic 中的一条 session 包含请求、响应、连接和时序。Inspectors 用结构化视图读取 headers、query、cookies、body、JSON、WebSocket 或原始字节。先看总览里的 URL、状态码、进程和时间,再进入具体 body;直接在数千条会话里全文搜索容易把第三方遥测、刷新请求和旧会话当成当前故障。
Filters 不会阻止客户端请求,也不会修改上游,它只控制当前会话列表显示。为了共享排障步骤,可以把过滤条件写成“测试 host + 调试头 + 相对时间窗口”,而不是仅靠人工选中。过滤前后会话总数变化要可解释,避免因为隐藏了 302、预检请求或重试而得出错误的单请求结论。
响应体可能经过 gzip、Brotli、分块或流式传输。Inspectors 展示的解码内容不一定等同于线路上的原始字节;协议差异需要 Raw、Headers 和 Timeline 交叉观察。HTTP/2 多路复用、WebSocket 和长连接也会改变传统“一请求一连接”的直觉。涉及真实包级行为时,应再用 Wireshark 或服务端 trace 复核。
Rules 是可执行改写,不是界面标签
Fiddler Everywhere 的 Rules 条件与动作可以匹配 URL、method、status、header 或 body,并执行返回响应、修改 header/body、延迟、关闭连接等动作。请求字段在转发前就可匹配;只依赖响应字段的条件要等上游响应到达,不能拿来证明请求被本地短路。Return Manual Response 属于最终动作,命中后直接应答,不连接上游。先完成前面的 http://example.com/ 观察基线,并记录其他已启用规则的状态,避免它们改变此实验结果。
在 Traffic 的 Rules 页点击 Add Rule,命名为 example-com-get-503。Rule Builder 中组合四个请求条件:Host 精确匹配 example.com、Path 精确匹配 /、Method 为 GET、Request Header 的名称为 X-Debug-Case 且值精确匹配 fiddler-503。动作按官方自定义响应步骤选择 Return Manual Response,填入完整响应;Content-Length 是下方 JSON 的 31 个 UTF-8 字节,不要把空行后的内容漏掉:
HTTP/1.1 503 Service Unavailable
Content-Type: application/json
X-Debug-Proxy: fiddler
Content-Length: 31
{"code":"UPSTREAM_UNAVAILABLE"}保存规则,打开 Rules 页总开关并启用这条规则。终端 B 对同一 HTTP URL 发正反两条请求;预期 503 时不能用 --fail-with-body 使 curl 在业务负例提前退出:
curl_rc=0
status=$(curl -q --noproxy '' --silent --show-error \
--proxy "http://127.0.0.1:$FIDDLER_PORT" \
--connect-timeout 3 --max-time 8 \
-H 'X-Debug-Case: fiddler-503' \
-D /dev/stderr -o /dev/stderr -w '%{http_code}' \
http://example.com/) || curl_rc=$?
printf 'curl_rc=%s status=%s\n' "$curl_rc" "$status"
test "$curl_rc" -eq 0 && test "$status" = 503
curl -q --noproxy '' --fail-with-body \
--proxy "http://127.0.0.1:$FIDDLER_PORT" \
--connect-timeout 3 --max-time 8 \
-o /dev/null -w 'without_header=%{http_code}\n' \
http://example.com/第一条的响应头应有 X-Debug-Proxy: fiddler,响应体应为刚填入的 JSON,Fiddler 会话显示该规则命中;第二条通常回到前面观察到的上游 200,且不带这个调试响应头。如果第二条状态变化,先与实验前基线比对,不把公共站点的任意新状态归因于 Rule。Fiddler 的命中记录与官方最终动作语义表明此规则可在本地短路;要独立证明某个自有服务没有收到请求,仍需用有权限的测试服务日志或计数器对照。实验后禁用并删除该临时规则,恢复其他规则原先的开关状态。
规则修改响应体时要同步考虑编码、Content-Type、压缩和 Content-Length。对登录、支付、文件上传和真实身份流量做广泛 body 替换风险很高,调试应使用合成账号和最小数据。规则集合如果要进入团队仓库,需要代码式评审:匹配范围、凭证处理、预期输出、失败语义、停止条件和回滚必须可读,不能只分享界面截图。
Fiddler Classic 的 FiddlerScript 与扩展也能改写请求和响应,但它们属于另一套执行环境。迁移到 Everywhere 前要逐条确认能力映射,不能假设脚本复制后语义不变。Classic 若继续存在,应冻结受支持版本、扩展来源和 Windows 运行边界,并给退出迁移设定明确触发条件。
Composer 把观察到的请求变成受控实验
Composer 用于构造和发送 HTTP 请求。它比在原会话上直接重放更适合显式编辑 method、URL、headers 和 body,但复制会话时可能把 Authorization、Cookie、CSRF token 和个人数据一并带入。第一步不是点击 Execute,而是删掉不需要的身份和追踪字段,换成测试账号与语义化占位符。
一次有价值的 Composer 对照只改变一个变量。例如先发送原始 If-None-Match 得到 304,再移除该头得到 200;或者保持请求体不变,只替换测试环境的过期 token。两次请求应使用新的调试标识并在服务端日志中可区分。Composer 发出的请求是新的真实请求,可能产生写入副作用,不能把“它来自调试工具”当作安全隔离。
请求集合需要长期复用时,记录目标环境、账号级别、幂等性、前置数据和清理动作。能够用自动化测试或契约夹具稳定覆盖的场景,不应长期依赖某个人桌面上的 Composer 历史。
.saz、快照与云共享扩大了数据边界
Fiddler Classic 常用 .saz 保存 session archive;Everywhere 也能导入导出会话、生成快照并提供协作能力。这些文件可能包含完整 URL、Cookie、Authorization、请求与响应体、内部域名、设备信息和用户数据。自动 sanitization 可以降低部分风险,但不能证明非结构化、压缩、加密或二进制内容已经清除。
默认只导出必要会话,并在导出后再次人工审查。原始文件放进仅当前处理者可读的加密临时目录,问题系统只接收脱敏后的最小证据。使用云分享时,访问主体从本机操作者扩大到账号、组织和链接接收者,还要考虑订阅、保留策略、撤销能力与审计。团队安全政策不允许流量离开终端时,不启用云协作。
会话数量、body 大小和长连接会同时推高内存与磁盘。捕获前限定进程、host、path 和时间窗,测试大文件或流媒体时关闭不必要的 body 保存。达到容量阈值后应停止新捕获、保留最小现场并清空无关会话,而不是继续让桌面进程承担无界缓存。
关闭窗口之前先恢复代理和信任
退出顺序从影响最大的改写开始:禁用并删除本次 Rule,停止 Replay/Composer 任务,关闭 capture source,再恢复系统、浏览器和移动设备原有代理设置。使用显式 --proxy 的终端实验没有修改 shell 全局代理变量;若另外启动过 System Proxy 捕获,须核对退出后原来的代理配置是否恢复。Windows/macOS 在 HTTPS Settings 使用 Remove 后,还要检查对应用户或机器证书库;Linux 手工加入的信任源必须按安装时记录的路径和指纹单独删除,不能指望界面 Remove 代替。
在前述安装证书的同一终端,先确认 FIDDLER_CA_CREATED=1,且源文件与目标文件的指纹仍与记录相同,再只删除本次创建的那个源文件并刷新系统信任:
if test "${FIDDLER_CA_CREATED:-0}" -eq 1 &&
test -n "${FIDDLER_CA_FP:-}" &&
test "${FIDDLER_CA_DST:-}" = "/usr/local/share/ca-certificates/fiddler-lab-${FIDDLER_CA_FP}.crt" &&
test -f "$FIDDLER_CA_DST" &&
test "$(openssl x509 -in "$FIDDLER_CA_DST" -noout -fingerprint -sha256 | sed 's/.*=//; s/://g')" = "$FIDDLER_CA_FP"; then
sudo rm -- "$FIDDLER_CA_DST" && sudo update-ca-certificates
else
printf '拒绝自动删除:回到安装记录核对目标与指纹\n' >&2
fi刷新后用 openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt "$FIDDLER_CA_SRC" 复查:若仍为 OK,说明这枚根可能还从其他位置被信任,不能宣布撤销完成;即使此命令不通过,也要分别检查 Firefox、JDK、移动设备等独立信任库。删除 Fiddler 导出的证书文件本身不会撤销已建立的信任。关闭 Fiddler 后,直连测试服务应成功,显式请求旧代理端口应连接失败;测试 Rule 的响应头不再出现。最后检查 .saz、快照、导出、共享链接和临时证书是否仍需留存。Classic 还要检查 WinINET 代理、启动项、FiddlerScript 和扩展残留,不能只卸载程序文件。
跨平台 GUI、Inspectors、Rules 与协作是 Fiddler Everywhere 的优势;Windows 遗留脚本和 SAZ 资产才是继续保留 Classic 的理由。偏向 Map/Breakpoints 的桌面移动端调试可用 Charles,需要脚本化 addon、无头运行和 CI 夹具则进入 mitmproxy。选型首先看身份、数据和自动化边界,不看三套界面谁更像个人习惯。
权威资料与规范地址
安装与系统依赖
| 查阅内容 | 官方地址 |
|---|---|
| Everywhere 官方安装步骤 | https://www.telerik.com/fiddler/fiddler-everywhere/documentation/installation-and-setup/quickstart-linux |
| AppImage FUSE 依赖 | https://docs.appimage.org/user-guide/troubleshooting/fuse.html |
| Ubuntu libfuse2t64 包 | https://packages.ubuntu.com/noble/libfuse2t64 |
