FRP内网穿透一站式配置

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
2
3
4
cd frp_0.29.0_linux_amd64
ls -a
rm frpc
rm frpc.ini

打开服务端配置文件:

1
vim frps.ini

将文件内容换为下面的:

1
2
3
4
5
6
7
[common]
bind_port = 7000
dashboard_port = 7500
token = bobozuihao
dashboard_user = admin
dashboard_pwd = bobozuihao
vhost_http_port = 8080

端口号均采用默认值即可,上面字段的含义如下:

名称 含义
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
2
3
jobs
# 下面是显示结果
[1]+ Running nohup ./frps -c frps.ini &

3、Windows及Mac安装客户端

Windows和Mac就需要手动下载了,对于用浏览器下载GitHub文件的下载速度真的不敢苟同,不过Windows上可以用freedownloader下载,Mac上用aria2下载,相比之下速度真的很感人了。

将下载后的文件解压,并删除服务端的文件。

然后对frpc.ini进行如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[common]
server_addr = 66.42.62.8
server_port = 7000
token = bobozuihao

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

[web]
type = http
local_port = 8080
custom_domains = web.frp.aqzscn.com

最主要的就是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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
server {
listen 80;
server_name 127.0.0.1 aqzscn.com www.aqzscn.com;

location / {
root /usr/share/nginx/html;
index index.html index.htm;
}

}

server {
listen 80;
server_name frp.aqzscn.com;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:7500/;
}
}

server {
listen 80;
server_name *.frp.aqzscn.com;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080/;
}
}

其中用server_name来匹配对应的域名,proxy_set_header 来保证请求的头信息和原始的头信息是一致的。

二级域名配置

上面只是实现了简单的一个域名的映射,如需映射多个域名,就需要配置二级域名了。

配置服务端:

1
vi frp_0.29.0_linux_amd64/frps.ini
1
subdomain_host = frp.aqzscn.com

重启FRP服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 一般来说,可以通过jobs列出当前会话中的进程,然后kill %【序号】,但我是新建立的ssh连接,所以只能通过第二种方式了。

# 列出与frps有关的进程
ps -aux|grep frps
# root 7415 0.0 2.5 114076 25248 ? Sl Sep19 0:06 ./frps -c frps.ini
# root 28113 0.0 0.2 112724 2240 pts/0 S+ 13:34 0:00 grep --color=auto frps

# 然后杀掉对应的进程号
kill 7415
kill 28113
# -bash: kill: (28113) - No such process

# 用nohup启动frps
nohup ./frps -c frps.ini &

配置客户端:

1
2
3
4
5
[mweb]
type = http
local_port = 8080
subdomain = test
;这是ini文件的注释,我们可以在一个配置文件中配置多个web服务的重定向,并通过注释来关闭和开启对应的映射。

然后启动客户端,并访问我们配置的地址:http://test.frp.aqzscn.com/

可以明显地看到这是我们本地的网页。

Godbobo wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!