尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

frp内网穿透实战:从原理到部署,安全访问内网服务

frp内网穿透实战:从原理到部署,安全访问内网服务 你是不是也遇到过这样的困境本地开发了一个网站应用想让同事或客户临时访问测试一下却发现对方根本连不上你的电脑或者家里搭建了NAS、智能家居服务器出门在外想访问时却束手无策又或者公司内部有个管理系统出差时急需登录却无法连接内网这些问题背后都指向同一个技术痛点如何让部署在内网没有公网IP的服务安全、稳定地被外网访问过去你可能听说过端口转发、动态域名解析DDNS甚至尝试过一些商业化的内网穿透工具但要么配置复杂要么收费昂贵要么速度堪忧。今天我们要深入探讨的是一个在开发者圈子里口碑极佳的开源解决方案——frp。这篇文章不会只告诉你“frp是个内网穿透工具”然后扔给你一堆命令。我会带你理解为什么在众多方案中frp的“反向代理”架构是更优雅的选择它如何用极简的配置解决端口映射、流量加密、权限控制等一系列问题更重要的是我将通过一个从零开始的完整实战教程让你不仅能将本地的Web服务映射到公网更能掌握其核心配置逻辑举一反三应用到数据库、SSH、远程桌面等各种场景。无论你是想临时分享一个开发中的项目还是为智能家居搭建远程访问通道这篇文章都将提供一条清晰、可落地的路径。1. 内网穿透为什么是 frp而不仅仅是“能通就行”在深入配置之前我们必须先厘清一个关键认知内网穿透的目标不仅仅是“连通”而是安全、可控、高性能的连通。许多新手会陷入一个误区随便找一个工具把本地端口暴露出去能访问就万事大吉。这忽略了几个核心风险安全风险暴露的端口可能成为攻击入口如果缺乏加密和认证传输数据如同“裸奔”。稳定性风险连接可能随时中断且重连机制不完善。管理风险无法精细控制谁可以访问、访问哪个服务日志缺失出了问题无从排查。frpFast Reverse Proxy之所以脱颖而出正是因为它从设计上就回应了这些痛点。它是一个高性能的反向代理应用采用C/S客户端/服务端架构服务端 (frps)部署在具有公网IP的服务器上如云服务器作为流量入口和中转站。客户端 (frpc)部署在内网需要被访问的机器上主动向服务端建立连接隧道。这种“内网客户端主动连接外网服务端”的模式完美绕过了大多数防火墙和路由器对入站连接的限制。你不需要在路由器上设置复杂的DMZ或端口转发因为连接是由内网发起的。与 ngrok、cpolar 等工具相比frp 的核心优势在于完全开源可控你可以自己部署服务端数据完全掌握在自己手中无需担心第三方服务的隐私政策或突然收费。配置灵活强大支持 TCP、UDP、HTTP、HTTPS、STCP安全TCP等多种协议能满足Web服务、游戏联机、文件传输、远程控制等多样化需求。社区活跃生态成熟遇到问题容易找到解决方案且有持续的更新和维护。接下来我们将通过一个最典型的场景——将本地开发的网站映射到公网来彻底掌握 frp。2. 核心概念与架构理解 frp 如何工作要玩转 frp必须理解它的几个核心概念这能让你在配置时知其然更知其所以然。1. 角色定义frps (frp server) 守护进程运行在公网服务器。它监听一个或多个端口等待 frpc 的连接。它是所有外部流量的总入口。frpc (frp client) 守护进程运行在内网机器。它配置好要暴露的本地服务如localhost:8080然后主动去连接 frps建立一条加密隧道。访问者 最终用户通过访问frps公网IP:指定端口来访问内网服务。2. 核心工作流程以Web服务为例访问者 (浏览器) - [请求] - frps(公网IP:80) - [通过已建立的隧道] - frpc - [转发请求] - 内网Web服务(localhost:8080) 内网Web服务 - [响应] - frpc - [通过隧道] - frps - [返回响应] - 访问者整个过程对访问者是透明的他感觉就像在直接访问一个公网网站。而对内网服务而言它只和本地的 frpc 通信完全感知不到公网的存在。3. 关键配置术语bind_port frps 监听的端口供 frpc 连接。vhost_http_port frps 监听的HTTP端口用于域名访问。server_addr frpc 配置中指定要连接的 frps 的公网IP或域名。server_port frpc 配置中指定要连接的 frps 的bind_port。[common] 配置文件中的通用配置节。[xxx] 每一个需要暴露的服务都需要一个独立的配置节如[web]。理解了这个架构配置就不再是记忆命令而是逻辑的自然推演。3. 环境准备你需要什么在开始动手前请确保你已准备好以下资源1. 一台具有公网 IP 的服务器用于部署 frps推荐 阿里云、腾讯云、华为云等厂商的轻量应用服务器或ECS。最基础的1核1G配置即可满足 frps 的运行。关键 确保服务器的安全组/防火墙放行了后续需要用到的端口如7000 8080。这是最常见的失败原因。系统 本文以Linux (Ubuntu 20.04/CentOS 7)为例这是最普遍的服务器环境。2. 一台内网机器用于部署 frpc 和本地服务可以是你的个人电脑Windows/macOS/Linux、树莓派、NAS 或公司内网的开发机。这台机器上需要运行着你希望暴露的服务例如一个本地运行的网站http://localhost:3000一个数据库localhost:3306SSH服务22端口3. 一个域名可选但强烈推荐如果你希望用http://dev.yourdomain.com这样的域名访问而不是难记的http://服务器IP:8080就需要一个域名。你需要在域名提供商处将域名解析A记录指向你的公网服务器IP。4. 工具SSH 客户端如 Xshell, FinalShell 或系统自带的终端用于连接服务器。文本编辑器如 VS Code, Notepad用于编辑配置文件。4. 第一步在公网服务器上部署 frps 服务端这是整个流程的基石。我们以 Linux 服务器为例。4.1 下载与安装 frps首先通过 SSH 连接到你的公网服务器。1. 确定系统架构并下载访问 frp 的 GitHub Releases 页面https://github.com/fatedier/frp/releases找到最新版本。使用uname -m命令查看服务器架构通常是x86_64对应amd64树莓派等可能是arm64。# 进入一个临时目录例如 /tmp cd /tmp # 下载对应版本请将版本号替换为最新版如 v0.54.0 # 对于 amd64 (x86_64) 架构 wget https://github.com/fatedier/frp/releases/download/v0.54.0/frp_0.54.0_linux_amd64.tar.gz # 对于 arm64 架构 # wget https://github.com/fatedier/frp/releases/download/v0.54.0/frp_0.54.0_linux_arm64.tar.gz2. 解压并移动到合适位置# 解压下载的压缩包 tar -zxvf frp_0.54.0_linux_amd64.tar.gz # 进入解压后的目录 cd frp_0.54.0_linux_amd64/ # 查看目录内容你会看到 frps (服务端) 和 frpc (客户端) 两个主要二进制文件 ls -l # 将 frps 和 frps.ini 复制到系统目录例如 /usr/local/bin 和 /etc/frp sudo mkdir -p /etc/frp sudo cp frps /usr/local/bin/ sudo cp frps.ini /etc/frp/4.2 配置 frps这是最关键的一步。编辑服务端配置文件/etc/frp/frps.ini。sudo vi /etc/frp/frps.ini使用以下基础配置模板并根据你的实际情况修改# /etc/frp/frps.ini [common] # frps 监听的端口供 frpc 连接。必须开放此端口的防火墙。 bind_port 7000 # 仪表盘端口用于查看 frps 状态可选但推荐 dashboard_port 7500 # 仪表盘用户名和密码请务必修改 dashboard_user admin dashboard_pwd your_strong_password_here # 用于 HTTP/HTTPS 类型代理的端口如果你要用域名访问Web服务 vhost_http_port 8080 vhost_https_port 8443 # 认证令牌增强安全性可选但强烈推荐 # frpc 配置中必须使用相同的 token 才能连接 token your_secret_token_here # 日志配置 log_file /var/log/frps.log log_level info log_max_days 3配置项详解bind_port7000 这是 frps 与 frpc 建立控制连接的端口。所有 frpc 都通过这个端口连接到 frps。务必在云服务器安全组和系统防火墙中放行此端口TCP。dashboard_port7500 通过浏览器访问http://你的服务器IP:7500可以查看 frps 的运行状态和所有连接代理的统计信息。同样需要放行此端口。vhost_http_port8080 当 frpc 配置了type http且设置了custom_domains时外部用户访问http://域名:8080的流量会由 frps 的这个端口接收然后转发给对应的 frpc。需要放行此端口。token 一个共享密钥用于 frps 和 frpc 之间的身份验证防止未经授权的客户端连接。请设置一个强密码。4.3 启动 frps 并设置开机自启方式一直接启动测试用sudo /usr/local/bin/frps -c /etc/frp/frps.ini如果看到“frps started successfully”之类的日志说明启动成功。按CtrlC可停止。方式二使用 systemd 管理生产环境推荐创建 systemd 服务文件实现后台运行和开机自启。sudo vi /etc/systemd/system/frps.service将以下内容写入文件[Unit] DescriptionFrp Server Service Afternetwork.target [Service] Typesimple Usernobody Restarton-failure RestartSec5s ExecStart/usr/local/bin/frps -c /etc/frp/frps.ini [Install] WantedBymulti-user.target然后启用并启动服务# 重载 systemd 配置 sudo systemctl daemon-reload # 启动 frps 服务 sudo systemctl start frps # 设置开机自启 sudo systemctl enable frps # 查看服务状态 sudo systemctl status frps如果状态显示active (running)恭喜你frps 服务端已部署成功验证 打开浏览器访问http://你的服务器IP:7500输入配置的用户名密码应该能看到 frps 的管理仪表盘。5. 第二步在内网机器上部署并配置 frpc 客户端现在我们转到内网机器比如你的笔记本电脑上操作。5.1 下载与安装 frpc根据你的内网机器系统选择对应版本。对于 Windows 用户从 GitHub Releases 下载frp_*_windows_amd64.zip。解压到任意目录例如C:\frp。在解压目录中你会找到frpc.exe和frpc.ini。对于 Linux/macOS 用户# 在终端中操作步骤与服务器端类似 cd /tmp 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/ # 可以将 frpc 和 frpc.ini 复制到方便的位置如 ~/frp/ mkdir -p ~/frp cp frpc frpc.ini ~/frp/ cd ~/frp5.2 配置 frpc映射本地 Web 服务假设你在内网机器上运行了一个本地网站地址是http://localhost:3000。现在我们要将它映射出去。编辑 frpc 的配置文件frpc.ini。# frpc.ini [common] # frps 服务端的公网 IP 地址或域名 server_addr 你的公网服务器IP # frps 服务端的 bind_port server_port 7000 # 必须与 frps.ini 中设置的 token 一致 token your_secret_token_here # 第一个代理配置用于 HTTP 网站 [web] # 代理名称可自定义但需唯一 type http # 代理类型为 HTTP local_ip 127.0.0.1 # 本地服务 IP local_port 3000 # 本地服务端口 # 自定义域名访问者将通过此域名访问 custom_domains dev.yourdomain.com # 请替换为你的真实域名 # 第二个代理配置示例映射 SSH 服务可按需添加 [ssh] # 另一个代理名称 type tcp local_ip 127.0.0.1 local_port 22 # 在 frps 上监听的远程端口访问者通过 server_addr:remote_port 连接 remote_port 6000配置详解[common] 通用配置指定了要去哪里找 frps 以及认证信息。[web] 这是一个独立的代理配置块。type http告诉 frps 这是一个 HTTP 代理frps 会处理 HTTP 协议相关的逻辑如域名分发。custom_domains这是实现一个 frps 对应多个内网网站的关键。frps 的vhost_http_port(8080) 可以接收多个域名的流量然后根据Host请求头将流量转发给配置了对应custom_domains的 frpc。你需要将dev.yourdomain.com的 DNS A 记录指向你的公网服务器IP。[ssh] 这是一个 TCP 类型代理的示例。它将在 frps 上监听6000端口。当访问者连接服务器IP:6000时流量会被转发到内网机器的22端口。5.3 启动 frpc 客户端对于 Windows 用户打开命令提示符 (CMD) 或 PowerShell。切换到 frpc 所在目录例如cd C:\frp。执行命令frpc.exe -c frpc.ini如果看到“start proxy success”等字样表示连接成功。可以按CtrlC停止。对于 Linux/macOS 用户# 在 frpc 所在目录执行 cd ~/frp ./frpc -c ./frpc.ini同样看到成功连接的日志即可。更优方案将 frpc 也配置为系统服务以 Linux 为例与 frps 类似创建 systemd 服务sudo vi /etc/systemd/system/frpc.service内容如下注意修改ExecStart路径[Unit] DescriptionFrp Client Service Afternetwork.target [Service] Typesimple User你的用户名 Restarton-failure RestartSec5s ExecStart/home/你的用户名/frp/frpc -c /home/你的用户名/frp/frpc.ini # 如果提示权限问题可能需要指定 WorkingDirectory WorkingDirectory/home/你的用户名/frp [Install] WantedBymulti-user.target然后启用服务sudo systemctl daemon-reload sudo systemctl start frpc sudo systemctl enable frpc sudo systemctl status frpc6. 第三步验证与访问完成以上两步后整个隧道已经建立。现在进行验证检查 frps 仪表盘 访问http://你的服务器IP:7500登录后应该在 “Proxy” 或 “TCP” 页面看到[web]和[ssh]两个代理处于在线 (online) 状态。通过域名访问网站确保你的域名dev.yourdomain.com已正确解析到服务器IPDNS生效可能需要几分钟到几小时。在外网比如用手机4G网络的浏览器中访问http://dev.yourdomain.com:8080。注意 这里需要带上 frps 上配置的vhost_http_port端口本例是8080。如果希望用80端口访问要么将vhost_http_port设为80需要root权限要么在 frps 前再用 Nginx 做一次反向代理。通过 SSH 访问内网机器在外网机器上使用命令ssh -p 6000 你的内网机器用户名你的公网服务器IP这个连接会先到达 frps 的6000端口然后通过隧道转发到你内网机器的22端口。7. 进阶配置与最佳实践基础打通只是开始要让服务稳定可靠还需要考虑以下方面。7.1 使用自定义域名和80/443端口Nginx反向代理直接使用:8080端口访问不优雅。我们可以用 Nginx 将80端口的流量转发到 frps 的8080端口。在公网服务器上安装 Nginx然后为其添加一个配置文件如/etc/nginx/conf.d/frp.confserver { listen 80; server_name dev.yourdomain.com; # 你的域名 location / { # 将请求代理到 frps 的 http 端口 proxy_pass http://127.0.0.1:8080; 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; } }然后重启 Nginx (sudo systemctl restart nginx)。现在访问http://dev.yourdomain.com即可无需端口号。HTTPS443端口配置类似只需在 Nginx 中配置 SSL 证书。7.2 安全性强化配置使用强 Tokentoken是重要的认证凭证务必使用高强度、随机生成的字符串。限制 Dashboard 访问 将dashboard_port设置为仅本地可访问如127.0.0.1:7500然后通过 SSH 隧道访问或通过 Nginx 配置 HTTP 基础认证和 IP 白名单。使用 STCP 模式保护 TCP 服务 对于数据库、远程桌面等敏感服务使用type stcp。它要求访问端也运行一个特殊的 frpcrole visitor并共享一个sk密钥实现了端到端的加密和访问控制即使有人知道了 frps 地址和端口也无法连接。定期更新 关注 frp 的 GitHub 发布页及时更新到新版本修复潜在安全漏洞。7.3 配置文件管理与多服务映射一个frpc.ini可以配置多个[service_name]块来映射多个本地服务。合理的做法是按项目或环境拆分配置文件并使用-c参数指定。# frpc_web.ini [common] server_addr x.x.x.x server_port 7000 token xxx [project-a-web] type http local_port 3000 custom_domains a.yourdomain.com [project-b-web] type http local_port 8080 custom_domains b.yourdomain.com # frpc_tcp.ini [common] server_addr x.x.x.x server_port 7000 token xxx [home-mysql] type tcp local_ip 127.0.0.1 local_port 3306 remote_port 33060 # 注意不要使用云服务器上已占用的端口 [home-rdp] type tcp local_ip 127.0.0.1 local_port 3389 remote_port 33389然后分别启动./frpc -c ./frpc_web.ini和./frpc -c ./frpc_tcp.ini。8. 常见问题与排查思路遇到问题不要慌按照以下顺序排查问题现象可能原因排查步骤解决方案frpc 连接 frps 失败1. 服务器IP/端口错误2. 防火墙/安全组未放行bind_port(7000)3. token 不匹配4. 服务器 frps 未运行1. 检查server_addr和server_port。2. 在服务器用sudo netstat -tlnp | grep :7000看端口监听状态。3. 在服务器用sudo systemctl status frps看服务状态。4. 对比 frps.ini 和 frpc.ini 的token。1. 修正配置。2. 放行防火墙端口sudo ufw allow 7000(Ubuntu) 或配置云服务器安全组。3. 重启 frps 服务。能连接但网站无法访问1. 域名解析未生效或错误2.vhost_http_port(如8080) 未放行3. frpc 配置中local_ip或local_port错误4. 本地服务未启动1. 用ping dev.yourdomain.com检查解析IP是否正确。2. 在服务器检查8080端口监听netstat -tlnp | grep :8080。3. 在内网机器用curl http://localhost:3000测试本地服务。4. 查看 frps 仪表盘确认对应代理是否在线。1. 等待DNS生效或检查A记录。2. 放行vhost_http_port端口。3. 确保本地服务正在运行。4. 检查 frpc 配置中的本地地址和端口。访问域名显示Bad Request或No such web pagefrps 未找到与请求域名匹配的 frpc 代理配置1. 检查浏览器访问的域名是否与 frpc.ini 中custom_domains完全一致包括子域名。2. 检查 frps 仪表盘该域名的代理是否在线。1. 确保域名拼写正确。2. 重启 frpc 客户端。SSH/其他TCP服务连接超时1.remote_port被占用或未放行2. 本地服务防火墙阻止3. frpc 配置的local_port错误1. 在服务器检查remote_port(如6000) 是否被其他程序占用。2. 在服务器放行该端口的防火墙。3. 在内网机器测试本地服务是否可连ssh localhost -p 22。1. 更换一个未被占用的remote_port。2. 配置防火墙规则。3. 修正 frpc 配置。服务间歇性断开1. 网络不稳定2. 服务器或客户端资源不足3. 长时间空闲连接被中断1. 查看 frps/frpc 日志文件中的错误信息。2. 检查服务器 CPU/内存使用情况。1. 在 frpc.ini 的[common]节添加tcp_mux true(默认开启) 和heartbeat_interval 30heartbeat_timeout 90维持连接。2. 考虑使用更稳定的网络环境。最重要的排查工具是日志始终关注frps.log和frpc控制台输出的日志信息它们能提供最直接的错误线索。9. 总结从工具使用者到架构理解者通过这篇教程我们完成的不仅仅是一个“内网穿透”的配置。我们实际上搭建了一个基于反向代理的、安全的、可管理的私有化访问通道。回顾一下核心要点架构是根本 理解 frp C/S 架构和“内网主动出网”的原理是解决一切配置问题的基础。安全无小事 务必设置强token谨慎开放端口对于敏感服务考虑使用STCP模式。配置即逻辑frps.ini定义服务端的开放规则frpc.ini定义客户端要暴露的服务。两者通过token和端口号协同工作。组合拳更强大 frp 负责打通网络Nginx 负责处理域名、SSL和负载均衡两者结合能构建更专业的服务。frp 的能力远不止映射一个Web服务。你可以用它来远程访问家里的 NAS如群晖、TrueNAS。在外网调试公司内网的开发环境。为没有公网IP的物联网设备提供远程管理接口。搭建点对点的安全文件传输通道。掌握 frp意味着你拥有了在任何网络环境下将服务安全呈现给外界的能力。建议你将本文中的配置保存为模板并根据不同的场景进行组合和调整。
返回列表