A.问题概述
一般的校园网或者一些机构的内网是无法从外网访问进来的,必须得连接内部的网络才可以访问校园网的资源。 官方方案一般是VPN,就是你在校外需要访问校内资源时,需要一个vpn平台,然后收个验证码或者扫个码什么什么的。 从校外需要访问校内资源,比如如下情形:
- 需要在家远程ssh登录自己的工作设备。
- 自己写的博客部署在了校内服务器,希望被校外的人看见。
- 自己设计的软件给外面人使用时,需要访问校园网里的设备。
由于VPN登录的繁琐性,情形2和3就已经把这个方案pass掉了,那么就需要我们使用到内网穿透技术。
B.预备知识
一般连接家里的路由器,或者校园网,使用ipconfig查看你的ip,会是如下这些情况
- A类地址范围:10.0.0.0 - 10.255.255.255
- B类地址范围:172.16.0.0 - 172.31.255.255
- C类地址范围:192.168.0.0 - 192.168.255.255
这些都是内网的IP频段,在内网以内的设备可以互相访问的。
一般来讲,外网的设备要想进来要问你的路由器愿不愿意(防火墙),或者你有一个公网IP。
内网穿透的作用就是把你的内网设备,映射到外网,让外网的设备可以访问到你的内网设备。
C.案例说明
这里以校内搭建Flask应用为例子。我们的设计草图如下所示。主要的主角有:
- 部署Flask服务的服务器,server,操作系统:ubuntu
- 我们自己的个人设备,PC,操作系统:windows
- 校外设备,可以用手机开热点来模拟外网环境(记得关掉校园网wifi)
图中标注的IP是因人而异的,需要自己查询。
#Tips:有部分读者可能没有可以使用的服务器,这个并没有关系,相当于你自己的设备和服务器是同一个设备而已。
C.1搭建一个Flask
在Flask服务器中,我们创建一个Flask应用
# flaskapp.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
return "hello world"
if __name__ == "__main__":
app.run(host='0.0.0.0', debug=True,port=5000)
终端运行python flaskapp.py
即可启动服务,其中host参数的0.0.0.0代表监听全部的端口,这样才可以被外部设备访问到。
这时flask会弹出大致如下信息(部分信息已脱敏)
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://192.168.1.103:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Restarting with stat
* Debugger is active!
这个时候,在我们自己的设备使用浏览器,输入网址http://192.168.1.103:5000/
,就可以访问到我们的Flask应用了。(输入的网址需要查看你的服务器的ip)
C.2校外网设备访问校内设备Flask
这里就轮到我们的内网穿透工具登场了。
这个穿透工具需要注册一个账号,然后实名认证一下就可以添加一个隧道。 在添加隧道界面,大致填写这些信息就可以了。
- 本地ip:服务器的IP,本文中为192.168.1.103
- 内网端口:一般为5000 ,和你的flask的端口有关
- 隧道名称:随便
- 外网端口:网站帮你填写完了
然后下载软件,服务器的操作系统是ubuntu,所以我下载的是amd64版本的。没有服务器,用windows设备测试读者应该下载windows版本。
然后就是在生成配置文件,把文件内容复制到刚刚下载的文件frpc.ini(按照官网步骤即可)
最后一条一条在服务器中执行如下命令。(windows的需要按照官网的步骤)
# 记得切到文件目录再执行操作
chmod 777 frpc # 修改文件权限用的
chmod 777 frpc.ini # 修改文件权限用的
./frpc -c ./frpc.ini # 启动服务
看到信息中有映射启动成功, 感谢您使用ChmlFrp!
就算是成功了。
在你的隧道列表中,有个隧道地址,用你的开着热点的手机输入这个网址就可以访问在服务器创建的Flask应用了。