1. 为什么你需要内网穿透?从“家里蹲”到“全球通”
你是不是也遇到过这种尴尬?自己在家里的电脑上搭了个网站,或者写了个小工具,想给朋友看看,结果发现对方根本访问不了。或者,你有一台放在公司内网的开发服务器,下班回家想连上去改点代码,却发现“此路不通”。这背后的“罪魁祸首”,就是我们常说的内网环境。
简单来说,我们家里的路由器、公司的防火墙,都像是一道安全门,把我们的设备保护在一个私密的网络里。这个网络里的设备可以互相访问,但外面的互联网却无法直接“敲门进来”。这当然是好事,保证了安全,但也带来了不便:你的服务被“困”在了内网。
这时候,内网穿透技术就派上用场了。它的作用,就像给你的内网服务开了一个专属的“快递收发站”。这个“收发站”设在一台拥有公网IP的服务器(我们称之为“公网服务器”或“中转服务器”)上。当外部用户想访问你内网的服务时,他们先访问这个公网服务器的某个端口;公网服务器收到请求后,会通过一条已经建立好的安全通道,把请求“转发”给你的内网机器;内网机器处理完请求,再把结果通过这条通道传回公网服务器,最终送达用户。整个过程,对用户来说是透明的,他感觉就像直接访问了你的内网机器一样。
实现内网穿透的工具有很多,比如 ngrok、花生壳等。但今天我要重点介绍的,是 frp。我选择它的理由很实在:开源免费、配置灵活、性能稳定、社区活跃。我自己在多个项目里都用它,从简单的远程桌面到复杂的Web服务暴露,它都能稳稳地扛住。相比于一些有流量或连接数限制的商用服务,frp 把控制权完全交还给了你自己,用起来特别踏实。
接下来,我就手把手带你,从零开始,用 frp 搭建一套属于自己的内网穿透服务。我们会完成两个最经典、最实用的场景:SSH远程登录内网机器和访问内网搭建的Web服务(以Nginx为例)。只要你有一台云服务器(比如腾讯云、阿里云最便宜的那种就行),再有一台需要被访问的内网电脑(可以是家里的NAS、树莓派,或者办公室的电脑),就能跟着我一起操作了。
2. 战前准备:搞定服务器与客户端
工欲善其事,必先利其器。在开始配置之前,我们需要明确两个角色,并准备好相应的“武器”。
公网服务器(服务端,frps):这是整个穿透体系的核心枢纽。它必须拥有一个公网IP地址,能让全世界直接访问。通常,我们会购买一台云服务器来扮演这个角色。你不需要多高的配置,1核1G就完全足够跑 frp 服务了,因为它的资源消耗非常小。
内网机器(客户端,frpc):这就是你需要被访问的那台设备。它处在路由器或防火墙后面,没有公网IP。它可以是任何系统——Windows、Linux,甚至路由器里的OpenWrt系统。
我们的作战计划是:在公网服务器上运行 frp 的服务端程序(frps),在内网机器上运行 frp 的客户端程序(frpc)。两者通过配置好的端口建立一条加密隧道,数据就在这条隧道里安全穿梭。
第一步:下载 frp
frp 的官方项目托管在 GitHub 上。我们直接去发布页面下载最新版本。这里有个小技巧,为了确保教程的长期有效性,我建议你养成查看最新版本号的习惯。访问 https://github.com/fatedier/frp/releases,你会看到一堆发布版本。选择名字里带 linux_amd64 的压缩包给服务器(通常是Linux系统),根据你内网机器的系统,选择对应的版本,比如 windows_amd64.zip 给 Windows 电脑。
如果你访问 GitHub 速度慢,可以尝试使用一些开发者常用的加速工具,或者从国内的镜像站下载。下载完成后,你会得到一个压缩包,里面包含了 frps、frpc、以及它们的配置文件样本。
第二步:文件分发
- 将
frp_0.58.1_linux_amd64.tar.gz(请以你实际下载的版本号为准)上传到你的公网服务器。你可以用scp命令,或者通过云服务商提供的网页控制台上传。 - 将对应的客户端版本(比如
frp_0.58.1_windows_amd64.zip)下载到你的内网机器上。
第三步:基础解压与熟悉 在服务器上,我们通过 SSH 连上去操作:
# 解压下载的压缩包
tar -zxvf frp_0.58.1_linux_amd64.tar.gz
# 进入解压后的目录
cd frp_0.58.1_linux_amd64/
# 查看目录内容
ls -al
你会看到几个关键文件:frps(服务端程序)、frps.toml(服务端配置模板)、frpc(客户端程序)、frpc.toml(客户端配置模板)。.toml 是一种比传统 .ini 更清晰的配置文件格式。
在内网机器上(以Linux为例),也进行同样的解压操作。现在,两边的“武器”都就位了,接下来我们进入最关键的配置环节。
3. 核心配置详解:让两端“握手”成功
配置 frp,说白了就是告诉服务端和客户端:“你们要在哪个端口见面,见面后怎么交换数据”。配置文件虽然简单,但每一个参数都至关重要。我们先从服务端配置开始。
3.1 配置服务端 (frps.toml)
在公网服务器上,用你喜欢的文本编辑器(如 vim 或 nano)打开 frps.toml 文件。
vim frps.toml
你会看到一个非常简洁的模板。我们将其修改为如下内容:
bindPort = 7000
auth.method = “token”
auth.token = “your_strong_password_here”
我来解释一下这几个参数:
bindPort = 7000:这是 frp 控制通道的端口。客户端(frpc)通过连接服务器的这个端口,来建立和管理隧道。你可以把它想象成两家公司总部之间的专用电话线号码。这个端口可以自定义,比如改成 7999,但一定要记住,并且确保在服务器的防火墙(安全组)中放行这个端口。auth.method和auth.token:这是 身份验证 配置,非常重要!它防止任何人随便连上你的 frp 服务器。token就是一个密码,客户端配置里必须使用相同的密码才能连接。请务必将your_strong_password_here替换成一个你自己生成的、足够复杂的字符串。我习惯用命令openssl rand -base64 16来生成一个随机密码。
配置就这么简单,保存退出。现在可以启动服务端了:
./frps -c ./frps.toml
如果看到日志输出 “frps started successfully” 之类的信息,并且程序没有退出,说明服务端已经在 7000 端口成功监听了。你可以按 Ctrl+C 先停止它,因为我们还要配置客户端。
3.2 配置客户端 (frpc.toml) - SSH穿透
现在切换到内网机器,编辑 frpc.toml 文件。我们的第一个目标是:通过公网服务器的某个端口,SSH 登录到这台内网机器。
假设内网机器的 SSH 服务端口是默认的 22。客户端配置如下:
serverAddr = “你的公网服务器IP地址”
serverPort = 7000
auth.method = “token”
auth.token = “your_strong_password_here” # 必须和服务端设置的一模一样!
[[proxies]]
name = “ssh”
type = “tcp”
localIP = “127.0.0.1”
localPort = 22
remotePort = 6000
逐条解析客户端配置:
serverAddr和serverPort:告诉客户端去哪里找服务端。就是公网服务器的 IP 和我们在frps.toml里设置的bindPort(7000)。auth.token:握手密码,必须和服务端一致。[[proxies]]:这是一个代理配置块的开始。name是这个代理规则的名字,可以自定义。type = “tcp”:因为 SSH 协议是基于 TCP 的,所以我们选择 TCP 类型的代理。localIP和localPort:这是内网服务的地址和端口。127.0.0.1代表本机,22就是本机 SSH 服务的端口。remotePort = 6000:这是最关键的参数!它定义了在公网服务器上开放的端口。意思是:当外部用户连接公网服务器的 6000 端口时,这个连接会被 frp 隧道转发到内网机器的 22 端口。
整个流程的比喻:公网服务器(门卫)在 7000 端口设立了接待处(frp控制通道)。内网机器(访客)到接待处登记,说:“我叫 ssh,我家(内网22端口)的电话,请你转接到你这里的 6000 号分机(remotePort)上。” 登记成功后,任何人拨打公网服务器的 6000 号分机,电话就会自动转接到内网机器的 22 端口。
3.3 首次连接测试
- 启动服务端:在公网服务器上,运行
./frps -c ./frps.toml。建议在首次测试时在前台运行,方便看日志。 - 启动客户端:在内网机器上,运行
./frpc -c ./frpc.toml。 - 观察日志:如果两边都显示连接成功、没有报错,恭喜你,隧道已经建立!
- 进行SSH连接:现在,打开你本地电脑的终端(比如 Windows 的 PowerShell 或 Mac 的 Terminal),使用以下命令进行 SSH 连接:
注意,这里的端口是ssh -p 6000 你的内网机器用户名@你的公网服务器IP6000(客户端配置的remotePort),用户名是内网机器的系统用户名,IP 是公网服务器的 IP。
如果一切顺利,你应该能成功登录到内网机器!第一次成功的感觉总是最棒的。你可以在内网机器上执行 ls、pwd 等命令验证一下。这意味着,无论你身在何处,只要能上网,就能管理这台内网设备了。
4. 进阶实战:暴露内网的Web服务(Nginx)
搞定 SSH 只是第一步,更常见的需求是把自己在内网搭建的网站、博客、或者像 Jellyfin、Nextcloud 这样的自建服务分享出去。这里我们以最经典的 Web 服务器 Nginx 为例。
首先,确保你的内网机器上已经安装并运行了 Nginx。在 Ubuntu/Debian 上可以这样安装:
sudo apt update
sudo apt install -y nginx
sudo systemctl start nginx
安装后,在本机浏览器访问 http://127.0.0.1,应该能看到 Nginx 的欢迎页面。Nginx 默认监听 80 端口。
现在,我们要修改 frp 客户端配置,让公网用户能访问这个内网的 Nginx。一个非常强大的特性是,frp 客户端可以同时配置多个代理规则。我们不需要删除之前的 SSH 配置,直接在后面追加即可。
打开内网机器的 frpc.toml 文件,在 SSH 代理的配置后面,添加一个新的 [[proxies]] 块:
# ... 前面是SSH的配置,保持不变 ...
[[proxies]]
name = “web”
type = “tcp”
localIP = “127.0.0.1”
localPort = 80
remotePort = 8080
这个配置和 SSH 非常相似:
name改成了“web”以示区别。localPort改成了 Nginx 监听的80。remotePort设置成了8080。这意味着我们将通过公网服务器的 8080 端口来访问内网的 Web 服务。
保存配置文件。由于我们修改了客户端配置,需要重启 frpc 客户端进程。先按 Ctrl+C 停止正在运行的客户端,然后重新执行 ./frpc -c ./frpc.toml 启动。服务端一般不需要重启。
现在,打开你任意一台能上网的电脑的浏览器,在地址栏输入:
http://你的公网服务器IP:8080
回车!神奇的事情发生了,你应该看到了和内网机器上一样的 Nginx 欢迎页面。这意味着你的内网 Web 服务已经成功“穿透”到公网了。
这里有一个非常重要的安全提醒:我们上面使用的是 type = “tcp”,这是最基础的转发。对于 HTTP/HTTPS 网站,frp 提供了更强大的 type = “http” 或 “https” 代理类型。使用这种类型,frps 服务端可以帮你处理域名绑定、URL 路由、SSL 证书卸载等高级功能,并且只需要一个公网端口(比如 80 或 443)就能代理无数个内网不同的网站,配置会更复杂但更专业。对于入门来说,TCP 转发简单直接,足够我们理解原理和完成基本暴露。
5. 化繁为简:后台运行与开机自启
测试成功了,但我们不可能永远开着终端窗口运行 ./frps 和 ./frpc。我们需要让它们在后台稳定运行,并且服务器重启后能自动启动。这才是生产环境的使用方式。
对于 Linux 系统(服务端和客户端都适用),最推荐的方式是使用 Systemd。
- 创建 Systemd 服务文件:
以服务端(frps)为例,在服务器上创建文件
/etc/systemd/system/frps.service。sudo vim /etc/systemd/system/frps.service - 编写服务配置:
将以下内容写入文件,注意修改
ExecStart的路径为你 frps 的实际存放路径。[Unit] Description=Frp Server Service After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/path/to/your/frps -c /path/to/your/frps.toml # 假设你的frps和配置在 /opt/frp/ 目录下 # ExecStart=/opt/frp/frps -c /opt/frp/frps.toml [Install] WantedBy=multi-user.target - 启用并启动服务:
看到sudo systemctl daemon-reload # 重载配置 sudo systemctl enable frps # 设置开机自启 sudo systemctl start frps # 立即启动服务 sudo systemctl status frps # 查看运行状态active (running)就表示成功了。同样的方法,在内网机器上为 frpc 创建frpc.service文件并启用。
对于 Windows 客户端,可以将其注册为系统服务,或者更简单一点,创建一个批处理文件(.bat),然后将其放入系统的启动文件夹。也可以使用 nssm 这个工具来将其安装为 Windows 服务,这样更稳定。
配置好后台服务后,你的内网穿透隧道就变成了一个“基础设施”,7x24小时默默工作,你再也不用操心它了。
6. 安全加固与性能调优
让服务跑起来只是开始,让它跑得安全、跑得稳,才是我们更关心的。这里分享几个我踩过坑后总结的经验。
安全第一:
- 强密码与定期更换:
frps.toml里的auth.token一定要用高强度密码(大小写字母、数字、符号混合),并且养成定期更换的习惯。 - 限制访问端口:在云服务器的防火墙(安全组)设置中,遵循最小权限原则。只开放必要的端口:
7000(frp控制端口)、6000(SSH转发端口)、8080(Web转发端口)。其他所有端口一律关闭。 - 使用非默认端口:将
bindPort从7000改为一个不常见的端口,可以减少被自动化工具扫描的风险。 - 考虑 TLS 加密:frp 支持在客户端和服务端之间使用 TLS 加密通信。虽然配置稍复杂,但对于传输敏感数据(如 SSH)的场景,强烈建议启用。在配置文件中添加
tls.enable = true相关选项即可。 - 客户端特权模式:在
frpc.toml中,可以设置privilegeMode = true并配置对应的privilegeToken,实现更细粒度的权限控制,但非必需。
性能与稳定:
- 连接池与超时:对于访问量较大的 TCP 服务,可以在客户端代理配置中设置
poolCount来启用连接池,提升性能。合理设置healthCheckTimeoutSec等超时参数,避免僵尸连接。 - 日志与监控:在配置文件中通过
log.level设置日志级别(如“info”或“warn”),将log.to指向一个具体的日志文件路径,方便出问题时排查。对于服务器,可以用systemctl status frps或journalctl -u frps查看运行状态和日志。 - 带宽考虑:frp 本身开销很小,主要瓶颈在于你的公网服务器的上行带宽。如果你暴露的服务需要传输大量数据(如视频流),请确保服务器带宽足够,否则体验会卡顿。
- 多客户端管理:如果你有多个内网设备需要穿透,可以在一个 frps 下连接多个 frpc。只需确保每个 frpc 配置的
remotePort不冲突即可。更高级的用法是使用subdomain或customDomains(HTTP类型代理)来通过不同域名区分服务。
7. 排错指南:常见问题与解决办法
即使跟着教程一步步来,也可能会遇到问题。别慌,我把我遇到过的一些典型问题和解决办法列出来,你可以对照排查。
问题一:客户端连接失败,日志显示 “connection refused” 或 “timeout”。
- 原因99%是网络不通。
- 排查步骤:
- 检查服务器IP和端口:确认
serverAddr和serverPort写对了。用ping 你的公网服务器IP测试基础连通性。 - 检查服务器防火墙/安全组:这是最最常见的坑!务必登录云服务商控制台,检查安全组规则是否放行了
bindPort(如7000)和你在remotePort中设置的所有端口(如6000, 8080)。入方向规则必须允许这些端口。 - 检查服务器本地防火墙:如果云服务器本身还开启了
firewalld或ufw,也需要在里面放行端口。例如sudo ufw allow 7000。 - 服务端程序是否运行:在服务器上执行
ps aux | grep frps和netstat -tlnp | grep 7000,确认 frps 进程存在并在监听7000端口。
- 检查服务器IP和端口:确认
问题二:连接成功,但访问公网端口没反应(SSH连不上或网页打不开)。
- 排查步骤:
- 检查客户端配置:确认
localIP和localPort是否正确。例如,你的 Nginx 真的运行在127.0.0.1:80吗?可以用curl http://127.0.0.1在内网机器本地测试。 - 检查内网防火墙:内网机器的防火墙可能阻止了 frpc 访问本地服务。可以暂时关闭防火墙测试(
sudo ufw disable),但生产环境请配置规则放行。 - 端口占用:你设置的
remotePort(如8080)可能在公网服务器上已经被其他程序占用了。在服务器上用netstat -tlnp | grep 8080检查。
- 检查客户端配置:确认
问题三:服务运行一段时间后中断。
- 可能原因:
- 网络波动:内网机器的网络不稳定。frp 有自动重连机制,一般能恢复。可以查看客户端日志。
- Token 不一致:检查服务端和客户端的
auth.token是否完全一致,包括大小写和特殊字符。 - 版本不一致:尽量保证服务端和客户端使用相同版本的 frp,避免兼容性问题。
通用排错心法:多看日志! 启动时加上 --log-level debug 参数可以输出更详细的信息。例如 ./frpc -c ./frpc.toml --log-level debug。日志会明确告诉你问题出在哪一步。
走到这里,你已经成功搭建了一套完全由自己掌控的内网穿透服务。从今往后,你的内网服务就不再是“信息孤岛”了。无论是管理家里的软路由、NAS,还是远程连接公司的开发环境,亦或是向朋友展示你刚做好的个人网站,都变得轻而易举。技术的乐趣就在于这种“连接”与“创造”,希望 frp 这个工具能为你打开一扇新的大门。如果在实践中遇到任何新问题,不妨去 frp 的 GitHub Issues 页面看看,社区非常活跃,很多坑前人都已经踩过了。
7827



被折叠的 条评论
为什么被折叠?



