<!DOCTYPE html>
frp 内网穿透实战:服务端配置、客户端连接与 HTTPS 域名穿透全指南
家里有台 NAS 想在公司访问,宿舍的树莓派想远程 SSH,本地的开发服务想给客户演示——这些需求的核心都是内网穿透。frp(Fast Reverse Proxy)是目前最流行的开源内网穿透工具,由 fatedier 开发,支持 TCP / UDP / HTTP / HTTPS 全协议代理,配合有公网 IP 的 VPS,就能把内网服务安全地暴露到公网。本文从零开始,带你在 VPS 上部署 frp 服务端,在本地机器上配置客户端,并完成 SSH 远程管理、Web 服务域名穿透和 HTTPS 证书绑定,最后给出完整的排错手册。
一、frp 工作原理与架构
frp 采用 C/S 架构:frps(服务端)运行在有公网 IP 的 VPS 上,frpc(客户端)运行在内网机器上。客户端主动向服务端发起连接,服务端监听公网端口,把来自公网的流量通过这条隧道转发给内网服务,实现"反向代理"。
公网用户 → VPS( frps 监听 7000/80/443 ) → frps <—隧道—> frpc(内网) → 内网服务(22/3306/8080)
这种设计的优点:客户端无需公网 IP、无需端口映射;隧道由客户端主动建立,穿越 NAT 能力极强;支持加密和压缩,传输安全。
二、服务端部署 frps(VPS 端)
首先在 VPS 上安装 frp。从 GitHub Releases 下载对应架构的压缩包,Linux x86_64 服务器一般选 frp_0.61.0_linux_amd64.tar.gz:
# 下载并解压(版本号可到 GitHub Releases 查询最新) cd /opt wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz tar -zxvf frp_0.61.0_linux_amd64.tar.gz mv frp_0.61.0_linux_amd64 frp cd frp # 查看目录内容,服务端只需保留 frps 相关文件 ls -l # frpc frpc.toml frps frps.toml
frp 0.52 之后的版本配置文件改为 TOML 格式,编辑服务端配置 frps.toml:
# /opt/frp/frps.toml bindPort = 7000 # frps 与 frpc 通信端口 auth.method = "token" auth.token = "ReplaceWithStrongRandomToken" # 客户端连接凭据,务必修改 # 以下为 Web Dashboard 管理面板配置(可选) webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "admin" webServer.password = "ChangeThisPassword" # 日志 log.to = "/var/log/frps.log" log.level = "info" log.maxDays = 7
启动服务端并验证:
./frps -c frps.toml & sleep 2 ss -lntp | grep -E "7000|7500"
如果看到 7000 和 7500 端口在监听,说明服务端已就绪。实际生产环境建议使用 systemd 托管,详见下文"开机自启"一节。
三、客户端部署 frpc(内网机器)
在本地 Linux / Windows / macOS 上下载对应架构的 frp 包,保留 frpc 和 frpc.toml。编辑客户端配置,连接服务端并定义一个 SSH 穿透:
# frpc.toml serverAddr = "your-vps-public-ip" serverPort = 7000 auth.method = "token" auth.token = "ReplaceWithStrongRandomToken" # 必须与服务端一致 [[proxies]] name = "ssh-home" type = "tcp" localIP = "127.0.0.1" localPort = 22 # 本机 SSH 端口 remotePort = 6022 # VPS 上对外暴露的端口
./frpc -c frpc.toml
启动后,在任意地方执行 ssh -p 6022 user@你的VPS公网IP,流量就会经 VPS 转发到内网的 22 端口,实现远程 SSH 管理。
四、HTTP 域名穿透:让内网 Web 服务上线
frp 的 HTTP 代理可以把内网的 Web 服务映射到 VPS 的 80 端口,配合域名解析即可访问。先给 VPS 的 frps 配置虚拟主机端口:
# frps.toml 追加 vhostHTTPPort = 80
客户端添加 HTTP 类型代理:
[[proxies]] name = "web-nas" type = "http" localIP = "127.0.0.1" localPort = 8080 # 内网 Web 服务端口 customDomains = ["nas.example.com"] # 需要解析到 VPS 的域名
把 nas.example.com 的 A 记录解析到 VPS 公网 IP,随后浏览器访问 http://nas.example.com 即可看到内网服务。多个站点可以配置多个 HTTP 代理,frps 会根据 Host 头自动路由。
五、HTTPS 穿透:内网服务绑定正式证书
HTTP 明文不安全,HTTPS 穿透有两种方式:frps 终结 TLS(推荐)或 TCP 直通回源。
5.1 frps 终结 TLS(vhostHTTPSPort 模式)
# frps.toml 追加 vhostHTTPSPort = 443
客户端配置 HTTPS 代理并指向本地 HTTP 服务:
[[proxies]] name = "web-https" type = "https" customDomains = ["nas.example.com"] [proxies.plugin] type = "https2http" localAddr = "127.0.0.1:8080" crtPath = "/etc/letsencrypt/live/nas.example.com/fullchain.pem" keyPath = "/etc/letsencrypt/live/nas.example.com/privkey.pem"
证书用 acme.sh 或 certbot 签发(参考本站《Let's Encrypt 证书实战》),把证书文件放到 VPS 上即可。浏览器访问 https://nas.example.com 显示小绿锁,HTTPS 流量在 VPS 终结,内网链路走加密隧道。
5.2 TCP 透传(HTTPS 回源,内网自己持证)
[[proxies]] name = "web-tcp-443" type = "tcp" localIP = "127.0.0.1" localPort = 443 remotePort = 443 transport.proxyProtocolVersion = "v2" # 可选,透传真实客户端 IP
这种方式把 443 端口整体转发到内网,证书由内网 Web 服务自己处理,适合内网已有证书或需要内网持证的场景。
六、systemd 开机自启:服务崩溃自动拉起
写 systemd 服务单元,让 frps / frpc 开机自启并崩溃自动重启。服务端为例:
# /etc/systemd/system/frps.service [Unit] Description=frp Server After=network.target [Service] Type=simple ExecStart=/opt/frp/frps -c /opt/frp/frps.toml Restart=on-failure RestartSec=5s LimitNOFILE=1048576 [Install] WantedBy=multi-user.target
systemctl daemon-reload systemctl enable --now frps systemctl status frps journalctl -u frps -f # 实时查看日志
客户端按同样方式创建 frpc.service。注意 frpc 需要保持与 VPS 长连接,建议把 Restart=always 并把 RestartSec 设为 3-5 秒,避免频繁重连被服务端限流。
七、Dashboard 面板:实时查看隧道状态
前面配置了 webServer,浏览器访问 http://你的VPS:7500,用配置的账号密码登录,可以看到:
- 所有代理的在线状态、流量统计(In/Out)
- 客户端连接列表与版本号
- 历史连接记录与错误信息
Dashboard 是排错利器:某个隧道不通,先看面板里代理是否显示 online,再看 Error 列的错误码。
八、常见排错手册
8.1 客户端连不上服务端(日志报 connection refused)
journalctl -u frpc -n 50 | grep -i error
- 检查 VPS 防火墙:
firewall-cmd --add-port=7000/tcp --permanent && firewall-cmd --reload,或云控制台安全组放行 7000/6022/80/443/7500 端口。 - 确认
serverAddr是公网 IP 而非内网 IP。 - 确认 token 两端一致,不一致会报
token is incorrect。
8.2 隧道 online 但访问不通
- 内网服务只监听了 127.0.0.1:确认
localIP写的是服务实际监听地址。 - 本地防火墙拦截:检查内网机器
systemctl status firewalld。 - 端口冲突:
remotePort被 VPS 上其他进程占用,用ss -lntp确认。
8.3 HTTP 域名访问返回 404
检查域名是否解析到 VPS,以及 customDomains 是否写对。frps 按 Host 头路由,域名解析到别处或 Host 不匹配都会 404。
8.4 连接频繁断开(日志大量 timeout)
常见原因是客户端处于不稳定的 NAT 下。调大心跳间隔:
# frpc.toml 全局段 transport.heartbeatInterval = 30 transport.heartbeatTimeout = 90
九、安全加固建议
- 强 token:token 至少 32 位随机字符,用
openssl rand -base64 32生成。 - 限制来源:frps 支持
allowPorts白名单限制客户端可使用的远端端口。 - Dashboard 不暴露公网:7500 端口只绑定 127.0.0.1 或内网,需要管理时走 SSH 隧道访问。
- SSH 穿透别用 22 直曝:使用非标准端口并开启密钥登录 + fail2ban。
- frp 支持
transport.tls.enable加密隧道,公网环境建议开启:
# frps.toml 与 frpc.toml 同时配置 transport.tls.enable = true
总结
frp 是内网穿透领域事实标准,一条隧道解决 SSH 远程管理、Web 上线、HTTPS 绑定三大场景。记住四个关键点:服务端开端口、token 两端一致、systemd 托管保活、Dashboard 排错。生产环境务必开启 TLS 加密并设置强 token,让内网服务"安全地"触达公网。

