公司内网服务器有演示环境,同时技术人员出差需要在客户现场进行演示,于是学习使用frp做的内网穿透。frp是用Go语言开发的,可用于内网穿透的高性能反向代理应用,支持tcp、udp、http和https。可将一个部署在本机的web服务映射到外网。
本文主要讲如何基于frp + nginx 配置http 内网穿透服务,承载多人同时使用。通过frp的运行原理入手,介绍frp服务端和客户端配置说明及后续延展功能。
frp是一个内网穿透工具,它可以让本地局域网的机器暴露到公网,简单的说就是在世界的任何地方,你都可以访问家里开着的电脑。frp支持tcp、udp、http、https,就是说不仅仅限于本地web服务器可以暴露,整台机器都可以暴露,windows的远程控制,mac和linux的ssh都可以被暴露。
1.frp:frp是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持tcp、udp、http、https等协议类型,并且web服务支持根据域名进行路由转发。frp内网穿透主要用于没有公网IP的用户,实现远程桌面、远程控制路由器、 搭建的WEB、FTP、SMB服务器被外网访问、远程查看摄像头、调试一些远程的API(比如微信公众号,企业号的开发)等。
2.Nginx:Nginx是十分轻量级的HTTP服务器,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP代理服务器。目前有很多国内网站采用Nginx作为Web服务器,如国内知名的公司新浪、163、腾讯、Discuz、豆瓣等。
框图说明:
1.配置无误的情况下,frp服务端和frp客户端先后启动,建立通信隧道,其中:
1)frp服务端监听http 81端口(此端口可自定义),接收此端口下所有外网用户请求,同时使用nginx代理81端口;
2)frp客户端代理本地想要暴露给外网的web服务端口,例如9090 端口,同时使用nginx代理9090端口;
2.通过配置在frp服务端nginx反向代理,将指向本台公网服务器的xxx.yyy.com域名映射到服务器的81端口,也就是frp监听的那个端口。外网用户访问xxx.yyy.com域名,等同于访问192.168.1.247:81,会触发 frp服务端和客户端的互动,从而http请求由frp服务端传递到frp客户端;
3.frp客户端收到http请求后,基于nginx配置,监听到http请求,则将请求转发到我本地的9090web服务端口;
4.本地的web服务收到http请求后,对请求做处理,并完成响应;
5.frp客户端将响应结果回传给frp的服务端。服务端最终将响应回传给外网用户;
6.最终的实测效果为:
访问xxx.yyy.com等同于访问我本地的localhost:9090。
1.在办公室访问家里的电脑,反之亦然;
2.自己电脑上的项目,方便发给客户朋友演示。比如我做了个小网站,发给朋友看看未上线版本,发个url给他就好了;
3.调试一些需要远程调用的程序,远程调用比如微信的API 回调接口。因为我有外网地址就不需要部署在公网服务器,直接进行本地调试。
可以根据需求下载对应的文件版本,推荐使用Windows_amd64和Linux_amd64版本,具体还需要根据机子情况。
下载链接:https://github.com/fatedier/frp/releases
frp主要由客户端(frpc)和服务端(frps)组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在机器上。
在客户端使用的都是frpc*名的文件,在服务端使用的都是frps*名的文件。
nginx部署路径:
/usr/local/nginx-1.14
frp部署路径:
/opt/tools/frp_0.37.1_linux_amd64
1.公网服务器:
2.内网服务器:
使用systemctl来控制启动,这个方法比较好用,很方便。注意服务端是frps.service,客户端是frpc.service。
1.服务端:
vi /lib/systemd/system/frps.service
在frps.service里写入以下内容:
启动frps:
systemctl start frps
重启frps:
systemctl restart frps
停止frps:
systemctl stop frps
查看状态:
systemctl status frps
2.客户端:
vi /lib/systemd/system/frpc.service
对frpc操作命令同服务端相同。
开始配置内网穿透,分为四个部分,服务端的nginx和frp,客户端的nginx和frp,下面按照从用户访问到web服务的流程顺序把配置贴出来,方便粘贴调整。
服务端nginx配置如下:
服务端frp配置如下:
客户端nginx配置如下:
客户端frp配置如下:
浏览器输入:http://xxx.yyy.com
由于时间原因下面一些重要的功能配置还没有验证,这里给出一些思路,方便后续抽出时间验证测试。
1.服务本身的密码安全性,例如如果远程桌面,那么选一个长密码是不可忽略的,还可以设定不使用密码只使用私钥登录。远程桌面那种可以用长密码登录。为了安全,也可以专门建立一个权限小的帐号用于远程登录,把管理员帐号远程登录权限禁止掉;
2.不要在内网机器本机上运行frp,例如内网有A、B两台机器,互相可以访问,如果重要机器是A,那么可以把FRP放在不重要的机器B上面,在FRP的local_ip那边设置为A地址即可。这样做的好处是可以在服务中认定B机器地址来的访问为外部访问,专门设置安全措施。反过来,如果直接放在A上,那么所有frp过来的操作都会被本地服务认定为A机器本身发起的,某些数据库软件直接就给127.0.0.1的本地IP管理员特权;
3.多做时间审查。SSH登录是有记录的。偶尔查看一下SSH的成功和失败登录记录。至少可以看看近期有没有人对你的服务器感兴趣。
用一个frps连接多个frpc,原理上多个frpc和frps绑定同一个端口,但是多个frpc用不同的remote_port连接。
第一个frpc.ini配置:
第二个frpc.ini配置:
两台机器都绑定的7000端口,但是远程连接的端口不同
第一台机器连接
ssh [email protected] -p 6000
第二台机器连接
ssh [email protected] -p 6001
默认情况下,当用户请求建立连接后,frps 才会请求 frpc 主动与后端服务建立一个连接。当为指定的代理启用连接池后,frp 会预先和后端服务建立起指定数量的连接,每次接收到用户请求后,会从连接池中取出一个连接和用户连接关联起来,避免了等待与后端服务建立连接以及 frpc 和 frps 之间传递控制信息的时间。这一功能比较适合有大量短连接请求时开启。
首先可以在frps.ini中设置每个代理可以创建的连接池上限,避免大量资源占用,客户端设置超过此配置后会被调整到当前值:
在frpc.ini中为客户端启用连接池,指定预创建连接的数量:
网络的本地本来是应该互联互通的,但各种各样的原因会导致互联互不通。于是就需要造轮子解决它,frp就是这样一个轮子,开源、免费、简单易用。下面说说自己的收获。
在学习了frp的知识后,明白想要访问局域网中的web服务不是只能通过等工具才行,使用frp做内网穿透同样可以。frp支持tcp、udp、http、https等协议类型,这些足够我们日常工作使用。使用frp工具有以下优势:
1.利用处于内网或防火墙后的机器,对外网环境提供HTTP或HTTPS服务;
2.对于http, https服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口;
3.利用处于内网或防火墙后的机器,对外网环境提供tcp和udp服务,例如在家里通过ssh访问处于公司内网环境内的主机。
通过对frp的学习和扩展资料的了解,我学到了很多之前没有接触过的知识与技术。比如frp是什么,它是通过什么方式使frp内外服务器的连接访问,子域名的使用方法,此外还使用frp技术对nginx的配置加深了印象。使我在技术池中又开辟了一块新空间。
最开始领导交代要使用frp内网穿透时,感觉没什么难度,就是服务端和客户端各安装一个frp软件,上网找找配置文档。但实际对于没有接触过内网穿透的人来说,还是有些困难的,有点会者不难的感觉。经过多方面了解后,终于实现了内网穿透,再回头看看其实还是比较简单的。
对于新软件的学习,我一直停留在实现功能的层面上,没有多往深处探索。通过领导的提示,使我认识到自己的不足。后续工作空闲时,会抽时间研究frp的扩展功能,比如安全、多客户端接入、压测等方面。一方面可以让我对于frp深入了解,另一方面也促使我发散思维,全面思考。