当前位置: 首页 > news >正文

5分钟搞定frp内网穿透:从零配置到远程访问本地Web服务

5分钟搞定frp内网穿透:从零配置到远程访问本地Web服务

最近在帮一个朋友调试他本地开发的微信小程序后端,他抱怨每次给测试人员演示都要把代码部署到云服务器上,过程繁琐不说,还经常因为环境差异出问题。我随口提了句:“你直接用内网穿透,把本地服务暴露出去不就行了?”他一脸茫然,觉得这听起来像是需要复杂网络知识才能搞定的“高级操作”。其实不然,借助像frp这样的工具,整个过程可以简化到一杯咖啡的时间。对于独立开发者、运维新手,或者任何需要临时对外展示本地Web服务(比如开发中的网站、API接口、管理后台)的朋友来说,掌握一套快速、可靠的内网穿透方法,能极大提升开发和协作效率。今天,我们就抛开那些复杂的理论,聚焦最实用的HTTP/HTTPS服务穿透场景,手把手带你跑通一个最小化的可行配置。

1. 理解核心:为什么是frp,以及它如何工作

在深入配置之前,我们花一分钟理解下frp到底在做什么。想象一下,你的本地电脑(客户端)在一个有路由器保护的内部网络里,没有公网IP,外界无法直接找到你。而frp的方案,需要一台拥有公网IP的服务器(服务端,通常是一台云主机)作为“中转站”。

它的工作流程非常直观:

  1. 你的本地frp客户端主动向外连接公网服务器上的frp服务端,建立一个稳定的控制通道。因为是内网设备主动“出访”,所以绕过了路由器或防火墙的入站限制。
  2. 当外部用户想要访问你的本地服务时,他实际上访问的是公网服务器的某个特定端口。
  3. 公网服务器上的frp服务端收到请求后,通过之前建立好的通道,将请求“转发”给你的本地frp客户端。
  4. 本地frp客户端再将请求送达你本地运行的Web服务(比如运行在localhost:8080的Spring Boot应用),获取响应后,再原路返回给外部用户。

整个过程,对于外部访问者而言,他感觉就是在直接访问一个公网IP上的服务;对于你的本地服务而言,它只是在接收来自127.0.0.1的连接。frp完美地扮演了“信使”和“翻译官”的角色。

提示:这种模式常被称为“反向代理”或“端口映射”。frp的轻量、高性能和配置简单,使其在众多同类工具中脱颖而出,特别适合临时性、开发调试类的场景。

2. 五分钟实战:服务端与客户端配置详解

理论清晰后,我们进入最关键的实操环节。请确保你已准备:

  • 一台公网服务器:拥有独立公网IP,系统推荐Linux(如Ubuntu 20.04+)。这里假设其公网IP为123.123.123.123
  • 一台本地开发机:可以是Windows、macOS或Linux,能运行frp客户端程序。
  • 一个本地Web服务:例如在localhost:8080运行的Node.js应用。

2.1 第一步:公网服务器部署frp服务端(约2分钟)

首先,登录你的公网服务器。我们将通过命令行快速完成部署。

1. 下载并解压frp访问frp的GitHub Releases页面,获取最新稳定版的Linux压缩包。这里以amd64架构为例:

# 创建一个专用目录并进入 mkdir -p /opt/frps && cd /opt/frps # 下载最新版本(请替换为实际版本号) wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz # 解压 tar -zxvf frp_0.52.3_linux_amd64.tar.gz # 进入解压后的目录 cd frp_0.52.3_linux_amd64

解压后你会看到几个关键文件,我们只需要关注服务端相关的:

  • frps:服务端可执行程序
  • frps.toml:服务端配置文件(新版本已改用TOML格式,更清晰)

2. 编写最小化服务端配置使用vimnano编辑frps.toml文件:

vim frps.toml

将内容修改为如下配置。这是一个极度精简但功能完整的配置,专注于HTTP穿透:

bindPort = 7000 auth.token = "your_secure_token_here" webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "admin" webServer.password = "admin_password" # 用于HTTP类型代理的端口 vhostHTTPPort = 8080 # 用于HTTPS类型代理的端口 vhostHTTPSPort = 8443

配置参数解读:

参数值示例说明
bindPort7000核心端口。客户端通过此端口连接服务端,建立控制通道。必须开放。
auth.token自定义字符串认证令牌。用于客户端和服务端之间的身份验证,增强安全性。
webServer.port7500仪表盘端口。可通过浏览器访问http://服务器IP:7500查看连接状态和统计信息。
vhostHTTPPort8080HTTP代理端口。当客户端配置type = http时,外部用户将通过访问服务器IP的这个端口来访问你的本地服务。

3. 启动服务端并设置自启在frp目录下,以后台方式启动服务:

./frps -c ./frps.toml &

为了确保服务器重启后frp能自动运行,我们可以创建一个简单的systemd服务。创建文件/etc/systemd/system/frps.service

[Unit] Description=Frp Server Service After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/opt/frps/frp_0.52.3_linux_amd64/frps -c /opt/frps/frp_0.52.3_linux_amd64/frps.toml [Install] WantedBy=multi-user.target

然后启用并启动服务:

sudo systemctl daemon-reload sudo systemctl enable frps sudo systemctl start frps sudo systemctl status frps # 检查运行状态

至此,服务端已在公网服务器上就绪。别忘了在服务器的防火墙(如ufw或安全组)中放行700075008080端口。

2.2 第二步:本地机器配置frp客户端(约2分钟)

现在回到你的本地开发机。操作逻辑类似,但我们是配置客户端。

1. 下载对应系统的frp客户端根据你的本地系统,从GitHub Releases页面下载对应的压缩包。例如,在Windows上,下载frp_0.52.3_windows_amd64.zip;在macOS上,下载frp_0.52.3_darwin_amd64.tar.gz。解压到任意目录,例如C:\frp~/frp

2. 编写客户端配置文件在解压目录中,找到frpc.toml文件,用文本编辑器打开。我们将配置一个最常见的场景:暴露本地的HTTP Web服务。

serverAddr = "123.123.123.123" serverPort = 7000 auth.token = "your_secure_token_here" [[proxies]] name = "web-localhost" type = "http" localIP = "127.0.0.1" localPort = 8080 customDomains = ["dev.yourdomain.com"] # 如果你有域名并已解析到服务器IP # 如果没有域名,使用下面这行替代 customDomains # remotePort = 8080 # 直接使用服务端的vhostHTTPPort

关键配置解析:

  • serverAddr:填写你的公网服务器IP。
  • auth.token:必须与服务端配置的token完全一致。
  • [[proxies]]:定义一个代理规则。name可自定义。
  • type = "http":指定为HTTP协议代理,这将使用服务端的vhostHTTPPort
  • localPort:你的本地Web服务实际监听的端口(例如localhost:8080)。
  • 关于域名
    • 如果你有域名(如dev.yourdomain.com)并已将其A记录解析到公网服务器IP,就使用customDomains。这样外部用户访问http://dev.yourdomain.com:8080即可。
    • 如果你没有域名,需要修改服务端和客户端配置。首先,在服务端frps.toml中,将vhostHTTPPort = 8080注释掉或删除,改为使用tcpmux或直接使用bindPort之外的另一个端口进行TCP转发(更简单的方式是使用type = “tcp”,见下文备选方案)。更常见的无域名简易做法是使用TCP代理。

3. 无域名情况下的备选TCP配置对于快速测试或没有域名的情况,使用TCP代理更直接。修改客户端配置如下:

serverAddr = "123.123.123.123" serverPort = 7000 auth.token = "your_secure_token_here" [[proxies]] name = "web-tcp" type = "tcp" localIP = "127.0.0.1" localPort = 8080 remotePort = 6000 # 在公网服务器上开放的一个新端口

同时,确保公网服务器的防火墙开放了6000端口。这样,外部用户直接访问http://123.123.123.123:6000就能映射到你的localhost:8080

4. 启动客户端在命令行中,进入frp解压目录,执行:

  • Windows (PowerShell):
    .\frpc.exe -c .\frpc.toml
  • macOS/Linux:
    ./frpc -c ./frpc.toml

如果看到“start proxy success”或类似的成功连接信息,恭喜你,最核心的穿透链路已经打通了!

3. 进阶技巧与安全加固

基础通道建立后,我们来看看如何让它更好用、更安全。frp的配置非常灵活,以下几个技巧能应对更复杂的场景。

3.1 使用自定义域名与HTTPS支持

拥有域名能提供更专业的访问体验。假设你已拥有域名example.com,并希望用test.example.com来访问本地服务。

  1. 域名解析:在你的域名DNS管理后台,为test.example.com添加一条A记录,指向你的公网服务器IP123.123.123.123
  2. 服务端配置:无需特殊改动,确保vhostHTTPPortvhostHTTPSPort已定义。
  3. 客户端配置:在frpc.toml的代理规则中,正确设置customDomains
    [[proxies]] name = “web-dev” type = “http” localIP = “127.0.0.1” localPort = 3000 customDomains = [“test.example.com”]
  4. 访问:现在,任何人访问http://test.example.com:8080(端口取决于你的vhostHTTPPort)都会指向你的本地服务。

启用HTTPS:如果你的本地服务是HTTPS的,或者你想在frp层面终止HTTPS(让frp服务端处理SSL证书),配置也类似。你需要将证书文件上传到服务器,并在服务端配置中指定证书路径。对于开发测试,更常见的做法是让本地服务运行HTTP,然后通过云服务商(如Nginx)或CDN来添加HTTPS层。

3.2 提升安全性的几个关键点

将内网服务暴露到公网,安全是首要考虑。除了使用强token外,还有以下措施:

  • 限制客户端IP:在服务端frps.toml中,可以设置allowPorts来精细控制哪些客户端IP可以连接哪些远程端口,但这需要静态IP。更通用的方法是利用云服务器的安全组或系统防火墙(如iptablesufw),严格限制只有可信IP能访问7000(控制端口)、7500(仪表盘)和业务端口(如8080)。
  • 仪表盘访问控制:务必修改默认的dashboard_userdashboard_password,并使用强密码。甚至可以只监听127.0.0.1webServer.addr = “127.0.0.1”),然后通过SSH隧道来访问管理界面,这样仪表盘完全不对外暴露。
  • 定期更新:关注frp的GitHub发布页,及时更新到新版本,修复潜在的安全漏洞。

3.3 客户端后台运行与开机自启

总不能一直开着个命令行窗口。让客户端在后台稳定运行:

  • Linux/macOS:可以使用nohupsystemd(与服务器端配置类似)。
    nohup ./frpc -c ./frpc.toml > frpc.log 2>&1 &
  • Windows:可以将其注册为系统服务。使用sc命令或借助NSSM(Non-Sucking Service Manager)这类工具,可以非常方便地将任何exe程序安装为服务。以管理员身份运行命令提示符,使用NSSM:
    # 假设nssm.exe和frpc.exe在同目录 nssm install FrpClient “C:\frp\frpc.exe” “-c C:\frp\frpc.toml” nssm start FrpClient

4. 排错指南与性能调优

即使按照步骤操作,偶尔也会遇到连接失败的问题。这里有一个快速排错清单:

  1. “连接服务器失败”

    • 检查服务器IP和端口:确认serverAddrserverPort(7000) 无误。
    • 检查服务器防火墙/安全组:确保公网服务器的7000端口已对客户端IP开放。可以用telnet 服务器IP 7000或在线端口检测工具测试。
    • 检查token:确认客户端和服务端的auth.token完全一致,包括大小写。
  2. “访问公网地址超时或拒绝连接”

    • 检查业务端口:确认服务端的vhostHTTPPort(如8080) 或TCP代理的remotePort(如6000) 已在防火墙/安全组中开放。
    • 检查客户端代理规则:确认localIPlocalPort正是你本地运行Web服务的地址和端口。可以在本地用浏览器访问http://127.0.0.1:8080测试服务本身是否正常。
    • 检查域名解析:如果用了域名,用pingnslookup命令检查域名是否已正确解析到服务器IP。
  3. 服务不稳定,偶尔断开

    • 可能是网络波动。可以在服务端和客户端配置中增加心跳和重连参数,提升稳定性。
    # 在客户端配置的[common]部分添加 transport.heartbeatInterval = 30 transport.heartbeatTimeout = 90 transport.dialServerTimeout = 10 transport.connectServerTimeout = 10

性能方面,对于开发测试和小流量访问,默认配置完全足够。如果遇到高并发场景,可以考虑:

  • 在服务端frps.toml中调整transport.tcpMux相关参数,启用连接复用。
  • 根据服务器性能,适当调整transport.maxPoolCount(连接池大小)。
  • 确保公网服务器的带宽和资源充足,瓶颈往往在这里。

整个配置过程,从下载软件到成功访问,核心步骤其实就在那关键的几分钟。frp的魅力就在于它的直接和高效,没有冗余功能,直击内网穿透的痛点。我自己的开发机上就常驻着一个frp客户端,配置了好几个不同端口的代理规则,对应着不同的本地项目。需要给同事演示哪个,就启动对应的代理,演示完随手一关,既方便又安全。这种掌控感,是依赖第三方穿透工具所无法比拟的。如果你在配置过程中卡在了某一步,多半是网络权限或某个参数拼写的问题,回头仔细核对一下,成功就在眼前。

http://www.jsqmd.com/news/474945/

相关文章:

  • 构建无限免费的AI编程伙伴:VSCode + Roo Code + Gemini Balance负载均衡策略详解
  • Netty实战:HttpObjectAggregator如何解决HTTP分块传输的烦恼?
  • 构建低代码平台:通过 Dify 将 Flux Sea Studio 能力封装为可视化 AI 工作流
  • 保姆级教程:神州数码交换机/路由器/防火墙串口恢复出厂设置全攻略(附SecureCRT配置)
  • 小白也能玩转CVPR模型:MogFace人脸检测工具部署实录
  • Composition-RL: Compose Your Verifiable Prompts for Reinforcement Learning of Large Language Models
  • 避坑指南:用Python的OP模块开发游戏脚本时遇到的5个常见问题
  • 从零理解NP-Hard:程序员如何用近似算法搞定这些‘不可能’问题?
  • ChatGPT登录失败问题深度解析:从诊断到修复的实战指南
  • 【TJXT】Day 12
  • python入门基础练习
  • 从平面到立体:ArcGIS Pro与Aerialod协同打造三维夜间灯光分布图
  • 手把手教你开发游戏派单小程序:从注册登录到财务对账的完整配置流程
  • 实时对比展示:伏羲AI模型、欧洲中心ECMWF及美国GFS全球预报效果
  • 万维网30年进化史:从HTTP/1.0到HTTP/3的底层协议变革
  • 学习笔记-计算机存储与数据表示基础
  • 为什么你的UVM重载不生效?详解factory机制4大必备条件(附排查清单)
  • ChatGPT显示Unable to Load Site错误:诊断与修复指南
  • 从CANoe到TSMaster:资深工程师的汽车软件工具链进阶实战指南
  • 【技术解析】Mask2Former:基于掩码注意力的通用图像分割新范式
  • 避坑指南:HyperMesh四面体网格划分失败的7个常见原因及修复方法(附错误案例)
  • 文墨共鸣大模型SolidWorks设计文档智能分析与摘要生成
  • 【C语言简明教程提纲】(三):字符串与编译预处理
  • 【OpenClaw】Edict 三省六部制使用与实战流程
  • Tao-8k模型API调用异常处理大全:从403 Forbidden到连接超时
  • 从R到Posit:数据科学家的现代统计计算环境全解析
  • Xray实战指南:从零构建自动化Web漏洞扫描体系
  • 乐鑫Wi-Fi模组量产测试:信号板方案原理与工程落地
  • 数据中心网络工程师必备:BGP与VXLAN EVPN协同配置全解析
  • ESP32-S3-WROOM-1与WROOM-1U模组硬件解析与工程落地指南