使用OpenWrt路由自动修改http请求的UserAgent来躲过移动设备检测

我所在的单位上网是需要自己交钱的,一直以来都是按照流量收费,我以前一个月可能需要花50+还不敢使劲用。
可是上个月系统升级后出现了一个包月套餐(限速1MB/S),我当然是喜出望外的立即办理了。
不过既然人家都说了是防代理,那么肯定也就有技术检测不让你共享网络。


实际测试后发现,只要将网络共享成热点让手机上网,网就会被踢掉。又需要重新登陆,且中间还有时间间隔。


因为是网页认证,根本不需要用客户端,所以对手机的检测肯定不是在前端而是上级路由对流量异常进行检测。尝试将虚拟机的网络共享给手机也会断网,也映证了这一观点。
后来继续研究,发现使用路由器共享给多台电脑都没有被踢掉,因此猜测:后台只是简单的判断了是否是手机流量,发现有手机流量通过就对账号断网。电脑上打开安卓模拟器,也很快就断网了,映证了这一观点。
于是提出猜想:上级路由能简单区分流量来自电脑还是手机,是对http流量中的"User-Agent"(后面简称UA)这一信息进行了判断,发现来自手机的UA就进行断网。
验证:火狐浏览器用扩展修改UA为安卓进行访问,发生断网✓;手机用电脑上的Fidder2代理并用自定义规则修改UA,不断网✓。

于是先附上Fidder2的规则,在FidderScript的“OnBeforeRequest”函数内加入如下代码之一(因为我只有安卓手机,所以苹果的我就不管了)

//一行式简单替换
oSession.oRequest["User-Agent"] = oSession.oRequest["User-Agent"].Replace("Android","Windows NT");
//多行判断修改,适合有更多需要替换的字符
var oUA = oSession.oRequest["User-Agent"];
if (oUA.indexOf("Android") > -1) {
    var nUA = oUA.Replace("Android","Windows NT");
    nUA = nUA.Replace("Nexus","Surface");
    oSession.oRequest["User-Agent"] = nUA;
}
那么,我现在是可以让手机上网了,但是这样我必须
  • 开启电脑

  • 运行Fidder

  • 设置WLAN代理

三步都不可或缺,对于其他人想连WiFi就会比较麻烦。

那么有没有可以不用开电脑,甚至不需要配置WLAN代理就能直接让手机上网的办法呢?
于是我想到了家里买的OpenWrt,作为Linux系统,有什么奇奇怪怪东西都是我这个菜鸟不能预料的。
于是我查找了一下,没有特别合适我的教程,基本都是研究如何兲朝上网的,于是我只能自己动手。终于还是研究出来了

因为我的路由买来当初就是预装的明月固件,因此后来全都用的明月版OpenWrt,因此以这个为例。

首先刷新软件包

或者使用SSH连接输入shell命令

opkg update

然后安装“privoxy”(主程序)、“luci-app-privoxy”(用户界面)、“luci-i18n-privoxy-zh-cn”(用户界面中文翻译,这个我的AR4300 OpenWrt系统没有,只能看英文的,刚买的WRT1900AC LEDE系统有)

或者使用SSH连接输入shell命令

opkg install privoxy 
opkg install luci-app-privoxy 
opkg install luci-i18n-privoxy-zh-cn

现在我们可以尝试启动代理了


访问控制里,设置监听地址为路由器IP和代理端口,允许访问地址则是同一网段,最后的数字写0,并跟上“/24”,代表0-255

保存应用后,手机就可以直接填写这个代理地址了,但是目前我们还没有对流量的User-Agent进行修改。

添加自定义的Action和Filter文件


然后用WinSCP连接进入“/etc/privoxy”修改这两个文件


“user.action”最后加上对http header进行修改的动作

# 替换Header里的安卓
{+client-header-filter{android}}
/

“user.filter”最后加上正则替换代码

#把“Android”和“iPxxxx”替换为“Windows NT”的filter
CLIENT-HEADER-FILTER: android Replace all "Android" with "Windows NT"

s@\b(Android|iP\w+)\b@Windows NT@ig



他们具体的意义请自行查阅 privoxy用户手册,我也看不大懂,反正这代码勉强能用。


现在如果设置Privoxy前置代理Fidder2,就可以在Fidder2看到,通过Privoxy访问的http流量的UA里的Android被换成了Windows


下一步就是如何让所有设备自动进入代理了。
首先需要勾选杂项中的“Accept intercepted requests”,不然iptables的转发会被当作无效而无法访问网页。如果设置了Fidder前置代理也需要删掉。

然后SSH连接输入如下命令

# 创建一个叫PrivoxyUA的表
iptables -t nat -N PrivoxyUA
# 将PrivoxyUA添加到PREROUTING表
iptables -t nat -A PREROUTING -i br-lan -p tcp -j PrivoxyUA

# 对如下地址不进行转发(都是内网)
iptables -t nat -A PrivoxyUA -d 0.0.0.0/8 -j RETURN
iptables -t nat -A PrivoxyUA -d 10.0.0.0/8 -j RETURN
iptables -t nat -A PrivoxyUA -d 127.0.0.0/8 -j RETURN
iptables -t nat -A PrivoxyUA -d 169.254.0.0/16 -j RETURN
iptables -t nat -A PrivoxyUA -d 172.16.0.0/12 -j RETURN
iptables -t nat -A PrivoxyUA -d 192.168.0.0/16 -j RETURN
iptables -t nat -A PrivoxyUA -d 224.0.0.0/4 -j RETURN
iptables -t nat -A PrivoxyUA -d 240.0.0.0/4 -j RETURN

# 重定向80端口的数据到8118端口(之前Privoxy的代理端口)
iptables -t nat -A PrivoxyUA -p tcp --dport 80 -j REDIRECT --to-ports 8118
# 因为https是无法直接检测UA的,所以没必要重定向转发
# iptables -t nat -A PrivoxyUA -p tcp --dport 443 -j REDIRECT --to-ports 8118

弄好后,再试试用手机不设任何代理访问,会发现远程识别到的User-Agent已经没有了Android。


至此工作完成,连入此路由下网络的手机会自动替换掉会导致断网的字符串,可以自由的用手机上网了。

不过有时还是会发现断网,可能是有些没有被注意到的字符串也是被识别为手机,但是我没有发现哪些是特殊的,还请发现的人告诉我。
另外此方法会导致有一小部分网站无法正常访问,我也不知道原因,比如 http://useragentstring.com/


作者:枫谷剑仙 地址:http://right.com.cn/forum/thread-249325-1-1.html

本文章由作者:佐须之男 整理编辑,原文地址: 使用OpenWrt路由自动修改http请求的UserAgent来躲过移动设备检测
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。

相关推荐