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 代理原理
- 服务端 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