(邪恶的实践)搭建寒假期间可供校外访问的代理

寒假到来,各位同学开始踏上了回家的路途。而我却仍然依恋着学校,原因之一就是能访问知网的教育网( CERNET )。宿舍网络各种不稳定想必各位杏仁儿深有体会,而图书馆的教育网……

妈妈再也不用担心我吃不到鸡了

——室友刘某语(估计开学我会被打死

其实对我个人而言,校园网最好的一个地方,就是能访问知网!然而学校为什么不给本科生 VPN ,所以我只能自己动手解决问题了。我个人最熟悉的语言是 Python ,已经做好准备写 Python 自动登录脚本的想法了,但是……为什么小米路由 Flash 只有 16M !装个 Python3 都成问题……所以便有了此文。

是以为序。

Part 0 成果

郑重声明:最近郭嘉加大了对境外服务器的审查力度,当出现向大陆以外地区的服务器长时间的大流量的访问会导致 IP 被封锁,请务必、务必、务必不要滥用!而且我的服务器不是无限流量!!为了我和别的同学的利益,我写了一个自动脚本,对于一小时内使用过多流量的 IP 将直接加入黑名单!而且我可以查到你是谁。

经我个人测试,手机版的知网等等简直就是鸡肋,而且没有办法做到 IP 登录。所以我在这里并没有放出手机客户端。

Linux 客户端(Appimage 版本)

Windows 客户端(务必要解压到一个你能找得到的地方,双击那个图标为小飞机的可执行文件)

Mac OS 客户端

对于使用 Windows 的同学,我已经替你们把配置填进去了,而对于使用 Mac OS 或者像我一样使用 Linux 的同学,请将开头的$改为S,然后用此链接导入配置:

$$://Y2hhY2hhMjA6YXN0ZXJ3YW5nQDEwMy4xLjE1My4xOTA6OTAwMA==#marchhappy.tech

随后,请自行下载安装火狐浏览器(传送门),并访问这里安装 SwitchyOmega ,将“初始情景模式”改为直接连接,到恢复配置一栏里填入 https://cloud.marchhappy.tech/assets/marchhappy.bak,然后到 SwitchyOmega 里选中 校外访问




敬请享受上知网、万方、维普等等的乐趣吧!

以下内容是我对自己整个服务搭建过程的记录,如果不关心原理的话,各位同学可以不用往下看了。如果有任何意见、想法,或者是使用上的疑难,欢迎在最下方评论区留言,或者 QQ 上找我,我会尽力解答。


Part 1 寻找可用接入方式

A.图书馆

首先想到的是找一个可用的 IP ,然后把它放到一个假期不断电的地方~当然,因为图书馆的 IP 段上网不需要收费,学校网管是不可能那么容易的就让你找到可用 IP 段的,在我测试的时候,就遇到了ping不通旁边电脑的情况,本机IP为 10.90.20.129 ,隔壁那台电脑IP是 10.90.20.128 ,死活不能互 ping (某些人可能已经能猜到我在哪里做的这个实验),毫无疑问,网管在配置计算机的时候就已经考虑过会有这种扫描手段,并且把ICMP给禁止了,我也很无奈~

批量测试命令:for /l %i in (1,1,255) do ping -n 1 -w 60 10.90.20.%i | find "回复" >> pingresult.txt

来自 10.90.20.1 的回复: 字节=32 时间<1ms TTL=255
来自 10.90.20.129 的回复: 字节=32 时间<1ms TTL=64
来自 10.90.20.210 的回复: 字节=32 时间=2ms TTL=128
来自 10.90.20.211 的回复: 字节=32 时间=1ms TTL=63
来自 10.90.20.212 的回复: 字节=32 时间=1ms TTL=63
来自 10.90.20.213 的回复: 字节=32 时间=1ms TTL=63
来自 10.90.20.214 的回复: 字节=32 时间=1ms TTL=63
来自 10.90.20.215 的回复: 字节=32 时间=1ms TTL=63
来自 10.90.20.216 的回复: 字节=32 时间=1ms TTL=63
来自 10.90.20.243 的回复: 字节=32 时间=2ms TTL=128
来自 10.90.20.247 的回复: 字节=32 时间=1ms TTL=64
来自 10.90.20.248 的回复: 字节=32 时间=1ms TTL=128
来自 10.90.20.251 的回复: 字节=32 时间=10ms TTL=254
来自 10.90.20.252 的回复: 字节=32 时间=9ms TTL=254
来自 10.90.20.253 的回复: 字节=32 时间=8ms TTL=254
来自 10.90.20.254 的回复: 字节=32 时间=15ms TTL=254

在图书馆的电脑搞到 IP 信息以后,我到宿舍的 Ubuntu Studio 上面填入了抄下来的 IP 信息,然而,并不能上网。所以在本机上排查原因:

aster@marchhappy:~/桌面$ traceroute 10.90.20.1
traceroute to 10.90.20.1 (10.90.20.1), 30 hops max, 60 byte packets
 1  10.10.16.1 (10.10.16.1)  14.703 ms  21.401 ms  39.528 ms
 2  10.254.0.1 (10.254.0.1)  39.554 ms  39.546 ms *

中间多了两个 hop ,而且估计图书馆是 IP 地址与 Mac 地址绑定,所以此计划告吹。

B.宿舍

我本来打算放在宿舍的,但是询问了一下宿管阿姨,寒假宿舍内拉闸,直接不用考虑了。

C.弱电间

就在我放弃挣扎的时刻,偶然间去地下室逛了一圈,结果看到了不得了的东西!学校宿舍的交换机房……而且,还没上锁。我估计这么重要的设备,宿管应当是不会断电的,寒假留宿的学生更是证实了我的这一猜测——网络不会中断。也就是说,我只要搞定校园网自动登录就可以了。


Part 2 代码实现

Section 1 跨越外网与内网的界限

我们平常使用的家宽,智慧型手机使用的蜂窝数据都无法访问校内资源,是因为你的 IP 不是校内 IP ,所以我们需要想办法让知网等等“认为”你的 IP 就是来自学校的。这里我画了一张图,尽可能通俗的的解释原理:

配置文件(删除了关键内容):

香港服务器(作为 frp 的服务器端):

# [common] 是不可或缺的部分
[common]
# 必须用方括号包含IPv6的文字地址或主机名,例如"[::1]:80", "[ipv6-host]:http" or "[ipv6-host%zone]:80"
# 我没这么干,因为估计设置了也没有人用
bind_addr = 0.0.0.0
bind_port = ***
# 用于 kcp 的 udp 端口,可以同上面的一般端口相同。
# 如果不设置的话,kcp 将在服务器端被禁用
kcp_bind_port = ***
# 控制台端口
dashboard_port = ***
# 控制台登录信息
dashboard_user = ***
dashboard_pwd = ***

# http 转发端口
vhost_http_port = ***
vhost_https_port = ***
# 日志文件位置
log_file = ./frps.log
# 设置日志记录等级,可选的有: debug, info, warn, error
log_level = info
# 设置日志保留时长
log_max_days = 3
# 自从v0.10.0以后,特权模式是唯一被支持的模式,请自行更换下面的 token
privilege_token = ***
# pool_count in each proxy will change to max_pool_count if they exceed the maximum value
max_pool_count = 200
# 是否使用tcp流复用,默认为true
tcp_mux = true

路由器(作为 frp 的客户端):

[common]
server_addr = 103.1.153.190
server_port = 7000
# 验证用
privilege_token = ***

# 在没有数据需要传输时提前建立的连接数,默认为0
pool_count = 5

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = ***
# 是否加密
use_encryption = true

[¥hadow(河蟹)$ocks]
#注意修改上方[]内的内容,不要与其他隧道名称重复
privilege_mode = true
type = tcp
#remote_port外部端口,可映射TCP、UDP端口范围为:9000-65535
remote_port = 9000
#local_ip本地服务IP
local_ip = 127.0.0.1
#local_port本地服务端口,同上面设置的
local_port = ***
use_gzip = true
use_encryption = true

最后,只要让路由器上的 $hadow(河蟹)$socks 服务器监听 9000 这个端口,便万事大吉。

Section 2 完成校园网自动登录

我校,无论是有线网络还是无线网络,都有一个共同的特点:需要 Portal 登陆。一开始我对这玩意儿一无所知,于是我就拿 Wireshark 抓了个包,真相大白——只是一个普通的 POST 请求。这就好办了,只要拿 CURL 做个请求就好。我在 Ubuntu Studio 下面做了个测试,成功了。

aster@marchhappy:~$ curl -d "username=18*******98&amp;domain=cmcc&amp;password=MTIzMzIx;enablemacauth=0" 10.10.100.14/index.php/index/login
{"info":"\u8ba4\u8bc1\u6210\u529f","status":1,"logout_username":"18*******98","logout_domain":"\u4e2d\u56fd\u79fb\u52a8","logout_ip":"10.100.100.32","logout_location":"\u5357\u4eac\u4e2d\u533b\u836f","logout_timer":0,"logout_window":0}

额……手机号码涉及到了隐私,所以没给你看……密码是用 Base64 方式编码的,服务器发回的数据是一个典型的 json 格式。在服务器发回的响应中,有些东西是用Unicode编码的,我把它还原如下:

{
"info": "认证成功",
"status": 1,
"logout_username": "18********8",
"logout_domain": "中国移动",
"logout_ip": "10.100.100.32",
"logout_location": "南京中医药",
"logout_timer": 0,
"logout_window": 0
}

所以剩下来的事情就很简单了,只需在我刷入的 Padavan 固件中,加一个断网时执行的脚本即可:

#!/bin/sh
echo ""
echo "Location: Nanjing University of Traditional Chinese Medicine"
echo "          Should also work fine in other universities using Portal like NUAA(南航大) and SEU(东大)"
echo "Useage  : Login for NJUCM's Portal and automatically reconnect the network get disconnected"
echo "          Written for my mi router mini running frp and shadoswsocks server"
echo "          Intends to help students access resources inside the CERNET in the winter holiday"
echo "Author  : Aster Wang @march_happy"
echo "          https://marchhappy.tech"
echo "License : Do What The Fuck You Want to Public License"
echo "          http://www.wtfpl.net/"
# Change the following accoarding to where you are
# Login function
# Password is in Base64
do_login() {
    username='13******6'
    domain='njucm'
    password='***'
    destination='http://10.10.100.14/index.php/index/login'
    curl -d "username=$username&domain=$domain&password=$password&enablemacauth=0" $destination
}
do_login_backup() {
    username_backup='18********8'
    domain_backup='cmcc'
    password_backup='***'
    destination_backup='http://10.10.100.12/index.php/index/login'
    curl -d "username=$username_backup&domain=$domain_backup&password=$password_backup&enablemacauth=0" $destination_backup
}
# Change the ping destination (IP or hostname) here
ip1='aliyun.com'
ip2='store.steampowered.com'
# Login the NJUCM Portal and begin the ping test
keep_connected_njucm() {
  do_login
  logger -t "[Keep Connected]First Login OK"
  while true
     do {
         sleep 10
         ping -c 2 $ip1 #&>/dev/null
         logger -t "[Keep Connected]First Ping Trial"
         exit
         if [ $? -eq 1 ]
         then
              ping -c 2 $ip2 #&>/dev/null
              do_login
              logger -t "[Keep Connected]Disconnected... Retrying"
              if [ $? -eq 1 ]
              then
                   sleep 5
                   if [ $i!=9 ]
                   then
                        do_login_backup
                        let "i++"
                        logger -t "[Keep Connected]Fallback Account Used"
                   fi
              fi
         fi
  }
  done
}
keep_connected_njucm

原理讲解结束。


最后,希望南中医能把VPN开放给本科生用户,因为,手机客户端根本就没某些人想的那么好用,很多论文你是没办法看的!

文尾彩蛋

猜猜我在哪台电脑上做的死~

以太网适配器 本地连接:

连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : Realtek PCIe GBE Family Controller
物理地址. . . . . . . . . . . . . : F8-0F-41-69-FA-84
DHCP 已启用 . . . . . . . . . . . : 否
自动配置已启用. . . . . . . . . . : 是
本地链接 IPv6 地址. . . . . . . . : fe80::9d7c:47a6:5996:bc98%12(首选)
IPv4 地址 . . . . . . . . . . . . : 10.90.20.129(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 10.90.20.1
DHCPv6 IAID . . . . . . . . . . . : 267915073
DHCPv6 客户端 DUID . . . . . . . : 00-01-00-01-1A-28-59-25-F8-0F-41-69-8C-68

DNS 服务器 . . . . . . . . . . . : 218.2.135.1
8.8.8.8
TCPIP 上的 NetBIOS . . . . . . . : 已启用

参考资料

[1]
NanoPiNEO安装ss配合frp使用笔记

[2]
簡析南京航空航天大學校辦無線局域網「nuaa.portal」的認證方式

[3]
njit-client断线自动重连脚本