Skip to content

frp

官方文档 https://gofrp.org

为什么使用 frp ?

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、QUIC、KCP 以及 Websocket 等多种协议。
  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间,降低请求延迟。
  • 代理组间的负载均衡。
  • 端口复用,多个服务通过同一个服务端端口暴露。
  • 支持 P2P 通信,流量不经过服务器中转,充分利用带宽资源。
  • 多个原生支持的客户端插件(静态文件查看,HTTPS/HTTP 协议转换,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
  • 高度扩展性的服务端插件系统,易于结合自身需求进行功能扩展。
  • 服务端和客户端 UI 页面。

下载 frp

下载 frp 后,目录下

bash
frp_<version>_<platform>_<arch>
├── frpc        # frp client 客户端
├── frpc.toml   # frp client 配置文件
├── frps        # frp server 服务端
├── frps.toml   # frp server 配置文件
└── LICENSE

通过 SSH 访问内网机器

服务端配置

NOTE

假设服务端是一台具有公网IP的机器,将在公网机器上部署 frp 服务端 (frps)。

部署 frps 并编辑 frps.toml 文件。以下是简化的配置,其中设置了 frp 服务器用于接收客户端连接的端口:

toml
bindPort = 7000

需要开放对应的端口

bash
# 设置需要开放的端口
PORT=7000

firewall-cmd --permanent --zone=public --add-port=${PORT}/tcp  # 添加 frps 端口  
firewall-cmd --reload      # 更新防火墙规则
firewall-cmd --list-ports  # 查看已开放的端口

# 如果后续不再使用
firewall-cmd --permanent --zone=public --remove-port=$PORT/tcp # 移除端口

IMPORTANT

  • 如果是云服务器上部署的话,请把云服务器的防火墙中的端口也一同打开,只打开系统的防火墙端口也是无法访问
  • 建议找不限制流量、限制带宽的云服务器服务
  • firewalld 可能需要安装

启动 frps 服务

bash
frps -c frps.toml

客户端配置

NOTE

假设客户端是一台没有公网IP的内网机器,将在内网机器上部署 frp 客户端 (frpc)

修改 frpc.toml 配置文件,配置 frpc 服务端

toml
serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

启动 frpc 服务

bash
frpc -c frpc.toml

就可以使用 ssh 命令访问内网机器

bash
ssh -p 6000 <user>@x.x.x.x

SSH 代理原理

FRP SSH Connection

  • 服务端 frps 启动时,会持续监听 7000 端口
  • 当客户端 frpc 启动时,会通过监听端口 7000 进行注册(告诉服务端内网机器的被代理端口 22 和服务器上监听转发端口 6000),并建立一个长连接,如果连接失败,则会尝试重新建立连接
  • 当用户外部访问服务端指定端口 6000 的时候,服务端会将流量转发至内网机器的被代理端口 22

使用 systemd 来管理 frp 服务

在 Linux 系统下,使用 systemd 可以方便地控制服务的启动、停止、配置后台运行以及开机自启动。

配置 frps 服务

/etc/systemd/system 下创建 frps.service 用于配置 frps 服务

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

写入内容

ini
[Unit]
Description = frp server  # 服务描述
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
ExecStart = /usr/local/bin/frps -c /etc/frp/frps.toml  # 启动 frps 的命令, 需修改为您的 frps 的安装路径
Restart=on-failure  # 在失败时自动重启
RestartSec=5s       # 重启间隔时间
TimeoutStartSec=30s # 服务启动超时时间

[Install]
WantedBy = multi-user.target

使用 systemd 命令管理 frps 服务

bash
systemctl start   frps # 启动服务
systemctl stop    frps # 停止服务
systemctl restart frps # 重启服务
systemctl status  frps # 查看状态
journalctl -u frps -f  # 查看日志

设置 frps 开机自启动

bash
systemctl enable frps

配置 frpc 服务

将 frpc 移动到 /usr/local/bin 目录下,配置文件移动到 /etc/frp 目录下

bash
mv frpc /usr/local/bin
mkdir /etc/frp
mv frpc.toml /etc/frp

/etc/systemd/system 下创建 frpc.service 用于配置 frpc 服务

bash
vim /etc/systemd/system/frpc.service

写入内容

ini
[Unit]
Description = frp client # 服务描述
After=network.target network-online.target
Wants=network-online.target
Requires=network-online.target  # 确保只有在网络可用的情况下,服务才会运行

[Service]
Type = simple
ExecStart = /usr/local/bin/frpc -c /etc/frp/frpc.toml  # 启动 frpc 的命令, 修改为您的 frpc的安装路径
ExecStop=/bin/kill $MAINPID
Restart=always        # 确保无论服务是正常退出还是异常崩溃,都会尝试重启
RestartSec=10         # 重启间隔
StartLimitInterval=0  # 禁用启动限制,允许服务无限次重启

[Install]
WantedBy = multi-user.target

使用 systemd 命令管理 frpc 服务

bash
systemctl start   frpc # 启动服务
systemctl stop    frpc # 停止服务
systemctl restart frpc # 重启服务
systemctl status  frpc # 查看状态
journalctl -u frpc -f  # 查看日志

设置 frpc 开机自启动

bash
systemctl enable frpc

⏰ 最后更新于: