在厦大宿舍安装路由器

最后更新于 2019 年 3 月 17 日(22403)。


前言

厦大一些经过网络改造的宿舍在联网时要求使用“厦门大学宽带认证客户端”因此不能直接安装路由器;一年前我找到了绕过这个客户端联网、安装路由器的办法。2018 年七夕前后,学校开始检测一些流量特征来确定你是否将网络共享给了多台设备使用(安装路由器,或者在电脑上用开热点的软件等),如果检测到,就会禁止你的账号联网半个小时;随后我也找到了绕过检查的办法。这篇文章介绍了绕过客户端联网和绕过共享检测的方法。如果在阅读的过程中有问题,可以 QQ 联系(897331845)或者评论。

首先是一些免责声明:

  1. 对于任何硬、软件的损坏,本人不赔偿,也不保证协助处理,哪怕这样的后果是因教程中的错误造成的;你需要自担风险。出现问题时,我应该会尽力协助,但我不是专业技术人员,没有能力也没有义务保证教程内容万无一失。尽管我还没有遇到过把路由器弄坏的例子,但读者也需要做好损失一台价值几十元或者几百元的路由器的心理准备。另外,本教程中的内容会使你的路由器失去保修。
  2. 对于因为安装路由器而可能造成的事故,我不负责。请设置足够复杂的管理员密码,并妥善保存;如果发生了安全事故(资金被盗、个人信息泄露等),与本人无关。
  3. 厦大宿舍明令禁止安装路由器,相关文件点击这里可以查看。我没有怂恿或建议任何同学安装路由器,安装路由器的行为完全是安装者的个人意志导致的,本人仅仅是作为技术交流的发起者而存在。请仅仅以学习研究为目的鼓捣路由器,并在安装好路由器之后 24 小时内再将之拆除;如果您喜欢上网,请按照学校指明的方式连接到互联网。如果学校根据校规等文件追究责任,与我无关。
  4. 不允许将此技术用于任何商业行为,我本人也保证不会用来赚钱,而会将研究结果无偿地公布出来,只为造福同学~~的同时顺便装逼~~。
  5. 不要发表不文明的言论。虽然我也觉得学校这样做很不厚道,但说脏话还是不好的。鼓励积极地传播这篇文章,以及义务地帮助身边有需要的同学。

简单地安装路由器

仅仅绕开客户端联网是很简单的:

  1. 确认自己在“厦门大学宽带认证客户端”(就是电脑联网时需要使用的那个软件)中填写的那个学号,以及选择的是电信还是移动。如果忘掉了,先把正确的试出来。

  2. 将学号按照下面的规则转换,在前面加上{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

  1. 用户名对应的密码就是“厦门大学宽带认证客户端”中填写的密码。
  2. 将这个用户名和密码按正常的方法填入路由器,按通常方法安装路由器就可以了。有的路由器用户名不能包含大括号,那就换一台。

  3. 也可以在电脑上创建 PPPoE 拨号、填入这个用户名和密码,这样就可以绕过客户端联网。有时可以解决一些奇怪的网络问题。

学校的共享检测并不十分严格,并不总是可以检测到装或者没装路由器;检测到然后被封掉的频率应该与使用频率有关,有的人可能几天才会被查到一次。建议先这样简单地安装上路由器,如果接下来总是被封掉的话,再进行接下来的步骤。

我假设你已经熟悉了通常情况下安装路由器的方法,并且在遇到简单的问题时可以自行在网上寻找答案、动脑理解。


安装 OpenWrt

防止检测的方法需要用到一个安装在路由器上的操作系统,叫“OpenWrt”。当然,在电脑上安装 OpenWrt 虚拟机或者其它 Linux 操作系统也是可以的(OpenWrt 其实也是 Linux 的一个发行版),思路也差不多,但这里不介绍。这一节的目标是:得到一台安装好 OpenWrt 的路由器。

OpenWrt 对路由器的性能要求较高,所以只有一部分中高端的路由器可以安装。淘宝或者咸鱼上可以很容易找到已经安装好 OpenWrt 的路由器售卖,最便宜大概六七十块钱就可以买到;也可以自己买一台路由器,自己动手安装 OpenWrt。

OpenWrt 的官网是 openwrt.org,打开比较慢需要耐心等待。在这里直接搜索你的路由器的型号,一般来说就可以找到一个详细的页面,上面会详细地说明这个型号是否支持安装 OpenWrt 以及在哪里下载、怎样安装。也可以直接百度或者谷歌,常常也可以找到详尽的中文教程。不同型号的路由器,安装方法不尽相同;任何版本的 OpenWrt 都是可以用来绕开检测的,并且安装方法没有区别;推荐安装官方最新稳定版。当然了,如果无论如何也找不到相关的资料,那说明这个路由器不能安装 OpenWrt。

路由器的型号(Model)在路由器背面就可以看到。有时,同一个型号中还会分几个不同的硬件版本。

有的路由器会注明“基于 OpenWrt 深度定制”,不要买,除非你有办法刷回原版 OpenWrt。有的路由器会注明安装了“明月用在”或其它非官方版本的 OpenWrt,也可以买,但因为无法拿到这个系统的 SDK,所以在接下来的步骤中要么受限制、要么还需要自己再刷回官方版本;具体情况后面会说明。

“LEDE”和 OpenWrt 几乎一样,可以当作 OpenWrt 来用。

在很多情况下,安装 OpenWrt 只需要在管理页面中使用“系统更新”或“固件升级”功能,就可以将 OpenWrt 安装好(使用文件名以factory.xxx结尾的那个文件,勾选“不保留配置”)。安装好 OpenWrt 后,建议等系统完全启动后,马上再断电重启一遍。

由于这一步没有统一的方法,虽然比较麻烦,但无法更详细地写下去了。


配置 Openwrt

现在,你已经有了一台安装好 OpenWrt 的路由器。接下来的步骤是,先像普通的路由器那样配置好上网的功能,然后配置防止检测的功能。

实际上,OpenWrt 的功能远远不止绕开学校的检测,翻墙去广告建博客等等都可以,想干什么干什么;这里只说联网和绕开检测的事,其它的功能自行探索。

配置上网

方法和配置大多路由器差不多,只不过 OpenWrt 没有面向新手的一目了然的指引,而需要在繁多的设置中找出需要修改的那部分。

  1. 接好路由器,进入管理页面。如果是刚刷入的 OpenWrt 没有root账户密码,登入后按照提醒设置一个即可;如果已经有了密码,也可以修改:点击 Go to password configuration 按钮或 System -> Administrator(管理权)。

如果你不知道路由器的管理页面地址,可以接好路由器后打开命令提示符,输入ipconfig并回车,寻找“默认网关”一项。新安装的 OpenWrt 管理页面地址一般是192.168.1.1

  • Password(密码):填写你想好的管理员密码。
  • Confirmation(确认密码):再填一遍。

点击 Save & Apply(保存并应用)。

  1. 点击 Network(网络)-> Interfaces(接口),点击“WAN”对应的 Edit 按钮。
  • Protocol(通信协议):改选为PPPoE,然后点击出现的 Switch Protocol(切换协议)按钮。
  • PAP/CHAP username(PAP/CHAP 用户名):填入之前由学号转换得到的用户名。
  • PAP/CHAP password(PAP/CHAP 密码):填入对应的密码。

点击 Save & Apply(保存并应用)。这时,路由器本身和有线网已经可以上网了。

  1. 点击 Network -> Wireless(无线)。如果提示 Disabled(已禁用)就点击 Enable(启用)。可能只有一个 2.4G 的,也可能有一个 2.4G 的、一个 5G 的。点 2.4G 的“编辑”。
  • ESSID:填 WiFi 的名字。

点击 Wireless Security(无线安全)。

  • Encryption(加密):改选为WPA2-PSK
  • Key(密码):填 WiFi 密码。

点击 Save & Apply(保存并应用)。

如果还有一个 5G 的,就一样地配置,只是 Channel(信道)需要选择147或更高。

这时,WiFi 就可以正常联网啦。

配置防检测

接下来的步骤必须联网才行,进行之前先确认已经可以使用路由器的网络打开百度。另外,如果你现在是在手机上看我的这篇文章,强烈建议你接下来改用电脑看,可以方便地复制粘贴一些代码;如果你非要手动打代码,注意不要打错,一个空格都不要错。

防检测分为两个部分:同步局域网内电脑的时间,以及修改 HTTP 头的 UA。

同步时间

NTP 就是用来同步两台电脑上的时钟的协议。接下来先启用 OpenWrt 自带的 NTP 服务器,然后将局域网内所有时钟校正的请求都发给路由器上的 NTP 服务器(也就是说,无视局域网内的电脑原本想要和哪台服务器同步时间,而强制将路由器上的时钟作为标准),这样局域网内所有的电脑上的时间都会变得一致。

只需要在管理页面中修改几个设置就可以了。

  • 配置 NTP 服务。点击 System -> System。
  • 勾选 Enable NTP client(启用 NTP 客户端)和 Provide NTP server(作为 NTP 服务器提供服务)。

  • NTP server candidates(候选 NTP 服务器)四个框框分别填写time.xmu.edu.cncn.pool.ntp.orgpool.ntp.orgtime.apple.com

点击 Save & Apply 按钮。

  • 配置防火墙转发。点击 Network -> Firewall(防火墙),然后点击 Custom Rules 标签,在大框框里另起一行,添加下面的代码:
iptables -t nat -N ntp_force_local
iptables -t nat -I PREROUTING -p udp --dport 123 -j ntp_force_local
iptables -t nat -A ntp_force_local -d 0.0.0.0/8 -j RETURN
iptables -t nat -A ntp_force_local -d 127.0.0.0/8 -j RETURN
iptables -t nat -A ntp_force_local -d 192.168.0.0/16 -j RETURN
iptables -t nat -A ntp_force_local -s 192.168.0.0/16 -j DNAT --to-destination 192.168.1.1

第六行最后的192.168.1.1需要修改为你的路由器的管理页面地址。例如,你的管理页面地址是192.168.10.1,那么这一行代码需要修改为:

iptables -t nat -A ntp_force_local -s 192.168.0.0/16 -j DNAT --to-destination 192.168.10.1

然后点击 Restart Firewall(重启防火墙)。

  • 确认效果。在 Windows 电脑上,打开控制面板,在右上角查看方式处选择小图标,然后点击“日期和时间”。点击 Internet 时间 -> 更改设置,点几次“立即更新”,直到提示“时钟在 xxx 与 xxx 同步成功”。这时,暂时地拔掉墙上接口与路由器之间的网线(断开了外网的连接),再点一次“立即更新”,应该仍然提示成功。

修改 HTTP 头的 UA

UA 中包含了操作系统版本等信息,而 HTTP 协议没有对这些信息加密,因此别人可以从这里看到这个数据包发自 Windows 电脑还是安卓手机等。接下来把所有 HTTP 头中的 UA 都改得一样。

有两种方法来修改 UA:使用 Privoxy 软件包,简单但会导致 HTTP 协议的内容传输缓慢(比如 QQ 发送图片会特别慢);或者自己写程序(我已经替你们写好了)并编译、安装到路由器上,麻烦但不会使 HTTP 协议的流量明显变慢;二者选其一即可。另外,修改 UA 还会导致其它的异常状况,稍等我会说明如何设置例外。

使用 Privoxy 修改 UA

接下来,需要安装好 Privoxy 并正确配置,然后将所有 HTTP 流量转发给 Privoxy 代理,并在 Privoxy 中替换 UA。

  • 安装 Privoxy。进入路由器管理页面,点击 System -> Software(软件包)。
  • 点击 Update lists(刷新列表)按钮,等待几分钟。如果提示好几条“Signature check passed”那么这一步执行成功;如果卡死了,几分钟后再进入这个页面,看到了很长很长的软件列表,那也是成功了。

  • 在 Filter(过滤器)中填写luci-app-privoxy,点击 Find package(查找软件包)按钮。点击下方“luci-app-privoxy”对应的 Install(安装)按钮。如果提示好几条“Configuring xxxx”,那么就是执行成功了;如果卡死后再进入管理页面,看到有一个 Services(服务)菜单,菜单里有 Privoxy WEB proxy(Privoxy 网络代理),那也是成功了。

  • 配置 Privoxy 设置。点击 Services -> Privoxy WEB proxy。

  • Files and Directories(文件和目录):Action Files 删除到只剩一个框,填入match-all.action。Filter files 和 Trust files 均留空。

  • Access Control(访问控制):Listen addresses 填写0.0.0.0:8118,Permit access 填写192.168.0.0/16。Enable action file editor 勾选。
  • Miscellaneous(杂项):Accept intercepted requests 勾选。
  • Logging(日志):全部取消勾选。

点击 Save & Apply。

  • 配置防火墙转发。点击 Network -> Firewall(防火墙),然后点击 Custom Rules 标签,在大框框里另起一行,添加下面的代码:
iptables -t nat -N http_ua_drop
iptables -t nat -I PREROUTING -p tcp --dport 80 -j http_ua_drop
iptables -t nat -A http_ua_drop -m mark --mark 1/1 -j RETURN
iptables -t nat -A http_ua_drop -d 0.0.0.0/8 -j RETURN
iptables -t nat -A http_ua_drop -d 127.0.0.0/8 -j RETURN
iptables -t nat -A http_ua_drop -d 192.168.0.0/16 -j RETURN
iptables -t nat -A http_ua_drop -p tcp -j REDIRECT --to-port 8118

点击 Restart Firewall(重启防火墙)按钮。

  • 使用 Privoxy 替换 UA。打开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

接下来需要下载我写好的代码,将它编译后上传到路由器,然后安装好。这个过程将在 Linux 下进行。

  • 在电脑上安装一个 64 位的 Linux 系统。安装成虚拟机或双系统都可以。

如果你的电脑是 64 位的 Win10,建议使用 Win10 的 Ubuntu 子系统(WSL),在 Windows 应用商店中搜索“Ubuntu”并安装,然后按照提示设置root账户密码即可;否则,推荐安装 deepin 虚拟机或双系统,操作简便。Ubuntu 虚拟机或者双系统当然也可以,但个人觉得 Ubuntu 比 deepin 丑而且操作难度高。

  • 安装编译依赖项。
sudo apt-get update && sudo apt-get install git-core build-essential libssl-dev libncurses5-dev unzip gawk subversion mercurial ccache tar ssh

如果这一步十分缓慢,推荐更换软件源为阿里;更换方法自行百度。

如果使用 WSL,将上面的命令复制进去,回车执行;如果使用 deepin,打开“深度终端”,将下面的命令复制进去,回车执行。

如果提示输入密码,输入安装 Linux 时设置的root账户密码即可。

  • 下载 SDK。

不同路由器、不同系统版本,SDK 都是不同的。官方 OpenWrt 的 SDK 和固件放在同一个目录下;删掉 OpenWrt 固件下载链接最后的文件名,将剩余的部分复制到浏览器地址栏,回车,拉到最下面,就可以看到 SDK 的下载地址了。比如,WNDR4300 的固件下载地址为:

http://downloads.openwrt.org/releases/18.06.1/targets/ar71xx/nand/openwrt-18.06.1-ar71xx-nand-wndr4300-ubi-factory.img

打开网站:

http://downloads.openwrt.org/releases/18.06.1/targets/ar71xx/nand/

就可以找到对应 SDK 的下载地址。

下载好 SDK 后,放到用户目录下。

如果使用 WSL,可以将 SDK 放到 C 盘根目录,然后使用命令cd ~ &amp;&amp; cp /mnt/c/.tar.xz .将它复制到 WSL 中;如果使用 deepin,手动把它复制粘贴到 home 文件夹下就可以了。

  • 解压 SDK 并进入。
cd ~ &amp;&amp; tar xvf *.tar.xz &amp;&amp; cd openwrt-sdk*

不要关闭命令行窗口,接着输入下面的命令。

  • 下载xmurp-ua的源代码。
git clone https://github.com/CHN-beta/xmurp-ua.git package/xmurp-ua
  • 编译xmurp-ua
make package/xmurp-ua/compile V=sc

如果弹出来一个菜单,按左右键选择 Exit,回车;然后选择 Save,回车;即可继续。

如果编译失败(使用 LEDE 的 SDK 时),可能需要在编译时增加一些参数,参考这篇文章;也可能是我的代码有误(没有适配你的路由器内核),请反馈给我。

  • 将编译好的软件包复制到路由器。
scp bin/targets/*/*/packages/*.ipk root@192.168.1.1:/tmp

其中的192.168.1.1换成你自己的管理页面地址。

如果提示是否继续,输入 yes 即可。还会提示输入密码,输入路由器的管理员密码即可。

  • 安装xmurp-ua

首先登录路由器:

ssh root@192.168.1.1

同样,其中的192.168.1.1换成你自己的管理页面地址。

若提示输入密码,输入路由器的管理员密码即可。

然后安装:

opkg install /tmp/*.ipk
  • 浏览器打开路由器管理页面,选择 System(系统)->Kernel Log(内核日志),在最后几行看到有xmurp-ua startnf_register_hook returnd 0字样,说明xmurp-ua已经被加载(已经启动)。
确认效果

非常简单:打开http://www.atool.org/useragent.php,网页正中的框中应该显示Privoxy/1.0(如果使用 Privoxy 修改 UA)或XMURP/1.0(如果使用xmurp-ua修改 UA)。

设置例外

修改 UA 后会导致的异常,到现在为止我发现的,只有 WeGame 和腾讯游戏下载器无法下载,“校友邦”无法登陆。还有就是,如果是使用 Privoxy 改的 UA,那么会造成很多下载非常缓慢。

要给局域网内某台电脑设置例外,只要在防火墙自定义规则中,另起一行,加上下面的代码(其中的01:23:45:67:89:AB替换为自己电脑的 MAC 地址),点击“重启防火墙”,那么来自这台电脑的 HTTP 头 UA 就不会被修改;将命令删除或者在前面加一个#,点击“重启防火墙”,就可以恢复。

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -m mac --mac-source 01:23:45:67:89:AB -j MARK --set-xmark 1/1

对于 Windows 系统,在命令提示符中输入ipconfig -all并回车,“物理地址”一项就是 MAC 地址;对于安卓系统,在 WiFi 的高级设置中,一般可以直接看到 MAC 地址。

如果要将所有的流量都设置为例外:

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-xmark 1/1

如果你稍稍了解iptables命令,就可以看明白我在干什么;如果不了解,也可以照葫芦画瓢。


使用 WinSCP 快速配置防检测

如果你是一个热心的同学,去帮助别人装路由器,建议使用 WinSCP 来配置;如果只是给自己装的话,就不必了。

WinSCP 的使用很简单:文件协议选SCP,主机名为管理页面地址,端口号为22,用户名为root,密码就是路由器管理员密码。登录后,右侧就是路由器中的所有文件,可以根据需要修改,也可以将电脑上的文件复制粘贴到路由器上;左上方有一个黑框框的图标(打开终端),可以用来给路由器发送命令。

发送命令时,WinSCP 常常会报错,别理它。如果说“主机超过十五秒没有响应”,等一会儿就可以了。

命令的写法有:

  • 如果要更新软件源并安装luci-app-privoxy
opkg update && opkg install luci-app-privoxy
  • 如果要安装xmurp-ua,先手动将编译好的软件包(扩展名为ipk)复制粘贴到/tmp,然后执行:
opkg install /tmp/*.ipk
  • 稍后修改完设置后,需要重启相关的服务。下面三句命令分别是重启防火墙、重启 NTP 服务器、重启 Privoxy:
/etc/init.d/firewall restart
/etc/init.d/sysntpd restart
/etc/init.d/privoxy restart

或者你懒得敲这样长的命令,直接重启一下路由器也行:

reboot

需要修改的配置文件有:

  • NTP 服务器的设置。在/etc/config/systemconfig timeserver 'ntp'那一段。把它修改为:
config timeserver 'ntp'
option enabled '1'
option enable_server '1'
list server 'time.xmu.edu.cn'
list server 'cn.pool.ntp.org'
list server 'pool.ntp.org'
list server 'time.apple.com'
  • Privoxy 的设置。在/etc/config/privoxy中。将它修改为:
config privoxy 'privoxy'
option confdir '/etc/privoxy'
option logdir '/var/log'
option logfile 'privoxy.log'
option forwarded_connect_retries '0'
option keep_alive_timeout '300'
list permit_access '192.168.0.0/16'
list actionsfile 'user.action'
option accept_intercepted_requests '1'
list listen_address '0.0.0.0:8118'
option toggle '1'

config system 'system'
option boot_delay '10'

再修改/etc/privoxy/user.action为:

{+hide-user-agent{Privoxy/1.0}}
/
  • 防火墙自定义规则,在/etc/firewall.user。按照之前的内容,将需要的代码写到这里就可以了。

参考资料

更新记录

  • 2018.9.15:修正修改 UA 中的一些错误。
  • 2018.9.15:补充使用 LEDE 的 SDK 时可能出现的一些问题。
  • 2018.9.16:确认不需要修改 IPID。
  • 2018.9.16:改正关于 HWNAT 的说法。
  • 2018.9.18:确认不需要做 NTP 服务。
  • 2018.9.20:在仅仅修改 UA 的情况下,学校今天中午封掉了我的路由器。赶紧又加载了 NTP 服务和改 IPID/TTL 的内容。看接下来会怎样。
  • 2018.10.3:优化 privoxy 配置文件。
  • 2018.10.4:将近两个星期过去了。这次确认,不改 IPID 和 TTL,只改 HTTP 的 UA 和 NTP 服务已经足够防止封杀。
  • 2018.10.10:整理了一下这篇文章,准备写那篇面向小白的了。
  • 2018.10.19(20454):再次整理了一下文章,完成了给小白看的版本。
  • 2018.10.22(20505):更改了使用 shadowsocks 翻墙的内容(实际上服务器并没有开 UDP 转发支持,而且我错误地配置了 mwan3,才导致的不稳定)。
  • 2018.10.24(20534):改正了教程里的两个小错误。如果之前照着教程走不成功的,可以再试一次。因为自己的疏忽给大家造了麻烦,我深表歉意。另外,学校封路由器,大家生气归生气,但是作为一个高素质的厦大学子,不要说脏话。
  • 2018.11.16(20853):发现一些路由器 sysupgrade 和 factory 固件都是.bin后缀,把这一点改正了。还有的人说升级 OpenWRT 之后路由器就开不了机了,虽然我觉得应该是他操作的问题,但还是加上了不升级的操作方法。另外,应该有人根本不介意路由器偶尔掉线,那这样的话,其实不需要这样复杂地配置。
  • 2018.12.15(20C63):解决了 HTTP 下载卡顿的问题。另外把额外配置的那一个部分删掉了,寒假专门写一篇文章吧。
  • 2018.12.15(20C64):对操作过程中可能出现的正常的卡死作了说明。补充了用 Privoxy 改 UA 可能导致的一些问题。
  • 2018.12.22(20D55):重写了改 UA 时的代码。
  • 2018.12.22(20D61):发现 UA 不是 GET 特有的字段,其它情况貌似基本是 POST 了(剩下的请求类型貌似不常用)。出这样的错误,显然就是专业计算机和非专业爱好者的区别吧。
  • 2018.12.24(20E13):删掉了改 IP 头的部分,改 UA 的代码也放到了 GitHub。不过这样看起来,这篇文章的主要内容反而不占主要的字数了。
  • 2018.12.25(20E24):把整个文章重新整理了一下,把新的方法写了进去。另外,Merry Christmas!
  • 2019.1.8(20G24):代码适配新内核、修复 BUG。
  • 2019.2.6(21233):把两篇文章合并了(放弃了教会所有小白的念头),删掉了很多废话。
  • 2019.2.8(21245):稍稍补充。
  • 2019.3.17(22403):博客搬家的过程中哪里被我搞坏了,就复制粘贴到了这里。这是我新博客第一篇不水的文章。
点赞
  1. 匿名说道:

    楼主干得好

发表评论

电子邮件地址不会被公开。必填项已用 * 标注