首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >frp 内网穿透搭建教程:公网访问内网服务配置详解

frp 内网穿透搭建教程:公网访问内网服务配置详解

原创
作者头像
gavin1024
发布于 2026-09-14 20:45:44
发布于 2026-09-14 20:45:44
5880
举报

摘要

frp 是常用的反向代理工具,用一台有公网 IP 的服务器把内网服务暴露到公网访问。本文完成 frp 服务端与客户端的部署,涵盖工作原理、服务端配置、多种穿透类型(HTTP、TCP、SSH)、身份认证与访问控制、开机自启,以及连接失败和端口冲突的排查方法。文中同时说明使用边界与合规要求。

一、frp 解决什么问题,以及使用边界

家庭宽带和多数办公网络处于运营商的多层网络地址转换之后,没有可直接访问的公网 IP。这导致本地运行的服务无法从外部访问。frp 的做法是:由内网的客户端主动连接到公网服务器建立长连接,外部请求先到公网服务器,再通过这条已建立的连接转发回内网。

典型的正当用途:

  • 把本地开发环境临时暴露,用于调试第三方平台的回调。
  • 访问家里的媒体服务器、网盘或智能家居中枢。
  • 远程连接自己家中或公司的设备进行运维。
  • 为自己的项目提供临时的外部访问地址。

使用边界必须说清楚。 frp 只应用于访问你自己拥有或已获明确授权的设备与服务。以下行为不在本文讨论范围,也不应尝试:

  • 在未经网络管理方许可的情况下,绕过单位、学校或机构的网络管理策略。
  • 把他人的设备或服务暴露到公网。
  • 用于规避任何网络监管要求。

企业和校园网络通常有明确的接入管理规定,部署前请先确认符合所在网络的使用政策。如果是企业场景需要远程接入,更合适的做法是使用受管控的企业远程接入方案,而不是个人搭建的穿透工具。

二、准备工作

需要两部分:一台有公网 IP 的服务器作为服务端,一台内网设备作为客户端。

公网服务器要求

项目

要求

CPU

1 核即可

内存

1 GB,frp 本身占用很低

带宽

按转发流量需求选择

操作系统

主流 Linux 发行版

带宽是这里的主要成本项。所有穿透流量都要经过公网服务器中转,转发大文件或视频流时带宽消耗明显。如果只是访问管理界面和轻量接口,较小带宽就够用。

需要放通的端口

端口

协议

用途

7000

TCP

frp 服务端与客户端通信

80 / 443

TCP

HTTP/HTTPS 类型穿透

自定义端口

TCP

TCP 类型穿透的对外端口

轻量应用服务器在实例详情页的「防火墙」页签添加规则;云服务器 CVM 在安全组的「入站规则」中添加。

三、部署服务端

在公网服务器上操作。先从项目发布页获取对应架构的安装包:

代码语言:bash
复制
uname -m

返回 x86_64 选 amd64 版本,返回 aarch64 选 arm64 版本。

下载并解压(版本号请以实际发布版本为准):

代码语言:bash
复制
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/

创建服务端配置文件:

代码语言:bash
复制
sudo nano /etc/frp/frps.toml

写入以下内容:

代码语言: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 是客户端接入的凭据,必须设置且足够随机。生成方式:
代码语言:bash
复制
openssl rand -hex 32
  • webServer.addr = "127.0.0.1" 让管理面板只监听本机,不对公网开放。需要查看时通过 SSH 端口转发访问,比直接暴露安全得多。
  • allowPorts 限制客户端可以申请的端口范围。不加这一项,任何持有令牌的客户端都能占用服务器上的任意端口。

配置为系统服务:

代码语言:bash
复制
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

四、部署客户端

在内网设备上操作。下载对应平台的安装包后,创建客户端配置:

代码语言:bash
复制
sudo nano /etc/frp/frpc.toml

场景一:穿透内网的 Web 服务

代码语言:toml
复制
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 服务

代码语言:toml
复制
[[proxies]]
name = "home-ssh"
type = "tcp"
localIP = "192.168.1.10"
localPort = 22
remotePort = 20022

访问方式是 公网服务器IP:20022。注意 remotePort 必须落在服务端 allowPorts 允许的范围内。

为敏感服务加一层认证

把 SSH 这类服务直接暴露到公网会持续遭到爆破尝试。frp 提供了访问密钥机制:

代码语言:toml
复制
[[proxies]]
name = "home-ssh"
type = "stcp"
secretKey = "一段随机密钥"
localIP = "192.168.1.10"
localPort = 22

这种类型不会在公网服务器上开放端口,只有持有相同密钥的访问端才能建立连接。访问端同样需要运行一个客户端并配置对应的访问者条目。安全性明显高于直接暴露端口。

启动客户端并设置自启:

代码语言:bash
复制
sudo systemctl daemon-reload
sudo systemctl enable --now frpc
sudo systemctl status frpc --no-pager

五、验证穿透是否生效

服务端正在监听

代码语言:bash
复制
sudo ss -lntp | grep -E ':(7000|8080)'

客户端已成功连接

代码语言:bash
复制
sudo journalctl -u frpc -n 30 --no-pager

日志中出现连接成功和代理启动成功的提示,说明链路已建立。服务端日志也会记录客户端上线。

从外部实际访问

HTTP 类型穿透,在外网环境访问配置的域名:

代码语言:bash
复制
curl -I http://nas.example.com:8080

TCP 类型穿透,测试端口连通性:

代码语言:bash
复制
nc -zv 公网服务器IP 20022

查看管理面板

面板只监听本机,通过 SSH 端口转发访问:

代码语言:bash
复制
ssh -L 7500:127.0.0.1:7500 用户名@公网服务器IP

然后在本地浏览器打开 http://127.0.0.1:7500,可以看到所有代理的状态和流量统计。

最后一项验证要在真实外网环境完成。在同一内网测试往往会走本地路由,不能说明穿透真的生效了。

六、配置 HTTPS

直接用 HTTP 暴露服务会明文传输数据。建议在公网服务器上用反向代理接管,由它处理证书。

把 frp 的 HTTP 端口作为后端:

代码语言:caddyfile
复制
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 删除。

目录
  • 摘要
  • 一、frp 解决什么问题,以及使用边界
  • 二、准备工作
  • 三、部署服务端
  • 四、部署客户端
  • 五、验证穿透是否生效
  • 六、配置 HTTPS
  • 七、常见问题与排查
  • 八、安全与维护建议
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档