V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bbmike253455
V2EX  ›  程序员

各位大佬指点下字符串模式查找问题

  •  
  •   bbmike253455 · 2022-04-21 17:43:31 +08:00 · 1209 次点击
    这是一个创建于 728 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    使用虚拟机+OpenWrt+Menthust 解决校园网认证问题,但是会有共享网络检测问题。目前现象是使用 80 端口很大概率被封,用 IPtables 禁止 80 端口的数据出 WALN 口就没事,分析是根据 HTTP 的 User-Agent 请求头判定的,但是现在挺多 APP 还用了 80 端口加速视频、图片什么的。目前找到了两种方案,分别是xmurp-uaUA2F,前者是内核修改,后者是用户态修改方案,但是不好使,访问 HTTP 页面,UA 并没修改。所以我参考他们的自己写了一个,同时也学习下 C 语言及 Linux 方面的东西.

    方案

    我采用的是第二个方案,设置规则,让符合条件的包交给用户态程序处理,模块是 NFQUEUE 。现在进度是交叉编译环境、测试环境都准备好了,代码进行到在 TCP payload 中查找 User-agent 并替换,想请问下那种查找算法效率高些?以下是我已进行的分析:

    • TCP payload 最大载荷是 1500 - IP 头(20) - TCP 头(20) = 1460 (Bytes),数据量也不是太大,直接暴力或许可以,UA2F 采用的就是暴力的方案
    • 查找过程是否需要利用 HTTP 协议结构,比如对于 HTTP 1.x 在遇到第一个换行前不需要匹配 User-Agent 字符。但是这样就需要考虑协议版本的问题了,还需要识别协议的版本。若是直接搜索 User-Agent 字符串,就可以不用考虑这些
    • 修改的时候,UA 信息可能被分片了,UA 主要信息在第二个包,但是User-Agent字段却在前一个包,搜索不出来,第二个包好像不太好修改?修改成统一 UA 可能增大 TCP payload 的数据,导致 IP 层分片?感觉去掉各平台的标识就行了,比如 Android 、IOS 、Win 等标识不同时出现。考虑分片增加复杂度了,感觉这种情况可以不考虑,账号拉黑应该有个阈值的,不会有这么多数据包巧合。
    • 一个 HTTP 的 TCP 链接,UA 应该大概率出现在第一个数据包(不考虑建立链接的包),后续的包应该不会出现了 UA ,所以可以借助 iptable 的标记功能,对后续的包快速放行。但是 HTTP2 的多路复用后续可能还会出现含义 UA 信息的包,不知道理解的对不对?。现现在大多数还是 HTTP 1.x 的?我观察虎牙直播的就是

    查找算法我感觉Rabin-Karp Algorithm应该合适,hh

    问题是:

    • 采用何种方案定位 UA 位置?
    • 定位后检索平台标识符替换,还是替换成统一的 UA ?
    4 条回复    2022-05-31 15:08:11 +08:00
    billlee
        1
    billlee  
       2022-04-21 20:31:11 +08:00
    我以前是做防火墙 & WAF 的,其实

    1. 直接搜索是很快的,商用防火墙可以在内核态拿着上万条正则扫万兆以太网的全部流量。
    2. 需要处理跨包场景
    3. 不能修改数据长度,否则后面的包序列号都会变,所有后续包都需要重写。
    4. HTTP 的各种高级特性处理起来确实很复杂,所以 WAF 一般是在用户空间做的。

    所以我还是建议用 TPROXY 抓到用户空间来用代理服务器重写 User-Agent 头
    bbmike253455
        2
    bbmike253455  
    OP
       2022-04-21 21:07:16 +08:00
    @billlee 多谢大佬!那我就用暴力的了。我准备就替换括号里面的内容,选一个最短的替换,空余位置补空格,真容量不够的话,那就 UA 缺失算了,只要不识别出来移动设备就行了
    代理服务器已经有解决方案了,Privoxy ,我已经用上了,就是有时候会断流、卡顿。

    Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36
    bfdh
        3
    bfdh  
       2022-04-22 11:59:53 +08:00
    @billlee
    1. 直接搜索是很快的,商用防火墙可以在内核态拿着上万条正则扫万兆以太网的全部流量。
    这个主要看 CPU 性能,我们在家用路由器上做过类似操作,性能损失很明显。

    来回答下楼主的问题
    如果只是想实现功能,nginx 反代有可能能满足楼主需求,不过这个我没有仔细研究过,只是提出来,需要楼主自行查证。

    如果是自己写代码实现,应该有下面这些需要留意
    1 、HTTP 1.x 也是可以一条 tcp 连接承载多个 http 请求的,关键字 keepalive ,这种情况也是需要持续处理后续数据的。
    2 、可以考虑使用类似反代的思路,这样的话,UA 跨包和因为修改 UA 导致的数据包长度变化问题就迎刃而解了。
    3 、UA 定位建议按协议进行分析,暴力查找感觉性能还是低了些,而且本来你也是抱着一部分学习的目的。
    4 、某些应用的服务器会检测 UA ,修改 UA 可能会导致功能异常,这种需要特殊处理。

    最后再提供另一个思路。
    不知道你们校园网 UA 检测对于 http 头跨包的情况处理到了什么程度,可以试试将 HTTP 头逐个字节发送,看看是不是能被检测到。逐个字节发送需要在网络层抓包确认,并不只是在代码里一次 write 一个字节,多次 write 的数据,内核可能会合成一个包发出去。
    lingling47
        4
    lingling47  
       2022-05-31 15:08:11 +08:00
    不过话说如果只是操作 ua nginx 反向代理好像可以实现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1098 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:49 · PVG 02:49 · LAX 11:49 · JFK 14:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.