一:frp简介
frp 是什么?
frp 采用 Golang 编写,支持跨平台,仅需下载对应平台的二进制文件即可执行,没有额外依赖。
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
市面上一些主流的内网穿透工具有:Ngrok,Natapp,花生壳,Ssh、autossh,Frp,Lanproxy,Spike。
这里介绍使用frp工具。
二:安装frp
1:准备
一台公网服务器(配置无要求网络稳定就行),服务器端,如公网IP:123.32.12.32。
内网客户端(准备要穿透出去的设备),客户端,如内网IP:192.168.152.103。
2:下载解压安装包
gitlab地址:https://github.com/fatedier/frp,可以在 Release 页面中下载到最新版本的客户端和服务端二进制文件,所有文件被打包在一个压缩包中。
找到自己Linux合适的版本,下载,主流Linux版本基本上都是amd64。
#下载
wget https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_amd64.tar.gz
#解压
tar -zxvf frp_0.44.0_linux_amd64.tar.gz
#进入目录
cd frp_0.44.0_linux_amd64/
进入文件夹,有两个名称文件frpc(c结尾代表client)和frps(s结尾代表server),分别是服务端程序和服务端配置程序。
需要将frpc拷贝至客户端,即内网服务器,或者在客户端直接下载也可以,客户端只需要使用frpc文件即可。
root@ubuntu:~/frp_0.44.0_linux_amd64# ls
frpc frpc_full.ini frpc.ini frps frps_full.ini frps.ini LICENSE
三:配置服务器端和客户端,及启动
1:配置服务器端
这里是为服务端配置frp 只关注frps和frps.ini即可,原始最简单配置为。
cat frps.ini
[common]
#隧道通道,服务器和客户端通过此端口通讯
bind_port = 7000
最简单也可以直接使用,先不配置其他测试使用先。
2:配置客户端
只关注frpc和frpc.ini即可,修改frpc.ini。
vim frpc.ini
原始配置已经有ssh的端口配置,所以修改server_addr为服务器IP即可。
[common]
server_addr = 123.32.12.32
server_port = 7000
[ssh]
type = tcp
#本机IP
local_ip = 127.0.0.1
#本机需要映射的端口22
local_port = 22
#远程服务器映射的端口为60022
remote_port = 60022
3:分别启动服务器端和客户端
注:服务器,如有防火墙,请开启7000端口和有需要的端口。
服务器运行启动:
./frps -c frps.ini
客户端运行启动:
./frpc -c frpc.ini
可以看到提示,都已经启动成功
测试ssh连接,这里用第三方工具xshell测试。
连接IP 为公网IP地址,端口为60022端口。
连接登录,即可登录到内网的192.168.152.103机器。
最简单的ssh端口映射就完成了。
四:升级配置
原始配置简单,但是如果需要其他功能,可自行添加,如下:
1:服务器端配置
vim frps.ini
修改如下
[common]
bind_port = 7000
#http服务端口
vhost_http_port = 8088
#https服务端口
vhost_https_port = 8443
# dashboard网页管理界面,以及设置账户密码(非必须,未配置则直接进入)
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
#客户端需要设置一样的token值才能鉴权通过
token = 12345678
2:客户端配置
vim frpc.ini
修改如下:
[common]
server_addr = 123.32.12.32
server_port = 7000
#token和服务器一致
token = 12345678
[ssh]
type = tcp
#本机IP
local_ip = 127.0.0.1
#本机需要映射的端口22
local_port = 22
#远程服务器映射的端口为60022
remote_port = 60022
[web]
type = http
#本地http服务端口,默认80,按需配置
local_port = 80
# 绑定域名,注:配置http,必须需要域名,否则报错。如没有,可采用普通的tcp模式映射。
custom_domains = xxx.xxx.xxx,vvv.vvv.vvv
[zabbix]
type = tcp
local_ip = 127.0.0.1
#本机需要映射的端口22
local_port = 10050
#远程服务器映射的端口为6000
remote_port = 11050
3:启动测试
分别启动客户端和服务器端
./frps -c frps.ini
客户端运行启动:
./frpc -c frpc.ini
浏览器打开web管理界面,http://123.32.12.32:7500/,输入账户密码,可查看端口映射相关情况。
同时访问:http://123.32.12.32:8088,即可访问跳转到到内网192.168.152.103机器的http服务。
其他更多参数参考中文文档:https://gofrp.org/docs/
4:后台启动
当然对于正式环境,可以配置后台启动,并报存日志输出到相关文件。
服务端:
nohup ./frps -c frps.ini > /var/log/frp.log 2>&1 &
客户端:
nohup ./frpc -c frpc.ini > /var/log/frp.log 2>&1 &
到此,frp服务器搭建完成。
停止
先找到这个进程
例如
ps -aux|grep frp| grep -v grep
root 3600 0.1 0.1 110188 9484 pts/0 Sl 15:04 0:00 ./frpc -c ./frpc.ini
kill -9 3600
如果需要自启动就吧启动命令写成sh脚本,让系统开机自动执行。如果不通首先排除端口问题,可以尝试更换端口,防火墙放行端口号。再不行就先重新启动服务器端系统,然后再重新启动客户端系统继续尝试。
新版的.toml配置文件示例
服务器端:
# 默认能连接到本服务器的ip地址,0.0.0.0表示任何ip都能连接。
bindAddr = "0.0.0.0"
# 本服务器各类协议的端口号。
bindPort = 7000
kcpBindPort = 7000
quicBindPort = 7002
# 使用quic协议连接的一些默认配置参数。
transport.quic.keepalivePeriod = 10
transport.quic.maxIdleTimeout = 30
transport.quic.maxIncomingStreams = 100000
# http服务端口。
vhostHTTPPort = 8080
# https服务端口。
vhostHTTPSPort = 8443
# dashboard网页管理界面,以及设置账户密码(非必须,未配置则直接进入)。
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"
# 如果使用tcp流复用,默认为true,frpc必须与frps相同。
# 也就是tcp复用,建议关掉,不知道有啥用,但是如果是true打开状态会严重影响客户端上传服务器的速度。
# 虽然关掉会提高速度,但是会影响稳定性,可能会出现多次刷新等待才能链接到服务,或者出现断流的情况。
# 从frp的0.5.0版本以上开始解决了tcpMux导致的网速慢的问题,就是切换成quic协议连接就ok了。
transport.tcpMux = true
# 客户端需要设置一样的token值才能鉴权通过。
auth.method = "token"
auth.token = "123456"
# 允许客户端设置的最大连接池大小,如果客户端配置的值大于此值,会被强制修改为最大值,默认为 5,修改为50。
transport.maxPoolCount = 50
客户端的:
# 服务器连接的协议IP以及端口,默认为tcp协议,可选tcp、kcp、quic、websocket 和 wss。
transport.protocol = "tcp"
serverAddr = "192.168.102.101"
serverPort = 7000
# 使用quic协议连接的一些默认配置参数,如果使用quic协议连接就去掉这些参数的注释。
# transport.quic.keepalivePeriod = 10
# transport.quic.maxIdleTimeout = 30
# transport.quic.maxIncomingStreams = 100000
#客户端需要设置一样的token值才能鉴权通过。
auth.method = "token"
auth.token = "123456"
#客户端 AdminServer 配置。
webServer.addr = "0.0.0.0"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin"
# 如果使用tcp流复用,默认为true,frpc必须与frps相同。
# 也就是tcp复用,建议关掉,不知道有啥用,但是如果是true打开状态会严重影响客户端上传服务器的速度。
# 虽然关掉会提高速度,但是会影响稳定性,可能会出现多次刷新等待才能链接到服务,或者出现断流的情况。
# 从frp的0.5.0版本以上开始解决了tcpMux导致的网速慢的问题,就是切换成quic协议连接就ok了。
transport.tcpMux = true
#是否启用加密功能,启用后该代理和服务端之间的通信内容都会被加密传输,如果 frpc 启用了全局 TLS,则不需要再启用此参数。
#如果为 true,则该代理的流量将被加密,默认为 false。
transport.useEncryption = false
#是否启用压缩功能,启用后该代理和服务端之间的通信内容都会被压缩传输。
#如果为 true,流量将被压缩。
transport.useCompression = false
#下面就映射的代理,包括代理名称,协议,本地IP端口以及服务器转发端口。
#如果使用HTTP/HTTPS协议必须要有域名以及本地的HTTP/HTTPS端口号,访问的时候都是通过服务器的转发端口号访问。
#如果是其他协议(例如tcp、udp等等)就需要填写本地端口以及服务器转发端口。
[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 56000
[[proxies]]
name = "web-http"
type = "http"
localIP = "127.0.0.1"
localPort = 80
customDomains = ["www.aaa.com"]
[[proxies]]
name = "web2-https"
type = "https"
localIP = "127.0.0.1"
localPort = 443
customDomains = ["www.aaa.com"]
启动frp:
使用以下命令启动服务器:./frps -c ./frps.toml。
使用以下命令启动客户端:./frpc -c ./frpc.toml。
安装为系统服务:
使用 systemd
此示例演示如何在 Linux 系统下使用 systemd 来管理 frps 服务,包括启动、停止、配置后台运行和设置开机自启动。
在 Linux 系统下,使用 systemd
可以方便地控制 frps 服务端的启动、停止、配置后台运行以及开机自启动。
以下是具体的操作步骤:
安装 systemd
如果您的 Linux 服务器上尚未安装 systemd,可以使用包管理器如 yum
(适用于 CentOS/RHEL)或 apt
(适用于 Debian/Ubuntu)来安装它:
# 使用 yum 安装 systemd(CentOS/RHEL)
yum install systemd
# 使用 apt 安装 systemd(Debian/Ubuntu)
apt install systemd
创建 frps.service 文件
使用文本编辑器 (如 vim) 在 /etc/systemd/system
目录下创建一个 frps.service
文件,用于配置 frps 服务。
$ sudo touch /etc/systemd/system/frps.service
$ sudo vim /etc/systemd/system/frps.service
写入内容
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
# 提前在/opt目录新建一个frp文件夹,将frp程序复制到此文件夹
# 如果是客户端就将frps改成frpc就行,其他可以保持不变
ExecStart = /opt/frp/frps -c /opt/frp/frps.toml
#部分RHEL8+系统还需要使用下面参数
Restart = always
RestartSec = 20
StartLimitInterval = 0
#Restart = always: 只要不是通过systemctl stop来停止服务,任何情况下都必须要重启服务,默认值为no
#RestartSec = 20: 重启间隔,比如某次异常后,等待5(s)再进行启动,默认值0.1(s)
#StartLimitInterval = 0: 无限次重启,默认是10秒内如果重启超过5次则不再重启,设置为0表示不限次数重启
#如果自动重启不成功可能还需要重新加载一下服务,在终端使用下面的命令
#systemctl daemon-reload
[Install]
WantedBy = multi-user.target
使用 systemd 命令管理 frps 服务
# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps
设置 frps 开机自启动
sudo systemctl enable frps
通过遵循上述步骤,您可以轻松地使用 systemd 来管理 frps 服务,实现启动、停止、自动运行和开机自启动。确保替换路径和配置文件名称以匹配您的实际安装。