
frp 是常用的反向代理工具,用一台有公网 IP 的服务器把内网服务暴露到公网访问。本文完成 frp 服务端与客户端的部署,涵盖工作原理、服务端配置、多种穿透类型(HTTP、TCP、SSH)、身份认证与访问控制、开机自启,以及连接失败和端口冲突的排查方法。文中同时说明使用边界与合规要求。
家庭宽带和多数办公网络处于运营商的多层网络地址转换之后,没有可直接访问的公网 IP。这导致本地运行的服务无法从外部访问。frp 的做法是:由内网的客户端主动连接到公网服务器建立长连接,外部请求先到公网服务器,再通过这条已建立的连接转发回内网。
典型的正当用途:
使用边界必须说清楚。 frp 只应用于访问你自己拥有或已获明确授权的设备与服务。以下行为不在本文讨论范围,也不应尝试:
企业和校园网络通常有明确的接入管理规定,部署前请先确认符合所在网络的使用政策。如果是企业场景需要远程接入,更合适的做法是使用受管控的企业远程接入方案,而不是个人搭建的穿透工具。
需要两部分:一台有公网 IP 的服务器作为服务端,一台内网设备作为客户端。
公网服务器要求
项目 | 要求 |
|---|---|
CPU | 1 核即可 |
内存 | 1 GB,frp 本身占用很低 |
带宽 | 按转发流量需求选择 |
操作系统 | 主流 Linux 发行版 |
带宽是这里的主要成本项。所有穿透流量都要经过公网服务器中转,转发大文件或视频流时带宽消耗明显。如果只是访问管理界面和轻量接口,较小带宽就够用。
需要放通的端口
端口 | 协议 | 用途 |
|---|---|---|
7000 | TCP | frp 服务端与客户端通信 |
80 / 443 | TCP | HTTP/HTTPS 类型穿透 |
自定义端口 | TCP | TCP 类型穿透的对外端口 |
轻量应用服务器在实例详情页的「防火墙」页签添加规则;云服务器 CVM 在安全组的「入站规则」中添加。
在公网服务器上操作。先从项目发布页获取对应架构的安装包:
uname -m返回 x86_64 选 amd64 版本,返回 aarch64 选 arm64 版本。
下载并解压(版本号请以实际发布版本为准):
mkdir -p ~/frp && cd ~/frp
wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
tar -zxf frp_0.61.0_linux_amd64.tar.gz
cd frp_0.61.0_linux_amd64
sudo mkdir -p /etc/frp
sudo cp frps /usr/local/bin/创建服务端配置文件:
sudo nano /etc/frp/frps.toml写入以下内容:
bindPort = 7000
auth.method = "token"
auth.token = "替换为一段足够随机的字符串"
vhostHTTPPort = 8080
vhostHTTPSPort = 8443
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "替换为强密码"
log.to = "/var/log/frps.log"
log.level = "info"
log.maxDays = 7
transport.maxPoolCount = 5
allowPorts = [
{ start = 20000, end = 20100 }
]几项配置的作用:
auth.token 是客户端接入的凭据,必须设置且足够随机。生成方式:openssl rand -hex 32webServer.addr = "127.0.0.1" 让管理面板只监听本机,不对公网开放。需要查看时通过 SSH 端口转发访问,比直接暴露安全得多。allowPorts 限制客户端可以申请的端口范围。不加这一项,任何持有令牌的客户端都能占用服务器上的任意端口。配置为系统服务:
sudo tee /etc/systemd/system/frps.service > /dev/null <<'UNIT'
[Unit]
Description=frp server
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
UNIT
sudo systemctl daemon-reload
sudo systemctl enable --now frps
sudo systemctl status frps --no-pager在内网设备上操作。下载对应平台的安装包后,创建客户端配置:
sudo nano /etc/frp/frpc.toml场景一:穿透内网的 Web 服务
serverAddr = "你的公网服务器IP"
serverPort = 7000
auth.method = "token"
auth.token = "与服务端保持一致"
[[proxies]]
name = "home-nas"
type = "http"
localIP = "127.0.0.1"
localPort = 8080
customDomains = ["nas.example.com"]这种方式需要把域名解析到公网服务器 IP,访问时通过域名区分不同服务,多个服务可以共用同一个对外端口。
场景二:穿透任意 TCP 服务
[[proxies]]
name = "home-ssh"
type = "tcp"
localIP = "192.168.1.10"
localPort = 22
remotePort = 20022访问方式是 公网服务器IP:20022。注意 remotePort 必须落在服务端 allowPorts 允许的范围内。
为敏感服务加一层认证
把 SSH 这类服务直接暴露到公网会持续遭到爆破尝试。frp 提供了访问密钥机制:
[[proxies]]
name = "home-ssh"
type = "stcp"
secretKey = "一段随机密钥"
localIP = "192.168.1.10"
localPort = 22这种类型不会在公网服务器上开放端口,只有持有相同密钥的访问端才能建立连接。访问端同样需要运行一个客户端并配置对应的访问者条目。安全性明显高于直接暴露端口。
启动客户端并设置自启:
sudo systemctl daemon-reload
sudo systemctl enable --now frpc
sudo systemctl status frpc --no-pager服务端正在监听
sudo ss -lntp | grep -E ':(7000|8080)'客户端已成功连接
sudo journalctl -u frpc -n 30 --no-pager日志中出现连接成功和代理启动成功的提示,说明链路已建立。服务端日志也会记录客户端上线。
从外部实际访问
HTTP 类型穿透,在外网环境访问配置的域名:
curl -I http://nas.example.com:8080TCP 类型穿透,测试端口连通性:
nc -zv 公网服务器IP 20022查看管理面板
面板只监听本机,通过 SSH 端口转发访问:
ssh -L 7500:127.0.0.1:7500 用户名@公网服务器IP然后在本地浏览器打开 http://127.0.0.1:7500,可以看到所有代理的状态和流量统计。
最后一项验证要在真实外网环境完成。在同一内网测试往往会走本地路由,不能说明穿透真的生效了。
直接用 HTTP 暴露服务会明文传输数据。建议在公网服务器上用反向代理接管,由它处理证书。
把 frp 的 HTTP 端口作为后端:
nas.example.com {
reverse_proxy 127.0.0.1:8080
}这样外部访问走 HTTPS,代理层解密后转给 frp,再由 frp 转发到内网。证书统一在代理层管理,内网服务不需要各自配置。
如果内网有多个服务,可以配置多个域名分别指向不同的 frp 代理,共用一套证书管理流程。
服务器位于中国内地且使用域名对外提供服务时,需要先完成 ICP 备案。
客户端连接不上服务端
按顺序检查:服务端 7000 端口是否在控制台放通;serverAddr 填写是否正确;两端 auth.token 是否完全一致;服务端进程是否在运行。令牌不一致时日志会明确提示认证失败。
提示端口已被占用
remotePort 与服务器上其他服务冲突,或超出了 allowPorts 允许范围。换一个范围内的空闲端口。
域名访问返回 404 或无法路由
确认域名已解析到公网服务器 IP,且 customDomains 中填写的域名与实际访问的一致。多个代理使用相同域名会导致冲突。
连接频繁断开
查看客户端日志判断是网络波动还是服务端主动断开。可以适当调整心跳相关参数。内网出口网络不稳定时,这类问题较难根治,需要从网络侧解决。
转发速度慢
所有流量经过公网服务器中转,速度受限于服务器带宽和两端到服务器的网络质量。先确认服务器带宽是否跑满,再考虑内网出口上行带宽是否成为瓶颈。
管理面板打不开
面板配置为只监听本机是有意为之。使用 SSH 端口转发访问,不要为了方便改成监听公网地址。
收紧暴露面
allowPorts 限制可申请的端口范围。内网服务自身也要加固
穿透只是打通了访问通道,不会让内网服务变得更安全。被暴露的服务必须有自己的身份认证,默认密码要改掉,管理后台不要用默认路径。一个没有认证的内网服务被暴露到公网,等于对所有人开放。
监控与日志
定期查看服务端日志,留意异常的连接尝试。日志配置了保留天数,不会无限增长。
变更前创建快照
调整配置前给实例创建快照。回滚会把整块系统盘恢复到快照时间点,之后的数据变更会被清除,运行中的实例会自动关机。
合规复核
再次强调使用边界:只穿透自己拥有或已获授权的设备与服务;遵守所在网络的接入管理规定;不要用于规避网络监管要求。企业场景的远程接入需求,应通过受管控的方案实现,并由网络管理方统一规划。
部署完成后,如果需要为暴露出去的服务配置统一的域名入口和证书,或为团队建立受管控的远程接入方案,可以作为下一步方向。
作为中转节点的公网服务器对带宽较敏感而对算力要求不高,轻量应用服务器的套餐式规格比较适合这类用途;需要更灵活的网络策略和安全组控制时,可以使用云服务器 CVM。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。