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.gz和frp_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详解
使用vim或nano编辑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断开,进程就终止了。我们需要将其配置为系统服务。
创建Systemd服务单元文件:
sudo vim /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/frp/frps -c /opt/frp/frps.ini ExecReload=/opt/frp/frps reload -c /opt/frp/frps.ini [Install] WantedBy=multi-user.targetUser=nobody: 使用一个低权限用户运行服务,是安全最佳实践。Restart=on-failure: 服务异常退出时自动重启。ExecStart: 指向你的frps可执行文件和配置文件绝对路径。
启用并启动服务:
# 重载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_addr和server_port指向你的frps服务器。token是认证密钥。- 每个
[xxx]代表一个需要穿透的“代理”,名称可以自定义(如[rdp],[web])。 type: 指定代理类型。tcp用于转发原始的TCP流量(如RDP,SSH,数据库,游戏);http/https用于Web应用,frps可以处理HTTP协议,实现基于域名或路径的路由。local_ip和local_port: 你的内网服务实际监听的地址和端口。remote_port: 当type=tcp时,外部用户通过服务器IP:remote_port来访问你的服务。确保此端口已在服务器安全组开放。subdomain和custom_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”。
此时,你可以进行测试:
- 测试远程桌面:在另一台不在同一局域网的电脑上,打开“远程桌面连接”,输入地址:
你的服务器公网IP:33890,点击连接。你应该能看到Windows的登录界面。请注意:直接暴露RDP端口到公网存在安全风险,务必确保Windows账户使用强密码,并考虑启用网络级身份验证(NLA)。 - 测试Web服务:确保你的本地Web服务(例如运行在
localhost:8080的应用)正在运行。然后在外部浏览器访问http://myweb.yourdomain.com或http://你的服务器IP:8080(取决于你的配置),应该能看到你的本地网站。
4.4 配置Windows客户端开机自启(后台服务)
让frpc在后台运行并开机自启,才能保证服务持续可用。在Windows上,我们可以将其注册为系统服务。
使用第三方工具nssm(推荐):nssm是一个优秀的Windows服务封装工具。
- 下载nssm,将
nssm.exe放到frp目录或系统PATH路径下。 - 以管理员身份打开命令提示符,切换到frp目录,执行:
nssm install frpc - 在弹出的GUI窗口中:
- Path: 浏览选择
frpc.exe。 - Startup directory: 自动填充为frp目录。
- Arguments: 输入
-c frpc.ini。
- Path: 浏览选择
- 点击“Install service”。之后,你可以在“服务”管理器中找到名为
frpc的服务,将其启动类型设置为“自动”。
- 下载nssm,将
使用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”。
- 排查链:
- 检查服务器IP和端口:确认
server_addr和server_port(7000) 无误。 - 检查服务器防火墙/安全组:这是最常见的原因。确保云服务器安全组和系统防火墙(如ufw/iptables)已放行7000端口。可以用
telnet 你的服务器IP 7000命令从客户端测试端口连通性。 - 检查Token:确认frps和frpc中的
token完全一致,包括大小写和特殊字符。 - 服务器端frps是否运行:登录服务器,执行
sudo systemctl status frps查看状态,sudo journalctl -u frps -n 50查看最新日志。
- 检查服务器IP和端口:确认
问题2:连接成功,但无法访问映射的服务(如远程桌面连不上,网页打不开)。
- 排查链:
- 检查本地服务:首先在Windows本机,用
127.0.0.1:本地端口确认服务本身是正常运行的。 - 检查frpc配置:确认
local_ip和local_port填写正确。如果服务绑定在127.0.0.1,这里就填127.0.0.1;如果绑定在0.0.0.0,也可以填127.0.0.1或本机局域网IP。 - 检查远程端口冲突与开放:确认
remote_port在服务器上没有被其他程序占用,并且该端口已在云服务器安全组和服务器本地防火墙中放行。这是仅次于上一步的常见坑点。 - 检查代理类型:确认
type选择正确。RDP是tcp,普通网站是http或https。 - 查看frpc/frps日志:连接建立后,访问请求的转发日志会打印出来,从中可以看到转发是否成功,以及可能的错误信息。
- 检查本地服务:首先在Windows本机,用
问题3:使用子域名访问时,出现 “no available connection” 或 “route not found”。
- 排查链:
- 检查frps配置:确认
subdomain_host已正确设置为你的一级域名(如yourdomain.com)。 - 检查DNS解析:确认你访问的子域名(如
myweb.yourdomain.com)的A记录已正确解析到frps服务器的公网IP。可以使用ping或nslookup命令验证。 - 检查frpc配置:确认
subdomain填写正确,且没有和custom_domains冲突。
- 检查frps配置:确认
5.3 性能调优与资源管理
- 连接池管理:在frps的
[common]段,max_pool_count控制每个代理的最大连接池大小。对于并发量不大的个人使用,默认值50足够。如果穿透的服务并发很高,可以适当调大。 - 带宽限制:如果服务器带宽有限,可以在frpc的每个代理段设置
bandwidth_limit来限制单个代理的带宽,避免某个服务占满全部带宽。 - 日志管理:默认日志会输出到控制台。可以在配置文件中通过
log_file,log_level,log_max_days等参数将日志写入文件,并控制日志级别和保留时间,便于长期排查问题。
经过以上步骤,你应该已经成功搭建了一套属于自己的、稳定可用的内网穿透环境。从服务器部署、安全配置,到客户端的多服务暴露和开机自启,再到后期的排错与优化,这套流程覆盖了个人用户绝大多数使用场景。frp的强大之处在于其简洁的配置和极高的灵活性,一旦理解了[common]和各个代理段[xxx]的配置逻辑,你就可以轻松地将任何内网服务安全、稳定地暴露到公网,彻底打破网络的边界。