公司内网服务器有演示环境,同时技术人员出差需要在客户现场进行演示,于是学习使用frp做的内网穿透。frp是用Go语言开发的,可用于内网穿透的高性能反向代理应用,支持tcp、udp、http和https。可将一个部署在本机的web服务映射到外网。

本文主要讲如何基于frp + nginx 配置http 内网穿透服务,承载多人同时使用。通过frp的运行原理入手,介绍frp服务端和客户端配置说明及后续延展功能。

1整体概述

frp是一个内网穿透工具,它可以让本地局域网的机器暴露到公网,简单的说就是在世界的任何地方,你都可以访问家里开着的电脑。frp支持tcp、udp、http、https,就是说不仅仅限于本地web服务器可以暴露,整台机器都可以暴露,windows的远程控制,mac和linux的ssh都可以被暴露。

1.1名称解释

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.2原理说明 

云服务器frp内网穿透配置说明_云服务器

框图说明: 

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.3适用场景 

1.在办公室访问家里的电脑,反之亦然; 

2.自己电脑上的项目,方便发给客户朋友演示。比如我做了个小网站,发给朋友看看未上线版本,发个url给他就好了; 

3.调试一些需要远程调用的程序,远程调用比如微信的API 回调接口。因为我有外网地址就不需要部署在公网服务器,直接进行本地调试。 

2安装准备 

可以根据需求下载对应的文件版本,推荐使用Windows_amd64和Linux_amd64版本,具体还需要根据机子情况。 

下载链接:​https://github.com/fatedier/frp/releases ​

2.1资源介绍 

frp主要由客户端(frpc)和服务端(frps)组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在机器上。 

在客户端使用的都是frpc*名的文件,在服务端使用的都是frps*名的文件。 

云服务器frp内网穿透配置说明_frp_02

2.2部署规划 

nginx部署路径: 

/usr/local/nginx-1.14 

frp部署路径: 

/opt/tools/frp_0.37.1_linux_amd64 

1.公网服务器: 

云服务器frp内网穿透配置说明_云服务器frp_03

2.内网服务器: 

云服务器frp内网穿透配置说明_frp内网穿透_04

2.3开机自启 

使用systemctl来控制启动,这个方法比较好用,很方便。注意服务端是frps.service,客户端是frpc.service。 

1.服务端: 

vi /lib/systemd/system/frps.service 

在frps.service里写入以下内容: 

云服务器frp内网穿透配置说明_frp内网穿透_05

启动frps: 

systemctl start frps 

重启frps: 

systemctl restart frps 

停止frps: 

systemctl stop frps 

查看状态: 

systemctl status frps 

2.客户端: 

vi /lib/systemd/system/frpc.service 

对frpc操作命令同服务端相同。 

3配置步骤 

开始配置内网穿透,分为四个部分,服务端的nginx和frp,客户端的nginx和frp,下面按照从用户访问到web服务的流程顺序把配置贴出来,方便粘贴调整。 

3.1服务端nginx 

服务端nginx配置如下: 

云服务器frp内网穿透配置说明_云服务器frp_06

云服务器frp内网穿透配置说明_frp_07

云服务器frp内网穿透配置说明_frp_08

3.2服务端配置 

服务端frp配置如下: 

云服务器frp内网穿透配置说明_frp_09

云服务器frp内网穿透配置说明_frp内网穿透_10

  

3.3客户端nginx 

客户端nginx配置如下: 

云服务器frp内网穿透配置说明_客户端_11

云服务器frp内网穿透配置说明_云服务器_12

云服务器frp内网穿透配置说明_客户端_13

云服务器frp内网穿透配置说明_frp内网穿透_14

云服务器frp内网穿透配置说明_客户端_15

云服务器frp内网穿透配置说明_frp_16

云服务器frp内网穿透配置说明_frp内网穿透_17

云服务器frp内网穿透配置说明_frp_18

3.4客户端配置 

客户端frp配置如下: 

云服务器frp内网穿透配置说明_云服务器_19

云服务器frp内网穿透配置说明_云服务器frp_20

3.5访问效果 

浏览器输入:http://xxx.yyy.com 

云服务器frp内网穿透配置说明_frp内网穿透_21

4扩充延展 

由于时间原因下面一些重要的功能配置还没有验证,这里给出一些思路,方便后续抽出时间验证测试。 

4.1安全策略 

1.服务本身的密码安全性,例如如果远程桌面,那么选一个长密码是不可忽略的,还可以设定不使用密码只使用私钥登录。远程桌面那种可以用长密码登录。为了安全,也可以专门建立一个权限小的帐号用于远程登录,把管理员帐号远程登录权限禁止掉; 

2.不要在内网机器本机上运行frp,例如内网有A、B两台机器,互相可以访问,如果重要机器是A,那么可以把FRP放在不重要的机器B上面,在FRP的local_ip那边设置为A地址即可。这样做的好处是可以在服务中认定B机器地址来的访问为外部访问,专门设置安全措施。反过来,如果直接放在A上,那么所有frp过来的操作都会被本地服务认定为A机器本身发起的,某些数据库软件直接就给127.0.0.1的本地IP管理员特权; 

3.多做时间审查。SSH登录是有记录的。偶尔查看一下SSH的成功和失败登录记录。至少可以看看近期有没有人对你的服务器感兴趣。 

4.2多客户端 

用一个frps连接多个frpc,原理上多个frpc和frps绑定同一个端口,但是多个frpc用不同的remote_port连接。 

第一个frpc.ini配置: 

云服务器frp内网穿透配置说明_frp内网穿透_22

第二个frpc.ini配置: 

云服务器frp内网穿透配置说明_frp内网穿透_23

两台机器都绑定的7000端口,但是远程连接的端口不同 

第一台机器连接 

ssh pi@49.223.83.111 -p 6000 

第二台机器连接 

ssh pi@49.223.83.111 -p 6001 

4.3线程配置 

默认情况下,当用户请求建立连接后,frps 才会请求 frpc 主动与后端服务建立一个连接。当为指定的代理启用连接池后,frp 会预先和后端服务建立起指定数量的连接,每次接收到用户请求后,会从连接池中取出一个连接和用户连接关联起来,避免了等待与后端服务建立连接以及 frpc 和 frps 之间传递控制信息的时间。这一功能比较适合有大量短连接请求时开启。 

首先可以在frps.ini中设置每个代理可以创建的连接池上限,避免大量资源占用,客户端设置超过此配置后会被调整到当前值: 

云服务器frp内网穿透配置说明_云服务器_24

在frpc.ini中为客户端启用连接池,指定预创建连接的数量: 

云服务器frp内网穿透配置说明_frp_25

5配置心得 

网络的本地本来是应该互联互通的,但各种各样的原因会导致互联互不通。于是就需要造轮子解决它,frp就是这样一个轮子,开源、免费、简单易用。下面说说自己的收获。 

5.1知识收获 

在学习了frp的知识后,明白想要访问局域网中的web服务不是只能通过vpn等工具才行,使用frp做内网穿透同样可以。frp支持tcp、udp、http、https等协议类型,这些足够我们日常工作使用。使用frp工具有以下优势: 

1.利用处于内网或防火墙后的机器,对外网环境提供HTTP或HTTPS服务; 

2.对于http, https服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口; 

3.利用处于内网或防火墙后的机器,对外网环境提供tcp和udp服务,例如在家里通过ssh访问处于公司内网环境内的主机。 

5.2技能提升 

通过对frp的学习和扩展资料的了解,我学到了很多之前没有接触过的知识与技术。比如frp是什么,它是通过什么方式使frp内外服务器的连接访问,子域名的使用方法,此外还使用frp技术对nginx的配置加深了印象。使我在技术池中又开辟了一块新空间。 

5.3心得总结 

最开始领导交代要使用frp内网穿透时,感觉没什么难度,就是服务端和客户端各安装一个frp软件,上网找找配置文档。但实际对于没有接触过内网穿透的人来说,还是有些困难的,有点会者不难的感觉。经过多方面了解后,终于实现了内网穿透,再回头看看其实还是比较简单的。 

对于新软件的学习,我一直停留在实现功能的层面上,没有多往深处探索。通过领导的提示,使我认识到自己的不足。后续工作空闲时,会抽时间研究frp的扩展功能,比如安全、多客户端接入、压测等方面。一方面可以让我对于frp深入了解,另一方面也促使我发散思维,全面思考。