我在厦大读书。17 年小学期换宿舍后,新宿舍里要求用一个客户端联网,所以不能装路由器;我找到了获得真实的 PPPoE 用户名的方法,于是可以绕过绕过这个客户端联网,也可以安装路由器。除此以外,有时用客户端联网会出现一些奇怪的问题(我见过几例,网页打不开或者客户端报错什么的),也可以用这个办法,绕过客户端直接拨号解决。下面会介绍这个方法。
2018 年七夕前后,学校开始检测时间戳和 UA 来判断一个账号是否共享给了多台设备使用(不论是安装路由器还是在电脑上开热点)。如果检测到就会禁止账号联网半个小时(认证日志显示“检测到代理”);随后我也找到了绕过检查的办法。下面也会介绍这个方法。
2020 年补充:这篇文章写于很早之前,行文混乱废话多,请多多包涵。
本文最后更新于 2020 年 10 月 22 日(40442)。应该会长期更新。
如果有什么问题,可以加我们的群(QQ 748317786)寻找帮助,或者直接联系我(联系方式在网站主页可以看到)。求助前请确认自己已经仔细读过了教程,描述问题时尽可能清晰,不然可能没有人理你;当然,只是想在群里聊天的话,也非常欢迎。我一般不回答群里的问题,除非我觉得这个人已经把问题描述清楚了,或者我觉得和这个人探讨问题对我有益。
本文章使用 CC 4.0 BY-NC-SA 协议授权,啥意思呢,大概就是说:
要是喜欢搞法律的话,可以看看这个法律意义上的申明,反正我不喜欢。
另外,本文仅仅发布在我自己的域名下(chn.moe)。如果你在什么论坛上发现类似的并且没注明出处,那不是我发的,那是他抄我。
免责申明与免被查水表申明
非常简单:
确认自己在“厦门大学宽带认证客户端”(就是电脑联网时需要使用的那个软件)中填写的那个学号和密码,以及选择的是电信还是移动。如果忘掉了,先把正确的试出来。
将学号按照下面的规则转换(实质上是 ASCII 码加四),在前面加上 {SRUN2}
,在后面加上 @cmcc
(移动)或 @ctnet
(电信),得到用户名。
转换前 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
转换后 | 4 | 5 | 6 | 7 | 8 | 9 | :(半角冒号) | ;(半角分号) | < | = |
例如,小明的学号为 19720192203456
,移动,则用户名为 {SRUN2}5=;645=664789:@cmcc
。
用户名对应的密码就是“厦门大学宽带认证客户端”中填写的密码。
如果目标是解决网络问题,在电脑创建 PPPoE 拨号(不会就去百度),把用户名密码填进去,直接拨号就可以了;如果目标是装路由器,将这个用户名和密码按正常的方法填入路由器,按通常方法设置就可以了。
我最先找到的办法是在系统日志里找用户名;后来经过别人提醒,才发现用户名有这样的规律。
如果你不知道“半角”是什么的话:就是指英文输入状态下的冒号和分号,而不是中文输入状态下。
有的路由器用户名不能包含大括号,正确的解决办法是抱怨“这是什么垃圾路由器”然后换一台。
这样安装上的路由器可能会掉线,掉线频率主要与人品有关,次要的原因似乎还有使用频率、流量大小、太阳黑子爆发、楼下流浪狗生娃等等。掉线时实际上是学校发现你用路由器于是把你的账号封掉半个小时(可以在认证日志中看到)。可以暂且这样,如果不能忍受这样的掉线频率,再接着往下做。实测大部分人是可以忍受的。
下面的内容中,我假设读者已经熟悉了通常情况下安装路由器的方法。你要是完完全全的小白,那这个不适合你,找你身边会的人或者在群里问问有没有人帮你吧。
这一节的目标是:得到一台安装好 OpenWrt 的路由器。但是安装 OpenWrt 没有统一的方法,自己找对应型号的资料吧。
OpenWrt 是什么?好吃吗?
巧克力味,嘎嘣脆
OpenWrt 也算是 Linux 的一个发行版,是一个安装在路由器上的操作系统。就算是小白也应该听说过 Ubuntu 或者 CentOS 之类的东西,OpenWrt 与它们没有太本质的区别。OpenWrt 对路由器的性能要求稍高,所以只有一部分中高端的路由器可以安装,超市随便买的几十块的路由器肯定不行就别折腾了。淘宝或者咸鱼上可以很容易找到可以安装 OpenWrt 的路由器售卖,但更推荐在闲鱼自己买一台路由器,自己动手安装 OpenWrt。最便宜大概三十块钱就可以买到(闲鱼二手极路由 1s),可以先买来练手,大概知道怎么回事了再买好的。
OpenWrt 的官网是 openwrt.org。在右上角直接搜索路由器的型号,大多可以找到一个详细的页面,上面会详细地说明这个型号是否支持安装 OpenWrt 以及在哪里下载、怎样安装等。也可以直接谷歌,常常也可以找到详尽的教程。不同型号的路由器,安装方法不尽相同;相同或相近型号的路由器、不同版本的 OpenWrt 安装方法相同;任何安装了 OpenWrt 的路由器都可以用来绕开检测的。当然了,如果无论如何也找不到相关的资料,那说明这个路由器性能太差没人去折腾,也就不能安装 OpenWrt;除非你是大佬,可以自己去适配。路由器的型号(Model)在路由器背面就可以看到。有时,同一个型号中还会分几个不同的硬件版本,不通刷。
除了官方,还有一大波第三方的 OpenWrt,开源的和不开源的都有。无论是 coolsnowwolf 的 LEDE 还是潘多拉还是什么 gswifi 其实都是从官方来的。不推荐小白搞第三方的,一方面是安全,那些不开源的你不知道它有没有加后门进去;另一方面是技术门槛,第三方的折腾起来比官方麻烦,小白也容易犯错。当然也有人喜欢第三方那种大而全的固件,这个根据自己兴趣选择即可。
现在,你已经有了一台安装好 OpenWrt 的路由器。这一节的目标是,让你的 OpenWrt 可以上网,以及配置好无线。
方法和配置大多路由器差不多,只不过 OpenWrt 没有面向新手的一目了然的指引,而需要在繁多的设置中找出需要修改的那部分。
进入管理页面。如果是刚刷入的 OpenWrt 没有root
账户密码,登入后按照提醒设置一个即可;如果已经有了密码,也可以修改:点击 Go to password configuration 按钮或 System -> Administrator(管理权)。
点击 Save & Apply(保存并应用)。
如果你不知道路由器的管理页面地址,可以接好路由器后打开命令行,windows 输入 ipconfig
并回车,linux 和 MacOS 输入 ifconfig
并回车,寻找“默认网关”或“default gateway”一项。新安装的 OpenWrt 管理页面地址一般是 192.168.1.1
。
点击 Network(网络)-> Interfaces(接口),点击“WAN”对应的 Edit 按钮。
PPPoE
,然后点击出现的 Switch Protocol(切换协议)按钮。点击 Save & Apply(保存并应用)。这时,路由器本身和有线网已经可以上网了。
点击 Network -> Wireless(无线)。如果提示 Disabled(已禁用)就点击 Enable(启用)。可能只有一个 2.4G 的,也可能有一个 2.4G 的、一个 5G 的。点 2.4G 的“编辑”。
点击 Wireless Security(无线安全)。
WPA2-PSK
。点击 Save & Apply(保存并应用)。
如果还有一个 5G 的,就一样地配置,只是 Channel(信道)需要选择 147
或更高。
这时,WiFi 就可以正常联网啦。
接下来的步骤必须联网才行,进行之前先确认已经可以使用路由器的网络打开百度。另外,如果你现在是在手机上看我的这篇文章,强烈建议你接下来改用电脑看,可以方便地复制粘贴一些代码;如果你非要手动打代码,注意不要打错,对于小白来说,一个空格都不要错。
对于厦门大学,防检测需要做两步:同步局域网内电脑的时间,以及修改 HTTP 头的 UA。
NTP 就是用来同步两台电脑上的时钟的协议。接下来先启用 OpenWrt 自带的 NTP 服务器,然后将局域网内所有时钟校正的请求都发给路由器上的 NTP 服务器(也就是说,无视局域网内的电脑原本想要和哪台服务器同步时间,而强制将路由器上的时钟作为标准),这样局域网内所有的电脑上的时间都会变得一致。
只需要在管理页面中修改几个设置就可以了。
配置 NTP 服务。点击 System -> System。
time.xmu.edu.cn
、cn.pool.ntp.org
、pool.ntp.org
、time.apple.com
。点击 Save & Apply 按钮。
配置防火墙转发。点击 Network -> Firewall(防火墙),然后点击 Custom Rules 标签,在大框框里另起一行,添加下面的代码:
1 | iptables -t nat -N ntp_force_local |
第六行最后的 192.168.1.1
需要修改为你的路由器的管理页面地址。例如,你的管理页面地址是 192.168.10.1
,那么这一行代码需要修改为:
1 | iptables -t nat -A ntp_force_local -s 192.168.0.0/16 -j DNAT --to-destination 192.168.10.1 |
如果你的网络不在 192.168.0.0/16
范围内,那么前几条也得对应着改。家用路由器一般都在这个范围内。
然后点击 Restart Firewall(重启防火墙)。
确认效果。在 Windows 电脑上,打开控制面板,在右上角查看方式处选择小图标,然后点击“日期和时间”。点击 Internet 时间 -> 更改设置,点几次“立即更新”,直到提示“时钟在 xxx 与 xxx 同步成功”。这时,暂时地拔掉墙上接口与路由器之间的网线(断开了外网的连接),再点一次“立即更新”,应该仍然提示成功,这说明 NTP 请求已经被劫持到了路由器自身而不是外网(否则网线都拔了,怎么可能成功呢)。记得把网线插回。
UA 中包含了操作系统版本等信息,而 HTTP 协议没有对这些信息加密,因此别人可以从这里看到这个数据包发自 Windows 电脑还是安卓手机等等。接下来把所有 HTTP 头中的 UA 都改得一样。
有两种方法来修改 UA,一种是使用 Privoxy,一种是使用 xmurp-ua,二选一即可。也有很多人喜欢用 Nginx,并且据说比 Privoxy 好用;但这个门槛比前面的高,会用的人都会,不会的我在这里也说不清,故不介绍,想尝试可以参考这里。另外,修改 UA 还会导致其它的异常状况,稍等我会说明如何设置例外。
除非是软路由(性能可以和笔记本相比的路由器),否则不推荐这个方案。如果在普通的路由器上使用这个方案,会导致会导致 HTTP 协议的内容传输缓慢(比如 QQ 发送图片会特别慢,有的下载也会特别慢,Bilibili 手机客户端看不了视频等),建议使用下一节的方案。
接下来,会安装好 Privoxy 并正确配置,然后将所有 HTTP 流量转发给 Privoxy 代理,并在 Privoxy 中替换 UA。
我已经很久很久没有碰过 Privoxy 了,这个方法也不再更新。所以下面的方法可能和最新的 OpenWrt 有出入,请在理解原理的前提下灵活机动。
可以先尝试自动安装。
luci-app-privoxy
,点击 Find package(查找软件包)按钮。点击下方“luci-app-privoxy”对应的 Install(安装)按钮。如果看到有一个 Services(服务)菜单,菜单里有 Privoxy WEB proxy(Privoxy 网络代理)(可能也需要先刷新一下),那就是成功了。也可以手动安装。
进入路由器管理页面,点击 System -> Software(软件包)。点击 Configuration(配置)选项卡。
在 Distribution feeds(发行版软件源)中,可以看到很多行,每行都有一个网址结尾。
base
结尾的网址,下载 zlib。packages
结尾的网址,下载 libpcre 和 privoxy。luci
结尾的网址,下载 luci-app-privoxy。libpcre2 和 libpcre 不同,不要下载错了。同理,zlib-dev 与 zlib 也不同。
另外,如果网页打开太慢或者下载太慢,并且自己有代理的话,建议开代理。
点击这里,下载 OpenWrt 软件包安装器(我写的),解压、运行。依次安装 zlib、libpcre、privoxy、luci-app-privoxy。
如果不愿意使用安装器,可以手动安装。将软件包 scp 到路由器,然后 opkg install xxx.ipk
即可。可以使用 winscp。如果你不知道 scp 是什么,那这个方法不适合你。新版本 OpenWrt 也内置了一个方便安装下载到电脑上的软件包的功能,可以尝试一下,我没试过。
进入路由器管理页面,看到有一个 Services(服务)菜单,菜单里有 Privoxy WEB proxy(Privoxy 网络代理),那就是成功了。
点击 Services -> Privoxy WEB proxy。
match-all.action
。Filter files 和 Trust files 均留空。0.0.0.0:8118
,Permit access 填写 192.168.0.0/16
。Enable action file editor 勾选。点击 Save & Apply。
点击 Network -> Firewall(防火墙),然后点击 Custom Rules 标签,在大框框里另起一行,添加下面的代码:
1 | iptables -t nat -N http_ua_drop |
点击 Restart Firewall(重启防火墙)按钮。
在路由器的局域网中打开 http://config.privoxy.org/edit-actions-list?f=0
,点击 Edit 按钮。Action 那一列中,hide-user-agent 改选为 Enable(绿色),在右侧 User Agent string to send 框中填写 Privoxy/1.0
;其它全部选择为 No Change (紫色)。点击 Submit 按钮。
如果打不开这个页面,说明之前哪里的配置有错误,请仔细检查一下。
打开 ua.chn.moe,网页上应该显示 Privoxy/1.0
。
如果你会写 iptables 命令,那么建议将内网的所有 PC 放行。例如,增加这一句:
1 | iptables -t mangle -I http_ua_drop -m mac --mac-source 01:23:45:67:89:AB -j RETURN |
我写了一个插件,可以直接在内核中修改 UA,效率比 privoxy 高,并且可以避免 privoxy 出现的各种问题,在普通路由器上推荐使用。源代码在这里。
风险提示
因为这个插件是我写的,而使用任何程序都显然有一定风险,所以我要先撇清关系:
插件分为两个版本:master 分支(相当于稳定版,最新版本号为 34)和 dev 分支(相当于开发版)。当然稳定版也不见得有多稳定。下面列出现在仍然存在的问题,曾经存在但已经解决的问题不再列出:
稳定版:不能百分之百地修改所有的 UA,多核路由器上漏得更严重,在一些检查得非常严格的学校仍然不能避免掉线而只能缓解,但对厦大来说足够使用了;这个问题在开发版中解决了。也有报告会导致网卡卡死,但我日常使用没有问题,也还没深入研究。
开发版:有严重 bug,会导致路由器每隔几个小时或一天自动重启一下。我没空去修。
该插件本质上是在 netfilter 中注册几个回调函数来处理数据包,因此与很多加速技术不兼容,开启加速后会导致插件拿不到数据包也就无从修改。官方 OpenWrt 不会默认开启这些加速,但一些第三方固件会,使用前注意先关掉这些加速。在大多情况下,关掉这些加速除了心里不爽以外并没有明显影响,属于感知不强的范畴。
编译软件包需要一定的 Linux 基础。如果你有这样的基础,可以自行编译,参考这里;如果没有这样的基础,但有时间和耐心去学习,也可以尝试;如果都没有,请找身边会的朋友编译,或在群里求助。当然,也可以直接找我帮忙编译。
参考上面使用 Privoxy 的方法中的安装方法。
安装完成后,浏览器打开路由器管理页面,选择 System(系统)-> Kernel Log(内核日志),在最后几行看到有类似这样的句子:
1 | [xxxx.xxxx] xmurp-ua: Started, version xx. |
这说明模块已经被成功加载。
打开 ua.chn.moe,网页上应该显示 XMURP/1.0
。
如果没有修改成功,考虑是否是 mark 冲突了;也就是说,别的模块设置了 mark 的第九位,导致我的模块将这些流量当成例外而放行(具体看下文)。如果出现这样的情况,可以在内核日志中找到这样的句子(请忽略我的塑料嘤语):
1 | [xxxx.xxxx] xmurp-ua: Mark matched. Note that all packages with the mark will be ACCEPT without modification. |
解决方法也是如上所述:最简单的办法,找到和本插件冲突的插件,卸载它们,然后重启。已知插件与 mwan3 冲突,原因是 mwan3 占用了 0x100 的 mark 位。可以卸载 mwan3 然后重启解决,或者在设置中将 Firewall mask(防火墙掩码)设置为 0x3E00
。当然我不是故意取到和它一样的,而是之前和别的插件冲突了才改到这一位,没想到又冲突了。
在防火墙自定义规则中,另起一行,加上下面的代码(其中的 01:23:45:67:89:AB
替换为自己电脑的 MAC 地址),点击“重启防火墙”,那么来自这台电脑的 HTTP 头 UA 就不会被修改;将命令删除或者在前面加一个#
,点击“重启防火墙”,就可以恢复。
1 | iptables -t mangle -A PREROUTING -p tcp --dport 80 -m mac --mac-source 01:23:45:67:89:AB -j MARK --set-xmark 0x100/0x100 |
对于 Windows 系统,在命令提示符中输入 ipconfig -all
并回车,“物理地址”一项就是 MAC 地址。
如果需要临时将所有的流量都设置为例外:
1 | iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-xmark 0x100/0x100 |
如果你稍稍了解 iptables
命令,就可以看明白我在干什么;如果不了解,也可以照葫芦画瓢。
学校给的客户端其实是使用 SRUN3 拨号而不是 SRUN2,只是 SRUN3 在普通路由器上无法实现,SRUN2 在厦大恰好也可以拨通,就用它了。对于 OpenWrt,稍稍修改拨号脚本后就可以使用 SRUN3 拨号。最近,用 SRUN2 拨号经常会莫名掉线几分钟,SRUN3 就没问题,不确定是学校故意搞的鬼还是巧合。
下面是用 SRUN3 拨号的步骤:
修改拨号脚本 /lib/netifd/proto/ppp.sh
。搜索 username
关键字,可以找到这样一句:
1 | ${username:+user "$username" password "$password"} \ |
把它修改成:
1 | ${username:+user "$(echo -e $username)" password "$password"} \ |
如果你不喜欢用命令行,那么用 WinSCP 来修改也非常方便。
打开管理页面,点击 Network(网络)-> Interfaces(接口),点击“WAN”对应的 Edit 按钮。用户名中的 {SRUN2}
需要修改成 {SRUN3}\r\n
。举例来说,小明原来的用户名是:
1 | {SRUN2}5=;645=664789:@cmcc |
那么,他需要改成:
1 | {SRUN3}\r\n5=;645=664789:@cmcc |
保存并应用,等待几分钟,就可以正常使用了。
写文章不易,写插件不易。不考虑打赏一点钱吗?点此直达
(我很可爱,请给我钱.jpg)
.bin
后缀,把这一点改正了。还有的人说升级 OpenWRT 之后路由器就开不了机了,虽然我觉得应该是他操作的问题,但还是加上了不升级的操作方法。另外,应该有人根本不介意路由器偶尔掉线,那这样的话,其实不需要这样复杂地配置。