native

使用 frp 实现内网穿透来访问内网网站

2019-06-03  本文已影响0人  环零弦

背景

我们学校的网站们在以前有一些是可以在公网上访问的,但后来可能因为什么政策或是安全因素,全部都不能公网访问了,这给我们带来了极大的不便。比如我想方便地在手机上查到我图书馆借的书都有哪几本,什么时候到期,我想查一下图书馆有没有我想要的书,书在哪儿放着。这让我不得不用手机连上校园网(有时候还连不上),然后打开在手机上极其难以适配(在电脑上也好不到哪儿去)的网页,缓慢地一步一步的(学校买的是sirsidynix图书管理系统,全无Restful API,恶心的是,每个固定的链接的URL是动态的,这就使得你必须一步步按照他的跳转逻辑才能获取到正确的下一个链接的URL,不存在跳步的情况)访问到你想点的链接,终于,你想看的结果出来了。

目的

做一个微信小程序,首页输入用户名和密码,能直接获取到上述的信息。

方案

1. 用到的工具

2. 还应该有的

架构信息

云服务器上开两个服务:frp 服务端nginx,内网里自己的主机开 frp 客户端node服务器
用户访问我的域名发起 https 请求,会被云服务器的 nginx 接受,nginx作反向代理,将这个请求传递到同域名的http地址(frp的代理监听地址),完成 https 到 http 的转换,并将请求穿透内网送至内网服务器,frp 的内网客户端收到这个请求后,将其转发给 node 服务器的监听端口,node 服务器收到请求后,对校园网内的图书馆网站发起一系列模拟用户登录后获取到信息,然后将信息返回给用户,一次请求的流程完成。
说明:在 nginx 的反向代理设置中,不能将 proxy_pass 字段设置为本机回环地址,因为 frp 绑定的是域名,所以使用本机回环地址不能使 frp 正确完成代理功能;另外 nginx 的https 相关设置项要参考证书提供者提供给你的设置。

关键设置

nginx.conf

 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
 ssl_prefer_server_ciphers  on;
 location / {
   proxy_pass http://YOUR_DOMAIN:YOURPORT;
 }

frps.ini

[common]
bind_port = FRP_COMMON_PORT
vhost_http_port = 8080

frpc.ini

[common]
server_addr = IPADDRESS.OF.YOUR.HIST
server_port = FRP_COMMON_PORT

[web]
type = http
local_port = PORT_OF_YOUR_APPLICATION_SERVER
custom_domains = YOUR_DOMAIN

启动

服务端 (CentOS 6.0)

$ nginx #启动 nginx
path-to-your-frp$ nohup ./frps -c ./frps.ini & #后台启动frp服务端

客户端 (Windows 10)

path-to-your-frp> ./frpc -c ./frpc.ini #启动frp客户端
path-to-your-webapp> node app.js #启动应用服务器,假设入口是 app.js

另外

还用一种方案,是把https在本地内网电脑解析,这就强依赖 frp 的代理能力,因为域名的证书是放在内网里的,可能浏览器在验证书的时候会有一些问题,尝试过这个方案,frp 使用一个叫 test_htts2http 的插件,总之也没好使,是我的问题。

结果

一天时间只完成了实现外网访问,小程序端还没做。
外网测试地址,可以获取我还欠了图书馆多少书。一次访问可能需要近10秒,绝对不是我的锅,模拟学校图书馆一次登录并抵达目标信息页,就需要花这么久,图书馆服务器就是这么慢。

参考资料:

上一篇 下一篇

猜你喜欢

热点阅读