FRP 内网穿透入门:轻松实现公网访问内网
告别束缚:为什么你需要内网穿透?
想象一下这样的场景:你在家里的电脑上搭建了一个非常棒的个人博客、文件服务器(NAS),或者运行了一个联机游戏服务器,供你和朋友一起玩。当你出门在外,或者你的朋友试图从外部网络访问这些服务时,却发现怎么也连不上。这是为什么呢?
原因很简单:你的家庭网络通常位于一个叫做“内网”的环境中,它隐藏在路由器后面。路由器通过网络地址转换(NAT)技术,让内网中的多台设备共享一个公网 IP 地址。从外部网络看,只能看到这个公网 IP,而无法直接“看到”你内网中的特定设备及其提供的服务。这就好比你住在一个小区里,小区只有一个大门(公网 IP),而你的房子(内网设备)在里面,别人只知道小区大门,不知道你具体住哪栋哪户,自然无法直接拜访你家里的某个房间(服务端口)。
传统的解决方法通常是“端口转发”(Port Forwarding)。通过在路由器设置中,将外部某个端口的访问请求,转发到内网中特定设备的特定端口。这在理论上可行,但也存在一些现实问题:
- 动态公网 IP: 大多数家庭用户的公网 IP 是动态分配的,隔一段时间就会变化。这意味着你可能需要使用动态域名服务(DDNS)来保持访问地址的稳定,增加了配置的复杂性。
- 路由器设置复杂: 不同品牌、不同型号的路由器,其设置界面和操作方式差异很大,对于不熟悉网络的用户来说,找到并正确配置端口转发可能非常困难,甚至一些光猫或老旧路由器根本不支持或功能受限。
- 安全性考量: 直接暴露内网服务的端口到公网,如果没有做好安全措施(如防火墙、强密码),可能会增加被扫描和攻击的风险。
- 多层 NAT: 有些用户可能处于更复杂的网络环境,比如“大内网”或多层路由器,这种情况下端口转发几乎无法奏效。
那么,有没有一种更简单、更稳定、更通用的方法,能够让我们绕过这些障碍,轻松地从公网访问内网服务呢?答案就是——内网穿透。而 FRP,正是当前最流行、最强大、最易用的内网穿透工具之一。
FRP 是什么?为什么选择它?
FRP(Fast Reverse Proxy)是一个高性能的反向代理应用,它可以帮助你将内网的服务(如 SSH、Web 服务器、远程桌面、数据库、游戏服务器等)通过一台具有公网 IP 的服务器暴露给外部网络。
FRP 的核心思想是构建一个“隧道”。它包含两个主要部分:
- frps (FRP Server): 运行在具有公网 IP 的服务器上。它监听一个特定的端口,等待来自内网客户端的连接。
- frpc (FRP Client): 运行在你内网中需要被访问的设备上。它主动连接到 frps,并建立一条或多条加密的隧道。
一旦隧道建立,外部用户就可以通过访问 frps 所在的服务器的某个端口,frps 就会将请求通过隧道转发给 frpc,frpc 再将请求转发给你内网中的目标服务。服务响应的数据也会通过隧道原路返回给外部用户。整个过程就像是 frpc 在公网服务器上为你内网的服务开辟了一个“临时入口”。
相较于其他内网穿透方案,FRP 具有诸多优势:
- 开源免费: FRP 是一个完全开源的项目,可以免费使用和修改。
- 高性能: 使用 Go 语言编写,性能优异,资源占用低。
- 多协议支持: 支持 TCP、UDP、HTTP、HTTPS 等多种协议,几乎涵盖了所有常见的应用场景。
- 配置灵活: 提供丰富的配置选项,可以满足各种复杂的穿透需求,支持域名绑定、子域名、身份验证等。
- 跨平台: 支持 Windows, macOS, Linux 等多种操作系统。
- 易于部署: 下载对应系统的压缩包,解压后修改简单的配置文件即可运行。
- 安全性: 支持 TLS 加密通讯、客户端身份验证等安全特性。
- Dashboard: 提供一个 Web 界面,方便监控 FRP 服务器和客户端的状态。
FRP 内网穿透的基本原理图
(图片来源:网络,示意图,实际细节可能略有不同)
这张图清晰地展示了 FRP 的工作流程:
1. 一个公网用户想要访问位于内网的服务(例如 Web 服务器)。
2. frps 运行在公网服务器上,监听一个端口。
3. frpc 运行在内网的服务所在设备上,主动连接到 frps。
4. 公网用户通过公网服务器的 IP 和 frps 配置的端口发起访问请求。
5. 公网服务器上的防火墙和 frps 接收到请求。
6. frps 通过 frpc 之前建立的隧道,将请求转发给内网的 frpc。
7. frpc 将请求转发给内网的实际服务(例如 Web 服务器)。
8. 内网服务处理请求并返回响应给 frpc。
9. frpc 通过隧道将响应返回给 frps。
10. frps 将响应返回给公网用户。
整个过程对公网用户是透明的,他们感觉就像是直接访问了公网服务器上的服务一样。
准备工作:开始前你需要什么?
在正式开始配置和使用 FRP 之前,请确保你具备以下条件:
- 一台具有公网 IP 的服务器: 这是 FRP 穿透的核心。你可以购买一台便宜的云服务器(VPS),例如阿里云、腾讯云、华为云、DigitalOcean、Vultr 等。选择 Linux 系统(如 CentOS、Ubuntu、Debian)通常更方便部署和管理。服务器需要开放 FRP 服务端监听的端口和客户端暴露服务的端口(需要在服务器的防火墙和云服务商的安全组中配置)。
- 一台位于内网的设备: 这是你想要被外部访问的设备,可以是你的个人电脑、树莓派、NAS 等,运行 Windows、Linux 或 macOS 均可。这台设备需要能够访问互联网,以便连接到你的公网服务器。
- 基础的命令行操作知识: 你需要知道如何在 Linux 或 Windows 的命令行界面中执行基本操作,如下载文件、解压文件、编辑文本文件、运行程序等。
- 耐心和排错能力: 初次配置可能会遇到一些小问题,根据错误提示和日志进行排查是必要的。
入门实践:一步步搭建 FRP 内网穿透
我们将通过一个常见的例子来演示 FRP 的搭建过程:将内网中的一个 SSH 服务(通常是 Linux 系统的 22 端口)和 Web 服务(通常是 80 或 8080 端口)暴露到公网。
整个过程分为两大部分:部署和配置 FRP 服务器(frps),以及部署和配置 FRP 客户端(frpc)。
第一步:下载 FRP
首先,你需要在公网服务器和内网设备上都下载 FRP 的程序包。
访问 FRP 的 GitHub Releases 页面:https://github.com/fatedier/frp/releases
找到最新版本的 FRP,根据你的服务器和内网设备的操作系统和架构选择对应的压缩包。
- Linux 服务器 (64位): 通常选择
frp_版本号_linux_amd64.tar.gz
- Windows 内网设备 (64位): 选择
frp_版本号_windows_amd64.zip
- macOS 内网设备 (64位): 选择
frp_版本号_darwin_amd64.tar.gz
- 树莓派或其他 ARM 架构设备: 选择
frp_版本号_linux_arm64.tar.gz
或frp_版本号_linux_arm.tar.gz
(根据具体型号是 64 位还是 32 位)
在公网服务器上 (Linux):
使用 wget
或 curl
下载压缩包。请将 版本号
替换为实际的版本号。
“`bash
示例:以 0.58.0 版本为例
wget https://github.com/fatedier/frp/releases/download/v0.58.0/frp_0.58.0_linux_amd64.tar.gz
解压
tar -zxvf frp_0.58.0_linux_amd64.tar.gz
进入解压后的目录
cd frp_0.58.0_linux_amd64
“`
解压后,你会看到很多文件,其中 frps
是服务器程序,frps.ini
是服务器配置文件,frpc
是客户端程序,frpc.ini
是客户端配置文件。在服务器上,我们只需要关心 frps
和 frps.ini
。
在内网设备上 (以 Windows 为例):
直接在浏览器中访问下载链接下载 zip 文件,然后解压到你喜欢的一个目录,比如 D:\frp
。同样,解压后会有 frps
, frps.ini
, frpc
, frpc.ini
等文件,在内网设备上,我们只需要关心 frpc
和 frpc.ini
。
第二步:配置和运行 FRP 服务器 (frps)
进入公网服务器上 FRP 解压后的目录。使用文本编辑器(如 nano
或 vim
)编辑 frps.ini
文件。
bash
nano frps.ini
frps.ini
文件的默认内容通常非常简洁,例如:
“`ini
[common]
bind_port = 7000
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
token = 12345678
allow_ports = 2000-3000,3001,3003,4000-50000
subdomain_host = example.com
“`
我们需要根据自己的需求修改它:
bind_port
: 这是 frps 监听客户端连接的端口。选择一个未被占用的端口号,例如7000
。记住这个端口号,frpc 配置时需要用到。dashboard_port
: (可选) 如果你想要使用 FRP 的 Web 监控界面,设置一个端口号,例如7500
。然后你可以通过http://你的服务器IP:7500
访问仪表盘。dashboard_user
和dashboard_pwd
: (可选) 为仪表盘设置用户名和密码,增强安全性。建议设置。token
: (强烈建议设置) 这是客户端连接服务器时的身份验证令牌。设置一个复杂且难以猜测的字符串。frpc 配置时需要使用相同的 token。这个参数非常重要,可以防止未经授权的客户端连接到你的 frps。
修改后的 frps.ini
示例:
“`ini
[common]
bind_port = 7000
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = your_secure_dashboard_password
token = your_secure_token_for_client_auth # 替换为你自己设置的安全token
其他参数暂时保持注释或删除
“`
保存并关闭 frps.ini
文件。
在服务器上开放端口:
非常重要!你需要在服务器的防火墙和云服务商的安全组规则中开放 bind_port
(例如 7000) 和你后续希望通过 FRP 暴露的服务的公网端口 (例如 SSH 的 6000, HTTP 的 80/443, RDP 的 33890 等)。具体操作方法取决于你的服务器系统和云服务商。
- Linux (使用 ufw 防火墙):
bash
sudo ufw allow 7000/tcp # frps 监听端口
sudo ufw allow 7500/tcp # dashboard 端口 (如果开启)
sudo ufw allow 6000/tcp # 例如为 SSH 暴露的公网端口
# ... 开放其他你需要的公网端口 ...
sudo ufw reload - Linux (使用 firewalld 防火墙 – CentOS/RHEL):
bash
sudo firewall-cmd --permanent --add-port=7000/tcp
sudo firewall-cmd --permanent --add-port=7500/tcp # dashboard
sudo firewall-cmd --permanent --add-port=6000/tcp # SSH example
# ... 开放其他你需要的公网端口 ...
sudo firewall-cmd --reload - 云服务商安全组: 登录你的云服务商控制台,找到你的服务器实例,配置其安全组规则,添加入站规则,允许特定端口(如 7000, 7500, 6000 等)的 TCP/UDP 流量。
运行 frps:
在 FRP 目录中执行以下命令启动 frps:
bash
./frps -c ./frps.ini
如果看到类似 start frps success
的输出,说明 frps 启动成功。此时终端会被占用。为了让 frps 在后台持续运行,即使关闭终端也不中断,可以使用 nohup
命令或配置为系统服务(推荐)。
使用 nohup 在后台运行 (临时方式):
bash
nohup ./frps -c ./frps.ini &
nohup
会忽略 SIGHUP 信号,&
会将进程放到后台。输出会重定向到 nohup.out
文件。你可以使用 jobs
查看后台任务,使用 fg %job_id
切换到前台,使用 kill %job_id
杀死进程。
配置为 systemd 服务 (推荐在 Linux 服务器上):
创建一个 systemd service 文件,例如 /etc/systemd/system/frps.service
:
“`ini
[Unit]
Description = frp server
After = network.target
[Service]
Type = simple
User = nobody # 或者其他非root用户,提高安全性
Restart = on-failure
RestartSec = 5s
ExecStart = /path/to/your/frp/frps -c /path/to/your/frp/frps.ini # 替换为你的frps实际路径和配置文件路径
[Install]
WantedBy = multi-user.target
“`
保存文件后,执行以下命令:
bash
sudo systemctl enable frps # 设置开机自启
sudo systemctl start frps # 启动服务
sudo systemctl status frps # 查看服务状态
这样 frps 就会在后台运行,并在服务器启动时自动启动。
第三步:配置和运行 FRP 客户端 (frpc)
进入内网设备上 FRP 解压后的目录。找到 frpc.ini
文件,使用文本编辑器打开。
“`ini
[common]
server_addr = 127.0.0.1 # 公网服务器的IP地址
server_port = 7000 # frps 监听的端口
[ssh]
type = tcp
local_ip = 127.0.0.1 # SSH 服务所在的内网设备的IP,如果就在运行frpc的设备上,通常是127.0.0.1或内网IP
local_port = 22 # SSH 服务监听的本地端口,默认是 22
remote_port = 6000 # 客户端通过服务器的哪个端口访问这个服务。例如设置为 6000
[web]
type = http
local_port = 80
custom_domains = yourdomain.com # 如果你配置了域名解析,可以使用域名
[web02]
type = tcp
local_ip = 192.168.1.100 # Web 服务所在的内网设备IP,如果和frpc不在同一台设备上
local_port = 8080
remote_port = 8080 # 通过公网服务器的 8080 端口访问此服务
“`
我们需要修改以下参数:
server_addr
: 填写你的公网服务器的 IP 地址。server_port
: 填写 frps 配置中bind_port
的端口号,例如7000
。token
: (如果 frps 配置了 token) 填写与 frps 中设置的相同的 token。
为需要穿透的服务添加配置:
在 [common]
部分下方,你可以添加多个服务配置块,每个块用 [
和 ]
括起来,名称唯一(例如 [ssh]
, [web]
, [rdp]
)。
-
[ssh]
: 这是一个服务配置块的名称,你可以随意命名,但要唯一。type = tcp
: SSH 是基于 TCP 协议的服务。local_ip = 127.0.0.1
: SSH 服务所在的内网设备的 IP 地址。如果 SSH 服务就在运行 frpc 的这台设备上,通常是127.0.0.1
或其内网 IP (如 192.168.1.x)。如果 SSH 服务在内网的另一台设备上,填写那台设备的内网 IP。local_port = 22
: SSH 服务实际监听的本地端口,默认是 22。remote_port = 6000
: 你希望从公网访问 SSH 服务时,连接公网服务器的哪个端口。这里设置为 6000。请确保这个端口在公网服务器的防火墙/安全组中已开放。
-
[web]
: 这是一个配置 Web 服务穿透的例子。type = http
: 如果是标准的 HTTP 服务 (80端口) 或 HTTPS (443端口),可以使用http
或https
类型,配合域名使用更方便。local_port = 80
: 内网 Web 服务监听的端口。custom_domains = yourdomain.com
: 如果你拥有一个域名,并且已经将域名的 A 记录或 CNAME 记录解析到了你的公网服务器 IP,可以在这里填写你的域名。这样你就可以通过访问http://yourdomain.com
来访问内网的 Web 服务。frps 会根据域名将请求转发到对应的 frpc。- 如果使用
type = http
或https
,frps 默认监听的 HTTP 端口是 80,HTTPS 端口是 443。如果你的服务器的 80/443 端口已经被占用,可以在frps.ini
的[common]
中添加vhost_http_port = 8080
或vhost_https_port = 8443
来改变 frps 接收 HTTP/HTTPS 请求的端口。客户端配置中无需指定remote_port
,只需要custom_domains
或subdomain
。
-
[rdp]
: 配置 Windows 远程桌面穿透的例子。type = tcp
local_ip = 192.168.1.5 # 例如 Windows 电脑的内网IP
local_port = 3389 # RDP 默认端口
remote_port = 33890 # 映射到公网服务器的 33890 端口
根据你需要穿透的服务,修改或添加相应的配置块。
修改后的 frpc.ini
示例 (以 SSH 和一个 TCP Web 服务为例):
“`ini
[common]
server_addr = your_server_public_ip # 替换为你的公网服务器IP
server_port = 7000 # 替换为你frps设置的bind_port
token = your_secure_token_for_client_auth # 替换为你frps设置的token
[ssh]
type = tcp
local_ip = 127.0.0.1 # 如果ssh服务就在运行frpc的这台机上
local_port = 22
remote_port = 6000 # 将内网22端口映射到公网服务器的6000端口
[my_web_tcp]
type = tcp
local_ip = 192.168.1.100 # 假设你的web服务器在内网的192.168.1.100
local_port = 8080 # web服务监听内网的8080端口
remote_port = 8080 # 将内网8080端口映射到公网服务器的8080端口
“`
保存并关闭 frpc.ini
文件。
在内网设备上运行 frpc:
打开命令行窗口 (Windows 使用 cmd 或 PowerShell,Linux/macOS 使用终端),进入 FRP 解压后的目录。
执行以下命令启动 frpc:
“`bash
Windows
frpc.exe -c frpc.ini
Linux/macOS
./frpc -c ./frpc.ini
“`
如果配置正确,你应该能看到 frpc 成功连接到 frps,并提示各个服务(如 ssh
, my_web_tcp
)启动成功。
同样,为了让 frpc 在内网设备后台持续运行,可以使用 nohup
(Linux/macOS) 或配置为系统服务(如 Windows 的 Task Scheduler 或 NSSM 工具)。这里以 Windows 使用 Task Scheduler 为例:
- 打开“任务计划程序”(Task Scheduler)。
- 创建基本任务。
- 任务名称可以命名为“FRP Client”。
- 触发器选择“计算机启动时”。
- 操作选择“启动程序”。
- 程序或脚本:填写
frpc.exe
的完整路径,例如D:\frp\frpc.exe
。 - 添加参数:填写
-c D:\frp\frpc.ini
(同样替换为你的配置文件完整路径)。 - 起始于:填写
frpc.exe
所在的目录,例如D:\frp
。 - 完成创建任务。为了确保在用户未登录时也能运行,可以双击创建的任务,在“常规”选项卡下选择“无论用户是否登录都要运行”,可能需要输入用户密码。
第四步:测试内网穿透效果
现在,frps 和 frpc 都应该已经成功运行,并且隧道已经建立。你可以尝试从外部网络访问你配置的服务了。
-
访问 SSH 服务:
使用 SSH 客户端 (如 PuTTY, Xshell, 或 Linux/macOS 自带的 ssh 命令) 连接到你的公网服务器 IP,端口为你 frpc 中为 SSH 服务设置的remote_port
(示例中是 6000)。
bash
ssh your_ssh_username@your_server_public_ip -p 6000
你应该能够成功连接到内网设备的 SSH 服务。 -
访问 TCP Web 服务:
使用浏览器访问http://your_server_public_ip:8080
(示例中为 TCP Web 服务设置的remote_port
是 8080)。
你应该能够看到内网 Web 服务器提供的页面。 -
访问 HTTP/HTTPS 服务 (使用 custom_domains):
如果你在 frpc 配置中使用了type = http/https
和custom_domains = yourdomain.com
,并且已经将yourdomain.com
解析到了你的公网服务器 IP,直接在浏览器中访问http://yourdomain.com
或https://yourdomain.com
。
你应该能够访问到内网的 Web 服务。 -
访问 RDP 服务:
在 Windows 电脑上打开“远程桌面连接”程序,输入你的公网服务器 IP 和端口号 (示例中是 33890),格式为your_server_public_ip:33890
,点击连接。
你应该能够连接到内网的 Windows 远程桌面。
如果一切顺利,恭喜你!你已经成功实现了内网穿透,可以通过公网访问内网服务了。
进阶应用与安全考量
FRP 功能强大,除了基本穿透,还有很多高级用法和必须考虑的安全问题。
1. 安全加固
直接将内网服务暴露到公网存在风险。务必采取以下安全措施:
- 设置 Token: 在
frps.ini
和frpc.ini
中都设置一个复杂且唯一的token
。这是客户端连接服务器的第一道防线。 - 开启 TLS 加密: 在
frps.ini
和frpc.ini
的[common]
中添加tls_enable = true
。这会加密 frpc 和 frps 之间的通讯流量,防止流量被监听或篡改。虽然会带来微小的性能开销,但强烈建议开启。 - 使用强密码: 确保你穿透的服务本身(如 SSH 密码、RDP 密码、Web 服务后台密码)使用了强密码。FRP 只是一个通道,服务本身的安全性同样重要。
- 限制访问:
- 服务器防火墙/安全组: 仅开放 frps 的监听端口 (
bind_port
)、dashboard 端口 (如果开启) 以及你实际需要暴露给公网的服务端口。尽量不要开放不必要的端口。 - FRP 的
allow_ports
或 ACL: 在frps.ini
中可以使用allow_ports
限制客户端只能将服务映射到服务器的特定端口范围。更高级的是配置 ACL (Access Control List) 来限制特定客户端、IP 或服务的访问。 - 服务本身的访问控制: 如果可能,在内网服务本身配置 IP 过滤或访问控制。
- 服务器防火墙/安全组: 仅开放 frps 的监听端口 (
- 非 root 用户运行 frps: 在 Linux 服务器上,尽量不要使用 root 用户运行 frps。可以创建一个专门的用户(如
nobody
或frp
)来运行,限制其权限。
2. 使用域名访问 HTTP/HTTPS 服务
使用 type = http
或 https
配合 custom_domains
或 subdomain
是访问 Web 服务的推荐方式,因为它更符合 Web 服务的习惯,并且可以使用统一的 80/443 端口,无需在 URL 中带端口号。
custom_domains
: 适用于你有自己的顶级域名,并且将子域名解析到你的公网服务器 IP。例如,将myblog.yourdomain.com
解析到服务器 IP,然后在 frpc 配置中为你的博客服务设置type = http
,custom_domains = myblog.yourdomain.com
。subdomain
: 如果你在frps.ini
中配置了subdomain_host = yourdomain.com
,客户端可以使用subdomain
参数。例如,frpc 中配置type = http
,subdomain = myblog
。这样就可以通过访问http://myblog.yourdomain.com
来访问。这对于没有自己域名的用户或者希望更灵活分配子域名的场景很有用,但需要服务器管理员配置subdomain_host
并进行相应的 DNS 解析(通常是泛解析*.yourdomain.com
到服务器 IP)。
3. Dashboard 监控界面
启用 Dashboard (dashboard_port
, dashboard_user
, dashboard_pwd
) 可以方便地通过 Web 界面查看 FRP 服务器的运行状态、连接的客户端、流量信息等。
- 访问地址:
http://你的服务器IP:dashboard_port
- 输入你在
frps.ini
中设置的用户名和密码。
4. 多个客户端和多个服务
一个 frps 可以同时连接多个 frpc 客户端。每个 frpc 客户端也可以同时穿透多个内网服务。
- 多个 frpc: 在不同的内网设备上运行配置了相同
server_addr
,server_port
,token
的 frpc 程序。每个 frpc 为其所在设备或可访问到的内网设备配置相应的服务。 - 多个服务: 在一个 frpc 的
frpc.ini
文件中,可以在[common]
部分下方添加多个不同的服务配置块,每个块对应一个需要穿透的服务。
5. UDP 穿透
FRP 也支持 UDP 协议的穿透,例如用于游戏服务器、DNS 查询等。
在 frpc.ini
中配置:
ini
[my_game_server]
type = udp
local_ip = 192.168.1.200
local_port = 27015 # 游戏服务器的UDP端口
remote_port = 27015 # 映射到公网服务器的端口
注意,UDP 协议穿透可能会受网络环境影响,稳定性和性能可能不如 TCP。确保服务器防火墙/安全组也开放了对应的 UDP 端口。
6. 性能优化
- 压缩: 在
frpc.ini
或每个服务配置中添加compress = true
可以压缩传输的数据,减少流量消耗,在带宽较低的环境下可能有帮助,但会增加 CPU 负担。 - 多路复用 (Multiplexer): FRP 默认使用 TCP 连接多路复用,这减少了连接建立的开销,提高了效率。通常不需要额外配置。
常见问题与故障排除
如果在配置和使用 FRP 过程中遇到问题,可以从以下几个方面排查:
-
检查 FRP 服务是否运行:
- 服务器端:确认
frps
进程正在运行 (ps aux | grep frps
),并且 systemd 服务状态正常 (systemctl status frps
)。 - 客户端:确认
frpc
进程正在运行,或者通过任务计划程序/systemd 查看状态。
- 服务器端:确认
-
检查防火墙和安全组: 这是最常见的问题。
- 服务器端: 确认服务器防火墙 (ufw, firewalld, iptables) 和云服务商安全组规则已经开放了
frps
的bind_port
(例如 7000) 以及你希望从公网访问的服务对应的remote_port
(例如 6000, 8080, 33890)。 - 内网客户端设备: 确认内网设备的防火墙允许来自
local_ip
的连接到local_port
。例如,如果要穿透本地 SSH (22端口),需要确保内网设备的防火墙允许 22 端口的入站连接。如果local_ip
是127.0.0.1
,通常不是防火墙问题。
- 服务器端: 确认服务器防火墙 (ufw, firewalld, iptables) 和云服务商安全组规则已经开放了
-
检查配置文件:
- 语法错误: 仔细检查
frps.ini
和frpc.ini
文件是否有拼写错误、参数名称错误、格式错误 (如中英文标点混用)。 - 参数对应: 确保
frpc.ini
中的server_addr
和server_port
与frps.ini
中的服务器 IP 和bind_port
对应。如果设置了token
,确保两端一致。 - 端口冲突: 确保
frps
的bind_port
、dashboard_port
没有被服务器上其他程序占用。确保frpc
中设置的local_port
是内网服务实际监听的端口,并且remote_port
在服务器端未被其他服务占用或已被 frps 占用(但不能重复映射同一个服务)。
- 语法错误: 仔细检查
-
查看日志:
检查 frps 和 frpc 运行时的输出或日志文件。FRP 通常会打印详细的连接信息和错误提示,这对于排查问题非常有帮助。如果你使用了 systemd 运行服务,可以使用journalctl -u frps.service
或journalctl -u frpc.service
查看日志。 -
网络连通性测试:
- 在内网客户端设备上,尝试
ping your_server_public_ip
,确认网络可达。 - 在内网客户端设备上,使用
telnet your_server_public_ip bind_port
(例如telnet your_server_public_ip 7000
),检查 frpc 是否能够连接到 frps 的监听端口。 - 在外部网络,尝试
telnet your_server_public_ip remote_port
(例如telnet your_server_public_ip 6000
),检查是否能够连接到 frps 暴露的服务端口。
- 在内网客户端设备上,尝试
-
FRP 版本兼容性: 尽量让 frps 和 frpc 使用相同或相近的版本,避免因版本差异导致的兼容性问题。
FRP 与其他方案的简单比较
- 与端口转发: FRP 不需要配置复杂的路由器,绕过动态 IP 问题(通过连接固定公网 IP 的服务器)。更灵活,支持更多协议和安全特性。
- 与 Ngrok: Ngrok 易于使用,但通常是付费服务,有流量、时长等限制,服务器不在自己控制下。FRP 是开源免费的,完全自主可控,没有功能限制。
- 与 VPN: VPN 通常提供的是网络层面的接入,连接成功后你可以访问内网中的多台设备和服务,更适合需要完全融入内网环境的场景。但 VPN 配置相对复杂,且需要在客户端安装 VPN 软件。FRP 更侧重于将特定的应用服务暴露到公网,配置相对简单,且客户端可以是轻量级的。
- 与 TeamViewer/AnyDesk: 这些是远程桌面工具,主要用于远程操作图形界面,不是通用的服务穿透方案。
总结
FRP 作为一款强大、灵活、开源的内网穿透工具,为我们解决了从公网访问内网服务的难题。通过搭建一个简单的 C/S 架构,即使没有公网 IP、面对复杂的路由器设置或多层 NAT,也能轻松实现各种内网服务的公网访问。
本篇文章详细介绍了 FRP 的原理、准备工作、服务器端和客户端的配置与运行步骤,并提供了一些常见服务的配置示例。同时,也强调了在使用 FRP 时必须重视的安全问题,以及一些进阶的应用技巧和故障排除方法。
掌握 FRP 的基本用法,将极大地扩展你的网络自由度,让你随时随地访问你的个人云、远程管理你的设备、分享你的自建服务等等。希望这篇入门指南能帮助你顺利踏上 FRP 的内网穿透之旅!在实际使用中,根据你的具体需求和环境,可能还需要参考 FRP 的官方文档进行更详细的配置。祝你使用愉快!