FRP内网穿透一站式配置
场景1:我有一台配置很差的服务器,也有一台放在公司可以一直开机的电脑,我想跑一个springboot项目。
场景2:我要做微信开发,我必须要有一个公网可以访问的域名。
针对这两种场景,要怎么做呢?当然是使用内网穿透,而市面上好的内网穿透工具收费,免费的每次建立的域名都是随机的,那能不能自己搭一个内网穿透服务呢?当然可以!
一、FRP安装
frp是一款开源的内网穿透软件,可以在GitHub上找到:https://github.com/fatedier/frp。
readme中有中文文档的链接,在release中可以看到最新的版本0.29.0
。其中我需要的是Linux版本的、Windows版本的和Mac版本的,目前我们的电脑大部分都是64位的了,我选择下载的分别是以下几个文件:
1、Linux服务端安装
我的服务器是CentOS 7,可以直接通过命令下载,也省去了文件上传的步骤:
1 | wget https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gz |
解压文件:
1 | tar -zxvf frp_0.29.0_linux_amd64.tar.gz |
删除我们不需要的客户端文件:
1 | cd frp_0.29.0_linux_amd64 |
打开服务端配置文件:
1 | vim frps.ini |
将文件内容换为下面的:
1 | [common] |
端口号均采用默认值即可,上面字段的含义如下:
名称 | 含义 |
---|---|
bind_port | 服务端口号 |
token | 客户端服务器之间的密钥 |
dashboard_port | frp仪表盘端口号 |
dashboard_user | admin |
dashboard_pwd | 仪表盘密码 |
vhost_http_port | web服务代理端口号 |
按下esc
键进入命令模式,保存并退出当前文件:
1 | :wq |
然后运行服务端:
1 | ./frps -c frps.ini |
此时访问服务端x.x.x.x:7500即可访问FRP仪表盘。
这张截图是配置过Nginx重定向之后的仪表盘页面
2、Linux服务端后台运行FRP
在上一节中我们成功运行了FRP,但我们按Ctrl+C退出或关闭SSH窗口后,FRP均会停止运行,此时我们需要使用nohup将其运行在后台。
1 | nohup ./frps -c frps.ini & |
Ctrl+C关闭nohup并查看后台中是否有FRP:
1 | jobs |
3、Windows及Mac安装客户端
Windows和Mac就需要手动下载了,对于用浏览器下载GitHub文件的下载速度真的不敢苟同,不过Windows上可以用freedownloader下载,Mac上用aria2下载,相比之下速度真的很感人了。
将下载后的文件解压,并删除服务端的文件。
然后对frpc.ini
进行如下配置:
1 | [common] |
最主要的就是common的配置和web的配置了,根据我的观察,这个文件是根据[xxx]来划分范围的,如果要开启多个不同的映射,多声明几个不同名字的[xx]模块就行。
因为我是在Mac上测试的,nginx的默认端口就是8080,然后修改nginx的欢迎页为this is Redirect Page以示和服务器上的默认页面的不同。
命令行输入.\frpc -c frpc.ini
即可与服务端连通,访问刚刚配置的web.frp.aqzscn.com即可访问到我们本地的欢迎页了。
这张截图是映射到Windows上运行的Restful服务的页面。
4、功能点补充
上面的两张截图中,域名后面均没有加端口号,这是因为我在服务端配置了nginx转发的缘故。
首先我希望我的域名frp.aqzscn.com
作为我的frp仪表盘页面,而*.frp.aqzscn.com
则是客户端配置的各种映射地址,那么我需要先去域名服务提供商那里修改我的dns配置,增加两条A记录,或者索性配置一条A记录*.aqzscn.com
转发到服务器的80端口,然后所有转发就可以放在服务器的nginx上了。
下面贴出我的nginx配置供大家参考:
1 | server { |
其中用server_name来匹配对应的域名,proxy_set_header
来保证请求的头信息和原始的头信息是一致的。
二级域名配置
上面只是实现了简单的一个域名的映射,如需映射多个域名,就需要配置二级域名了。
配置服务端:
1 | vi frp_0.29.0_linux_amd64/frps.ini |
1 | subdomain_host = frp.aqzscn.com |
重启FRP服务:
1 | # 一般来说,可以通过jobs列出当前会话中的进程,然后kill %【序号】,但我是新建立的ssh连接,所以只能通过第二种方式了。 |
配置客户端:
1 | [mweb] |
然后启动客户端,并访问我们配置的地址:http://test.frp.aqzscn.com/
可以明显地看到这是我们本地的网页。