测试环境为:
ubutubu 22.04

一、特别说明

frp 是一个快速反向代理,通过具有公网IP的节点上部署frp服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,包括:

  • 客户端服务端支持TCP、QUIC、KCP以及Websocket等多种协议。

  • 采用TCP连接流式复用,在单个连接间承载更多请求,节省连接建立时间,降低请求延迟。

  • 代理组间的负载均衡。

  • 端口复用,多个服务通过同一个服务端端口暴露。

  • 支持P2P通信,流量不经过服务器中转,充分利用带宽资源。

  • 多个原生支持的客户端插件(静态文件查看,HTTPS/HTTP协议转换,HTTP、SOCK5代理等),便于独立使用frp客户端完成某些工作。

  • 高度扩展性的服务端插件系统,易于结合自身需求进行功能扩展。

  • 服务端和客户端UI界面。

二、安装frp

1.准备

一台公网服务器(配置要求不高,带宽大,网络稳定即可),作为服务端,如公网IP:47.23.42.13。

内网客户端(准备穿透出去的服务),如内网IP:192.168.1.11。

2.下载解压安装包

GitHub地址为:GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.,最新版本的客户端和服务端二进制文件在Release页面中。

找到自己合适的版本,下载。

#下载
wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz
#解压
tar -zxvf frp_0.58.1_linux_amd64.tar.gz
#进入目录
cd frp_0.58.1_linux_amd64

进入文件夹后,可以看到有5个文件,其中frpc为客户端程序,frpc.toml为客户端配置文件。frps为服务端程序,frps.toml为服务端配置文件。

root@ubuntu:~/frp_0.58.1_linux_amd64$ ls
frpc  frpc.toml  frps  frps.toml  LICENSE

需要将frpc拷贝至客户端,即内网服务器,或者在客户端直接下载也可以,客户端只需要使用frpcfrpc.toml文件即可。

3.服务端配置

配置文件修改

服务端配置时修改frps.toml文件,官方给出了完整的配置文件说明。

# IPv6的字面地址或主机名必须括起来。
# 在方括号中,如“[::1]:80”、“[ipv6-host]:http”或“[ipv6-host%zone]:80”
# 对于单个 "bindAddr" 字段,不需要方括号,例如 `bindAddr = "::"`。
bindAddr = "0.0.0.0"
# 隧道端口,服务端通过此端口与客户端通信
bindPort = 7000
​
# 用于KCP协议的UDP端口,可以与“bindPort”相同。
# 如果未设置,frps 中的 kcp 将被禁用。
kcpBindPort = 7000
​
# 每个代理中最大池数量。
transport.maxPoolCount = 5
​
# 如果你想支持虚拟主机,你必须设置用于监听的http端口(可选)
# 注意:http端口和https端口可以与bindPort相同。
# 由于备案原因,一般不使用80和443端口,可以自定义
vhostHTTPPort = 7001
vhostHTTPSPort = 7002
​
​
# frps后台
# dashboard is available only if webServer.port is set.
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"
​
​
# console or real logFile path like ./frps.log
log.to = "./frps.log"
# trace, debug, info, warn, error
log.level = "info"
log.maxDays = 3
# disable log colors when log.to is console, default is false
log.disablePrintColor = false
​
​
# 服务端和客户端使用token鉴权
auth.method = "token"
# 设置token值
auth.token = "12345678"
​
# 每个客户端可以使用的最大端口数,默认值为0表示没有限制。
maxPortsPerClient = 0
​
# 如果服务端主机进行了域名绑定,则填入对应域名,否则填入服务器的公网IP地址
subDomainHost = "47.23.42.13"

其他配置看官网的完整配置文件frp/conf/frps_full_example.toml at dev · fatedier/frp · GitHub

启动服务端
./frps -c frps.toml
配置开机自启动

使用vim编辑器创建并编辑frps.service文件。

$ vim /etc/systemd/system/frps.service

写入内容

Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径以及配置文件存储路径
ExecStart = /path/to/frps -c /path/to/frps.toml
[Install]
WantedBy = multi-user.target
使用
systemd
命令,管理
frps

# 启动frp
systemctl start frps
# 停止frp
systemctl stop frps
# 重启frp
systemctl restart frps
# 查看frp状态
systemctl status frps​
配置开机启动
 

 
systemctl enable frps

4.客户端配置

修改frpc.toml

 

 
# 您的代理名称将更改为 {user}.{proxy}
user = "your_name"
# 服务端IP
serverAddr = "47.23.42.13"
# 服务端端口
serverPort = 7000
# 控制台或真实日志文件路径,如 ./frpc.log
log.to = "./frpc.log"
# trace, debug, info, warn, error
log.level = "info"
log.maxDays = 3
# disable log colors when log.to is console, default is false
log.disablePrintColor = false
# 鉴权方式为token
auth.method = "token"
# 服务端设置的token
auth.token = "12345678"
# 服务端后台
webServer.addr = "127.0.0.1"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin"
webServer.pprofEnable = false
# 配置本地服务
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
# 本机需要映射的端口
localPort = 22
# 远程服务器映射的端口为6000
remotePort = 6001
# 映射web服务
[[proxies]]
name = "web01"
type = "http"
localIP = "127.0.0.1"
# 本地web服务端口
localPort = 80

启动客户端

 

 
./frpc -c frpc.toml

注意,服务端需要开启7000、6001、7001、7002等端口。

5.测试连接

这里测试ssh连接

 

 
root@ubuntu:~$ ssh root@47.23.42.13 -p 6001

连接登陆,即可登陆内网IP为192.168.1.12的主机。

6.p2p配置

做p2p配置时,需要公网服务器找到两个通信方的位置,然后使用UDP进行端到端通信。

服务端需要开启UDP端口,在frps.toml中添加一个配置。

 

 
quicBindPort = 7002

客户端1添加如下配置

[[proxies]]
name = "p2p_tcp"
type = "xtcp"
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22
# 如果不为空,则只有指定用户的访问者可以连接。 # 否则,同一用户的访问者可以连接。'*' 表示允许所有用户。
allowUsers = ["user1", "user2"]

客户端2添加如下配置

 

 
[[visitors]]
name = "p2p_tcp_visitor"
type = "xtcp"
# 如果未设置服务器用户,则默认为当前用户。
serverUser = "user1"
serverName = "p2p_tcp"
secretKey = "abcdefg"
bindAddr = "127.0.0.1"
bindPort = 9001

这样,客户端2在远程连接的使用使用localhost:9001就能点对点访问服务了。

本教程鸣谢 zlf同学,撰写

更多推荐