校园网中实现免费上网的方法(2)

该方法需要拥有校内服务器,且该服务器能正常访问外网.

原理很简单,就是访问不需要花钱的内网,然后将流量全部发到校内服务器上,让该服务器做代理进行请求转发.

该方法不讨论ipv6,因为在校园网有v6地址你就已经可以免费上网了.

代理服务器设置

google搜索关键词 “shadowsocks 搭建 代理服务器”

本地配置

  • 安装ss,配置代理服务器为校内的那台服务器地址即可,各项配置正确即可在能访问服务器的前提下访问到百度一类未被墙的网站.
  • 这时浏览器能上网但是其他软件(像迅雷/百度网盘)没法上网怎么回事?

首先要提一下ss在本地实现代理的机制.

以Windows系统为例,设置里有“系统代理”的选项,
系统代理

如果启用该选项,填上相应的配置,那么系统会自动在浏览器的设置里添加代理地址,可以这样查看,
浏览器代理

这样的话,浏览器和其他的支持这种代理设置的软件就会在访问网络时将流量发到代理地址上,但是实际上,支持系统代理的软件非常少,一般来说只被浏览器普遍支持(所以你知道为什么直接启用ss后除了浏览器为什么其他软件都不走ss代理)。说明了这些,那么ss怎样实现在本地的代理就很容易明白了,你第一次运行ss,它会自动设置系统代理,代理地址为本地回环地址加上端口(默认为1080,可手动更改),那么浏览器的流量发到这个代理地址后,ss进行处理(根据代理规则出口流量与加密等),其实localhost:1080后面还跟了一个文件,它就是PAC

里面定义了至少一个JS函数,代理规则也都在里面,它通过JS函数来确定访问每个URL时所选用的合适代理,再将流量出口.
知道了这些,你就应该明白,如果想要其他软件也用上系统代理,那么我们需要将这些软件的流量也转发到系统代理的地址上.
在此我选择了proxifier来进行可选择性的代理.具体的使用请自己搜索.

但是此时你只能访问未被墙的网站,因为你的代理服务器在墙内.

二次代理

想上google的解决办法当然就是二次代理了,有两种实现办法:

  • 1.我先将流量发到自己的校内服务器上,再配置校内服务器,让它把流量发到墙外的代理服务器;
  • 2.我直接在自己的PC上挂两个SS客户端,一个配墙外代理服务器(占1080端口),一个配校内服务器(占1081端口),流量都发到1080端口,利用pac进行选择性代理,然后利用ss客户段端设置中的Forward proxy添加一个本地1081端口的sock5代理,让1080端口的流量经过选择性代理后再全部发送到1081端口通过校内服务器出口到外网.

对于第一种方法,这里贴一个GitHub项目,它只要一条命令就可以实现二次代理,需要注意的是使用转发功能之前需要先切换到develop分支.

但是第一种方法在我的使用过程中体验并不好,第一,速度比较慢(可能是我那台服务器年纪比较大,计算处理能力较低,所以两次加密处理起来比较慢);第二,就是如果你的墙外代理服务器有多台就需要开多个端口;所以我放弃了法一,采用了法二,大概过程在上面已经说了,在此不赘述;对于proxifier的规则配置说两点,首先,default选项填1080端口;如果像我一样需要校园认证等操作不需要走代理(我这边这种过程是不能走代理,因为学校的校园网认证对于ip段做了跳转,如果是服务器一类的地址去访问则直接跳转到学校官网首页而非认证校园网登录页面)就新增加一条规则,将其action设为direct,其中的target hosts对于ip地址或网址进行匹配.

自动注册热键的ss客户端

在github的shadowsocks-windows项目中下载的版本到目前为止是没有自动注册热键功能的,也就是你设置热键后每次重启电脑都要手动重新注册一下,对有热键需求的人来说肯定不方便,但是自动注册的功能已经被voq开发出了,GitHub项目在此.基于此,我用appveyor编译了一下, 生成了exe文件,appveyor项目在此,debug版比release版报错更详细,exe文件下载链接在artifacts里面,有需要的可以下载.

手机怎么办

在此以IOS系统为例介绍,Android类似.

我使用的代理软件是Shadowrocket,现在app store上已经封停了,无法下载,可以使用各类助手,如果自己当前使用的助手平台上也被封了,可以下载我从pp助手获得的ipa文件->下载链接.

需要注意的是,代理规则应该是默认全部代理,对于一些特定的网址(如校园网的认证登录网址)应该进行匹配直连(direct).

而在shadowrocket的使用中,我发现使用FINAL进行默认的规则并不可行,如配置文件这样写:

[Rule]
IP-CIDR,127.0.0.1,DIRECT
FINAL,PROXY

这表示我希望除了发到127.0.0.1回环地址的流量进行直连外,其他的全都进行代理;然而实际却并不可行,它对其他的流量并不会进行默认代理,不知道是不是软件本身的问题.
在此我对域名后缀进行了关键字匹配,只要是使用域名访问的都进行转发(反正常用的域名后缀就那么多个),如DOMAIN-KEYWORD,com,PROXY,这样在访问所有.com域名后缀的站点时都走代理.

根据报错来设置代理规则

例如

比如我使用命令hexo s来启用heox本地服务器查看刚更新的内容效果时,访问localhost:4000站点网页打不开或者网页内容显示不完全,在这种情况下就要怀疑是代理的问题了,去查proxifier日志(建议在proxifier菜单栏中的log一栏里将file log选择为Errors only,这样就会把报错日志保存到本地文件中,查起来很方便),其中显示:

[12.01 17:15:10] chrome.exe *64 - [::1]:4000 (IPv6) close, 335 bytes sent, 0 bytes received, lifetime 00:01
[12.01 17:15:10] chrome.exe *64 - [::1]:4000 (IPv6) close, 0 bytes sent, 0 bytes received, lifetime 00:01
[12.01 17:15:10] chrome.exe *64 - [::1]:4000 (IPv6) open through proxy 127.0.0.1:1080 SOCKS5
[12.01 17:15:10] chrome.exe *64 - [::1]:4000 (IPv6) open through proxy 127.0.0.1:1080 SOCKS5
[12.01 17:15:10] chrome.exe *64 - [::1]:4000 (IPv6) warning : GetSockName() cannot work properly for the IPv4-IPv6 mixed connection.

一看发现是访问本地v6地址的4000端口出现的问题(为什么要走v6地址的原因未知),那就很简单了,我们把::1(代表v6的本地回环地址,同v4的127.0.0.1)加入到Localhost中,规则设为direct
加入v6本地回环

一些注意点

注意如果使用过程中有些需要使用网络的软件发生异常(如启动不响应),应该要去查proxifier日志,看看是不是代理的问题,如果没有产生日志应该将所有代理关掉再重启异常的软件试试.

赘述

免费上网并不是目的, 也不是为了抖机灵, 整个过程只是对自己动手能力的锻炼而已.

注: 本文仅用于技术讨论与分享,严禁用于任何非法用途