AI摘要
前言
这篇教程是用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.com
或ping 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服务端
- 进行服务配置,这些是默认的端口,需要在防火墙中打开
- 进行WEB服务配置,设置好用户名和密码,此默认端口也要打开
- 进行token设置
- 最后,开启服务,并下载此客户端frp
注意事项:
kcpBindPort
不应与bindPort
相同,建议分配为不同端口(如bindPort=15443
,kcpBindPort=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位 X86
Windows版本,本教程为第一个 - 下载后解压到一个方便的位置,如
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
双击此文件运行客户端。
成功时,您会看到类似以下输出,即链接成功:
[I] login to server success, get run id [xxxxxxxxxxxx]
[I] proxy added: [web-site]
[I] [web-site] start proxy success
3.4 frpc.exe文件自动消失处理办法(可选)
这是由于windows安全中心自动清除威胁文件导致的。
- 在病毒威胁防护设置 -> 管理设置 -> 添加排除项
四、宝塔面板配置反向代理
4.1 创建站点
- 登录宝塔面板
- 点击左侧菜单中的【网站】
- 点击【添加站点】
填写以下信息:
- 域名:填入您要使用的域名(如www.example.com)
- FTP:选择【不创建】
- 数据库:选择【不创建】
- PHP版本:选择【纯静态】
- 点击【提交】
4.2 修改Nginx配置
- 在网站列表中,找到刚创建的站点,点击【设置】
- 选择左侧菜单的【配置文件】
- 将现有内容完全替换为以下配置(注意替换域名):
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
}
- 点击【保存】
- 回到软件商店,找到【Nginx】,点击【设置】,再点击【重载配置】
4.3 配置SSL证书(可选)
- 在站点设置中,点击【SSL】
- 选择【Let's Encrypt】
- 选择验证方式为【文件验证】
- 勾选您的域名,点击【申请】
- 证书申请成功后会自动配置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。
解决方法:
- 确保使用正确的配置文件(
.toml
而不是.ini
) - 检查配置语法是否符合TOML格式规范
5.2 frpc报错:"token in login doesn't match token from configuration"
问题原因:客户端与服务器的token不一致。
解决方法:
- 仔细核对服务端和客户端配置中的token是否完全一致
- 重启服务器端frps服务:
systemctl restart frps
- 重新启动客户端
5.3 网站显示"The page you requested was not found"
问题原因1:frpc客户端未运行或已断开。
解决方法:
- 检查客户端命令行窗口是否仍在运行
- 重新启动frpc客户端
- 检查是否有成功连接的日志信息
问题原因2:域名与frpc配置不匹配。
解决方法:
- 确保frpc.toml中的customDomains与实际访问域名完全一致
- 检查大小写和子域名
5.4 访问域名时显示404或"找不到网页"
问题原因:宝塔面板的Nginx配置未正确设置反向代理。
解决方法:
- 检查Nginx配置文件中是否包含正确的
location / {...}
反向代理块 - 确保
proxy_pass
指向的端口与frps.toml中的vhostHTTPPort
一致 - 重载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设置为自启动服务:
- 下载NSSM
- 解压后,以管理员身份运行命令提示符
执行以下命令:
cd 路径到nssm解压目录\win64 nssm install frpc
在弹出的窗口中:
- Path:选择frpc.exe的路径
- Startup directory:选择frpc所在目录
- Arguments:填写
-c frpc.toml
- 点击"Install service"
- 启动服务:
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客户端必须保持运行,才能确保内网穿透服务的持续可用。建议将客户端配置为系统服务,实现开机自启动。