ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

frp内网穿透实战:从原理到部署,实现远程访问与端口映射

2026/8/16 10:57:37 拓冰建站 浏览量
frp内网穿透实战:从原理到部署,实现远程访问与端口映射

1. 项目概述:为什么我们需要内网穿透?

如果你尝试过在家里搭建一个网站、一个文件服务器,或者想远程访问公司电脑的桌面,大概率会遇到一个头疼的问题:你的设备处在一个由路由器构建的局域网(内网)里,没有公网IP地址。这意味着,从互联网上,别人无法直接找到你的设备,就像你住在一个没有门牌号的大院里,快递员根本送不进来。

这就是“内网穿透”要解决的核心痛点。它本质上是一种网络技术,通过在公网服务器(有固定门牌号)和内网设备之间建立一条“隧道”,将公网上的访问请求,安全、稳定地“穿透”到内网中的指定设备上。这样一来,即使你没有公网IP,也能让你的服务在互联网上被访问到。

市面上内网穿透工具不少,比如早期的ngrok,以及各种商业化的服务。但今天我们要深入聊的,是frp。它之所以在开发者、运维和极客圈子里备受推崇,核心原因在于:开源、免费、配置灵活、性能稳定。你可以完全掌控整个穿透链路,从服务器到客户端,所有配置都透明可见,这对于需要自定义端口、协议或者有安全审计要求的场景来说,是商业服务无法比拟的优势。简单来说,frp让你从一个“租客”变成了“房东”,拥有了对网络通道的完全控制权。

接下来的内容,我将以一个拥有公网服务器的“服务端”和一台处于家庭内网的“客户端”为例,手把手带你完成frp的部署、配置,并深入解析其工作原理和避坑要点。无论你是想远程开发、搭建个人网盘,还是实现智能家居的远程控制,这篇教程都能给你一套完整、可靠的解决方案。

2. frp核心架构与工作原理拆解

在动手之前,我们必须先理解frp是怎么工作的。这能帮助你在后续配置时,清楚地知道每一个参数的意义,而不是机械地复制粘贴。

2.1 核心组件:服务端与客户端

frp的架构非常清晰,由两个核心程序组成:

  1. frps:服务端

    • 角色:部署在具有公网IP的服务器上(比如你购买的云服务器)。
    • 职责:作为“总机接线员”和“交通枢纽”。它监听来自互联网的访问请求,同时也等待内网客户端的连接。它的核心工作是建立并维护“隧道”,进行请求的转发和路由。
  2. frpc:客户端

    • 角色:部署在你需要被访问的内网设备上(比如家里的NAS、开发电脑、树莓派)。
    • 职责:作为“内线电话”。它主动向外连接公网上的frps服务端,告诉服务端:“我在这里,我想把本地的某个端口(比如80端口的Web服务)映射出去”。连接建立后,它就负责在服务端和内网服务之间转发数据。

2.2 工作流程与隧道建立

理解数据是如何流动的至关重要。我们以一个最常见的场景为例:将内网电脑A的3389端口(Windows远程桌面)暴露到公网。

  1. 隧道建立:内网的frpc启动,读取配置文件,主动向公网服务器的frps的某个端口(例如7000)发起一个控制连接。这个连接是长连接,始终保持,用于通信和管理。
  2. 服务注册frpc通过这个控制连接告诉frps:“我有个服务叫rdp,类型是tcp,监听在我本地的127.0.0.1:3389。请帮我映射一下。”
  3. 端口监听frps收到指令后,会在自己的一个端口(例如6000)上开始监听。
  4. 访问触发:当你在外网的电脑B上,使用远程桌面连接工具,输入公网服务器IP:6000时,这个连接请求就到达了frps6000端口。
  5. 请求转发frps立刻通过之前建立的控制连接,通知内网的frpc:“有客人来了,目标是rdp服务。”frpc随即在本地建立一个连接到127.0.0.1:3389,并将frps传来的数据转发给它。
  6. 数据透传:从此,电脑B与frps:6000之间的所有TCP数据包,都会被frps通过隧道原封不动地转发给frpc,再由frpc转发给内网电脑A的3389端口。反之亦然。对于电脑B和电脑A而言,它们感觉像是在直接通信。

注意:这里有一个关键点,所有的入站请求都是由客户端(frpc)主动发起的连接“引进来”的。这完美解决了家庭宽带没有公网IP、路由器防火墙阻拦入站连接的问题。因为防火墙通常不限制内网设备主动向外的连接。

2.3 为什么选择frp?方案对比

在决定使用frp前,你可能也了解过其他方案,这里做个快速对比:

方案优点缺点适用场景
商业内网穿透服务配置简单,有可视化界面,通常提供域名。免费版有限制(流量、带宽、域名),收费可能不菲,数据经过第三方服务器。临时、轻量级需求,不想维护服务器。
路由器DDNS + 端口转发性能最好,直接点对点。需要公网IP(目前运营商大多不提供),配置复杂,安全性依赖自身。幸运地拥有家庭公网IP的用户。
Zerotier/Tailscale组建虚拟局域网,点对点直连,端到端加密。在某些复杂网络环境下打洞可能失败,需要安装客户端软件。多设备组网,互访,对延迟敏感。
frp开源免费,完全自控,配置灵活,协议支持全面,性能稳定。需要一台公网服务器,需要一定的命令行和配置能力。需要稳定、长期、自定义程度高的内网服务暴露

如果你的需求是长期、稳定地暴露一个或多个服务(如Web站点、数据库、远程桌面),并且希望控制成本和数据路径,那么拥有一台云服务器并部署frp,无疑是综合性价比和可控性最高的方案。

3. 实战部署:从零搭建frp穿透环境

理论清晰了,我们进入实战环节。我会以最常用的Linux服务器(服务端)和Windows客户端为例,其他系统(如macOS、Linux客户端)配置逻辑完全相同。

3.1 服务端部署与配置

首先,你需要一台有公网IP的服务器,国内外云厂商均可。假设服务器系统是Ubuntu 22.04。

步骤一:下载并解压frp

访问frp的GitHub Releases页面,根据服务器CPU架构选择最新版本。通常x86_64的服务器选择linux_amd64版本。

# 切换到临时目录,下载最新版本(请替换为实际版本号) cd /tmp 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 # 移动到合适的目录,例如 /usr/local/frp sudo mv frp_0.52.3_linux_amd64 /usr/local/frp cd /usr/local/frp

解压后你会看到一堆文件,其中服务端我们主要关心两个:

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

步骤二:配置服务端frps.toml

使用vimnano编辑配置文件:

sudo vim frps.toml

一个最基础、安全的配置如下:

bindPort = 7000 # 服务端监听端口,用于与客户端建立控制连接。这是frp工作的基础端口。 auth.method = "token" auth.token = "your_strong_password_here" # 强烈建议设置Token认证!这是防止他人恶意连接你服务端的关键。`your_strong_password_here` 替换成你自己生成的一串复杂字符串。 webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "admin" webServer.password = "admin_web_password" # 启用Web仪表板,方便查看连接状态。通过 `http://你的服务器IP:7500` 访问,用户名密码在此设置。 # 其他高级配置如日志、带宽限制等,初期可以保持默认。

实操心得bindPort(默认7000)和webServer.port(例如7500)需要在服务器的防火墙(如ufw或云服务商的安全组)中放行。Token务必设置得复杂且唯一,不要使用默认值或简单密码。

步骤三:启动frps服务

为了让它能在后台稳定运行,我们使用systemd来管理。

  1. 创建systemd服务文件:
    sudo vim /etc/systemd/system/frps.service
  2. 写入以下内容(注意修改ExecStart的路径):
    [Unit] Description=Frp Server Service After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.toml [Install] WantedBy=multi-user.target
  3. 启动并设置开机自启:
    sudo systemctl daemon-reload sudo systemctl start frps sudo systemctl enable frps
  4. 检查运行状态:
    sudo systemctl status frps
    如果看到active (running),说明服务端已经成功启动。现在你可以打开浏览器,访问http://<你的服务器IP>:7500,用上面设置的用户名密码登录,就能看到仪表板了。初始时客户端未连接,仪表板里是空的。

3.2 客户端部署与配置

现在,我们转到需要被穿透的内网Windows电脑上。

步骤一:下载Windows客户端

同样去GitHub Releases页面,下载windows_amd64版本。解压到一个方便的位置,例如D:\frp

步骤二:配置客户端frpc.toml

D:\frp目录下,编辑frpc.toml文件。

serverAddr = "你的服务器公网IP" serverPort = 7000 # 指向你刚才配置的frps地址和端口。 auth.method = "token" auth.token = "your_strong_password_here" # 这里的token必须和服务端配置的完全一致! [[proxies]] name = "web" type = "tcp" localIP = "127.0.0.1" localPort = 80 remotePort = 8080 # 这是一个示例,将本地的80端口Web服务,映射到服务器上的8080端口。 # 这意味着,访问 `服务器IP:8080` 就等于访问 `内网电脑的80端口`。 [[proxies]] name = "rdp" type = "tcp" localIP = "127.0.0.1" localPort = 3389 remotePort = 6000 # 这是远程桌面的配置。将本地的3389端口,映射到服务器的6000端口。

步骤三:启动Windows客户端

D:\frp目录下,打开命令提示符或PowerShell,运行:

./frpc -c ./frpc.toml

如果一切正常,你会看到连接成功的日志,类似“login to server success”

此时,回到服务端的Web仪表板 (http://服务器IP:7500),你应该能看到一个客户端在线,并且列出了你配置的两个代理(web和rdp)。

步骤四:测试穿透效果

  1. 测试Web服务:确保你内网Windows电脑上有一个服务正在监听80端口(比如你跑了一个本地网站)。然后在另一台能上网的电脑上,打开浏览器,访问http://你的服务器IP:8080。如果配置正确,你应该能看到和内网电脑上一样的网站。
  2. 测试远程桌面:在外网电脑上,打开“远程桌面连接”工具,输入地址:你的服务器IP:6000,点击连接。如果成功,你就会看到内网Windows电脑的登录界面。

注意事项:Windows防火墙可能会阻止入站连接。由于frpc是主动向外连接,所以通常不需要在Windows防火墙上为frpc.exe或映射的端口(如3389)专门设置入站规则。但如果你的内网服务本身被防火墙阻止(比如本机的Web服务),则需要在该服务的防火墙上放行。

4. 进阶配置与核心功能解析

基础穿透实现后,frp更强大的地方在于其丰富的代理类型和高级功能,可以应对各种复杂场景。

4.1 多种代理类型与应用场景

除了最基础的tcp代理,frp还支持:

  • udp:用于DNS查询、游戏联机、视频流等UDP协议应用。

    [[proxies]] name = "dns" type = "udp" localIP = "192.168.1.1" # 例如你的路由器或内网DNS服务器 localPort = 53 remotePort = 60053
  • http/https最常用的Web穿透类型。它允许你用一个服务器端口,根据域名来转发到不同的内网Web服务。这对于在单台服务器上暴露多个网站非常有用。

    # 服务端 frps.toml 需要额外配置 vhostHTTPPort = 8080 vhostHTTPSPort = 8443 # 客户端 frpc.toml [[proxies]] name = "myblog" type = "http" localIP = "127.0.0.1" localPort = 4000 # 假设本地Hugo运行在4000端口 customDomains = ["blog.yourdomain.com"] # 你需要将此域名解析到服务器IP [[proxies]] name = "nas" type = "http" localIP = "192.168.1.100" # 内网NAS的IP localPort = 5000 # NAS的管理页面端口 customDomains = ["nas.yourdomain.com"]

    这样,访问http://blog.yourdomain.com:8080会指向本地Hugo,而http://nas.yourdomain.com:8080会指向内网NAS。https类型同理,但需要配置证书。

  • stcp安全TCP模式。它避免了将服务直接暴露在公网端口上。访问者也需要运行一个特殊的frpc作为“访问者”,通过一个“密钥”来连接。安全性更高,适合数据库等敏感服务。

  • p2p:点对点模式。frp会尝试让客户端和访问者直接建立连接,绕过服务器中转,从而降低延迟和服务器流量消耗。但成功率受网络环境(NAT类型)影响较大。

4.2 身份验证与安全加固

安全是自建服务的生命线。除了必须设置的auth.token,还有更多加固措施:

  1. 限制允许的客户端IP:在服务端frps.toml中,可以设置allowPortsallowIPs来精细控制哪些端口可以被映射,以及只接受来自特定IP的客户端连接(如果你的客户端IP固定)。
    # 只允许映射10000-20000范围内的端口 allowPorts = [ { start = 10000, end = 20000 } ]
  2. 使用TLS加密传输:在服务端和客户端配置中启用TLS,可以对控制通道和数据进行加密,防止中间人攻击。
    # 服务端和客户端配置中同时添加 transport.tls.enable = true
  3. 为Web仪表板启用HTTPS:如果仪表板需要在外网访问,务必配置HTTPS。
  4. 定期更新:关注frp的GitHub发布页,及时更新到新版本,修复潜在的安全漏洞。

4.3 性能调优与稳定性保障

对于需要高并发或低延迟的服务,可以考虑以下调优:

  • 连接池:对于tcp代理,可以设置poolCount来创建多个连接池,提升并发能力。
    [[proxies]] name = “high_concurrent_svc” type = “tcp” localIP = “127.0.0.1” localPort = 8080 remotePort = 18080 transport.poolCount = 5 # 建立5个连接池
  • 带宽限制:在服务端或客户端配置带宽限制,防止单个服务占满服务器带宽。
    # 在代理配置中 bandwidthLimit = “10MB” # 限制该代理的带宽
  • 健康检查:frp支持对后端服务的健康检查,如果内网服务宕机,frp可以自动停止转发,并记录日志。
  • 日志与监控:合理配置日志级别(infowarn),定期查看日志。将frps的systemd服务日志接入你的监控系统(如Prometheus+Grafana),便于发现问题。

5. 常见问题排查与实战心得

即使按照教程一步步来,也可能会遇到问题。下面是我在多次部署中总结的常见“坑”和解决方法。

5.1 连接失败类问题

问题:客户端日志显示“dial tcp [服务器IP]:7000: i/o timeout”“connection refused”

  • 排查思路
    1. 服务器防火墙/安全组:这是最常见的原因。确保云服务商控制台的安全组和服务器本身的防火墙(如ufw)已经放行了7000(bindPort)、7500(仪表板)以及你映射的remotePort(如6000,8080)。
      • ufw检查:sudo ufw status verbose
      • 阿里云/腾讯云等请登录控制台检查安全组规则。
    2. 服务器端口监听:在服务器上执行sudo netstat -tunlp | grep frps,检查7000端口是否由frps进程正确监听。
    3. 客户端网络:确认客户端电脑能正常访问互联网。尝试在客户端用telnet 服务器IP 7000curl -v 服务器IP:7000测试端口连通性(如果服务器端有响应)。
    4. Token错误:仔细核对服务端frps.toml和客户端frpc.toml中的auth.token是否完全一致,包括大小写和特殊字符。

问题:服务端仪表板能看到客户端在线,但访问映射的端口(如服务器IP:6000)失败。

  • 排查思路
    1. 客户端本地服务:首先确认内网客户端上,对应的服务是否真的在运行并监听在正确的IP和端口上。例如,对于RDP,检查Windows的“远程桌面”设置是否已启用;对于Web,在客户端本地用浏览器访问http://127.0.0.1:本地端口测试。
    2. 客户端防火墙:虽然frpc是主动连接,但本地的服务端口(如3389, 80)可能被Windows Defender防火墙阻止了入站连接。需要在“Windows Defender 防火墙”->“高级设置”中,为对应的端口添加入站规则。
    3. frpc配置错误:检查frpc.tomllocalIPlocalPort是否正确。localIP127.0.0.1通常指本机,如果服务运行在本机的其他IP(如192.168.1.xxx)上,需要相应修改。
    4. 服务器端口占用:确认你映射的remotePort(如6000)在服务器上没有其他程序占用。

5.2 性能与稳定性类问题

问题:连接速度慢,延迟高,或经常断开。

  • 可能原因与解决
    1. 服务器地理位置:你的公网服务器如果离你物理位置太远,网络延迟自然会高。选择离你主要访问区域近的机房。
    2. 服务器带宽小:低价VPS的带宽通常只有1Mbps或按流量计费。穿透大流量服务(如文件传输、视频流)会非常慢。升级带宽或使用p2p模式(如果成功)可以缓解。
    3. 连接池不足:高并发场景下,默认单个连接可能成为瓶颈。适当增加poolCount
    4. 客户端/服务器资源不足:检查CPU和内存使用情况。frp本身很轻量,但如果服务器或客户端负载本身已很高,也会影响网络栈处理速度。
    5. 网络波动:家庭宽带或移动网络的IP变化可能导致连接断开。确保frpc配置了自动重连(默认已开启),并考虑为客户端配置开机自启(如Windows计划任务)。

5.3 配置与管理心得

  1. 配置文件管理:建议使用版本控制(如Git)来管理你的frps.tomlfrpc.toml文件,特别是当你有多个客户端和复杂配置时。修改前做好备份。
  2. 客户端开机自启(Windows)
    • 创建一个批处理文件start_frpc.bat,内容为D:\frp\frpc -c D:\frp\frpc.toml
    • Win+R,输入shell:startup,将批处理文件或它的快捷方式放入这个启动文件夹。
    • 更优雅的方式是使用 NSSM 将frpc注册为Windows服务,这样可以在后台静默运行,并管理其生命周期。
  3. 域名与HTTPS:对于长期使用的Web服务,强烈建议购买一个域名,并配置DNS解析到你的服务器IP。然后可以使用Let‘s Encrypt等工具为你的域名申请免费SSL证书,在frp的https代理中配置证书路径,实现安全的HTTPS访问。
  4. 日志是救星:遇到任何问题,第一件事就是查看日志。服务端日志在systemctl status frpsjournalctl -u frps中;客户端日志直接显示在命令行,也可以使用-log参数输出到文件。将日志级别设为info能获得更多调试信息。

最后,我想分享一个个人体会:frp的强大在于其“简单而直接”的哲学。它不试图做一个大而全的网络平台,而是专注于做好“端口转发”这一件事,并通过灵活的配置将其做到极致。从最初的简单穿透,到后来支持多协议、负载均衡、插件系统,它的每一次更新都切中实际需求。自己搭建和维护一套frp系统,初期确实需要投入一些学习成本,但换来的是一套完全受控、可按需定制、且几乎零额外成本的网络基础设施。这种“掌控感”和解决问题的能力,正是技术实践带来的最大乐趣之一。当你成功通过自己搭建的隧道,在千里之外流畅地访问到家中的设备时,那种成就感,是使用任何现成商业服务都无法替代的。