简介
FRP(Fast Reverse Proxy) 是一个高性能的内网穿透工具,支持 TCP、UDP、HTTP、HTTPS 等多种协议,可将内网服务(如 Web 服务器、SSH、远程桌面)映射到公网,方便远程访问。本教程将指导你完成 FRP 的安装、配置和使用,帮助你快速实现内网服务的外网访问。
本教程适用于:
- 希望将本地服务(如 Web 服务器)暴露到公网的用户。
- 需要远程访问内网设备(如 Raspberry Pi、NAS)的用户。
- 开发者或运维人员需要简单、安全的内网穿透解决方案。
准备工作
在开始之前,请确保你具备以下条件:
- 公网服务器:一台具有公网 IP 的服务器(如云服务器,推荐 Linux 系统,如 Ubuntu 或 CentOS)。
- 内网客户端:需要穿透的本地设备(如 PC、Raspberry Pi)。
- FRP 软件:从 FRP GitHub 发布页面 下载最新版本。
- 基础环境:确保服务器和客户端支持 FRP 运行(通常为 Linux、Windows 或 macOS)。
安装 FRP
1. 下载 FRP
访问 FRP GitHub 下载页面。
根据服务器和客户端的操作系统选择合适的压缩包(如
frp_x.y.z_linux_amd64.tar.gz
)。-
下载并解压:
// 下载文件到当前文件夹 wget https://github.com/fatedier/frp/releases/download/v0.63.0/frp_0.63.0_linux_amd64.tar.gz // 解压文件 tar -zxvf frp_0.63.0_linux_amd64.tar.gz cd frp_0.63.0_linux_amd64
2. 安装到服务器
将解压后的文件传输到公网服务器(如通过
scp
或 FTP)。-
确保服务器开放必要的端口(如默认的 7000 用于 FRP 控制,80、443 用于 HTTP/HTTPS)。
# 示例:开放 7000 端口(Ubuntu) sudo ufw allow 7000 # 如果是云服务器,需要在控制台进行端口添加,添加后才可以访问
3. 安装到客户端
- 将解压后的文件传输到内网客户端。
- 无需额外安装,直接使用解压后的
frpc
(客户端)和frps
(服务器端)二进制文件。
配置 FRP
FRP 的配置主要分为服务器端(frps.toml
)和客户端(frpc.toml
)。以下是基本配置示例。
1. 服务器端配置(frps.toml)
在公网服务器上编辑 frps.toml
:
# 客户端与服务连接端口
bindPort = 7000
# 客户端连接服务端时认证的密码
auth.token = "xxxxxxxx"
# http协议监听端口
vhostHTTPPort = 80
vhostHTTPSPort = 443
# web界面配置
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"
-
bindPort
:FRP 服务监听的端口,用于客户端连接。 -
vhostHTTPPort
:HTTP 服务代理端口。 -
vhostHTTPSPort
:HTTPS 服务代理端口。 -
auth.token
:用于认证,防止未授权访问。
保存后,启动服务器端:
./frps -c frps.toml
2. 客户端配置(frpc.toml)
在本地客户端上编辑 frpc.toml
:
serverAddr = "公网服务器 IP" # 公网服务器 IP
serverPort = 7000 # 与frps.toml 的bindPort 一致
auth.token = "xxxxxx" # 与frps.toml 的token 一致
[[proxies]]
name = "name" #
type = "https"
localIP = "127.0.0.1"
localPort = 9001
#remotePort = 6000 # 远程访问端口
#自定义域名
customDomains = ["www.yanjy.top"]
-
serverAddr
:公网服务器的 IP 地址。 -
serverPort
:服务器端bind_port
。 -
auth.token
:与服务器端一致的认证令牌。 -
[[proxies]]
:代理名称,可自定义。 -
name
:穿透名称,自定义。 -
type
:代理类型(如http
、tcp
、udp
)。 -
localIP
和localPort
:本地服务的地址和端口。 -
customDomains
:绑定的域名,需提前在 DNS 中解析到公网服务器 IP。
保存后,启动客户端:
./frpc -c frpc.toml
使用 FRP
1. 验证连接
- 启动服务器端和客户端后,检查日志确认连接是否成功:
- 服务器端日志:显示客户端连接信息。
- 客户端日志:显示代理注册成功。
- 通过浏览器访问
http://yourdomain.com
或公网 IP,检查是否能访问本地服务。
2. 常见使用场景
场景 | 配置示例 |
---|---|
Web 服务 | [web] type=http localIP=127.0.0.1 localPort=8080 customDomains=example.com |
SSH 远程访问 | [ssh] type=tcp localIP=127.0.0.1 localPort=22 remotePort=6000 |
远程桌面 (RDP) | [rdp] type=tcp localIP=192.168.1.100 localPort=3389 remotePort=3389 |
3. 设置开机自启
-
Linux 服务器端(以 systemd 为例):
sudo vim /etc/systemd/system/frps.service
添加以下内容:
[Unit] # 服务名称,可自定义 Description = frp server After = network.target [Service] Type = simple # 启动frps的命令,需修改为您的frps的安装路径 ExecStart = /home/frps_serve/frp_0.63.0_linux_amd64/frps -c /home/frps_serve/frp_0.63.0_linux_amd64/frps.toml [Install] WantedBy = multi-user.target
启用服务:
sudo systemctl enable frps # 设置为开机自启 sudo systemctl start frps
客户端:类似配置,修改
ExecStart
为frpc
命令。
进阶配置
1. 启用 HTTPS
-
在服务器端配置 SSL 证书:
将证书文件(
.crt
和.key
)放置在服务器目录。-
修改
frps.toml
:[common] bindPort = 7000 vhostHTTPSPort = 443 tlsOnly = true
客户端配置保持不变,访问时使用
https://yourdomain.com
。
2. 多客户端支持
在 frpc.ini
中添加多个代理:
[[proxies]]
name = "lhw-api"
type = "https"
localIP = "127.0.0.1"
localPort = 9001
#自定义域名
customDomains = ["你的域名"]
[[proxies]]
name = "mimisite"
type = "http"
localIP = "127.0.0.1"
localPort = 8099
#自定义域名
customDomains = ["你的域名"]
3. 性能优化
-
压缩:在
frpc.toml
中启用compression = true
减少带宽占用。 -
连接池:在
frps.toml
中设置max_pool_count = 50
提高并发性能。
故障排查
问题 | 可能原因及解决方案 |
---|---|
客户端无法连接服务器 | 检查 serverAddr 、serverPort 和 auth.token 是否正确;确保服务器防火墙开放端口。 |
无法访问服务 | 确认本地服务(如 Web 服务器)正在运行;检查 DNS 解析是否正确。 |
HTTPS 访问失败 | 确保证书有效且路径正确;检查服务器端是否启用 tls_only 。 |
安全建议
-
使用强 Token:设置复杂且唯一的
auth.token
。 - 启用 TLS:优先使用 HTTPS 加密通信。
- 限制 IP:在服务器防火墙中限制允许连接的客户端 IP。
- 定期更新:关注 FRP 官方发布,升级到最新版本以修复安全漏洞。
参考资料
附录
常用命令
# 查看 FRP 版本
./frps --version
./frpc --version
# 后台运行
sudo systemctl start frps # 启动frp
sudo systemctl stop frps # 停止frp
sudo systemctl restart frps # 重启frp
sudo systemctl status frps # 查看frp状态
配置文件结构
-
frps.toml
:服务器端核心配置文件,定义监听端口和认证方式。 -
frpc.toml
:客户端配置文件,定义代理规则和服务映射。