Total Pageviews

Wednesday 24 June 2020

在厦大宿舍安装openwrt路由器

前言

我在厦大读书。17 年小学期换宿舍后,新宿舍里要求用一个客户端联网,所以不能装路由器;我找到了获得真实的 PPPoE 用户名的方法,于是可以绕过绕过这个客户端联网,也可以安装路由器。除此以外,有时用客户端联网会出现一些奇怪的问题(我见过几例,网页打不开或者客户端报错什么的),也可以用这个办法,绕过客户端直接拨号解决。下面会介绍这个方法。
2018 年七夕前后,学校开始检测时间戳和 UA 来判断一个账号是否共享给了多台设备使用(不论是安装路由器还是在电脑上开热点)。如果检测到就会禁止账号联网半个小时(认证日志显示“检测到代理”);随后我也找到了绕过检查的办法。下面也会介绍这个方法。
免责申明与免被查水表申明:
  1. 对于任何硬、软件的损坏,本人不赔偿,也不保证协助处理,哪怕这样的后果是因教程中的错误造成的;你需要自担风险。出现问题时,我应该会尽力协助,但我不是专业技术人员,没有能力也没有义务保证教程内容万无一失。尽管我还没有遇到过把路由器弄坏的例子,但读者也需要做好损失一台价值几十元或者几百元的路由器的心理准备。另外,本教程中的内容会使你的路由器失去保修。
  2. 对于因为安装路由器而可能造成的事故,我不负责。请设置足够复杂的管理员密码,并妥善保存;如果发生了安全事故(资金被盗、个人信息泄露等),与本人无关。
  3. 厦大宿舍明令禁止安装路由器,相关文件点击这里可以查看。我没有怂恿或建议任何同学安装路由器,安装路由器的行为完全是安装者的个人意志导致的,本人仅仅是作为技术交流的发起者而存在。请仅仅以学习研究为目的鼓捣路由器,并在安装好路由器之后 24 小时内再将之拆除;如果您喜欢上网,请按照学校指明的方式连接到互联网。如果学校根据校规等文件追究责任,与我无关。
  4. 不允许将此技术用于任何商业行为,我本人也保证会将技术无偿地公布出来,只为造福同学的同时顺便装逼致某些淘宝商家:对,说的就™是你,不认识“不允许”这三个字吗。什么“专业的团队”,可拉倒吧,教程是我写的,插件也是我写的,其它学校的方案也是在校学生鼓捣出来的,用的开源工具是无数工程师免费奉献出来的,你有什么贡献呢?除了拿我们的群当免费售后,顾客有问题不是卖路由器的解决,而是把我们的群号丢顾客让顾客去里面问,你又做了什么呢?
  5. 不要发表不文明的言论。虽然我也觉得学校封路由器很不厚道,但说脏话还是不好的。鼓励积极地传播这篇文章,以及义务地帮助身边有需要的同学。
本文最后更新于 2020 年 2 月 4 日(31422)。应该会长期更新。
如果文中有错误或者方法已经失效,可以 QQ 联系(897331845),或者 QQ 邮箱联系。如果是小白寻求帮助,请先确认自己已经仔细阅读过本文,并且操作确实没有问题。如果是来交朋友的,那么非常欢迎。

简单地安装路由器(绕过客户端联网)

非常简单:
  1. 确认自己在“厦门大学宽带认证客户端”(就是电脑联网时需要使用的那个软件)中填写的那个学号和密码,以及选择的是电信还是移动。如果忘掉了,先把正确的试出来。
  2. 将学号按照下面的规则转换(实质上是 ASCII 码加四),在前面加上 {SRUN2},在后面加上 @cmcc(移动)或 @ctnet(电信),得到用户名。
    转换前0123456789
    转换后456789:(半角冒号);(半角分号)<=
    例如,小明的学号为 19720192203456,移动,则用户名为 {SRUN2}5=;645=664789:@cmcc
    如果你不知道“半角”是什么的话:就是指英文输入状态下的冒号和分号,而不是中文输入状态下。
  3. 用户名对应的密码就是“厦门大学宽带认证客户端”中填写的密码。
  4. 如果目标是解决网络问题,在电脑创建 PPPoE 拨号(不会就去百度),把用户名密码填进去,直接拨号就可以了;如果目标是装路由器,将这个用户名和密码按正常的方法填入路由器,按通常方法设置就可以了。
我最先找到的办法是在系统日志里找用户名;后来经过别人提醒,才发现用户名有这样的规律。
有的路由器用户名不能包含大括号,正确的解决办法是换一台。
如果不能上网,请确认自己的硬件没问题、网口插对了、用户名和密码也输对了,一般就不会有问题的。还有问题,再联系我。
这样安装上的路由器可能会掉线,掉线频率取决于使用频率、流量大小,以及人品,掉一次需要半个小时才能恢复。学校似乎是新生来之后一两个月查得严一些,后面松很多。如果不能忍受这样频率的掉线,就接着往下看吧。

在 OpenWrt 上配置防止共享检测

下面的内容中,我假设读者已经熟悉了通常情况下安装路由器的方法。你要是完完全全的小白,那这个不适合你,找你身边会的人或者我帮你做吧。

安装 OpenWrt

这一节的目标是:得到一台安装好 OpenWrt 的路由器。
“OpenWrt”(Linux 的一个发行版)是一个安装在路由器上的操作系统。OpenWrt 对路由器的性能要求较高,所以只有一部分中高端的路由器可以安装。淘宝或者咸鱼上可以很容易找到已经安装好 OpenWrt 的路由器售卖,也可以自己买一台路由器,自己动手安装 OpenWrt。最便宜大概三十块钱就可以买到(闲鱼二手极路由 1s),足够一个宿舍日常使用;要折腾的话,几千块钱的软路由也可以。
OpenWrt 的官网是 openwrt.org,打开比较慢需要耐心等待。在右上角直接搜索路由器的型号,大多可以找到一个详细的页面,上面会详细地说明这个型号是否支持安装 OpenWrt 以及在哪里下载、怎样安装等。也可以直接百度或者谷歌,常常也可以找到详尽的中文教程。不同型号的路由器,安装方法不尽相同;相同或相近型号的路由器、不同版本的 OpenWrt 安装方法相同,并且都可以用来绕开检测的;推荐安装官方最新稳定版。当然了,如果无论如何也找不到相关的资料,那说明这个路由器性能太差没人去折腾,也就不能安装 OpenWrt。
因为这一步没有统一的方法,我没有办法更详细地写下去了,自己找对应型号的资料吧。
路由器的型号(Model)在路由器背面就可以看到。有时,同一个型号中还会分几个不同的硬件版本,不通刷。
“LEDE”和 OpenWrt 几乎一样,算是一个旧版本的 OpenWrt,可以当作 OpenWrt 来用。
网上有流传各路大神改过的 LEDE 或者 OpenWrt,增加了许多功能,但我非常不建议新手使用:里面的功能新手大多用不到,而且容易引起兼容性的问题,并且这些功能也可以在安装好后根据需要增加。总之,新手就老老实实用官方版。
有的路由器详情页面会注明“基于 OpenWrt 深度定制”或者“明月永在”或其它非官方版本的 OpenWrt,不要买,除非你有办法刷回官方 OpenWrt。因为这些版本的 OpenWrt 作者并不开放 SDK,没有办法编译需要的内核模块。
安装好 OpenWrt、系统完全启动后,建议马上再断电重启一遍。我用过的一些路由器需要这一步才能让 WiFi 正常工作。

配置上网

现在,你已经有了一台安装好 OpenWrt 的路由器。这一节的目标是,让你的 OpenWrt 可以上网,以及配置好无线。
方法和配置大多路由器差不多,只不过 OpenWrt 没有面向新手的一目了然的指引,而需要在繁多的设置中找出需要修改的那部分。
  1. 进入管理页面。如果是刚刷入的 OpenWrt 没有root账户密码,登入后按照提醒设置一个即可;如果已经有了密码,也可以修改:点击 Go to password configuration 按钮或 System -> Administrator(管理权)。
    如果你不知道路由器的管理页面地址,可以接好路由器后打开命令提示符,输入 ipconfig 并回车,寻找“默认网关”一项。新安装的 OpenWrt 管理页面地址一般是 192.168.1.1
    • Password(密码):填写你想好的管理员密码。
    • Confirmation(确认密码):再填一遍。
    点击 Save & Apply(保存并应用)。
  2. 点击 Network(网络)-> Interfaces(接口),点击“WAN”对应的 Edit 按钮。
    • Protocol(通信协议):改选为PPPoE,然后点击出现的 Switch Protocol(切换协议)按钮。
    • PAP/CHAP username(PAP/CHAP 用户名):填入之前由学号转换得到的用户名。
    • PAP/CHAP password(PAP/CHAP 密码):填入对应的密码。
    点击 Save & Apply(保存并应用)。这时,路由器本身和有线网已经可以上网了。
  3. 点击 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 标签,在大框框里另起一行,添加下面的代码:
    1
    2
    3
    4
    5
    6
    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,那么这一行代码需要修改为:
    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 同步成功”。这时,暂时地拔掉墙上接口与路由器之间的网线(断开了外网的连接),再点一次“立即更新”,应该仍然提示成功,这说明 NTP 请求已经被劫持到了路由器自身而不是外网(否则网线都拔了,怎么可能成功呢)。然后把网线插回。

修改 HTTP 头的 UA

UA 中包含了操作系统版本等信息,而 HTTP 协议没有对这些信息加密,因此别人可以从这里看到这个数据包发自 Windows 电脑还是安卓手机等等。接下来把所有 HTTP 头中的 UA 都改得一样。
有两种方法来修改 UA,二选一即可。另外,修改 UA 还会导致其它的异常状况,稍等我会说明如何设置例外。

使用 Privoxy 修改 UA

除非是软路由(性能可以和笔记本相比拟的路由器),否则不推荐这个方案。如果在普通的路由器上使用这个方案,会导致会导致 HTTP 协议的内容传输缓慢(比如 QQ 发送图片会特别慢,有的下载也会特别慢,Bilibili 手机客户端看不了视频等),建议使用下一节的方案。
接下来,会安装好 Privoxy 并正确配置,然后将所有 HTTP 流量转发给 Privoxy 代理,并在 Privoxy 中替换 UA。
安装
可以先尝试自动安装。
  • 进入路由器管理页面,点击 System -> Software(软件包)。
  • 点击 Update lists(刷新列表)按钮,等待几分钟。如果提示好几条“Signature check passed”那么这一步执行成功;如果卡死了,几分钟后再进入这个页面,看到了很长很长的软件列表,那也是成功了。要是老不成功,可能是晚上网络太差了,白天上网人少的时候试试,或者手动安装。
  • 在 Filter(过滤器)中填写 luci-app-privoxy,点击 Find package(查找软件包)按钮。点击下方“luci-app-privoxy”对应的 Install(安装)按钮。如果提示好几条“Configuring xxxx”,那么就是执行成功了;如果卡死后再进入管理页面,看到有一个 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 即可。如果你不知道 scp 是什么,那这个方法不适合你。
  • 进入路由器管理页面,看到有一个 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 标签,在大框框里另起一行,添加下面的代码:
1
2
3
4
5
6
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 -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.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

使用 XMURP-UA 修改 UA

我写了一个插件,可以直接在内核中修改 UA,效率比 privoxy 高,并且可以避免 privoxy 出现的各种问题。推荐使用。(绝对不是王婆卖瓜,而是用过的都说好。)
27 及以前的版本的插件有 bug,会导致路由器随机卡死,发生频率大约一天一两次,在多核路由器上发生得更频繁。版本 28 起解决了这个问题,因此推荐更新到最新版本。更新的方法与新安装一致。
下载或编译
大致上说,对应于不同的路由器型号、不同的 OpenWrt 版本,都需要重新编译。但是对大多数人来说,没有 Linux 操作的经验,编译是一件比较困难的事情。因此:
  • 如果你使用的是 Openwrt 官方稳定版,可以在这里找到我统一编译好的最新版本。
    这里的版本并不全。如果没有你的版本,请按照下一条操作。
    如果你不知道你的路由器型号对应哪个版本,就按照下面的方法来找:
    • 进入路由器管理页面,点击 System -> Software(软件包)。点击 Configuration(配置)选项卡。
    • 在 Distribution feeds(发行版软件源)中,可以看到很多行,每行都有一个网址结尾。其中有一个网址包含 targets,它的格式类似于:
      1
      .../targets/aaa/bbb/...
      那么,你的路由器对应的版本就放在 aaa 目录下的 bbb 目录中。
  • 如果你使用的是非官网版本,并且有 SDK;或者官方版本,但是我没有准备统一编译出来的包。那么:
    • 要么,将 SDK 或 SDK 下载地址(如果是非官方版本)或者系统版本和型号(如果是没有统一编译包的官方版本)发给我,我编译好后将包发给你。我的联系方式:QQ 897331845 或对应的 QQ 邮箱。
    • 要么,参照编译说明,自行编译。
    如果是自己编译的 OpenWrt,在 make menuconfig 中勾选“Build the OpenWrt SDK”,然后正常编译一遍,就可以得到 SDK 了。
  • 如果你使用的是非官网版本,并且有源代码,希望将插件集成到镜像中:
    • 下载源代码:
      1
      git clone https://github.com/CHN-beta/xmurp-ua.git package/xmurp-ua
    • make menuconfig,在 Kernel module -> Other modules 里勾选 kmod-xmurp-ua(按 y)。保存退出。
    • 正常编译镜像,镜像中就会包含插件了。
  • 如果你使用非官方版本,并且没有源代码、没有 SDK。别想了,没辙。
安装
点击这里,下载 OpenWrt 软件包安装器(我写的),解压、运行,安装即可。
如果不愿意使用安装器,可以手动安装。将软件包 scp 到路由器,然后 opkg install xxx.ipk 即可。如果你不知道 scp 是什么,那这个方法不适合你。
安装完成后,浏览器打开路由器管理页面,选择 System(系统)-> Kernel Log(内核日志),在最后几行看到有类似这样的句子:
1
2
[xxxx.xxxx] xmurp-ua: Started, version xx.
[xxxx.xxxx] xmurp-ua: nf_register_hook returnd 0.
这说明模块已经被成功加载。
确认效果
打开 ua.chn.moe,网页上应该显示 XMURP/1.0
如果没有修改成功,考虑是否是 mark 冲突了;也就是说,别的模块设置了 mark 的第九位,导致我的模块将这些流量当成例外而放行(具体看下文)。如果出现这样的情况,可以在内核日志中找到这样的句子:
1
2
[xxxx.xxxx] xmurp-ua: Mark matched. Note that all packages with the mark will be ACCEPT without modification.
[xxxx.xxxx] xmurp-ua: If the mark is not set manually, it maybe a conflict there. Find out which app is using the desired bit and let it use others, or modify and recompile me.
解决方法也是如上所述:最简单的办法,找到和本插件冲突的插件,卸载它们,然后重启。
这个情况在小白使用各路大神改过的 OpenWrt 时经常出现,而小白又不会去解决,所以我才建议用官方的。
对于较新的 OpenWrt,在 Network -> Firewall(防火墙)中,可能有流量分载(offloading)的开关。如果有,不要勾选,否则会导致插件失效。如果有其它 nat 加速之类的功能,也建议不要打开。如果实在想要启用流量分载,可以看 github 的说明,但一般来说真的没有这个必要。
已知插件与 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 拨号

学校给的客户端其实是使用 SRUN3 拨号而不是 SRUN2,只是 SRUN3 在普通路由器上无法实现,SRUN2 在厦大恰好也可以拨通,就用它了。对于 OpenWrt,稍稍修改拨号脚本后就可以使用 SRUN3 拨号。最近,用 SRUN2 拨号经常会掉线几分钟,SRUN3 就没问题,不确定是学校故意搞的鬼还是巧合。
下面是用 SRUN3 拨号的步骤:
  • 修改拨号脚本。WinSCP 连接到路由器后,打开文件 /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)

参考资料

No comments:

Post a Comment