内网穿透实战:基于frp实现远程访问与本地服务暴露
2026/8/18 22:56:11 网站建设 项目流程

1. 从“局域网孤岛”到“随时访问”:为什么我们需要内网穿透

如果你和我一样,经常需要远程访问家里的电脑、NAS,或者想把自己在本地开发的服务临时分享给朋友测试,那你一定遇到过这个经典难题:设备明明就在家里,网络也通,为什么在外面就是连不上?这堵看不见的“墙”,就是NAT(网络地址转换)和运营商防火墙。我们家庭宽带分配到的通常是内网IP,路由器再通过一个公网IP与外界通信。外部网络无法主动发起对内部设备的连接请求,这就好比你的家在一个没有门牌号的大院里,快递员知道大院地址,但不知道具体该敲哪一扇门。

“内网穿透”技术,就是解决这个问题的钥匙。它通过在公网服务器(有固定IP或域名)和你的内网设备之间,建立一条稳定的“隧道”。外部请求先到达公网服务器,再由服务器通过这条隧道转发给你的内网设备,从而实现从外网访问内网服务。这就像在大院门口(公网服务器)安排了一位管家(穿透客户端),快递员把包裹交给管家,管家再根据房号(内网设备标识)准确送到你手上。

在众多内网穿透工具中,frp以其配置灵活、性能稳定、社区活跃而备受青睐。它采用C/S架构,分为服务端(frps)和客户端(frpc)。服务端部署在具有公网IP的服务器上,负责接收外部流量;客户端部署在内网设备上,主动连接服务端并注册需要暴露的服务。今天,我们就来手把手搞定在Windows客户端和Linux服务器上部署frp的全过程,让你彻底告别“局域网孤岛”。

2. 战前准备:服务器与客户端的选型与基础配置

在开始敲命令之前,合理的规划和准备能避免后续很多麻烦。这里我们假设你已经拥有一台云服务器(如阿里云、腾讯云、AWS等),系统为Ubuntu 22.04 LTS;客户端是你的Windows 10/11电脑。

2.1 服务器端(frps)环境剖析

你的云服务器是整条隧道的“枢纽”,它的选择和配置至关重要。

服务器基础要求:

  • 公网IP:这是必须的。确保你的云服务器实例分配了公网IPv4地址。部分云厂商的服务器默认只开通了IPv6或处于私有网络,需要在控制台手动申请或绑定弹性公网IP。
  • 安全组/防火墙:这是新手最容易踩坑的地方。云服务器的安全组(或防火墙规则)默认会拦截大部分入站端口。我们需要为frp服务端开放必要的端口。通常,frps默认监听7000端口用于与客户端建立控制连接。此外,我们后续映射的每个服务(如远程桌面、Web服务)都需要一个独立的端口,这些端口也需要在安全组中放行。一个稳妥的做法是,先规划好你要暴露哪些服务,记下它们的端口号,一并配置。
  • 系统权限:建议使用具有sudo权限的普通用户进行操作,而非直接使用root账户,以提高安全性。

域名与SSL(可选但推荐):如果你希望通过域名而非IP+端口来访问服务,并且希望通信加密,那么需要准备一个域名,并为frps配置TLS证书。这对于暴露Web服务(如个人博客、仪表盘)尤为重要。你可以使用Let‘s Encrypt申请免费证书。本文为简化流程,先以IP直连为例,但会在配置中预留SSL的选项。

2.2 客户端(frpc)环境确认

客户端是你的Windows电脑,需要确保:

  • 网络正常,能够访问互联网。
  • 你计划从外部访问的服务在本地是正常运行的。例如,你想穿透远程桌面,请先在局域网内测试RDP连接是否正常;想穿透一个本地Web应用,请先用浏览器访问http://localhost:端口确认服务已启动。
  • 知晓这些本地服务的监听端口(如RDP默认3389,HTTP服务可能是8080等)。

2.3 frp版本选择与下载

前往frp项目的GitHub Releases页面,根据服务器和客户端的系统架构下载对应的版本。对于大多数情况:

  • 服务器(Linux):选择linux_amd64版本。
  • 客户端(Windows):选择windows_amd64版本。

下载后,你将得到一个压缩包(如frp_0.xx.x_linux_amd64.tar.gzfrp_0.xx.x_windows_amd64.zip)。里面包含frps(服务端程序)、frpc(客户端程序)以及它们各自的配置文件示例(frps.ini,frpc.ini)和完整配置文件(frps_full.ini,frpc_full.ini)。完整配置文件包含了所有可配置项的说明,是极好的参考手册。

3. 服务器端部署实战:从安装到守护进程

现在,我们登录到Linux服务器,开始部署frp服务端。

3.1 上传、解压与目录规划

通过SFTP工具(如WinSCP、FileZilla)或scp命令,将Linux版的frp压缩包上传到服务器的某个目录,例如/opt

# 切换到目录并解压 cd /opt sudo tar -zxvf frp_0.xx.x_linux_amd64.tar.gz # 重命名目录以便管理 sudo mv frp_0.xx.x_linux_amd64 frp cd frp

解压后,你会看到一系列文件。我们主要关心frps(可执行文件)和frps.ini(配置文件)。一个好的习惯是建立独立的目录来存放这些文件,并与系统服务集成。

3.2 核心配置文件frps.ini详解

使用vimnano编辑frps.ini文件。一个最基础但功能完整的配置如下:

[common] bind_addr = 0.0.0.0 bind_port = 7000 # 仪表盘端口,用于查看frps状态 dashboard_port = 7500 # 仪表盘登录账号密码 dashboard_user = admin dashboard_pwd = your_strong_password_here # 客户端连接认证令牌,强烈建议设置,增强安全性 token = your_secure_token_here # 子域名配置,如果你打算用子域名访问服务(如web.yourdomain.com) subdomain_host = yourdomain.com # 最大连接池大小,根据客户端数量调整 max_pool_count = 50

关键配置项解读:

  • bind_addr = 0.0.0.0: 表示监听所有网络接口,这是标准做法。
  • token: 这是服务端和客户端之间的“暗号”。客户端配置中必须使用相同的token才能成功连接。务必将其修改为一个强密码,并妥善保管。
  • dashboard_port,user,pwd: 开启了frps的内置Web管理面板,你可以通过http://你的服务器IP:7500来查看连接状态、流量统计,非常直观。
  • subdomain_host: 这是实现“子域名访问”功能的关键。假设你拥有域名yourdomain.com,并已将*.yourdomain.com的A记录解析到你的服务器IP。在客户端配置中,你可以为某个服务设置subdomain = web,那么外部用户访问http://web.yourdomain.com时,frps会根据子域名web将请求转发给对应的客户端。这比记端口号方便得多。

3.3 配置系统服务(Systemd)实现开机自启与自动守护

手动运行./frps -c ./frps.ini虽然可以启动,但一旦SSH断开,进程就终止了。我们需要将其配置为系统服务。

  1. 创建Systemd服务单元文件:

    sudo vim /etc/systemd/system/frps.service
  2. 写入以下内容:

    [Unit] Description=Frp Server Service After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/opt/frp/frps -c /opt/frp/frps.ini ExecReload=/opt/frp/frps reload -c /opt/frp/frps.ini [Install] WantedBy=multi-user.target
    • User=nobody: 使用一个低权限用户运行服务,是安全最佳实践。
    • Restart=on-failure: 服务异常退出时自动重启。
    • ExecStart: 指向你的frps可执行文件和配置文件绝对路径。
  3. 启用并启动服务:

    # 重载systemd配置 sudo systemctl daemon-reload # 设置开机自启 sudo systemctl enable frps # 立即启动服务 sudo systemctl start frps # 查看服务状态和日志 sudo systemctl status frps sudo journalctl -u frps -f

    看到active (running)状态,并且日志显示“frps started successfully”之类的信息,说明服务端已成功启动。

3.4 服务器防火墙与安全组配置

这是打通内外网络的最后一道关卡,必须配置正确。

云平台安全组(以阿里云/腾讯云为例):登录云服务器控制台,找到你的实例所属的安全组,添加入方向规则:

  • 协议:TCP,端口范围:7000(frps控制端口), 授权对象:0.0.0.0/0(或你的固定IP以提升安全)。
  • 协议:TCP,端口范围:7500(仪表盘端口), 授权对象:建议设置为你的办公IP或0.0.0.0/0(如果临时查看)。
  • 协议:TCP,端口范围:你计划为内网服务映射的公网端口(例如,远程桌面用33890,Web服务用8080),授权对象按需设置。

服务器本地防火墙(如果启用,如ufw):

sudo ufw allow 7000/tcp sudo ufw allow 7500/tcp sudo ufw allow 33890/tcp # 举例 sudo ufw reload

现在,你可以尝试在浏览器访问http://你的服务器IP:7500,输入配置的用户名密码,应该能看到frps的仪表盘了。这证明服务端部署成功。

4. Windows客户端配置:以远程桌面和Web服务为例

服务端就绪后,我们回到Windows电脑,配置客户端来暴露本地服务。

4.1 解压与配置文件准备

将Windows版的frp压缩包解压到一个方便的位置,例如D:\Tools\frp。在这个目录下,找到frpc.ini文件,用记事本或VS Code等编辑器打开。

4.2 详解frpc.ini配置文件

一个配置了远程桌面和HTTP Web服务的客户端配置示例如下:

[common] server_addr = 你的服务器公网IP server_port = 7000 token = your_secure_token_here # 必须与frps.ini中的token一致 # 示例1:暴露Windows远程桌面(RDP) [rdp] type = tcp local_ip = 127.0.0.1 local_port = 3389 remote_port = 33890 # 在服务器端映射的端口 # 示例2:暴露一个本地运行的Web服务(例如在localhost:8080) [web] type = http local_ip = 127.0.0.1 local_port = 8080 # 使用子域名方式访问(需在frps配置subdomain_host) subdomain = myweb # 或者使用自定义域名(需将域名解析到服务器IP) custom_domains = myapp.yourdomain.com # 或者使用端口方式访问(无需域名) # remote_port = 8080 # 示例3:暴露一个TCP类型的自定义服务(如Minecraft服务器) [my_game] type = tcp local_ip = 127.0.0.1 local_port = 25565 remote_port = 25565

配置逻辑深度解析:

  • [common]段:定义了客户端如何连接服务端。server_addrserver_port指向你的frps服务器。token是认证密钥。
  • 每个[xxx]代表一个需要穿透的“代理”,名称可以自定义(如[rdp],[web])。
  • type: 指定代理类型。tcp用于转发原始的TCP流量(如RDP,SSH,数据库,游戏);http/https用于Web应用,frps可以处理HTTP协议,实现基于域名或路径的路由。
  • local_iplocal_port: 你的内网服务实际监听的地址和端口。
  • remote_port: 当type=tcp时,外部用户通过服务器IP:remote_port来访问你的服务。确保此端口已在服务器安全组开放。
  • subdomaincustom_domains: 当type=http/https时使用。这是frp非常强大的功能。假设frps配置了subdomain_host = yourdomain.com,此处设置subdomain = myweb,那么外部访问http://myweb.yourdomain.com的请求就会被自动转发到本地的8080端口。custom_domains则用于指定完全独立的域名。

4.3 启动客户端与验证连接

保存好frpc.ini文件后,打开命令提示符(CMD)或PowerShell,切换到frp目录,执行:

frpc.exe -c frpc.ini

如果一切配置正确,你会看到连接成功的日志,例如“proxy [rdp] start success”

此时,你可以进行测试:

  1. 测试远程桌面:在另一台不在同一局域网的电脑上,打开“远程桌面连接”,输入地址:你的服务器公网IP:33890,点击连接。你应该能看到Windows的登录界面。请注意:直接暴露RDP端口到公网存在安全风险,务必确保Windows账户使用强密码,并考虑启用网络级身份验证(NLA)。
  2. 测试Web服务:确保你的本地Web服务(例如运行在localhost:8080的应用)正在运行。然后在外部浏览器访问http://myweb.yourdomain.comhttp://你的服务器IP:8080(取决于你的配置),应该能看到你的本地网站。

4.4 配置Windows客户端开机自启(后台服务)

让frpc在后台运行并开机自启,才能保证服务持续可用。在Windows上,我们可以将其注册为系统服务。

  1. 使用第三方工具nssm(推荐):nssm是一个优秀的Windows服务封装工具。

    • 下载nssm,将nssm.exe放到frp目录或系统PATH路径下。
    • 以管理员身份打开命令提示符,切换到frp目录,执行:
      nssm install frpc
    • 在弹出的GUI窗口中:
      • Path: 浏览选择frpc.exe
      • Startup directory: 自动填充为frp目录。
      • Arguments: 输入-c frpc.ini
    • 点击“Install service”。之后,你可以在“服务”管理器中找到名为frpc的服务,将其启动类型设置为“自动”。
  2. 使用Windows计划任务:创建一个在系统启动时运行frpc.exe的计划任务,也可以实现自启,但作为服务管理的便捷性不如nssm。

5. 进阶配置与深度避坑指南

基础功能跑通后,我们来看看如何优化和解决常见问题。

5.1 提升安全性与连接稳定性

  • 使用强Token和仪表盘密码:这是第一道防线,切勿使用默认或弱密码。
  • 限制访问来源:在frps的[common]段,可以使用allow_ports来限制客户端可以绑定哪些远程端口,使用privilege_allow_ips来限制允许连接frps的客户端IP,进一步提升安全性。
  • 启用TLS加密通信:[common]段添加tls_enable = true,可以为frps和frpc之间的控制连接启用TLS加密,防止通信被窃听。对于type=https的代理,还需要配置证书。
  • 配置连接保活与重试:在frpc的[common]段,可以设置:
    tcp_mux = true # 启用多路复用,提升性能 heartbeat_interval = 30 heartbeat_timeout = 90 login_fail_exit = false # 连接失败不退出,持续重试
    这些参数有助于在网络波动时保持连接稳定,并自动重连。

5.2 常见问题排查思路

问题1:frpc连接失败,日志显示 “connection timed out” 或 “login to server failed”。

  • 排查链:
    1. 检查服务器IP和端口:确认server_addrserver_port(7000) 无误。
    2. 检查服务器防火墙/安全组:这是最常见的原因。确保云服务器安全组和系统防火墙(如ufw/iptables)已放行7000端口。可以用telnet 你的服务器IP 7000命令从客户端测试端口连通性。
    3. 检查Token:确认frps和frpc中的token完全一致,包括大小写和特殊字符。
    4. 服务器端frps是否运行:登录服务器,执行sudo systemctl status frps查看状态,sudo journalctl -u frps -n 50查看最新日志。

问题2:连接成功,但无法访问映射的服务(如远程桌面连不上,网页打不开)。

  • 排查链:
    1. 检查本地服务:首先在Windows本机,用127.0.0.1:本地端口确认服务本身是正常运行的。
    2. 检查frpc配置:确认local_iplocal_port填写正确。如果服务绑定在127.0.0.1,这里就填127.0.0.1;如果绑定在0.0.0.0,也可以填127.0.0.1或本机局域网IP。
    3. 检查远程端口冲突与开放:确认remote_port在服务器上没有被其他程序占用,并且该端口已在云服务器安全组和服务器本地防火墙中放行。这是仅次于上一步的常见坑点。
    4. 检查代理类型:确认type选择正确。RDP是tcp,普通网站是httphttps
    5. 查看frpc/frps日志:连接建立后,访问请求的转发日志会打印出来,从中可以看到转发是否成功,以及可能的错误信息。

问题3:使用子域名访问时,出现 “no available connection” 或 “route not found”。

  • 排查链:
    1. 检查frps配置:确认subdomain_host已正确设置为你的一级域名(如yourdomain.com)。
    2. 检查DNS解析:确认你访问的子域名(如myweb.yourdomain.com)的A记录已正确解析到frps服务器的公网IP。可以使用pingnslookup命令验证。
    3. 检查frpc配置:确认subdomain填写正确,且没有和custom_domains冲突。

5.3 性能调优与资源管理

  • 连接池管理:在frps的[common]段,max_pool_count控制每个代理的最大连接池大小。对于并发量不大的个人使用,默认值50足够。如果穿透的服务并发很高,可以适当调大。
  • 带宽限制:如果服务器带宽有限,可以在frpc的每个代理段设置bandwidth_limit来限制单个代理的带宽,避免某个服务占满全部带宽。
  • 日志管理:默认日志会输出到控制台。可以在配置文件中通过log_file,log_level,log_max_days等参数将日志写入文件,并控制日志级别和保留时间,便于长期排查问题。

经过以上步骤,你应该已经成功搭建了一套属于自己的、稳定可用的内网穿透环境。从服务器部署、安全配置,到客户端的多服务暴露和开机自启,再到后期的排错与优化,这套流程覆盖了个人用户绝大多数使用场景。frp的强大之处在于其简洁的配置和极高的灵活性,一旦理解了[common]和各个代理段[xxx]的配置逻辑,你就可以轻松地将任何内网服务安全、稳定地暴露到公网,彻底打破网络的边界。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询