写在前面
前言
(此部分对全文而言并不重要,可以跳过)
曾经的我呢,可是纯正的技术类博主呢
不知为何,居然转行到生活类博主了…
所以,今天我重操旧业啦(笑)
本文与其说是一篇搭frp的教程文章吧,更像是一篇我的踩坑历程。当然它的本质还是教程文章啦
小惊喜
我用的是宝塔面板,直到最后我才知到它有个插件叫frp管理器…可以一键部署frp……
所以,如果你也用宝塔面板,完全没有必要耗费脑细胞折腾,装个插件就over了
了解一些小常识
(个人理解,语言可能比较接地气,见谅)
内网穿透啊,就是你的计算机没有公网(仅在一个内网环境中),通过有公网的frp服务器进行流量转发,让内网中计算机的流量转发到公网。(但是在公网访问的是frp服务器而非内网的计算机)
至于frp嘛,它是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议。
它分为服务端frps,即放在公网服务器的一端;以及客户端frpc,即放在内网里边的。
frp工作原理(一般用不到,看看即可):
1.服务端运行,监听一个主端口,等待客户端的连接;
2.客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;
3.服务端fork新的进程监听客户端指定的端口;
4.外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端;
5.客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。
开始前的准备
- 一台有公网的服务器
- 一个电脑
- 一个已经备案的域名(国外服务器不用备案也行)
- 一个敢于不怕失败而折腾的大脑
先上GitHub把最新的frp下载下来。
https://github.com/fatedier/frp/releases
注意:把你服务端(服务器)的版本和客户端的都下载下来
(比如我用Centos,即linux,和Windows)
(防止某些人上不了GitHub,我把它们放到这里了:
然后用电脑把它俩解压,留着别删了
捣腾服务器
给你的域名解析个二级域名,这个域名就是frp转发的域名(记得挂ssl)
在服务器的网站根目录把你上上一步解压的压缩包(与服务器系统对应的那个)传过去。
然后新建一个配置文件,frps.ini
这个配置文件内至少包含以下内容:
[common]
bind_port = 7000
vhost_http_port = 8080
vhost_https_port = 8443
bind_port
:指定 FRP 服务端监听的端口,客户端将通过该端口与服务端进行连接。这里设置为7000
。vhost_http_port
:指定用于 HTTP 虚拟主机的端口。通过 FRP 的 HTTP 类型隧道,客户端请求将被转发到该端口。这里设置为8080
。vhost_https_port
:指定用于 HTTPS 虚拟主机的端口。通过 FRP 的 HTTPS 类型隧道,客户端请求将被转发到该端口。这里设置为8443
。
当然,也可以增加其他参数:
[common]
# frp服务端口
bind_port = 7000
# 用户连接时的url端口
vhost_http_port = 10000
vhost_https_port = 10000
# 主域名 通过此域名连接(也可用公网IP)
subdomain_host = test.com
# 控制台端口(通过此端口可进入后台查看frp状态)
dashboard_port = 7500
# 控制台账户
dashboard_user = admin
# 控制台密码
dashboard_pwd = admin123
max_pool_count = 10
# 日志文件位置及名字
log_file = ./frps.log
# 日志级别
log_level = info
# 日志最多记录天数
log_max_days = 3
# token 客户端token需要与此一致(类似密码,客户端配置文件也必须要token)
# token可以有效防止其他人连接服务器
token = testtoken
[web01]
# 如果值为http,则必须设置 vhost_http_port
type = http
# 如果代理类型等于http,则必须设置自定义_域,并用逗号分隔
# 例:custom_domains = web01.yourdomain.com,web01.yourdomain2.com
custom_domains = test.com
然后打开终端,cd到frps目录,运行以下指令:
./frps -c ./frps.ini
然后就运行成功了。
需要注意的是:关闭终端后,frps服务端也随之关闭。后文会提到挂后台运行的方法。
捣腾客户端
打开第一步解压的frpc客户端文件夹
同理,新建一个frpc.ini
的配置文件
其中至少包括以下内容:
[common]
server_addr = frp服务器ip或域名,最好是ip(IP 地址更稳定和直接。)
server_port = 服务端frps.ini的bind_port
[web]
type = 类型,https或http等
local_port = 本地要映射的端口(本地服务运行的端口,比如 Flask 或其他 Web 服务的端口。)
custom_domains = frp的二级域名,例如frp.loneapex.cn,而非主域名
注:custom_domains的域名需要正确解析到frp服务器上,否则可能无法访问。
其中的type要说的话有点复杂,让chatgpt讲一下:
客户端配置文件中的 type 类型决定了客户端将如何处理传入的流量,而不是取决于服务端的二级域名的协议。
- FRP 客户端配置类型 (
type
):type
字段指定了客户端将如何处理传入的流量。常见的类型有:tcp
: 用于TCP流量的穿透,适用于非HTTP/HTTPS的应用程序。http
: 用于HTTP流量的穿透,适用于Web应用程序。https
: 用于HTTPS流量的穿透,支持加密传输。- 其他类型可以用于不同的协议和场景,如UDP等。
- 服务端的二级域名与客户端配置的关系:
- 服务端的二级域名(如
frp.loneapex.cn
)主要决定了请求到达FRP服务器后如何转发到内部网络或服务。 - 客户端的配置文件中的
custom_domains
字段用于指定需要穿透的域名,但不直接决定协议类型。
- 服务端的二级域名(如
- 协议与端口的匹配:
- 协议类型(如
http
、https
)和端口(如80
、443
)通常是服务端和客户端在配置时约定好的。客户端会监听本地的一个端口(如8080
),而服务端则会根据请求的协议和域名进行转发到相应的端口上。
- 协议类型(如
上边说了这么多,就是:
tcp
: 用于一般 TCP 流量,例如 SSH。http
和 https
: 用于 Web 流量,分别对应 HTTP 和 HTTPS 协议。
注:可以有多个类似[web]的区块,如[web1] [web2]
然后把客户端要映射的程序给打开【一定要先打开再启动frp客户端!】
【待映射端口一定要和配置文件一致!!】
然后依旧用终端cd到文件目录,运行
./frpc -c ./frpc.ini
如果不出意外(配置文件两端吻合且没错的话),则
连接成功
(为了方便把它塞到一个bat文件吧)
frpc -c frpc.ini
pause
服务器折腾
本来就此结束,访问frp.loneapex.cn(frp的二级域名,后边不用加端口),理论上可以访问,但是吧
哦,对哦,还要配置nginx呢(反向代理)
由于我用宝塔,它自己即可完成,各位大佬们可以搜搜frp Nginx配置(挺多的)
然后,理论上来说,你的frp服务器就搭好了。
后台挂frp服务端。
(本部分搬自云服务器搭建frp服务(超详细) – 散人长情 – 博客园 (cnblogs.com))
以 Linux 为例,在目录 /etc/systemd/system
下新建文件名为 frps.service 的文件(Windows参考百度)
说明: ExecStart = {frps.exe所在的目录}/frps -c {frps.ini所在的目录}/frps.ini
(比如ExecStart=/home/frp_0.27.0_linux_amd64/frps -c /home/frp_0.27.0_linux_amd64/frps.ini)
内容如下:
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple U
ser=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
文件新建好后用以下命令控制(Linux的客户端也是此命令,把 frps 改成 frpc 即可):
systemctl enable frps #设置开机启动
systemctl start frps #启动
systemctl stop frps #停止
systemctl status frps #状态
終わり
本文到此就结束了
啊,好累,好久没写技术类文章以至于有种违和感了。
不过嘛,技术类文章虽说写一篇得一两个小时(加上各种调试得半天呢),但是不需要任何情感输出;相反,生活类文章(比如随笔、杂谈)则需要自己的主观感受,把自己的真实想法写出来,这种感觉对我来说是这样的——当我在写作的时候,各种思绪喷涌而来,写完后才发现论点们居然毫无关联、驴唇不对马嘴,成了一篇“狗皮膏药”似的随笔(笑),这之后又发现自己提出的观点好低级、好无聊、好没用,发现自己挺废物的www
所以呢,久违的写篇技术文也挺不错的嘛。