[随笔]利用云虚拟机和学校VPN实现校外访问校内站点(反向代理)

时间:2022-03-06 09:51:56

探究背景简介:

  大学校内站点一般不对外开放,个人认为原因有二:

  一是站点内容受众就是大学师生;

  二是站点基本无防御措施,在公网环境下容易发生意外情况。

  至于为何不对外开放,不是这篇随笔探讨的重点,利用一些技术工具,实现公网下访问校内站点,才是这篇随笔要谈的。

  为何要在校外去访问校内资源?这每个人都有自己的答案。

  要通过公网访问这种内部站点,基本思路有两个,一个就是找一台在校园内部能连接到公网的机器做代理;另一个就是利用几乎所有高校都会提供的VPN通道,通常用学号等作为验证。

  第一种思路需要有一定的人脉等资源,不然很难找到一台在校内能24小时不间断运行的机器,况且针对机器的宕机很难在线修复,利用个人电脑在宿舍搭建也不现实,毕竟许多学校会断电断网。反观第二种思路,只要有一个学号或者教职工号就可以通过VPN使用校内资源,较为便捷,唯一的一点问题是在连接到VPN后,一般情况下只能访问校内资源,而无法使用其他的公网上的资源,好在这种现象只是vpn客户端的一种安全策略而已,可以通过修改路由表等来达到校内资源和公网资源同时使用的目的。

目的:让普通师生用户直接访问到校内资源。

  无论使用3G,4G,还是自家的移动联通电信宽带,都能便捷的访问校内网站,而无需连接到校内网。


大致工作流程:

一、创建云主机

  毫无疑问,必须选择国内的云主机。

  作为一名忠实的软粉,选择云主机必然是优先选择微软自家的Azure了,无奈囊中羞涩,只好放弃。但是1元体验Azure的好事是绝对不能错过的,于是用1元钱体验了1500RMB额度的Azure,建了一个D0标准的虚拟机,貌似是一天80RMB,很是奢侈啊。但是体验完了,还是要回归现实的,最终选了阿里云最便宜的一档ECS,但针对此次探讨的需求,已经足够。

  虚拟机的系统大版本是Ubuntu14。

二、配置云主机

  因为选择了使用VPN来访问校内网站,那么必须安装一个VPN客户端到服务器,学校提供的VPN是基于SSL协议的,经过我几天的百度,发现只有MotionPro这款软件最好使,但遗憾的是,在Linux上面,这款软件只支持GUI的操作方式,并没有提供在BASH中操作的命令,那必须要为服务器安装一个桌面环境了。经过百度发现,XUbuntu-desktop比较轻量级,在服务器上使用最好不过,于是根据一些教程,完成了服务器上桌面环境的安装配置。具体配置可以参考这篇教程 http://www.linuxidc.com/Linux/2015-04/116446.htm

  作为一名软粉,为什么不用Winserver呢?因为windows下Nginx的性能不是一般的差,而且还只是一个beta版本;而IIS在反向代理中会出现一些我个人暂时没找到解决办法的问题。所以只能Linux了。

况且!!!Satya Nadella 说了“Microsoft Love Linux”,是的,我也爱Linux。

[随笔]利用云虚拟机和学校VPN实现校外访问校内站点(反向代理)

三、安装MotionPro

  ArrayNetwork还有几款类似MotionPro的SSL VPN客户端软件,但是这些都会监测路由表变化,然后重置路由表。所以暂时选择MotionPro

  Array Network公司产品下载集合,可以选择合适的版本进行下载使用

  http://support.arraynetworks.com.cn/troubleshooting/

四、配置定时任务和脚本,修改路由表

  针对路由表的修改,是这次探讨最为关键的一步。通过修改路由表,可以实现特定的IP通过VPN去访问,而其他的IP则通过物理网卡去访问,从而实现学校内网和公网的同时访问。

  值得注意的是:

  1. 所有的路由表修改工作是在虚拟机上完成,不正当的修改会导致当前主机失去和虚拟机的网络连接
  2. 学校的vpn在长时间无访问的情况下,会自动掉线,所以需要一个心跳包的机制
  3. 我所在学校的vpn,无论如何,24小时后会自动断开,需要重连

  所有这些导致的结果就是必须用定时任务和脚本去修改路由表。至于修改的具体内容,我在GitHub有一个项目专门介绍:https://github.com/cjw1115/RouteTableChange

  由于用到了shell脚本,需要注意的是,再Ubuntu中,原先默认的bash shell被修改成了dash shell,这会导致一些脚本处理的语法错误,

  通过如下方式改回bash:
  

sudo dpkg-reconfigure dash
选择NO

五、Nginx反向代理

  完成以上四个步骤后,现在服务器应该可以访问校内站点诸如:jwgl.xxxx.edu.cn,my.xxxx.edu.cn等类似网站,也可以访问百度新浪等公网上的站点。接下来就是安装配置Nginx,架起一座校内和校外的桥。

  一个基本需求是,用户访问例如jwgl.proxyxxx.com,返回jwgl.xxxx.edu.cn的内容。

  Nginx负责监听用户对jwgl.proxyxxx.com的请求,并将请求转发到jwgl.xxxx.edu.cn,最后把jwgl.xxxx.edu.cn的响应又转发给用户,实现反向代理。

具体如何配置,可以参考如下配置文件(/etc/nginx/nginx.conf部分)

upstream  jwgl{
         server jwgl.xxxx.edu.cn:80;
}
server{
         listen 80;
         server_name 127.0.0.1;
        
         location /{
                proxy_set_header Host $host;
                proxy_pass http://jwgl;
         }
}

  jwgl.proxyxxx.com这个网址应该被解析到云虚拟机的公网IP上面,具体的解析可以到域名提供商处设置。

  以上五个步骤就可以实现这篇随笔要探讨的主题,在公网下访问不对外开放的校内资源!


  接下来是自问自答环节:

  问:既然校内资源不对外开放,自然有它的道理,那为什么还要通过这种方式去访问校内资源呢?

  答:这么做,只是为了更好的使用校内资源,绝不是为了搞破坏!