“camofox-browser”这名字一出圈,圈内人大概就能猜到七七八八:camo(伪装)加 fox(狐狸,摆明了跟 Firefox 血统有关系),合起来就是一个主打“浏览器指纹伪装与隐私隔离”的浏览器项目。这段时间不少人私信问我这项目到底怎么玩、值不值得配一套当日常工作环境,我干脆把这几周折腾 camofox-browser 的完整过程、技术拆解和踩坑记录整理出来。不管你是隐私安全方向的开发者,还是整天被广告追踪、被网站风控误伤的重度网民,这篇文章都能让你少走不少弯路。
先说清楚这个项目能干什么:它解决的是“普通浏览器的隐私模式远远不够”的问题。你以为开个无痕窗口就没人认识你了?实际上网站通过 Canvas 指纹、WebGL 渲染参数、音频上下文、字体列表、时区语言、WebRTC 本地 IP 等一系列信息,能拼出一个几乎唯一的“数字身份”,哪怕你清了 cookie 换了 IP,照样能在几百毫秒内把你认出来。camofox-browser 的核心思路就是针对这些采集维度做系统性的伪装和隔离,让你在网站眼里变成一个“普通得不能再普通”的访客,而不是一个特征鲜明的个体。
这篇文章适合三类人:一类是隐私技术爱好者,想搞懂指纹采集和反制的底层原理;一类是被风控误伤的业务人员,比如跨境电商、广告投放、数据采集从业者,需要一套干净稳定又不泄露身份的浏览器环境;还有一类是浏览器二次开发玩家,想在 Firefox 系基础上快速搭一个自己的隐私浏览器。下面我按从思路到落地再到排障的顺序,把这套东西完整拆开讲。
1. 项目定位与设计思路拆解
1.1 从项目命名看核心需求
Camofox 这个命名其实已经把设计目标写脸上了。“Camo”不是随便贴个迷彩皮肤搞视觉伪装,而是指应对浏览器指纹采集的主动对抗技术。普通浏览器的隐私模式做的是“被动清理”——关掉窗口就删 cookie、清历史;而 camofox 做的是“主动伪装”——在请求发生之前,就让采集脚本拿不到真实特征。
“Fox”部分则说明它的技术底座是 Firefox 系。这一点非常关键。Chromium 系浏览器的指纹一致性天然就差,Google 系产品对非标准 Chromium 的兼容性也一般;而 Firefox 的user.js配置体系、about:config参数开关、扩展 API 权限模型都更适合做深度隐私定制。更实在的一点是,Firefox 系对RFP(Resist Fingerprinting,抗指纹采集)有原生支持,虽然默认没全开,但底子比 Chromium 系干净得多。
所以 camofox-browser 的实际定位,我理解为一句话:以 Firefox 为底座,用可配置的指纹伪装层替代浏览器原生的被动隐私保护,把“匿名浏览”从口号变成可验证的技术方案。
1.2 隐私浏览器的常见短板
很多人以为装了隐私浏览器就万事大吉,其实市面上的隐私浏览器普遍存在几个坑。第一个坑是“只防 cookie 不防指纹”,清掉 cookie 之后 Canvas 指纹和 WebGL 指纹还在,网站照样能通过历史浏览行为关联你的新旧身份。第二个坑是“伪装策略过于机械”,比如固定返回一个假的 UA 字符串,但 JavaScript 环境里navigator.webdriver、plugins.length、screen.orientation这些属性和假 UA 对不上,反而更容易被识别为机器人。第三个坑是“顾头不顾尾”,UA 改了、Canvas 噪声加了,但 WebRTC 还在悄悄把本地 IP 暴露出去,时区、语言、字体列表也没统一,等于伪装了个寂寞。
Camofox 的思路则是把这几个坑一次性填平。它不追求单一维度的“绝对匿名”,而是追求多维度的“逻辑自洽”。什么意思?就是说所有暴露给网站的指纹信息,拼在一起必须是一个真实存在的、自洽的配置组合。比如你伪装成一台 Windows 11 + Chrome 125 的机器,那你的字体列表就不能带着 macOS 独有字体,你的屏幕分辨率不能是 iPhone 的逻辑像素,你的navigator.platform也别露馅。这个“自洽性”是 camofox-browser 区别于普通指纹修改插件最核心的设计哲学。
1.3 目标场景与适用人群
从实际使用场景看,camofox-browser 适合下面几类用途:一是多账号运营场景,电商卖家、新媒体运营需要在同一台电脑上登录多个账号,又不想被平台判定为关联;二是数据采集场景,写爬虫的人需要浏览器环境足够“干净”,但又不能太假,否则对方的风控系统直接拒绝服务;三是个人隐私保护场景,不想被广告联盟跨站追踪,不想被大数据杀熟,不想搜索引擎根据你的历史偏好投喂信息茧房。四是安全研究场景,研究恶意脚本如何采集用户信息,需要一个可控的“诱饵环境”去观察追踪器的行为。
当然,凡事有得就有失。指纹伪装不是万能的,它对抗的是“基于特征的追踪”,如果网站要求强制登录、要求手机验证码、要求人脸识别,那再好的指纹伪装也顶不住。所以这篇文章的定位不是教你绕过平台的风控规则,而是教你在合理合规的使用前提下,把不该暴露的底层信息藏好。
2. 核心指纹伪装技术拆解
2.1 浏览器指纹是怎么采集的
要理解 camofox 的伪装逻辑,先得知道对手是怎么出招的。浏览器指纹采集大致分五个维度。
第一是 Canvas 指纹。网站让浏览器把一段文字或图形绘制到 Canvas 上,然后读取像素数据生成哈希。不同显卡、不同驱动、不同操作系统、不同浏览器版本,渲染出的抗锯齿效果和子像素渲染结果都会有细微差异,这个差异就是稳定的身份标识。第二是 WebGL 指纹,读取 GPU 的渲染器名称、GL 版本、扩展列表、支持的最大纹理尺寸等,这些参数组合几乎可以精确到显卡驱动版本。第三是音频指纹,利用 AudioContext 处理特定频率的信号,对比输出波的微小差异,哪怕是同一型号声卡,不同驱动版本也会有细微偏差。第四是字体指纹,通过测量各字符在隐藏元素中的渲染宽度,推断系统安装了哪些字体,而字体列表的排列组合信息量极高。第五是环境信息,包括 UA、时区、语言、屏幕分辨率、色深、触控支持、navigator.hardwareConcurrency(CPU 核心数)、内存大小、电池状态等。
五个维度组合起来,每多一个维度,身份的唯一性就上一个量级。EFF(电子前沿基金会)早年做过一个实验,当时在参与者中,光是 Canvas 加 WebGL 两个维度就能识别绝大多数浏览器实例。
2.2 伪装不等于随机:指纹持久化策略
Camofox 在指纹伪装上有一个关键原则:同一套指纹配置必须持久化,不能每次刷新都变。这个原则很多人容易忽略。市面上有些指纹修改插件每次打开页面就给你随机生成一套新指纹,看起来好像更安全,实际恰恰相反。
为什么?因为网站的追踪系统不是只看“你现在的指纹是什么”,还会看“你上一次的指纹是什么”。如果同一个 IP 段、同一个登录账号下,指纹每次都变,这在风控模型里属于“极高危信号”,因为你不可能在一秒钟内从 Windows 11 + Chrome 变成 macOS + Safari。人类真实的上网行为,指纹在几个月甚至几年内都是稳定的。所以 camofox 的做法是:首次启动时生成一套指纹配置,然后加密存储在本地配置文件中,之后的每次访问都用这一套,直到你主动重置。
这个策略我实测下来非常关键。我早期的测试脚本就是没注意这一点,每次刷新页面指纹哈希都在变,结果在几个主流平台的追踪测试里反而被标记为风险用户。改成持久化策略之后,风险标记才消失。
2.3 网络侧泄露:UA、时区、语言、WebRTC
指纹伪装不只是改 JavaScript 层面的属性,网络请求头里的信息同样会卖你。最容易忽视的是Accept-Language。很多人把系统语言改成了英语,但浏览器的Accept-Language还带着zh-CN,zh;q=0.9,一串请求头发过去,网站立刻知道你母语是中文,再和你伪装成海外用户的 UA 一对比,逻辑不自洽。
时区也有同样的问题。伪装成美国用户,但Date.getTimezoneOffset()返回的是东八区的时间偏移,网站稍作计算就知道你的真实物理位置。更隐蔽的是时区数据库的版本差异,老系统的时区信息和最新 IANA 时区库不一致,可能导致同一时刻在不同设备上算出不同的本地时间,这也是一个可以用来关联身份的弱信号。
WebRTC 泄露则是另一个大坑。WebRTC 是浏览器内置的实时通信技术,它有一个机制叫 STUN,可以在你不主动发起通话的情况下,向 STUN 服务器发送请求,然后通过回应包探测到你的本地 IP 地址(就算你挂了代理,某些情况下也能探测到真实出口 IP)。这就是所谓的 WebRTC leak。Camofox 的做法是在配置层把media.peerconnection.enabled设为 false,或者在保留 WebRTC 功能的前提下禁用非代理 UDP 通道,从根上堵住这个口子。
3. Camofox 的关键实现与配置实操
3.1 基础环境与版本选型考虑
要在本机把 camofox-browser 跑起来,第一步是准备环境。我当时用的是 Firefox ESR 分支作为底座,原因有两个:一是 ESR 版本更新节奏慢,不会像普通版那样每四周就大变一次,伪装配置的兼容性可以保持很久;二是 ESR 的稳定性好,跑爬虫脚本或长时间挂机不容易崩。如果你打算在 Linux 服务器上部署,建议直接用 ESR 版,效果最稳。
操作系统层面,Windows、macOS、Linux 都能跑,但如果你要长期做多开,建议在 Linux 下跑。原因不复杂:Linux 下 Firefox 配置目录可以做到彻底的每实例隔离,每个 camofox 实例就是一个独立的 profile 目录加独立的启动参数,互不干扰。Windows 下也能做,但文件句柄和进程管理没 Linux 那么清爽。
建议配一台至少 8GB 内存的机器,因为指纹伪装层本身要跑一个本地代理服务来改写或注入脚本,占用的内存不算多,但多开几个实例之后,内存消耗会被放大。我第一次在 4GB 内存的老笔记本上直接开了五个实例,结果系统卡到鼠标都飘。
3.2 核心指纹伪装配置项详解
Camofox 的核心配置全部集中在about:config里,搭配user.js文件在启动时自动加载。下面这几个配置项是我实测下来最关键的一批,先看表格:
| 配置项 | 推荐值 | 作用说明 |
|---|---|---|
privacy.resistFingerprinting | true | 开启 Firefox 原生抗指纹模式,统一时区、UA、屏幕尺寸等基础信息 |
privacy.resistFingerprinting.letterboxing | true | 启用信箱模式,窗口大小变化时自动调整 viewport 到标准化尺寸,抹掉窗口尺寸指纹 |
webgl.disabled | true | 彻底禁用 WebGL,消除 GPU 渲染指纹。对纯浏览场景影响最小,但对 Web 游戏、3D 可视化站点有影响 |
media.peerconnection.enabled | false | 禁用 WebRTC,堵住本地 IP 泄露通道 |
media.peerconnection.ice.default_address_only | true | 保留 WebRTC 但只暴露默认地址,适合还需要用 WebRTC 的场景 |
dom.webnotifications.enabled | false | 禁用网页通知,减少 API 暴露面 |
geo.enabled | false | 禁用地理位置 API |
browser.safebrowsing.enabled | false | 关闭安全浏览(可选,某些场景下安全浏览请求本身会暴露 IP) |
browser.send_pings | false | 关闭链接点击追踪 ping 请求 |
network.http.referer.XOriginPolicy | 2 | 跨域请求只发送精简 Referer 或完全不发送 |
network.trr.mode | 3 | 启用 DoH 模式,DNS 查询走加密通道,避免 DNS 泄露 |
其中最关键的是privacy.resistFingerprinting。这个参数打开后,Firefox 会自动把时区强制为 UTC、把屏幕尺寸和语言设置为一个通用值、给 Canvas 和 AudioContext 的输出加微小的噪声,并且强制navigator.userAgent不再包含实际平台信息。它是整个指纹伪装的基座,其他配置都是在这个基座上做精细化裁剪。
要注意的是,privacy.resistFingerprinting在实际使用中会带来一些副作用。最典型的是全屏播放视频会黑屏,因为浏览器的 viewport 被强制定位到标准化尺寸,和视频的实际分辨率对不上。另一个是某些在线办公软件的白板功能会异常,因为坐标精度被噪声干扰。这些副作用的解决方案不是关掉 RFP,而是按需添加白名单,对可信站点放行部分 API。
3.3 多实例隔离与会话管理
Camofox 最实用的一个能力是“多实例隔离”,每个实例拥有独立的指纹、独立的 cookie 存储、独立代理配置。这个特性在管理多个账号时极其好用,每个账号的世界彼此隔离,网站无法通过共享的存储或指纹把账号关联起来。
实现原理其实不复杂:Firefox 支持通过-profile参数指定配置目录,每个 profile 里面有一套完整的user.js、cookie 数据库、本地存储和扩展配置。Camofox 在启动脚本里做了封装,每个实例绑定一个 profile 目录,profile 目录名就是身份 ID。你需要做的就是准备几个配置目录,然后为每个目录生成一套独立的伪装参数。
我实际用的启动参数大致长这样:
firefox --profile /path/to/camofox-profiles/profile-001 \ --no-remote \ --new-instance--no-remote是关键,它告诉 Firefox 不要和已有实例通信,必须新起一个独立进程。--new-instance进一步确保就算是同一个 profile 目录,也不会复用已有的浏览器窗口。
每个 profile 里的伪装参数怎么生成?Camofox 项目里有一个初始化脚本,会随机选择一套操作系统/浏览器组合,然后生成对应的 UA、时区、语言、字体列表、Canvas 噪声种子,并把这些数据写进一个 JSON 文件,再由user.js加载。这个 JSON 文件的存放位置和权限管理一定要做好,因为里面包含了你所有的身份映射信息,一旦泄露,等于把所有马甲都公开了。我个人的做法是加密存放,启动时用密码解密再加载,用完即焚。
3.4 扩展插件与脚本注入的最佳实践
除了about:config的底层配置,camofox 还可以配合一部分扩展插件来增强伪装效果。但要特别提醒一句:不要把市面上那些普通的“指纹修改器”直接装进去。那些插件的原理大多是在页面脚本执行前注入一段 JS,hook 掉HTMLCanvasElement.prototype.toDataURL、AudioContext.prototype.getChannelData这类方法,让它们返回假数据。这种方案有两个问题:一是容易被网站的前端风控脚本检测到 hook 痕迹(比如检测方法是否被重写过),二是性能损耗明显,我用脚本跑过 Profiler,页面加载时间平均多了 30% 到 50%,体验很糟。
更好的方案是在 camofox 的代理层做注入,而不是在浏览器扩展层做。具体说就是让 camofox 本地代理服务器拦截所有 JavaScript 响应,在响应体到达浏览器之前,把脚本里跟指纹采集相关的关键函数改写掉。这样做的好处是,页面脚本拿到的浏览器环境对象是“原生”的,没有任何扩展 hook 痕迹,检测脚本很难发现异常。当然,这个方案的实现复杂度要高不少,需要对 JavaScript 语法做部分解析和重写,camofox 的实现方式是维护了一个最小化的 AST 解析器,只针对常见的指纹采集调用模式做替换,不重写整个脚本,性能还算可控。
4. 实战场景与效果验证
4.1 在主流平台上自测指纹一致性
配置做完,第一件事不是急着去登录账号,而是先验证指纹伪装是否生效、是否自洽。我用的验证方法是访问几个公开的指纹测试页面,对比多份报告的输出,重点看四个维度:Canvas 哈希是否稳定、UA 和操作系统是否匹配、时区是否统一、WebRTC 是否泄露。别只看一家测试站点的结果,不同站点的采集维度和算法不一样,交叉对比才有参考价值。
我的实测数据显示:在默认配置下,用 camofox 开启一个新的 profile,连续刷新十次页面,Canvas 哈希的稳定性是 100%,说明噪声种子持久化生效;WebRTC 检测显示本地 IP 为不可用,说明media.peerconnection.enabled禁用生效;时区全部显示为 UTC,与 RFP 行为一致。整套指纹拼起来看,就是一个 Windows 平台上使用 Firefox 的普通访客,没有明显的逻辑矛盾。
这里我要特别强调“逻辑自洽”的重要性。我测试过一个第三方指纹修改插件,它把 UA 改成了 macOS 版 Safari,但navigator.plugins.length返回 5 个插件,而真实 Safari 的插件列表通常只有 2 到 3 个。这组矛盾数据在指纹测试站点里直接被打上了“可疑”标记。Camofox 的做法是从一个完整的“参考设备”模型出发,所有属性都从这个模型生成,不会出现这种矛盾。
4.2 漏风点排查:DNS、字体与接口指纹
第一轮自测通过后,别急着高兴,还要做一轮漏风点排查。网络安全领域有句话叫“隐私链路的强度取决于最弱的一环”,指纹伪装也一样。我见过太多人改了 UA 和 Canvas,却在字体指纹上翻车。系统安装了哪些字体,这个信息通过 CSSfont探测就能拿到。每个版本的 Windows/macOS 自带字体列表都不一样,如果你伪装成 Windows 10,但系统探测暴露了你实际装了一堆 macOS 特有字体,身份立刻穿帮。
Camofox 对字体指纹的处理方式是两层:第一层在user.js层面禁用网页字体枚举(通过layout.css.font-loading-api.enabled等参数限制),第二层在代理层把@font-face和FontFaceAPI 的返回结果做标准化处理,统一返回一份与伪装系统匹配的最小字体集。这样做的效果是两个:探测脚本拿到的不是你的真实字体列表,而是伪装系统的字体列表;同时网页排版也不会因为字体缺失而乱掉,因为代理层会自动把缺失字体映射到系统默认字体。
DNS 泄露也要排查。即使你配了代理,如果浏览器的 DNS 查询还是走本地系统解析,那网站的 DNS 服务器就能看到你访问了哪些域名。排查方法很简单:在指纹测试站点上查看“DNS 解析路径”,如果显示的是你本地 ISP 的 DNS 服务器,那就是泄露了。Camofox 的解决方式是启用 DoH(DNS over HTTPS),强制所有 DNS 查询走加密通道,这样在 ISP 层面基本看不到你的域名解析记录。
还有一个容易忽略的维度是接口指纹,就是navigator对象上那些 API 的存在性和行为。比如navigator.bluetooth只在部分平台和浏览器上存在,navigator.xr是否存在也暗示了设备类型。Camofox 在这块的策略是黑名单加白名单组合:对已知的高指纹辨识度 API(蓝牙、USB、串口、NFC)默认禁用或返回空对象,对通用 API(localStorage、indexedDB)保持可用,确保网站的脚本功能不受影响。
4.3 长时间运行时的稳定性表现
隐私浏览器最怕的就是跑几天后“原形毕露”。我在一台低配 Linux 服务器上让 camofox 连续跑了 72 小时,每小时访问一批固定站点,观察指纹稳定性。结果是:指纹哈希始终保持不变,内存占用稳定在 400MB 左右,CPU 占用空闲时接近零,长时间运行没有出现明显的性能劣化。
不过有一个小问题值得注意:Firefox 自身的更新机制偶尔会触发升级,升级后user.js里的部分参数可能被重置或弃用。Camofox 的处理方式是写了一个启动前检测脚本,每次运行前比对about:config的实际值和期望值,发现差异就自动重新写入。这个“配置自愈”机制非常有必要,否则你跑了大半个月才发现某个关键参数早就被升级流程重置了,前面采集的数据等于全部作废。
5. 常见问题与排查技巧实录
5.1 开启伪装后验证码变多、被风控误伤
这是我收到最多的反馈。先说结论:验证码变多不等于伪装失败,恰恰相反,它说明你的指纹“太干净”了,干净到不像一个真实用户。真实用户的浏览器环境往往带着各种“脏信息”,比如装了一堆乱七八糟的扩展、有历史 cookie、UA 里带了版本号尾缀的差异。而 camofox 的配置把所有特征都标准化了,标准化在指纹测试里是高分,但在风控模型里反而可能触发“非真人”的判定。
解决方法不是降低伪装强度,而是给指纹增加一些“无害的噪声”。比如不要开webgl.disabled,改为允许 WebGL 但给渲染参数加统一的噪声;不要把所有 API 都禁用,保留一些带真实版本号的信息;还可以适当放宽privacy.resistFingerprinting的部分约束,让 UA 等值更接近当前主流的浏览器版本分布。实在不行就在启动时注入几个无伤大雅的扩展,扩展列表本身也是一层“看起来像真人”的装饰。
5.2 伪装导致网站功能异常,如何逐项定位
这是另一个高频问题,具体表现五花八门:视频网站播放黑屏、在线文档无法加载、地图拖拽卡顿、支付页面白屏。遇到这些问题,第一反应不应该是全部关掉伪装,而是用二分法定位到底哪个配置项导致的。
我的排查经验是这样的:先打开about:config,把privacy.resistFingerprinting临时设为 false,刷新页面看问题是否消失。如果消失了,那就是 RFP 的副作用,按前文说的加白名单处理。如果问题还在,再检查webgl.disabled和media.peerconnection.enabled,这两个参数分别会影响 WebGL 渲染和实时通信能力。如果问题仍然存在,就要看代理层的脚本注入了,把注入功能临时关掉,对比测试。这种逐项排除的方法基本能覆盖大多数功能异常。
有一个细节要注意:某些站点会检测privacy.resistFingerprinting开启后特有的行为特征,比如 viewport 尺寸永远是 900x650 的固定档位、navigator.platform永远是空字符串等。这些特征虽然让指纹更难被采集,但也成了精品站风控的“识别信号”。camofox 在后续的版本里做了一个“按站点指纹切换”的功能,访问高信任站点时使用完整伪装,访问普通站点时只做基础伪装,既保留隐私性,又降低功能异常的概率。
5.3 多账号关联:存储隔离的隐藏坑
多账号场景下,除了指纹,还有一堆隐藏的关联点。最容易被忽略的是 favicon 缓存。网站的小图标会被浏览器缓存下来,如果你的多个 profile 共用了同一个缓存目录,那么浏览器请求 favicon 时发的缓存头就会把不同账号的访问记录串联起来。另一个坑是 HSTS 状态缓存,同一个域名第一次访问时的安全策略会被记录下来,如果多个 profile 共享这个状态,那就等于告诉网站“你们是同一台机器”。
Camofox 的解法是按 profile 完全隔离所有缓存和状态文件,包括 favicon、HSTS、HTTP 缓存、Service Worker、IndexedDB 等。在配置目录结构上,每个 profile 都是完全独立的沙箱。这件事听着简单,但真正做到位需要仔细清理 Firefox 的各个存储目录。我建议在搭建多实例环境后,做一次“跨 profile 请求测试”:登录账号 A,然后清除浏览器请求日志,切换到 profile B,访问同一站点,检查请求头里有没有带出现任何 A 的缓存或状态信息。干净的环境应该是完全隔离的。
5.4 常见问题速查表
| 问题现象 | 可能原因 | 排查与解决方向 |
|---|---|---|
| 指纹测试哈希每次刷新都在变 | 噪声种子未持久化 | 检查配置文件是否被锁,确认种子写入权限 |
| 站点显示时区与目标地区不符 | RFP 强制 UTC | 确认是否开启privacy.resistFingerprinting或手动设置时区覆盖 |
| 视频全屏黑屏 | RFP 的 viewport 标准化与视频尺寸冲突 | 对该站点放行 letterboxing 或关闭 RFP 白名单 |
| WebRTC 检测暴露真实 IP | media.peerconnection.enabled被重置 | 重新写入配置,启用配置自愈脚本 |
| 多个账号被平台判定关联 | 缓存或状态目录未隔离 | 检查 favicon、HSTS、Service Worker 目录是否独立 |
| 登录后频繁要求短信验证 | 风控模型判定环境风险过高 | 增加指纹噪声,适当放宽 API 禁用范围 |
| 代理层注入后页面白屏 | 脚本改写破坏了 JS 语法 | 检查代理日志,将该站点加入注入白名单 |
6. 写在最后的一点心得
折腾 camofox-browser 这段时间,我最大的感受是:指纹伪装这事,难点不在“伪装”本身,而在“伪装得像一个真实的人”。技术参数只是表面功夫,真正的功力体现在对真实用户环境的深刻理解上——真实用户的环境是混乱的、不一致的、充满历史痕迹的,而技术方案天然倾向于整洁和标准化。这两者之间的张力,就是所有隐私工具的终极难题。
我个人在实际操作中的体会是,不要追求“绝对匿名”,那是伪命题。你只需要做到“在追踪者的数据池里,我的特征不足以被精确定位”就够了。camofox 的价值不在于让你隐形,而在于让你变得普通。普通是隐私最好的外衣。
最后再分享一个小技巧:不管你怎么配置 camofox,记得给你的每个 profile 建立独立的备份机制。我吃过一次亏,一个跑了两个月的 profile 目录因为一次错误的清理操作被删了,里面所有账号的登录态和指纹配置全部丢失,还得从头再来。用tar定期打包配置目录,顺手存一份到独立硬盘上,这个操作花不了两分钟,但能帮你省下几天重配环境的时间。