背景

由于平时公司开发和测试的机器全部都是在公司的内网环境,最近前端团队说他们的VPN经常连接不上,希望能通过公网访问到后端的接口,并且做一些案例演示的时候,也可以直接连接到测试机器上面,这样更加方便一些。于是就有了这么一个需求,需要打通内外网。

方案一、VPN

ps -lef | greo ppp

就在我打算放弃使用之后,想到还有一台windows的服务器,那个可以连接上vpn,于是就使用那台机器做了一个常识,当连接上VPN之后,悲剧发生了,远程桌面连接断开了,在本机ping这台服务器的公网ip,无果,于是猜测可能是因为VPN的原因导致公网ip不起作用了……

方案二、内网穿透

goproxy

最开始我是使用goproxy来测试内网穿透,当一切就绪后,其实是可以连上的,不过访问的速度不是很好,不懂是不是我配置不恰当,这里就不展开了,下面说一下frp。

frp

frp这个也是使用go语言编写的内网穿透工具,配置起来比较简单,在linux下,只需要下载对应的发行包解压后,修改下配置文件启动即可,这里也不说关于怎么安装了。

frpc.ini

以万网的域名为例,添加一个子域名,如test,选择A记录,地址解析到VPS的公网ip,这个时候通过在vps上配置nginx反向代理到frps监听的那个http端口,理论上就可以接收到通过二级域名访问过来的请求了。但是呢?并不得,直接返回404了,其根本的原因就是上面说到的custom_domains,在跟踪了从浏览器发起的请求,请求头的Host是子域名,但是frpc.ini的custom_domains配置的是主域名,怀疑是请求已经通过链路发送到了内网,但是内网的frpc获取请求头中的Host跟配置文件中的进行比较,发现不一致时,则认为404,抱着这个猜想,修改了frpc.ini的配置,将custom_domains修改为了二级域名,然后重启frpc,重新访问,这个时候请求就通了。所以,这个配置项一定是跟访问的域名/Ip要一致,如果不一致,也可以通过nginx的proxy_set_header Host设置成和custom_domains一样的,不过个人不建议这样做。

关于内网机器,我是通过内网一台机器跟frps进行通信,然后将http请求都转发给监听80端口的nginx来处理,在nginx里面,根据配置的location 反向代理到其他内网机器的tomcat或者别的servlet容器,需要注意一下,如果location不是直接配置/的话,需要加rewrite把前缀给替换掉,否则可能会请求不到。

以上就是本人的这次尝试的一个总结,后续有什么新的发现继续补充……希望给有需要的朋友提供点参考,如果有什么理解不到位的地方,也请大家多多指出!