深信服 Atrust 篡改了我的 Cookie 吗?求助一个可能关于深信服 Atrust 的问题

33 天前
 Mystery0

背景说明

OP 从 2018 年开始做了一个爬虫项目,从 2018 年持续维护到现在。 爬虫项目里面使用 tensorflow 训练了一个验证码识别器,从 2018 年以来,验证码识别器一直保持很高的准确率(>99%),但是从 2024 年 10 月 17 日开始,被爬的系统开始频繁报错“验证码错误”异常,最开始我以为是被爬系统加强了反爬策略,于是重新采集了 2w 张验证码,打上标记之后重新训练了一个模型,验证集成功率>99%之后将新的模型部署上去了,但是被爬系统依旧频繁报错“验证码错误”。 于是我开始具体的分析整个请求链路,发现这个事情似乎没有这么简单。

爬虫链路图示

在整个链路中,我将不同的服务器分别命名为 A 、B 、C 。

  1. 其中 A 就是爬虫需要爬取的业务系统,这个系统是一个外包项目,可能很长时间才改动一次( 21 年改过一次版,虽然接口有细微变化,但是整体交互逻辑与以前项目差别不大,因此我们花了几天时间就完成了爬虫的全部功能适配)。A 使用 Cookie 进行会话管理,技术栈从接口看似乎是 ASP ,主要针对电脑用户,因此在打开页面的时候就会生成 Cookie ,登录成功之后 Cookie 一般不会变化(更多细节我们也不是很了解)。
  2. 业务系统 A 藏在一个大内网之中,内网提供了深信服零信任平台 Atrust 的方式给非内网用户使用,只需要在自己电脑上连上 Atrust 并登录对应账号就可以直接访问业务系统 A 了。
  3. Atrust 客户端以前我们是专门开了一台 Windows 服务器上面运行然后再通过 Nginx 将接口反向代理给其他服务器使用,从去年开始我们发现了一个将 EasyConnect 或者 Atrust 运行到 Docker 中的项目(项目地址: https://github.com/docker-easyconnect/docker-easyconnect ),因此我们将 VPN 从 Windows 服务器上迁移到了 Linux 服务器中,docker-atrust 在完成账号登录之后通过 tinyproxy 向外暴露 http 代理和 socks 代理。
  4. 代理服务器 B 是使用 go 开发的服务,具体技术栈为 gin+标准库 http 包,加上 orirawlings/persistent-cookiejar 库实现 cookie 的持久化,gin 暴露一个统一代理接口,客户端发送过来的请求需要将用户标识、请求 Uri 以及访问需要使用代理信息设置到 Header 中,gin 收到请求之后根据用户标识和代理信息生成不同的 Cookie 存放路径,并且创建一个专用的 HttpClient ,与用户标识、代理信息 一起存储到 Map 中,后续相同用户标识再请求时直接从 Map 中获取 HttpClient 发送请求。
  5. 代理服务器 B 使用上述的方案将来源于业务系统 A 的 Cookie 信息完全对其他服务隔离,这样业务服务器 C 需要获取业务系统 A 的返回数据时,只需要设置一个用户标识就可以直接进行请求了,不用再额外处理 Cookie 的设置、更新、删除等操作。
  6. 业务服务器 C 上运行的是爬虫执行的具体逻辑,程序通过代理服务器 B 间接访问业务服务 A ,然后分析返回的数据并进行处理。

情况说明

带着上面的疑惑,我测试了多次 Edge 浏览器的登录,大多数情况下报错“验证码错误”、“用户名或密码错误”,如果我在提前输入好账号密码之后,快速多次点击验证码(触发验证码刷新),然后快速输入验证码并点击登录,就能够正确的登录进去。但是在登录后自动跳转的主页中报错“用户会话已注销”之类的提示。

此时夜已经很深了,我就将线上流量切回了 Docker-Atrust ,然后再次在 Windows 云服务器上 Edge 浏览器测试登录,此时它正常了。

😢

求助

这几天的时间里面,我每天都在想这个奇怪的现象,Edge 浏览器与爬虫程序的交叉点是从 Atrust 开始的,如果爬虫程序有问题应该不会影响 Edge 浏览器的 Cookie 与会话,既然影响了说明问题不是出在代理服务器 B 以及业务服务器 C ,而是 Atrust 往上的东西。

我甚至怀疑是 Atrust 存在 bug 导致了不同 Cookie 的请求被混合然后返回了错误的数据,或者是 Atrust 存在一个类似“连接复用”的功能?将不同 Cookie 的请求强行使用了相同的连接然后导致串会话?

我已经尝试修改了爬虫程序,在业务服务器 C 中,每次调用代理服务器 B ,都加上一个时间戳参数,用来确保每次请求的 Uri 均不相同(同一时间请求同一个接口有很小概率相同),问题没有得到解决,也没有肉眼看出来有任何的改善。

也花了时间翻了 Atrust 的一些功能说明和论坛,没有明确找到 Atrust 有这种“连接复用”的功能。

感谢大家花了这么多的时间看到这里,希望大家能够帮我分析分析,看看是不是我的排查思路哪里有问题?或者是 Atrust 的什么相关功能防止了我这种请求方式?

我已经实在是没辙了😢

2078 次点击
所在节点    问与答
35 条回复
Mystery0
33 天前
帖子不要沉了呀,求大家帮帮我
defunct9
33 天前
好同志,图很清晰。
Mystery0
33 天前
因为情况很复杂,所以写了很多的字配上图来说明情况,希望大佬们可以耐心看完
proxytoworld
33 天前
按道理零信任的项目是不会动第三方网站的 cookie
kkk9
33 天前
改时间戳有啥用?不应该先打个日志吗?把报错时候的所有参数都打印出来,对比正常时刻的参数
Mystery0
33 天前
@proxytoworld 对,这也是我十分奇怪的点,按理说不管是不是深信服,VPN 都不应该会“篡改”请求的,但是除了 Atrust 之外,就没有地方可以怀疑了,除非是业务系统 A 改东西了。
因为我在服务器上单独测试过浏览器访问业务系统 A 了,问题依旧出现,说明问题应该不是出现在代理服务器 B 、业务服务器 C 甚至更加往下的服务器

这东西对我的冲击有点像“计算网络不存在了”
zjsxwc
33 天前
把用户发出的 cookie ,与 A 收到的请求 cookie 对比一下,不就知道了有没有篡改
proxytoworld
33 天前
没玩过爬虫,但我的意见是出错的时候把 cookie 拿出来,放到浏览器里面手动测试可不可以访问
Mystery0
33 天前
@kkk9 参数应该是一样的,代理服务器 B 和业务服务 C 都是代码来发的请求,没有道理不一样
Windows 云服务器上的 Edge 浏览器在多次测试过程中使用的都是同一个账号和密码,也没有换浏览器,请求成功和失败的时候参数也应该是一样的

这个东西给我的感觉就像是:我用 Edge 刚刚获取到的 Cookie ,还没开始走到登录接口呢,就突然被什么东西给拿去用了(例如刷新验证码,或者登录其他账号了),等 Edge 走到登录接口了,Cookie 就有问题了
Mystery0
33 天前
@zjsxwc 接触不到 A ,要爬它就是因为改不了动不了它呀
defunct9
33 天前
A 端加了控制,同一个 IP 限制多次登录。
Mystery0
33 天前
@proxytoworld #8 这需要改一下代码,让来自用户的请求先临时停下来,然后再把 cookie 从 B 里面抓出来拿到 Windows 云服务器去访问测试

改动比较大,后面如果还是没有进展也只能试试了

不过说起来,我观察了浏览器上访问业务系统 A 时的请求,它的 Cookie 有刷新的情况,正常先加载 Html ,此时服务端 set 一个 cookie ,然后浏览器开始加载 js 、img 等资源,在这些加载过程中依旧会随机的 set 一个新的 cookie ,从观察情况来看,没有什么规律,也不确定为什么业务系统 A 要 set 一个新的 cookie
Mystery0
33 天前
@defunct9 #11 这算是一个可能的原因。如果是这样的话,我这爬虫的寿命相当于是终结了

不过业务系统 A 是个外包,应该不会专门做这种吧

明说了吧,业务系统 A 就是 正方教务系统
tomatocici2333
33 天前
@Mystery0 #13 有账号吗? 先正常渠道登录试试 看看有没有风控
Mystery0
33 天前
@tomatocici2333 有账号,今晚我测试一下 A 的风控,看看是不是 A 的限制
BenCoper
33 天前
@Mystery0 #12 这种业务操作逻辑怎么这么像我司的反爬产品啊哈哈
Mystery0
33 天前
@BenCoper 是不是就是你写的
for1shot
33 天前
个人觉得 cookie 出问题的概率不大。
我是做 DPI 的,略微了解过深信服的产品,讲一个有可能的原因。
可能是深信服识别出了你的爬虫特征,比如短时间内的大量访问,因此根据你的流量特征做了定向的封堵,不过这个封堵不是永久的,可能过一段时间就又恢复了,所以你手动测试有可能是正常的,但是一爬虫就失败了。
Mystery0
33 天前
@for1shot 这种封堵一般会和业务系统绑定吗?
我在浏览器上测试的时候,看到的报错信息并不是直接返回的文本,而是整个 html ,html 渲染完成之后会在登录对话框中显示错误信息
如果是深信服的封堵,应该直接中断连接或者直接返回 text/plain 的数据(就是网页上几个大字),不会返回 html 数据,除非深信服识别之后将情况告知了业务系统 A 也就是正方,然后正方针对深信服告知的结果做了专门的错误信息处理。

写出来这些感觉可能性不强……
正方确实是很多高校使用的教务系统,校园网对外访问也是使用深信服的产品( easyconnect 、atrust 等),不过也说不好,也许上面有要求正方和深信服一起解决掉所有高校的爬虫问题?
tomatocici2333
33 天前
@Mystery0 #15 Atrust 不大可能去修改你的 ck,这玩意不就是个 clash

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1083548

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX