frp 内网穿透实战:服务端配置、客户端连接与 HTTPS 域名穿透全指南


<!DOCTYPE html>

frp 内网穿透实战:服务端配置、客户端连接与 HTTPS 域名穿透全指南

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,让内网服务"安全地"触达公网。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Linux 服务器时间同步实战:chrony 配置、NTP 原理与时间漂移排错

Nginx 反向代理进阶实战:WebSocket 代理、负载均衡与常见排错

评 论
更换验证码