前言

最近开始玩儿服务器了,从最开始的阿里云轻量级服务器到现在的腾讯云轻量级服务器,从最开始的2核1G升级到后面的2核4G,对性能的需求越来越高。

要是一直这样砸钱升配置也太难受了,为了解决这个痛点,在百度上了解到了内网穿透这个技术,具体的实现我也不懂,咱们用别人的工具就行了,站在巨人的肩膀上嘛。

如果你想跟着本篇文章搭建内网穿透并能在公网访问,请确保你具备以下条件:

  • 一台带有公网IP的服务器
  • 一台Windows系统的电脑(PS,其他系统的也行,配置是差不多的)
  • 能够使用的域名(PS:如果服务器是国内的,则域名需要备案)

Frp

是什么

Frp是一种用于网络穿透的工具。”Frp”代表”Fast Reverse Proxy”,它允许用户通过在内部网络中设置一个服务器,访问位于防火墙后面或者在NAT网络中的设备。

简单来说,它可以帮助用户从外部网络访问内部网络中的服务或设备,同时绕过网络配置方面的限制。

Frp可以用于远程访问、内网穿透、端口转发等场景,提供了一种简单、安全和灵活的方式来管理和访问网络设备和服务。(PS:ChatGPT说的)

内网穿透的工具有很多,也有一些免费的内网穿透服务,你不需要自己配置服务端,用别人的就行了,但是追求稳定,还是自己搭比较好。

根据我个人的使用体验,感觉Frp使用起来有点儿像微服务的注册中心,你需要穿透的内容就是一个服务,每个服务有不同的协议,例如:httptcpudp,这是最常用的三个。

传输层与应用层协议同时出现,应该是为了更好地管理应用层的协议,不太懂,反正你需要将它们注册到Frp的服务端。

优缺点

  • 解决高性能服务器需求,节约服务器成本,运算交给本地机器处理。

  • 云服务器只负责数据传输,服务器性能瓶颈在于带宽的大小。

  • 延迟翻一倍,如果搭建竞技游戏服务器不友好,例如我本地机器访问云服务器的延迟是40ms,那么穿透后的延迟即为80ms,根据实际情况会更高。

如何下载

Frp官方下载地址,需要下载系统对应的压缩包,下载最新的版本也是可以的,我这里下载的版本是0.51.1

Windows X86_64下载frp_x.x.x_windwos_amd64.zipLinux X86_64下载frp_x.x.x_linux_amd64.tar.gz

image-20230808095357365

如何安装

下面我将Frp的服务端类比为Java开发中微服务的注册中心,你需要穿透的内容类比为服务,例如:我的世界服务器、博客网站。

Frp的压缩包是包含服务端与客户端的,服务端即frps,客户端即frpc,你可以将不需要的那端删除,也可以保留它们。

服务端

首先需要开放对应的端口

我这里开放了7000:tcp/udp10000:tcp7500:tcp27010-27020:udp25560-25570:tcp,解释如下:

1
2
3
4
5
7000:tcp/udp	# 服务注册的端口,我这里开放了tcp协议与udp协议,应该是只用开放tcp
10000:tcp # Http服务的端口,可以想象成Nginx代理的那个端口,它会监测你的域名,然后转发到对应的服务
7500:tcp # 注册中心面板的端口,参考阿里云的Nacos
27010-27020:udp # udp协议应用端口,你看着来,这里是我的应用
25560-25570:tcp # tcp协议应用的端口,(同上)

将tar.gz包解压在软件目录,我这里解压在了/opt,进入/opt/frp_x.x.x_linux_amd64目录,编辑frps.ini,内容如下(使用时可能需要删除注释):

1
2
3
4
5
6
7
8
9
10
11
[common]
bind_port = 7000 # frp注册端口
vhost_http_port = 10000 # http服务端口
dashboard_port = 7500 # 面板端口
dashboard_user = admin # 面板用户名
dashboard_pwd = admin # 面板密码
max_pool_count = 10
log_file = /opt/frp_0.51.1_linux_amd64 # 日志存放的位置
log_level = info # 日志记录级别
log_max_days = 3 # 日志最大保存时间
token = token # 连接令牌,需要与Frp客户端一致

以服务的形式挂后台,非必须,但是每次你系统都需要手动执行/home/frp_0.27.0_linux_amd64/frps -c /home/frp_0.27.0_linux_amd64/frps.ini命令。

在目录 /etc/systemd/system 下新建文件名为 frps.service 的文件,编辑内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/home/frp_0.27.0_linux_amd64/frps -c /home/frp_0.27.0_linux_amd64/frps.ini

[Install]
WantedBy=multi-user.target

(PS: ExecStart = frps所在的目录/frps -c frps.ini所在的目录/frps.ini

frps.service文件创建成功后,服务的管理指令如下:

1
2
3
4
systemctl enable frps #设置开机启动
systemctl start frps #启动
systemctl stop frps #停止
systemctl status frps #状态

输入sudo systemctl start frps启动服务,并使用systemctl status frps查看服务运行状态,输入如下表示启动成功:

image-20230808103236295

客户端

在配置客户端之前请确保你的服务端的配置文件是按照上面的模板配置的,否则我也不知道会出现什么问题。

将zip文件解压到你的软件目录下,进入解压后的目录,找到frpc.ini文件,编辑内容如下(PS:使用时记得要删除注释,反正我的电脑得删):

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
35
[common]
server_addr = x.x.x.x # 服务器ip地址,也可以为域名
server_port = 7000 # frp注册端口,与服务端配置对应
token = token # 连接令牌,需要与Frp服务端一致

[test]
type = http # 服务类型
local_ip = 127.0.0.1 # 本地服务主机的ip(PS:只要是你本机局域网能访问的IP都行,例如192.168.114.129,虚拟机也是可以的)
local_port = 3000 # 本地http服务的端口
custom_domains = test.frp.xxx.xxx # 穿透后的http访问域名,例:test.frp.baidu.com

[NAIFU]
type = http
local_ip = 127.0.0.1
local_port = 6969
custom_domains = naifu.frp.xxx.xxx

[mc-classmate-1]
type = tcp
local_ip = 127.0.0.1
local_port = 25560 # 本地服务端口
remote_port = 25560 # 服务端端口

[mc-classmate-2]
type = tcp
local_ip = 127.0.0.1
local_port = 25561
remote_port = 25561

# 穿透我的求生之路服务器
[l4d2-1]
type = udp
local_ip = 192.168.114.135
local_port = 27015
remote_port = 27015

除了[common],其他的方括号你可以类比为服务名(反正我是这么想象的),方括号节点下的内容就是该服务的配置了,http服务有点儿特殊,需要绑定域名,绑定域名需要于本篇文章后面的域名配置配合使用。

当然,我的三级域名名字与应用名称相同只是为了好区分,你也可以不一样,上面的配置文件表示配置了两个http服务,两个tcp服务与一个udp服务, 其中tcp服务与udp服务的配置相似。

如果你一直按照本篇文章的步骤执行,请务必进行域名配置

需要开放对应的端口,例如udp服务中使用了远程的27015端口,那么你需要开放服务器的27015端口,并确保你本地的服务已经启动。

域名配置

Frp穿透Http的服务有些特殊,需要配置域名,如果你是按照本文配置的Frp服务端与客户端,那么配合接下来的域名配置,会特别方便,并且访问服务时不需要指定端口。

域名解析

需要创建两个解析,即frp*.frp,其中frp指向服务器IP,*.frp指向frp.xxx.xxx

这里我将frp.xxx.xxx作为我的注册中心面板访问域名,*.frp.xxx.xxx作为http穿透服务的域名。

image-20230802160300847

Nginx代理

当然,配置了域名还是需要带端口使用,为了不带端口使用,需要用到Nginx的反向代理,因为服务器使用了宝塔面板,这里就一键安装了。

在Nginx主配置文件的根节点下添加以下指令,解析自定义的代理规则:

1
include /www/server/nginx/conf/product/*.conf;

/www/server/nginx/conf/product/目录下创建frp.conf文件,并写入以下内容:

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
# frp面板
server {
listen 80;
# 填写你的二级解析域名
server_name frp.xxx.xxx;

location / {
proxy_pass http://127.0.0.1:7500/;
index index.html index.htm;
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
access_log /www/wwwlogs/nginx/product/frp.log;
}
# frp-http
server {
listen 80;
# 填写你的三级泛解析
server_name *.frp.xxx.xxx;

location / {
proxy_pass http://127.0.0.1:10000/;
index index.html index.htm;
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
access_log /www/wwwlogs/nginx/product/test.log;
}

配置完成后,确保你的Frp服务端与客户端都在运行,本地服务也启动成功。

随后重载Nginx配置,访问你在客户端的frpc.ini文件中配置的custom_domains下的域名,看是否穿透成功。

后语

本篇博文用于记录Frp的配置步骤,防止遗忘,方便后续换机能够快速搭建。根据个人习惯对其他博主的配置步骤进行了整合。

如果博主的理解有误,可以在评论区指出,相互学习!

参考文档

Frp文档

云服务器搭建Frp服务(超详细)

配置域名访问及Nginx(命令/宝塔)

【FRP】Frp内网穿透 + Nginx域名无端口访问(一)