ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零搭建FRP内网穿透服务:实现外网访问内网应用

从零搭建FRP内网穿透服务:实现外网访问内网应用 大家好我是专注于分享实用技术干货的博主。在开发测试、远程调试或搭建个人服务时我们常常会遇到一个经典难题如何让处于公司或家庭内网中的服务能被外网直接访问无论是想展示一个本地开发的Web项目还是需要远程连接家中的NAS或树莓派内网穿透都是绕不开的关键技术。市面上虽有众多商业工具但自建方案往往更灵活、可控且免费。本文将围绕FRP (Fast Reverse Proxy)这款开源神器手把手带你从零搭建一套免费、稳定、高性能的内网穿透服务涵盖服务端部署、客户端配置、多协议支持及安全加固全流程让你彻底掌握这项核心技能。1. 内网穿透核心概念与FRP简介在深入实操之前我们有必要厘清几个核心概念理解FRP究竟解决了什么问题。1.1 什么是内网穿透想象一下你的个人电脑或开发服务器位于一个局域网比如公司的办公网络或家里的路由器后面它拥有一个内网IP地址如192.168.1.100。这个地址在公网互联网上是无法被直接寻址的。内网穿透技术就是通过一台拥有公网IP的服务器作为“桥梁”将公网的请求“转发”到内网的目标机器上从而实现外网访问内网服务。常见应用场景包括远程办公与开发访问公司内网的OA、GitLab、测试环境。智能家居与物联网远程管理家中的NAS、监控摄像头、树莓派服务器。微信/小程序开发本地开发调试需要公网可访问的回调地址。游戏联机或私有服务搭建Minecraft等游戏的私人服务器供朋友访问。演示与测试向客户或同事临时展示运行在本地的Web项目。1.2 为什么选择FRPFRP是一个专注于内网穿透的高性能反向代理应用使用Go语言编写。与其他工具相比它的优势非常明显开源免费代码托管于GitHub完全免费使用和修改。配置灵活支持TCP、UDP、HTTP、HTTPS等多种协议可满足绝大部分需求。高性能与低延迟得益于Go语言的并发特性转发效率很高。跨平台提供Windows、Linux、macOS、ARM等全平台客户端适配各种设备。社区活跃遇到问题容易找到解决方案和社区支持。FRP的核心角色服务端 (frps)部署在具有公网IP的服务器上如云服务器负责接收外网请求并与内网客户端保持连接。客户端 (frpc)部署在内网需要被访问的设备上主动连接到服务端并告知服务端需要转发哪些端口的流量。简单来说FRP的工作原理是内网的frpc主动连接到公网的frps建立一个稳定的通道。当外部用户访问frps的某个端口时frps会通过这个通道将请求转发给内网的frpcfrpc再将请求送达内网中真正的服务如Web服务器最后将响应原路返回。2. 环境准备与资源规划在开始部署前我们需要准备好相应的软硬件环境并做好规划。2.1 所需资源清单一台具有公网IP的服务器这是FRP服务端frps的宿主机。你可以使用阿里云、腾讯云、华为云等提供的云服务器ECS最低配置如1核1G即可满足学习和轻度使用。确保服务器的安全组/防火墙放行了后续需要用到的端口。一台或多台内网设备这是你需要被访问的电脑、开发机、NAS等将运行FRP客户端frpc。一个域名可选但推荐如果你需要通过HTTP/HTTPS访问Web服务并希望使用自定义域名如dev.yourname.com则需要准备一个已备案的域名。对于TCP/UDP转发域名不是必须的。2.2 版本与系统选择FRP版本我们将使用其GitHub发布页面的最新稳定版。本文以frp_0.54.0版本为例原理适用于其他版本。服务端系统以最常用的Linux (Ubuntu 20.04/CentOS 7)为例。客户端系统我们将分别演示Windows和Linux客户端的配置。重要提示下载时请注意区分amd64和arm64架构。amd64适用于绝大多数Intel和AMD的桌面、服务器CPU。arm64适用于树莓派4B、苹果M系列芯片、以及一些轻量级服务器。 你可以通过命令uname -m或arch来查看自己设备的架构。3. 服务端 (frps) 部署与配置我们的第一步是在公网服务器上安装并配置FRP服务端。3.1 下载与安装FRP通过SSH连接到你的云服务器执行以下命令# 创建一个专用的frp目录 mkdir -p /opt/frp cd /opt/frp # 下载最新版本的frp请前往GitHub Release页面确认最新版本号 # 以 v0.54.0 linux amd64 为例 wget https://github.com/fatedier/frp/releases/download/v0.54.0/frp_0.54.0_linux_amd64.tar.gz # 解压下载的文件 tar -zxvf frp_0.54.0_linux_amd64.tar.gz # 进入解压后的目录 cd frp_0.54.0_linux_amd64/解压后你会看到一系列文件其中frps/frps.exe服务端可执行程序。frpc/frpc.exe客户端可执行程序。frps.ini/frps_full.ini服务端配置文件示例。frpc.ini/frpc_full.ini客户端配置文件示例。3.2 配置服务端 (frps.ini)服务端的核心配置文件是frps.ini。我们创建一个最小化但功能完整的配置# frps.ini [common] # frp服务端监听的端口客户端通过这个端口连接服务端 bind_port 7000 # 用于仪表盘的端口可以通过浏览器查看frp状态 dashboard_port 7500 # 仪表盘的登录用户名和密码 dashboard_user admin dashboard_pwd your_strong_password_here # 用于HTTP/HTTPS类型代理监听的端口如果不需要Web服务可注释 vhost_http_port 8080 vhost_https_port 8443 # 身份验证令牌用于增强安全性客户端配置需与此一致 token your_secret_token_here # 最大连接池大小根据客户端数量调整 max_pool_count 50 # 日志记录配置 log_file ./frps.log log_level info log_max_days 3关键参数解释bind_port这是FRP的核心通信端口必须开放如云服务器安全组开放TCP:7000。dashboard_port管理面板端口方便查看连接状态建议设置并做好访问限制。token强烈建议设置一个复杂的令牌这是服务端和客户端之间的“暗号”防止未经授权的客户端连接。vhost_http_port当你想通过域名访问内网多个Web服务时用到FRP会根据HTTP请求头中的Host字段来区分转发到哪个客户端。3.3 启动服务端并设置开机自启配置完成后我们可以先在前台测试启动# 在frp目录下执行 ./frps -c ./frps.ini如果看到“frps started successfully”之类的日志说明服务端启动成功。按CtrlC可以停止。为了长期稳定运行我们需要将其配置为系统服务。对于使用 systemd 的系统如Ubuntu 20.04, CentOS 7创建systemd服务文件sudo vim /etc/systemd/system/frps.service写入以下内容注意修改ExecStart和User的路径[Unit] DescriptionFrp Server Service Afternetwork.target [Service] Typesimple Usernobody Restarton-failure RestartSec5s ExecStart/opt/frp/frp_0.54.0_linux_amd64/frps -c /opt/frp/frp_0.54.0_linux_amd64/frps.ini [Install] WantedBymulti-user.target重新加载systemd配置并启动、启用服务sudo systemctl daemon-reload sudo systemctl start frps sudo systemctl enable frps # 设置开机自启 sudo systemctl status frps # 查看运行状态现在FRP服务端已经在你的公网服务器上持续运行了。你可以通过http://你的服务器IP:7500并使用配置的用户名密码访问仪表盘。4. 客户端 (frpc) 配置实战服务端就绪后接下来在内网设备上配置客户端。我们将以两个最典型的场景为例SSH远程连接和本地Web服务穿透。4.1 基础准备下载与配置模板首先在内网机器上下载对应平台的FRP客户端。以Windows为例从GitHub Release页面下载frp_0.54.0_windows_amd64.zip并解压。Linux客户端下载方式同服务端。客户端的核心配置文件是frpc.ini。我们先创建一个包含公共配置的模板# frpc.ini - 公共部分 [common] # 公网FRP服务端的地址和端口 server_addr 你的公网服务器IP server_port 7000 # 必须与服务端配置的token一致 token your_secret_token_here # 客户端日志配置 log_file ./frpc.log log_level info log_max_days 3 # 连接池设置可选 pool_count 54.2 场景一穿透SSH服务TCP转发假设内网机器的SSH服务在22端口我们想通过公网服务器的6000端口来访问。在frpc.ini的[common]部分后添加以下配置# frpc.ini - SSH穿透配置 [ssh] type tcp local_ip 127.0.0.1 local_port 22 remote_port 6000配置解读[ssh]这是一个代理规则的名称可以自定义。type tcp指定代理类型为TCP。local_ip和local_port指客户端机器上真正提供服务的地址和端口。127.0.0.1代表本机。remote_port这是服务端公网服务器对外开放的端口。外部用户将通过连接server_addr:remote_port来访问内网服务。启动客户端Windows打开命令提示符(cmd)或PowerShell进入frp解压目录执行frpc.exe -c frpc.ini。Linux在终端执行./frpc -c ./frpc.ini。启动成功后你就可以使用任何SSH客户端通过ssh -p 6000 你的用户名你的公网服务器IP来连接到内网机器了。4.3 场景二穿透本地Web服务HTTP转发假设你在内网用Python Flask运行了一个Web应用地址是http://127.0.0.1:5000并且你有一个域名dev.yourdomain.com解析到了你的公网服务器IP。首先确保服务端配置中启用了vhost_http_port 8080。然后在客户端的frpc.ini中添加如下配置# frpc.ini - Web服务穿透配置 [web] type http local_ip 127.0.0.1 local_port 5000 custom_domains dev.yourdomain.com # 可选如果你有多个Web服务可以配置多个[web]段使用不同的custom_domains [web2] type http local_ip 192.168.1.200 # 也可以是内网其他机器的IP local_port 80 custom_domains test.yourdomain.com配置解读type http指定代理类型为HTTP。custom_domains这是关键。当外部用户访问http://dev.yourdomain.com:8080时FRP服务端会根据域名dev.yourdomain.com将请求转发给配置了该域名的客户端即[web]代理。访问方式用户只需在浏览器访问http://dev.yourdomain.com:8080请求会经过以下路径用户浏览器 - 公网服务器:8080 (frps) - 内网客户端 (frpc) - 内网127.0.0.1:5000 (Flask应用)注意由于使用了非标准HTTP端口8080访问时需要带上端口号。如果想用80端口需将服务端的vhost_http_port改为80并确保服务器80端口未被占用且安全组已开放。5. 进阶配置与优化掌握了基础用法后我们来看一些提升安全性、稳定性和便利性的进阶配置。5.1 使用配置文件包含与拆分当代理规则很多时可以将它们拆分到不同文件方便管理。# frpc.ini - 主配置 [common] server_addr x.x.x.x server_port 7000 token your_secret_token_here # 包含其他配置文件 includes ./conf.d/*.ini然后在conf.d目录下创建独立的配置文件如ssh.ini、web.ini。5.2 增加连接安全性与稳定性TLS加密传输在[common]部分服务端和客户端同时配置tls_enable true可以对FRP控制通道的通信进行加密。心跳与重连以下配置可以增强在网络不稳定时的连接韧性。[common] # 心跳间隔和超时时间秒 heartbeat_interval 30 heartbeat_timeout 90 # 登录失败后重试间隔秒 login_fail_exit false # 首次连接失败后重试间隔 initial_interval 1 max_initial_interval 305.3 身份验证进阶除了tokenFRP还支持更严格的OIDCOpenID Connect认证适合企业环境集成配置较为复杂一般个人使用token已足够安全。5.4 UDP协议转发某些应用如游戏联机、DNS查询需要使用UDP协议。配置方法与TCP类似[dns_udp] type udp local_ip 192.168.1.5 local_port 53 remote_port 60016. 常见问题与排查思路在部署和使用FRP过程中你可能会遇到一些问题。下面是一个快速排查指南。问题现象可能原因排查步骤与解决方案客户端连接失败login to server failed1. 服务器地址/端口错误2. 服务器防火墙/安全组未放行端口3. 服务端未运行4. token不匹配1. 检查server_addr和server_port。2. 使用telnet 服务器IP 7000测试端口连通性。3. 登录服务器检查frps进程状态 (systemctl status frps)。4. 核对服务端和客户端的token是否完全一致。服务端启动失败端口被占用配置的端口已被其他程序占用使用netstat -tlnp | grep :端口号查找占用进程修改frps.ini中的端口或停止冲突进程。能连接但无法访问服务连接被拒绝1. 客户端local_ip或local_port配置错误2. 内网服务本身未启动或监听错误3. 客户端本地防火墙阻止1. 确认内网服务在指定IP和端口上正常运行如curl localhost:5000。2. 检查客户端配置的local_ip是否真是服务监听IP0.0.0.0或127.0.0.1。3. 临时关闭客户端防火墙测试。HTTP访问返回404Not Found1. 域名未正确解析到服务器IP2. 客户端custom_domains配置错误3. 访问的域名与配置不符1. 使用ping yourdomain.com确认域名解析正确。2. 检查客户端配置的custom_domains是否与访问的域名完全一致。3. 访问时确保Host头正确浏览器访问域名即可。仪表盘无法访问1. 防火墙未开放7500端口2. 配置的IP绑定限制1. 检查服务器安全组和本地防火墙规则。2. 可在frps.ini中设置dashboard_addr 0.0.0.0默认即是。连接不稳定经常断开1. 网络波动2. 服务器或客户端资源不足3. 未配置心跳1. 检查服务器和客户端的网络质量。2. 查看系统资源CPU、内存。3. 在[common]中配置heartbeat_interval和heartbeat_timeout。通用排查命令查看日志这是最重要的手段。仔细阅读frps.log和frpc.log文件中的error或warn信息。测试端口在服务器上telnet 127.0.0.1 7000测试服务端自身端口从外网telnet 服务器IP 7000测试公网可达性。简化配置遇到复杂问题时先回归最简配置只留一个代理确认基础功能正常后再逐步添加。7. 安全最佳实践与生产环境建议将FRP用于生产环境或重要服务时安全是首要考虑。使用强令牌Tokentoken是首要防线务必使用高强度、无规律的随机字符串并定期更换。限制访问来源在服务端frps.ini的[common]中使用allow_ports来精确控制客户端可以绑定哪些远程端口避免开放过多高危端口。allow_ports 6000-6010, 8080, 8443使用privilege_allow_ips来限制允许连接服务端的客户端IP如果你有固定出口IP。启用TLS加密如前所述设置tls_enable true以加密控制通道防止通信被窃听或篡改。保护管理面板为仪表盘dashboard设置强密码。修改默认的7500端口。通过云服务器安全组或系统防火墙如iptables仅允许特定的管理IP地址访问仪表盘端口。切勿将dashboard_port暴露给所有IP。以非root用户运行在Linux上像之前systemd配置示例那样使用Usernobody或创建一个专用的低权限用户来运行frp服务降低被攻击后的风险。定期更新关注FRP项目的GitHub Release及时更新到新版本修复可能的安全漏洞。分离部署如果条件允许将FRP服务端部署在一台独立的、最小化安装的服务器上与其他业务服务隔离。监控与告警利用服务端的仪表盘或结合frps的日志监控连接数和状态。可以编写脚本监控frp进程异常时发出告警。8. 总结与扩展方向通过本文的详细拆解你应该已经掌握了使用FRP搭建免费内网穿透服务的全套技能从核心概念理解、服务端部署、客户端配置TCP/HTTP到进阶优化、问题排查和安全加固。FRP的灵活性和强大功能足以应对个人开发、团队协作乃至小型生产场景的需求。下一步可以探索的扩展方向HTTPS支持为穿透的Web服务配置SSL证书实现https访问。这通常需要在服务端配置vhost_https_port并在客户端配置type https。负载均衡与健康检查FRP支持将多个后端客户端配置成同一个代理组实现简单的负载均衡和健康检查。插件机制利用FRP的插件功能实现请求修改、身份验证等自定义逻辑。与自动化脚本集成将FRP客户端的启动、停止与你的开发流程或设备启动脚本结合实现全自动化穿透。技术的学习在于实践。建议你立即按照步骤从最简单的SSH穿透开始尝试遇到问题再回头查阅本文的排查章节。当你成功从外网访问到内网服务的那一刻你会对网络通信有更深的理解。这套自建的内网穿透方案不仅免费、可控更是你技术工具箱中一件非常得力的武器。
返回列表