# 一、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

查看状态如下图所示,则说明启动成功。

image-20221115182433396

# 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

登录之后界面如下: image-20221115183807622

如果上述步骤没有问题,则说明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 &

到这里,恭喜你,你基本成功了,但还剩最后一步,很多人会弄错。

image-20221115192427194

# 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多了两条记录,image-20221116102040309

http多了一条记录。

image-20221116104457980

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