AI摘要

使用frp搭建高性能内网穿透服务的详细教程,包括服务器端和客户端配置、宝塔面板反向代理设置以及常见问题排查。

前言

这篇教程是用XAMPP已经在本地搭建好了Typecho博客网站,除了用花生壳,也可以用更好的frp做内网穿透,此篇教程就是使用frp搭建高性能内网穿透服务。

一、准备工作

1.1 所需资源

  • 一台具有公网IP的服务器(已安装宝塔面板)
  • 域名(可选,用于通过域名访问服务)
  • 本地环境(运行Web服务的计算机)

1.2 了解frp工作原理

frp分为服务端(frps)和客户端(frpc)两部分:

  • 服务端(frps):部署在公网服务器上
  • 客户端(frpc):部署在本地需要穿透的设备上

1.3 域名与DNS解析(指向同一IP)

  • 将要对外提供访问的域名(如:www.example.com)添加一条 A 记录,指向 frps 所在服务器的公网IP(即宝塔所在服务器IP)。
  • 同一台服务器可承载多个域名,均需指向同一公网IP。
  • 常用验证方式:

    • 在本地终端执行:nslookup www.example.comping www.example.com,确认解析到的IP与服务器公网IP一致。
    • 解析生效后再进行后续的Nginx配置与证书申请。

二、服务器端配置

2.1 安装与版本说明

  • 首选方式(推荐):在宝塔软件商店中安装并开启「frp管理器 1.1」。该管理器可一键完成服务端安装、版本选择、配置与启动,适合快速部署与可视化管理。
  • 可选方式(手动):从 GitHub 发布页下载对应平台的 frp 二进制包,解压并通过 systemd 方式托管运行(适合有Linux基础的用户)。
  • 重要版本提示:自 v0.51.0 起,frp 配置文件已由 INI 切换为 TOML 格式。请确保服务端与客户端均使用 TOML,并注意版本匹配。

2.2 配置frps服务端

  • 进行服务配置,这些是默认的端口,需要在防火墙中打开
    frp管理器-服务端端口配置
  • 进行WEB服务配置,设置好用户名和密码,此默认端口也要打开
    frp管理器-Web管理配置
  • 进行token设置
    frp管理器-Token设置
  • 最后,开启服务,并下载此客户端frp
    frp管理器-启动与客户端下载
  • 注意事项:

    • kcpBindPort 不应与 bindPort 相同,建议分配为不同端口(如 bindPort=15443kcpBindPort=15444)。
    • vhostHTTPPort/vhostHTTPSPort 为 frps 内部的虚拟主机端口,通常通过 Nginx 80/443 反向代理至此端口对外提供服务。
    • auth.token 为客户端鉴权必须一致的密钥,修改后需重启 frps 并同步更新客户端。

2.4 配置防火墙

确保服务器防火墙开放了必要的端口:

# 根据frps.toml中的配置开放以下端口
firewall-cmd --permanent --add-port=15443/tcp  # bindPort
firewall-cmd --permanent --add-port=15444/udp  # kcpBindPort
firewall-cmd --permanent --add-port=18080/tcp  # vhostHTTPPort
firewall-cmd --permanent --add-port=18443/tcp  # vhostHTTPSPort
firewall-cmd --permanent --add-port=16337/tcp  # tcpmuxHTTPConnectPort
firewall-cmd --permanent --add-port=7001/tcp   # webServer端口
firewall-cmd --permanent --add-port=80/tcp     # HTTP标准端口
firewall-cmd --reload

三、客户端配置

3.1 下载frp客户端

在您本地计算机上,下载与服务器端相同版本的frp:

  • 可以下载宝塔中给出的0.53.2版本
  • Windows用户:从GitHub下载对应的64位 X86Windows版本,本教程为第一个
    frp GitHub发布页-Windows amd64 下载
  • 下载后解压到一个方便的位置,如D:\frp

3.2 配置frpc客户端(TOML格式)

在frp文件夹中创建/编辑frpc.toml文件(注意:不是frpc.ini),内容如下:

# frpc.toml

# 基本配置 - 连接到服务器
serverAddr = "服务器公网IP"
serverPort = 15443  # 必须与frps.toml中的bindPort一致

# 认证token,必须与服务器端一致
auth.token = "与服务器端相同的令牌"

# 代理规则配置
[[proxies]]
name = "web-site"      # 名称可自定义
type = "http"          # 协议类型
localIP = "127.0.0.1"  # 本地服务IP
localPort = 80         # 本地服务端口
customDomains = ["www.example.com"]  # 您的域名(需已解析到与frps同一IP)
提示:customDomains 中的域名需与 1.3 小节配置的 A 记录一致,且已生效。

3.3 启动frpc客户端

创建一个批处理文件start_frpc.bat

@echo off
cd /d %~dp0
frpc.exe -c frpc.toml
pause

Windows启动脚本示例-start_frpc.bat
双击此文件运行客户端。

成功时,您会看到类似以下输出,即链接成功:

[I] login to server success, get run id [xxxxxxxxxxxx]
[I] proxy added: [web-site]
[I] [web-site] start proxy success

frpc连接成功日志示例

3.4 frpc.exe文件自动消失处理办法(可选)

这是由于windows安全中心自动清除威胁文件导致的。

  • 在病毒威胁防护设置 -> 管理设置 -> 添加排除项
    Windows安全中心-病毒威胁防护设置
    Windows安全中心-添加排除项选择
    Windows安全中心-排除项已添加

四、宝塔面板配置反向代理

4.1 创建站点

  1. 登录宝塔面板
  2. 点击左侧菜单中的【网站】
  3. 点击【添加站点】
  4. 填写以下信息:

    • 域名:填入您要使用的域名(如www.example.com)
    • FTP:选择【不创建】
    • 数据库:选择【不创建】
    • PHP版本:选择【纯静态】
      宝塔面板-添加站点
  5. 点击【提交】

4.2 修改Nginx配置

  1. 在网站列表中,找到刚创建的站点,点击【设置】
  2. 选择左侧菜单的【配置文件】
  3. 将现有内容完全替换为以下配置(注意替换域名):
server
{
    listen 80;
    listen [::]:80;
    server_name www.example.com;  # 替换为您的域名
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/www.example.com;  # 保持不变
    #CERT-APPLY-CHECK--START
    # 用于SSL证书申请时的文件验证相关配置 -- 请勿删除
    include /www/server/panel/vhost/nginx/well-known/www.example.com.conf;
    #CERT-APPLY-CHECK--END

    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    #SSL-END

    #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
    error_page 404 /404.html;
    #error_page 502 /502.html;
    #ERROR-PAGE-END

    # 核心反向代理配置 - 将请求转发到frps
    location / {
        proxy_pass http://127.0.0.1:18080;  # 对应frps.toml中的vhostHTTPPort
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
    include /www/server/panel/vhost/rewrite/www.example.com.conf;
    #REWRITE-END

    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }

    #一键申请SSL证书验证目录相关设置 (保持不变)
    location ~ \.well-known{
        allow all;
    }

    #禁止在证书验证目录放入敏感文件
    if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
        return 403;
    }

    access_log  /www/wwwlogs/www.example.com.log;
    error_log  /www/wwwlogs/www.example.com.error.log;

    #Monitor-Config-Start 网站监控报表日志发送配置
    access_log syslog:server=unix:/tmp/bt-monitor.sock,nohostname,tag=6__access monitor;
    error_log syslog:server=unix:/tmp/bt-monitor.sock,nohostname,tag=6__error;
    #Monitor-Config-End
}
  1. 点击【保存】
  2. 回到软件商店,找到【Nginx】,点击【设置】,再点击【重载配置】

4.3 配置SSL证书(可选)

  1. 在站点设置中,点击【SSL】
  2. 选择【Let's Encrypt】
  3. 选择验证方式为【文件验证】
  4. 勾选您的域名,点击【申请】
  5. 证书申请成功后会自动配置HTTPS(可选择强制HTTPS或保留HTTP)

4.4 域名与访问验证(必做)

  • 确认域名解析:nslookup www.example.com 或在宝塔面板/域名商DNS控制台确认 A 记录已指向 frps 所在服务器IP。
  • 通道自检:先访问 http://www.example.com:18080/(直接到达 frps 的 vhostHTTPPort)。若能看到站点内容,说明 frp 穿透链路正常。
  • 入口自检:再访问 http://www.example.com/(通过Nginx的80端口反代转发至 frps)。若能正常显示,说明反向代理配置生效。
  • 如 18080 可访问而 80 不可访问,多半为 Nginx 站点未正确配置为反代或未重载配置;如两者均不可访问,优先检查 frpc 连接状态与 auth.token 一致性。

4.5 访问网站

成功

五、常见问题排查

5.1 frpc报错:"error unmarshaling JSON"

问题原因:frp从v0.51.0开始,配置文件格式从INI改为TOML。

解决方法

  1. 确保使用正确的配置文件(.toml而不是.ini
  2. 检查配置语法是否符合TOML格式规范

5.2 frpc报错:"token in login doesn't match token from configuration"

问题原因:客户端与服务器的token不一致。

解决方法

  1. 仔细核对服务端和客户端配置中的token是否完全一致
  2. 重启服务器端frps服务:systemctl restart frps
  3. 重新启动客户端

5.3 网站显示"The page you requested was not found"

问题原因1:frpc客户端未运行或已断开。

解决方法

  1. 检查客户端命令行窗口是否仍在运行
  2. 重新启动frpc客户端
  3. 检查是否有成功连接的日志信息

问题原因2:域名与frpc配置不匹配。

解决方法

  1. 确保frpc.toml中的customDomains与实际访问域名完全一致
  2. 检查大小写和子域名

5.4 访问域名时显示404或"找不到网页"

问题原因:宝塔面板的Nginx配置未正确设置反向代理。

解决方法

  1. 检查Nginx配置文件中是否包含正确的location / {...}反向代理块
  2. 确保proxy_pass指向的端口与frps.toml中的vhostHTTPPort一致
  3. 重载Nginx配置:在宝塔面板中点击【软件商店】→【Nginx】→【设置】→【重载配置】

5.5 网站可以访问但样式错乱

问题原因:后端网站不知道自己通过什么域名被访问。

解决方法
确保Nginx配置中包含以下头信息传递:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

六、高级应用(可选)

6.1 将frpc设置为Windows服务

使用NSSM工具将frpc设置为自启动服务:

  1. 下载NSSM
  2. 解压后,以管理员身份运行命令提示符
  3. 执行以下命令:

    cd 路径到nssm解压目录\win64
    nssm install frpc
  4. 在弹出的窗口中:

    • Path:选择frpc.exe的路径
    • Startup directory:选择frpc所在目录
    • Arguments:填写-c frpc.toml
  5. 点击"Install service"
  6. 启动服务:nssm start frpc

6.2 多域名与子域名配置

在frpc.toml中可以配置多个域名或子域名:

# 主站点
[[proxies]]
name = "web-main"
type = "http"
localIP = "127.0.0.1"
localPort = 80
customDomains = ["www.example.com"]

# 管理后台(指向同一本地端口,但使用不同域名区分)
[[proxies]]
name = "web-admin"
type = "http"
localIP = "127.0.0.1"
localPort = 80
customDomains = ["admin.example.com"]

结语

通过以上配置,您已成功搭建了一个完整的内网穿透服务,可以安全地将本地网站发布到公网。宝塔面板的图形化界面简化了服务器端的配置过程,同时保留了申请SSL证书等功能。

与商业内网穿透服务相比,自建frp服务不仅没有带宽限制,还提供了更高的定制灵活性和安全性。虽然初始配置略显复杂,但完成后您将拥有一个稳定可靠的内网穿透解决方案,完全由自己掌控。

记住:frp客户端必须保持运行,才能确保内网穿透服务的持续可用。建议将客户端配置为系统服务,实现开机自启动。

最后修改:2025 年 08 月 08 日
如果觉得我的文章对你有用,请随意赞赏
END
本文作者:
文章标题:使用frp搭建高性能内网穿透服务(结合XAMPP和宝塔面板)
本文地址:https://blog.ybyq.wang/archives/855.html
版权说明:若无注明,本文皆Xuan's blog原创,转载请保留文章出处。