使用frp实现内网穿透和利用nginx做二级域名映射打通内外网

为什么80%的码农都做不了架构师?>>>   hot3.png

背景

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

方案一、VPN

本人就在阿里云租了一台VPS,最开始是打算使用ppp连接到公司的VPN服务器,这样VPS和内网就打通了,但是一切就绪之后,开始拨号,发现连上了,使用ps -lef | greo ppp也发现了ppp的进程,日志也没报错,欣喜!但是好事总是多磨难,就在用ifconfig查看ip信息的时候,发现ppp对应的竟然是我VPS在阿里的内网地址(PS:内网网关为192.168.1.1),并没有给我分配192.168.1.x这样的ip,使用ping去ping内网的机器也不通,几经折腾之后,发现此路并不容易行得通。

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

方案二、内网穿透

goproxy

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

frp

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

下面记录下frp使用过程中遇到的一些"坑"。其实在我看来,对于第一次接触这个软件的人来说,比较坑的地方在于frpc.ini的custom_domains这个配置项,最开始是配置了一个域名,然后使用这个域名frps配置的http端口进行访问是可以访问到内网的,不过换成了ip之后就访问不通了,直接跳转到frp提供的一个html页面。这让我百思不得其解啊。再后来觉得域名加端口号这种方式实在是不雅,就想到了配置子域名的形式进行访问。

以万网的域名为例,添加一个子域名,如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把前缀给替换掉,否则可能会请求不到。

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

转载于:https://my.oschina.net/succy/blog/2981337

你可能感兴趣的:(运维)