各位大佬指点下字符串模式查找问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
bbmike253455
V2EX    程序员

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

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

    背景

    使用虚拟机+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     Solana     3684 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 00:10 PVG 08:10 LAX 17:10 JFK 20:10
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86