# 一、frp概览
# 1.1 frp 是什么?
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。(理论上限网速取决你公网服务器的带宽,这点非常nice哦,比那些白嫖的龟速内网穿透服务好得多)
# 1.2 为什么使用 frp?
通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
- 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
- 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
- 代理组间的负载均衡。
- 端口复用,多个服务通过同一个服务端端口暴露。
- 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
- 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
- 服务端和客户端 UI 页面。。
FRP项目官网是 https://github.com/fatedier/frp
# 1.3 frp工作原理
- 服务端运行,监听一个主端口,等待客户端的连接;
- 客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;
- 服务端fork新的进程监听客户端指定的端口;
- 外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端;
- 客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。
# 二、frp安装与配置
想要配置frp穿透,首先必须先要有一台具有外网ip(即:可以外网访问)的服务器。如果没有,接下来的教程就不用看了。
配置教程主要分为两个部分。 一是服务器端(外网服务器)配置; 二是客户端([内网服务器)配置。
# 2.1 服务端配置
# 2.1.1 下载frp(linux版)
目前可以在 Github 的 Release (opens new window) 页面中下载到最新版本的客户端和服务端二进制文件,所有文件被打包在一个压缩包中。
也可以在服务器使用wget下载,我这边是liunx服务器为例。
#切换目录
cd /usr/local/
#wget下载frp
wget https://github.com/fatedier/frp/releases/download/v0.45.0/frp_0.45.0_linux_amd64.tar.gz
#解压到当前工作目录
tar -zxvf frp_0.45.0_linux_amd64.tar.gz
#切换到解压后的目录
cd frp_0.45.0_linux_amd64
#修改服务端的配置文件frps.ini
vim frps.ini
frps.ini详细内容如下:
[common]
# frp监听的端口,默认是7000,可以改成其他的
bind_port = 7000
# 授权码,请改成更复杂的,这个token之后在客户端会用到
token = 52010
# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,请改成自己的
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true
# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
# 2.1.2 使用 systemd 启动frp服务
Linux 系统下,使用systemd 可以方便地控制 frp 服务端 frps 的启动和停止、配置后台运行和开启自启。
要使用 systemd 来控制 frps,需要先安装 systemd,然后在 /etc/systemd/system 目录下创建一个 frps.service 文件。
#如Linux服务端上没有安装 systemd,可以使用 yum 或 apt 等命令安装 systemd
# yum
yum -y install systemd
# apt
apt -y install systemd
#创建并编辑 frps.service 文件
vim /etc/systemd/system/frps.service
#配置 frps 开机自启
systemctl enable frps
#启动frp
systemctl start frps
#查看状态
systemctl status frps
frps.service内容如下:
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /usr/local/frp_0.45.0_linux_amd64/frps -c /usr/local/frp_0.45.0_linux_amd64/frps.ini
[Install]
WantedBy = multi-user.target
查看状态如下图所示,则说明启动成功。

# 2.1.3 防火墙开放端口
云服务可以直接到安全组进行设置
# 添加监听端口
firewall-cmd --permanent --add-port=7000/tcp
# 添加管理后台端口
firewall-cmd --permanent --add-port=7500/tcp
firewall-cmd --reload
#查看所有开启的端口号
netstat -aptn
#查看7000端口使用情况
netstat -ntulp |grep 7000
#如果没有任何输出则说明没有开启该端口号
lsof -i:7000
#检查端口是否可用
telnet 127.0.0.1 7000
# 2.1.4 frp其它命令
# 停止frp
systemctl stop frps
# 重启frp
systemctl restart frps
# 查看frp状态
systemctl status frps
# 2.1.5 验证服务端是否启动成功
访问:http://服务器IP:后台管理端口 ,输入用户名和密码可以查看连接状态 用户名和密码分别对应frps.ini文件中的dashboard_user和dashboard_pwd
登录之后界面如下:

如果上述步骤没有问题,则说明frp的服务端配置成功。
# 2.2 客户端配置
# 2.2.1 下载frp(MAC版)
目前可以在 Github 的 Release (opens new window) 页面中下载到最新版本的客户端和服务端二进制文件,所有文件被打包在一个压缩包中。
也可以在服务器使用wget下载,我这边是M1芯片的MAC为例。其它的版本按照自己的机器来选择版本。
#创建目录用来储存frp
mkdir -p /Users/mike/Documents/frp
#切换目录
cd /Users/mike/Documents/frp
#下载frp(本次演示的是M1芯片,其它的安装自己的机器来选择版本)
wget https://github.com/fatedier/frp/releases/download/v0.45.0/frp_0.45.0_darwin_arm64.tar.gz
#解压
tar -zxvf frp_0.45.0_darwin_arm64.tar.gz
#切换目录
cd frp_0.45.0_darwin_arm64
#修改客服端的配置文件frpc.ini
vim frpc.ini
frpc.ini文件详细内容如下
# 客户端配置
[common]
server_addr = 服务端的服务器ip
# 与frps.ini的bind_port一致
server_port = 7000
# 与frps.ini的token一致
token = 52010
# 配置ssh服务
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
# 这个自定义,之后再ssh连接的时候要用
remote_port = 6000
#配置本地服务,用于远程调试
[tcp_port]
type = tcp
local_ip = 127.0.0.1
local_port = 8080
remote_port = 8080
- 注意:[ssh]这样的名称必须全局唯一,即就算有多个客户端,也只能使用一次,其他的可以用[ssh2]、[ssh3]等;
- 意思就是说,如果你要配置多个客户端,必须将另外的客户端的[ssh]改为[ssh2]、[ssh3]等,并且remote_port也要变,比如6002,6003等
# 2.2.2 防火墙开放端口
你如果觉得mac放行端口麻烦,可以直接将防火墙关闭
# 2.2.3 客户端启动
通过IP加端口访问服务
#切换到安装目录
cd /Users/mike/Documents/frp/frp_0.45.0_darwin_arm64
#在当前命令执行可执行文件frpc,并指定配置文件。
./frpc -c frpc.ini
#后台运行
nohup ./frpc -c frpc.ini >/dev/null 2>&1 &
到这里,恭喜你,你基本成功了,但还剩最后一步,很多人会弄错。

# 2.2.4 设置通过域名访问
上面的例子演示了如何通过IP加端口访问服务,下面介绍一下如何通过域名访问服务。
第一步:访问你的域名DNS管理界面,添加一个子域名
点 [ 新增一条A记录 ]
主机记录填: frp (即frp.example.com)
记录值填写服务器IP (服务端的机器IP)
保存退出
第二步:在公网服务器上设置
- 编辑:frps.ini (找到common一栏,添加一行)
[common] vhost_http_port = 8000- 存盘退出, 并重启服务端。
第三步:在客户端机器上设置 编辑:frpc.ini (添加web栏,内容如下)
[web] type = http local_port = 8080 custom_domains = frp.example.com- 存盘退出,并重启客服端。
# 2.2.5 测试穿透是否配置成功
找另外一台不同网段的linux或者mac电脑,在终端执行
#查看frpc进程
ps -ef | grep frpc
#测试ssh
ssh 用户名@服务端ip -p 端口号
#测试通过IP加端口访问服务
curl 服务端ip:8080/自己的web服务访问路径
#测试通过域名加端口访问服务
curl frp.example.com:8080/自己的web服务访问路径
访问:http://服务器IP:后台管理端口 ,输入用户名和密码可以查看连接状态,发现Proxies下的TCP多了两条记录,
http多了一条记录。

更详细的操作,请参考frp官方文档 (opens new window)