与桂林某电子科技大学的校园网的防火墙斗智斗勇

最后一次更新时间:Friday, April 3rd 2020, PM

 

注:

请遵守中国大陆法律规定!
本文所记录的技术与过程仅为技术交流!切勿将其运用在其它地方!
若读者模仿并将其移用至别处,与本文作者无关!
感谢您的阅读和理解!

 

 

 

起因

最近一直在玩一款名为部落冲突的手游,玩过的同学都知道,这个游戏到了中后期全靠肝。而作为一名优秀(懒得动手刷资源)的程序员,面对这种需要进行反复无意义的劳动时,就要有符合程序员核心价值观的意识——能用脚(本)解决的事情,就绝不动手!本来电脑开模拟器用脚本刷的开开心心,但是我最近由于某些个人原因,在一个月黑风高的夜晚,把电脑搬回了学校实验室。然后发现,游戏打开后就黑屏(进不去游戏)。



so——问题出现了,我们就要解决它!

 

 

 

第一天

首先要分析一下问题。

部落冲突打不开了,可能的原因有好几种:

1.服务器坏了?
没有。手机依然可以登陆;

2.客户端坏了?
没有。各个商店里的各个版本我都尝试过,不太可能出现这种事故
(当你觉得全世界有问题的时候,不妨先想想是不是自己的问题)

那么除却以上两点,出问题的可能就是网络了。

 

 

 

打开模拟器的浏览器,发现一切正常。各种app也都可以使用,貌似只有部落冲突不能用。
到这里其实大家都应该有所感觉——会不会是这个游戏被屏蔽了呢?
验证的方法也很简单,如果学校要屏蔽游戏的话,那么首当其冲的肯定是

 

 

 


G胖:天天搞优惠亏钱就算了,到头来还要被屏蔽

 

 

 

果然

 

 

 

那么问题的所在就一目了然了——是学校的防火墙从中作梗!

 

 

 

从原理上来说,我只要穿透这个防火墙就可以了
大家都听说过翻墙,只不过我现在要翻的是SchoolFireWall

既然要翻墙,那么首先需要搭一个代理服务器(俗称梯子)
我想了一圈,宿舍那边入户的网线没有屏蔽掉Steam,而且如果可以用的话,时延比起来外网的vps要小很多。

 

 

 

于是我找到我宿舍的同学,让他帮我搭一个Linux虚拟机。
那么整体的网络架构应该是如下图所示的

 

 

 

同学用的虚拟机是Windows10的子系统Ubuntu(Win10应用商店里的那个)
我查了一下,这个虚拟机和真机共享IP,即vmware的默认网卡模式(下图)

 

 

 

同学在虚拟机中部署好ssh并启动,把虚拟机用户帐密发给我,我在实验室进行连接并控制
这里为了避免与QQ抢端口,建议将其端口号改为23
那么网络架构图中右下角部分就算是打通了。

与此同时,我让同学使用windows cmd中的tracert ip命令,查询到了宿舍路由器的ip
(该命令可以跟踪数据包所经过的网关的ip)

 

 

 

在下图这个例子中,第二个跃点为外网分配给路由器的ip

 

 

 

我在实验室ping了一下第二个跃点(宿舍路由器)的ip,可以ping通
那么接下来只需要解决从路由器到同学的pc这一段即可

 

 

 

登陆路由器管理界面,找到高级设置中的DMZ功能(IP映射)
这个功能可以理解为将该路由器内网中的某一设备的ip映射到自己身上
也就是外网数据包发送到路由器的IP时,路由器会自动转发其到内网某一指定设备

 

 

 

最后,测试可以从实验室ssh连接到寝室的代理服务器。
当然,这个只是测试,总不能一直让同学开着虚拟机给我当代理服务器。
日后只需要用手里现成的树莓派3B就可以了。

代理服务器的问题已经解决了,我在电脑上信心满满的打开ShadowSocks客户端
连上代理服务器,切换为全局模式,双击steam图标,经过紧张的等待后

 

 

 

还是上不去steam

很正常,生活嘛,总是起起落落落落落落落落落。

 

 

 

第二天

经过我冷静的分析(划掉),以及google公司的鼎力相助

原来ShadowSocks客户端的全局模式并不是类似于VPN那种,可以代理本地的所有流量。
ShadowSocks的全局代理只是sock5代理,即只有http和socks数据会走代理

游戏有很多是udp,而大部分http都是用的tcp,所以我猜测steam和部落冲突的流量并没有走代理

解决方法是使用一个由@AHaLa 这位大佬提供的工具—— proxifier_百度百科

 

 

 

通过网上的教程,使用ShadowSocks和proxifier将本机网络指定走代理(vpn)化之后
我兴奋的搓起了手,那感觉就像是革命胜利的前夕,不会再有压迫了!

 

 

 

但是,革命这种事情,总是一波三折

学校的防火墙除了防火墙最基本的IP封锁之外,还有另一个功能——DNS污染
在我尝试了指定DNS服务器以及修改hosts的方法发现二者均行不通

 

 

 

不过还好,proxifier提供了远程DNS解析

 

 

 

在看了几篇缺斤少两的博客之后,找到了一篇正确的proxifier和ShadowSocks将本地网络vpn化教程(除了开启远程解析,还要把小飞机代理的的端口填入直连名单)最终,我成功的连上了steam网络!

看吧,只要思想不滑坡,方法总比困难多(wdnmd劳资csgo新买的皮肤还没好好看几眼)

 

 

 

其实过程到这里就差不多结束了,但是吧~~

 

 

 

第三天

我来到实验室之后,发现昨天成功启动了脚本的部落冲突居然没有正常运行。仔细一看发现,我的电脑没网络了。一拍脑袋想到,学校的上网是要登陆的,每天晚上会把在线的强制下线。所以,要让它自动上线才可以

 

 

 

我google了一下相关的资料,在看过好多大神的思路之后,下载了一个名为Fiddler的抓包软件。Wireshark之前上计网的实验课倒是用过,但是比较复杂,杀鸡何用宰牛刀(其实是我忘了怎么用)

 

 

 

通过抓取数据包,我发现学校的登陆系统是通过GET方式直接发送数据包,这就大大降低了难度,因为Get方式发送的话,用户名和密码是明文写在url里的。我发现登陆过程中一共产生了3个数据包,而第三个数据包就是名为login的登录信息,把它的url复制,存到txt里

 

 

 

只要把图中的DDDDD和upass换成自己的学号和密码就可以了,于是我手动注销,然后用浏览器直接访问改好的url。果然,并不需要经过登陆页面,直接就登陆成功了。

 

 

 

那么接下来要做的,就是编写一个程序,实现这个功能。

大概的思路是,一直ping 8.8.8.8,如果可以ping通,则可以访问;如果不能ping通,则代表账户已被下线,需要访问指定的url。这里我使用python来实现。最后,再加上死循环让程序一直检测就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import os
import threading
import time
import urllib2

def ping():
if(os.system('ping -c 8.8.8.8') == 0):
print 'Connect SUCCESS'
else:
print 'Connect FALSE'

try:
s = urllib2.urlopen('此处为txt中修改好的URL')
except urllib2.HTTPError, e:
print e.code

def do():
while 1:
ping()
time.sleep(0.5)

do()

本地测试之后发现一切正常,我便把它丢到树莓派上运行了,这样就可以保证我路由器下的所有子设备都可以保持7*24在线。

 

 

 

结尾

大概就是这样了,第二天就可以看到全部刷满的资源(斜眼笑)。其实我本来想用树莓派直接搭全局代理,但是现在的资料貌似有点过时,树莓派的openwrt一直不出,lede的ss框架也不太好用,部署的证书都是过期的,pc基本没法用。如果走过路过的看官有相关资料的,还望指点迷津~

感谢阅读,以上


除特别声明外,本站所有文章均采用 CC BY-SA 4.0 协议 ,转载请注明出处!