Press ESC to close

自建 FRP 内网穿透加速:5 元学生机也能流畅远程

“还在为家里的 NAS 无法在外网访问而发愁?还在为公司内网的服务器无法远程管理而头疼?或者,你手头只有一台吃灰的 5 元学生机,却想把它变成强大的跳板?”

在网络世界中,内网穿透(NAT Traversal) 是一项至关重要的技术。它允许你从公共互联网访问位于私有网络(内网)中的设备或服务,例如家中的私人云存储(NAS)、办公室的开发服务器、甚至是你的个人电脑。传统的解决方案通常涉及复杂的路由器端口映射设置,或者依赖价格不菲的公网 IP。而对于像我这样只有一台廉价学生云服务器(通常没有公网 IP 或者端口限制严格)的用户来说,这些方法更是寸步难行。

然而,有了 FRP (Fast Reverse Proxy),这一切都将变得简单而高效。FRP 是一款高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,能够帮助你轻松实现内网穿透,将内网服务安全、稳定地暴露到公网。最棒的是,即使你只有一台配置低廉的云服务器(例如每月 5 元的学生机),FRP 也能助你实现流畅的远程访问体验。

本文将为你带来一份超详细的 FRP 内网穿透搭建指南。我们将通过一张图清晰地展示其工作原理,然后手把手地带领你完成从注册到安装、从配置到测速的每一个步骤。你将不再依赖复杂的技术知识,只需简单的操作,就能让你的内网设备获得“公网身份”,畅享远程访问的便利!


一、一图看懂 FRP 内网穿透架构

在开始动手之前,我们先通过一张简单的架构图来理解 FRP 是如何实现内网穿透的。

FRP 内网穿透的核心组成部分:

  1. FRP 服务器 (frps):
    • 部署在拥有公网 IP 的云服务器(VPS)上。这台服务器充当中转站
    • 它的任务是接收来自公网用户的请求,并将这些请求转发给对应的内网客户端。
    • 同时,它也维护与所有 FRP 客户端的连接。
  2. FRP 客户端 (frpc):
    • 部署在内网中需要被外部访问的设备上(例如 NAS、树莓派、本地 PC 等)。
    • 它主动与 FRP 服务器建立并保持连接。
    • 当 FRP 服务器收到目标请求时,它会将请求通过这条已建立的连接发送给对应的 FRP 客户端。
  3. 公网用户/访问者:
    • 通过互联网访问 FRP 服务器的某个端口。
    • FRP 服务器根据配置,将请求路由到正确的 FRP 客户端,最终抵达内网中的服务。

工作流程简述:

  1. frpc 连接 frps: 位于内网的 frpc(客户端)主动向部署在公网的 frps(服务器)发起连接,并保持这条“隧道”。
  2. frps 监听端口: frps 会根据配置,在公网 IP 上监听一个或多个端口。
  3. 用户访问公网 IP: 当公网用户访问 frps 的公网 IP 和监听端口时。
  4. 请求转发: frps 接收到请求后,会识别这个请求是为哪个 frpc 服务的,然后通过之前建立的隧道,将请求转发给对应的 frpc
  5. frpc 转发到内网服务: frpc 收到请求后,再将其转发给内网中真实的服务(例如 NAS 的 Web 端口、SSH 端口等)。
  6. 响应回传: 内网服务处理请求后,将响应原路返回给 frpcfrpc 再传回 frpsfrps 最后传回公网用户。

整个过程就像是 frpc 在公网服务器上为你开了一个“邮筒”,外面的信件(请求)投递到这个邮筒,然后通过一个秘密通道(隧道)直接送达你的内网房间(服务),而你房间的回复(响应)也通过同样的方式送出去。

理解了基本原理,我们就可以开始动手搭建了!


二、手把手搭建:注册、安装、配置、测速

我们将以一台 Linux 服务器(作为 FRP 服务器)和一台 Linux / Windows 设备(作为 FRP 客户端)为例进行演示。

1. 准备工作:云服务器注册与选择

首先,你需要一台拥有公网 IP 的云服务器。对于个人用户或学生,推荐选择国内或国外的廉价云服务器,例如:

  • 国内: 腾讯云轻量应用服务器、阿里云 ECS 学生机(或轻量应用服务器)。这些通常价格优惠,例如每月 5 元、8 元等。
  • 国外: Vultr、Linode、DigitalOcean 等,通常价格从每月 5 美元起。

选择服务器时的注意事项:

  • 地域选择: 选择距离你或你的目标用户最近的地域,可以有效降低延迟。
  • 操作系统: 推荐选择 Ubuntu LTSCentOS,它们有良好的社区支持和丰富的软件源。
  • 带宽: 对于远程访问和数据传输,带宽比 CPU 和内存更重要。即使是 1Mbps 的带宽,也能满足基本的远程 SSH 和轻量级网页访问。如果需要传输大量数据或进行视频流,则需要更高的带宽。

完成服务器的注册和购买,并确保你能够通过 SSH 工具(如 PuTTY, Xshell, Termius 或 Linux/macOS 自带的终端)连接到你的云服务器。

2. 安装 FRP:服务端与客户端

FRP 的安装非常简单,只需下载对应操作系统的二进制文件即可。

步骤 A:下载 FRP 包

访问 FRP 的 GitHub Releases 页面:https://github.com/fatedier/frp/releases

根据你的服务器和客户端设备的操作系统和架构(例如 amd64 代表 64 位 Intel/AMD 处理器,arm64 代表 64 位 ARM 处理器,如树莓派 4),选择最新的稳定版本进行下载。

在云服务器(frps)上操作:

以 Linux AMD64 为例:

Bash

# 进入一个合适的目录,例如 /opt
cd /opt

# 下载 FRP 最新版本(请替换为实际版本号和架构)
# 示例:下载 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

# 重命名解压后的目录,方便管理
mv frp_0.58.0_linux_amd64 frp

# 进入 FRP 目录
cd frp

# 查看文件内容,你会看到 frps 和 frpc 可执行文件
ls
# 预期输出包含:frps frps.ini frpc frpc.ini LICENSE README.md

在内网设备(frpc)上操作:

如果内网设备是 Linux:操作步骤同上,但下载的可能是 frp_0.58.0_linux_arm64.tar.gz 等。 如果内网设备是 Windows:

  1. 在 Windows 浏览器中访问 FRP GitHub Releases 页面,下载 frp_0.58.0_windows_amd64.zip
  2. 将下载的 ZIP 文件解压到一个你方便的目录,例如 D:\frp

步骤 B:FRP 服务端 (frps) 配置

进入云服务器上的 FRP 目录 (/opt/frp),编辑 frps.ini 文件:

Bash

cd /opt/frp
vim frps.ini # 使用 vi/vim 或 nano 编辑

清空原有内容(如果存在),然后粘贴以下配置:

Ini, TOML

[common]
bind_addr = 0.0.0.0
bind_port = 7000           # frps 和 frpc 之间通信的端口,确保此端口在云服务器安全组中放行

# 如果你想开启 HTTP/HTTPS 代理,可以配置以下端口
# vhost_http_port = 80     # HTTP 服务的虚拟主机端口
# vhost_https_port = 443   # HTTPS 服务的虚拟主机端口

# 认证令牌,frpc 必须使用相同的 token 才能连接 frps
# 务必设置一个复杂且独特的 token,防止未授权连接
token = your_strong_secret_token_here

# Dashboard 端口 (可选,用于监控 frps 状态)
# dashboard_addr = 0.0.0.0
# dashboard_port = 7500
# dashboard_user = admin
# dashboard_pwd = your_dashboard_password

# 日志配置 (可选)
# log_file = ./frps.log
# log_level = info
# log_max_days = 3

配置说明:

  • bind_port = 7000:这是 FRP 服务端监听的端口,用于接收来自所有 FRP 客户端的连接。务必在你的云服务器安全组/防火墙中放行此端口(入站规则)
  • token = your_strong_secret_token_here:这是一个认证令牌。客户端(frpc)必须提供相同的令牌才能连接到服务端(frps)。请务必替换为一个复杂、独特的字符串!
  • vhost_http_port / vhost_https_port:如果你想通过 FRP 穿透内网的 Web 服务(如 Nginx、Apache),并希望通过 http://你的公网IPhttps://你的公网IP 直接访问,就需要配置这两个端口。同样需要在云服务器安全组中放行 80/443 端口
  • dashboard_port:FRP 自带一个 Dashboard,用于监控客户端连接状态和流量。如果你想使用,取消注释并设置一个端口。该端口也需要在安全组中放行,并设置 dashboard_userdashboard_pwd 以保护访问。

步骤 C:FRP 客户端 (frpc) 配置

进入内网设备上的 FRP 目录(Linux: /opt/frp,Windows: D:\frp),编辑 frpc.ini 文件:

在 Linux 客户端上:

Bash

cd /opt/frp
vim frpc.ini # 使用 vi/vim 或 nano 编辑

在 Windows 客户端上:

找到 frpc.ini 文件,用记事本或任何文本编辑器打开。

清空原有内容(如果存在),然后粘贴以下配置:

Ini, TOML

[common]
server_addr = your_vps_public_ip_or_domain # 你的云服务器公网 IP 地址或域名
server_port = 7000                         # 必须与 frps.ini 中的 bind_port 一致
token = your_strong_secret_token_here      # 必须与 frps.ini 中的 token 一致

# 示例:穿透 SSH 服务
[ssh]
type = tcp
local_ip = 127.0.0.1                       # 内网 SSH 服务的 IP 地址,如果是本机就用 127.0.0.1
local_port = 22                            # 内网 SSH 服务的端口
remote_port = 6000                         # frps 在公网监听的端口,用于 SSH 访问。这个端口也需要在云服务器安全组中放行

# 示例:穿透 HTTP 服务(假设你的 NAS 或本地 Web 服务运行在 80 端口)
# [web]
# type = http
# local_ip = 127.0.0.1
# local_port = 80
# # 你可以在 frps.ini 中配置 vhost_http_port 后,直接通过公网IP访问
# # 或者通过 custom_domains 来配置一个域名访问
# custom_domains = your_domain.com # 如果你有域名,可以指向你的公网IP,然后在这里配置

# 示例:穿透 RDP 远程桌面(Windows)
# [rdp]
# type = tcp
# local_ip = 127.0.0.1
# local_port = 3389
# remote_port = 33890 # frps 在公网监听的端口,用于 RDP 访问,需要在云服务器安全组中放行

# 示例:穿透 NAS Web UI (例如群晖 NAS)
# [nas_web_ui]
# type = tcp
# local_ip = 192.168.1.10             # NAS 的内网 IP 地址
# local_port = 5000                   # NAS 的 Web UI 端口
# remote_port = 50000                 # frps 在公网监听的端口,用于访问 NAS,需要在云服务器安全组中放行

配置说明:

  • server_addr:你的云服务器的公网 IP 地址或域名。
  • server_port:必须和服务端的 bind_port 一致。
  • token:必须和服务端的 token 一致。
  • [ssh][web][rdp][nas_web_ui]:这些是代理服务的名称,可以自定义,但每个名称必须是唯一的。
  • type = tcptype = http:指定代理类型。tcp 适用于 SSH、RDP、数据库等;http/https 适用于 Web 服务。
  • local_ip:内网中目标服务的 IP 地址。如果是 frpc 所在的设备提供的服务,通常是 127.0.0.1。如果是同一内网的另一台设备,则填写其内网 IP。
  • local_port:内网中目标服务的实际端口。
  • remote_port这是最关键的端口! 它是 frps 在公网上监听的端口,当你从外网访问 你的公网IP:remote_port 时,请求会被转发到你的内网服务。这个端口也需要在你的云服务器安全组/防火墙中放行(入站规则)

重要:云服务器安全组/防火墙配置

无论是在国内还是国外的云服务商,通常都有安全组或防火墙功能。你需要确保以下端口是开放的:

  • FRP 服务端通信端口: frps.inibind_port 设置的端口 (例如 7000)。
  • 你为内网服务配置的 remote_port 例如 SSH 的 6000,RDP 的 33890,NAS Web 的 50000 等。
  • 如果你使用了 vhost_http_port / vhost_https_port,则需要放行 80 / 443 端口。
  • 如果你使用了 dashboard_port,也需要放行该端口。

不放行这些端口,FRP 将无法正常工作。

3. 启动 FRP 服务与客户端

步骤 A:启动 FRP 服务端 (frps)

在云服务器的 /opt/frp 目录下,执行:

Bash

# 启动 frps
./frps -c ./frps.ini

如果看到类似 start frps success 的输出,说明服务端启动成功。 注意: 这样启动会在当前终端一直运行。如果你想让它在后台运行,并开机自启动,可以使用 nohup 或配置 Systemd 服务。

使用 nohup 后台运行:

Bash

nohup ./frps -c ./frps.ini &

这会将 frps 放入后台运行,并将其输出重定向到 nohup.out 文件。

配置 Systemd 服务 (推荐,更稳定可靠):

  1. 创建一个 Systemd 服务文件: Bashsudo vim /etc/systemd/system/frps.service
  2. 粘贴以下内容: Ini, TOML[Unit] Description = Frp Server Service After = network.target syslog.target Wants = network.target [Service] Type = simple # 替换为你 frps 所在的实际路径 ExecStart = /opt/frp/frps -c /opt/frp/frps.ini Restart = on-failure RestartSec = 10s [Install] WantedBy = multi-user.target
  3. 保存并退出。
  4. 重新加载 Systemd 配置: Bashsudo systemctl daemon-reload
  5. 启动 frps 服务: Bashsudo systemctl start frps
  6. 设置开机自启: Bashsudo systemctl enable frps
  7. 检查服务状态: Bashsudo systemctl status frps

步骤 B:启动 FRP 客户端 (frpc)

在 Linux 客户端上:

进入 /opt/frp 目录,执行:

Bash

./frpc -c ./frpc.ini

如果看到类似 start proxy success 的输出,说明客户端启动成功。同样,可以使用 nohup 或 Systemd。

在 Windows 客户端上:

  1. 打开命令提示符 (CMD) 或 PowerShell。
  2. 导航到你解压 FRP 的目录,例如 cd D:\frp
  3. 执行: Bash.\frpc.exe -c .\frpc.ini (注意 Windows 下是 frpc.exe

如果一切顺利,你将看到客户端连接到服务器的日志信息。

4. 测试与测速

现在,你的 FRP 内网穿透隧道应该已经打通了!是时候进行测试了。

测试 SSH 穿透:

如果你配置了 SSH 穿透(例如 remote_port = 6000),在任何有公网连接的设备上,使用 SSH 客户端连接:

Bash

ssh username@your_vps_public_ip_or_domain -p 6000
  • username:你内网设备的 SSH 用户名。
  • your_vps_public_ip_or_domain:你的云服务器公网 IP 或域名。
  • 6000:你配置的 remote_port

如果能够成功登录到你的内网设备,恭喜你,SSH 穿透成功!

测试 Web 服务穿透:

如果你配置了 HTTP/HTTPS 穿透,在浏览器中访问:

  • http://your_vps_public_ip_or_domain:remote_port (如果是非 80 端口)
  • http://your_domain.com (如果你配置了 custom_domains 和域名解析)

如果能正常访问到你的内网 Web 服务,Web 穿透成功!

测速:

远程连接的流畅度取决于你的云服务器带宽、内网设备的网络带宽以及延迟。

  • SSH/RDP 体验: 实际操作一下,感受响应速度。对于 SSH,可以尝试执行一些命令,看输出是否即时。对于 RDP,操作界面是否流畅。
  • 文件传输: 通过 SSH 传输文件(使用 scp 或 WinSCP 等工具),或通过 Web 服务下载文件,观察传输速度。
  • Ping / MTR: 在你的设备上 ping 你的云服务器 IP,查看延迟。如果延迟过高,可能是地域选择不当或网络路径拥堵。

性能优化建议:

  • 选择合适的云服务器地域: 离你最近的地域通常能提供最低延迟。
  • 带宽优先: 在预算允许的情况下,优先选择更高带宽的云服务器。
  • 压缩: FRP 自身支持数据压缩,但对于 SSH 等已加密或压缩过的协议,效果不明显。对于 HTTP 协议,如果服务本身没有开启 Gzip 压缩,FRP 的压缩功能可能有用。
  • 协议选择: 对于大部分场景,TCP 代理是稳定的选择。对于游戏或实时应用,可以尝试 UDP 代理。
  • 多隧道: 如果你的内网服务分散在多台机器或多个端口,可以配置多个 [proxy_name] 段,为每个服务创建独立的隧道。

三、FRP 高级配置与常见问题排查

FRP 的功能远不止于简单的内网穿透。了解一些高级配置和排查技巧,能让你更好地利用它。

1. YAML 配置片段(可选)

除了 INI 格式,FRP 也支持 YAML 格式的配置文件。YAML 格式通常更易读,尤其是当配置项较多时。

frps.yaml 示例:

YAML

common:
  bind_addr: 0.0.0.0
  bind_port: 7000
  token: your_strong_secret_token_here
  # dashboard_addr: 0.0.0.0
  # dashboard_port: 7500
  # dashboard_user: admin
  # dashboard_pwd: your_dashboard_password

frpc.yaml 示例:

YAML

common:
  server_addr: your_vps_public_ip_or_domain
  server_port: 7000
  token: your_strong_secret_token_here

proxies:
  - name: ssh
    type: tcp
    local_ip: 127.0.0.1
    local_port: 22
    remote_port: 6000
  - name: nas_web_ui
    type: tcp
    local_ip: 192.168.1.10
    local_port: 5000
    remote_port: 50000
  # - name: my_web_site
  #   type: http
  #   local_ip: 127.0.0.1
  #   local_port: 80
  #   custom_domains:
  #     - your_domain.com

使用 YAML 配置时,启动命令需要指定 -c 参数指向 .yaml 文件:

Bash

# frps
./frps -c ./frps.yaml

# frpc
./frpc -c ./frpc.yaml

2. 域名解析与 HTTPS

如果你有自己的域名,可以将域名解析到你的云服务器 IP 地址,然后通过域名访问内网服务,这样更美观和方便。

HTTP/HTTPS 代理配置 (type = http/https):

frps.inifrps.yaml 中,取消注释 vhost_http_port = 80vhost_https_port = 443

frpc.inifrpc.yaml 中,对于 HTTP/HTTPS 代理,使用 custom_domains

Ini, TOML

[web_service]
type = http
local_ip = 127.0.0.1
local_port = 8080 # 内网 Web 服务端口
custom_domains = myweb.yourdomain.com # 请替换为你的子域名

HTTPS 额外配置(证书):

如果你的内网 Web 服务已经配置了 HTTPS,并且你也想通过 HTTPS 访问,FRP 可以直接透传。 但如果你想通过 FRP 服务器来处理 HTTPS 证书(即 https://myweb.yourdomain.com 访问,证书部署在 frps 服务器上),则需要在 frps 服务器上配置 Nginx 或 Caddy 等 Web 服务器,将 443 端口的流量转发给 frps 的 vhost_https_port

3. 压测与流量统计

  • FRP Dashboard: 如果你在 frps.ini 中配置并开启了 dashboard_port,你可以在浏览器中访问 http://你的公网IP:dashboard_port,并输入配置的用户名密码。Dashboard 可以显示连接状态、流量统计、在线客户端列表等信息,帮助你监控 FRP 的运行情况。
  • 流量统计工具: 结合云服务器提供商的流量监控,或使用 iftopnethogs 等工具在服务器和客户端上查看实时流量。

4. 常见问题排查

  • 无法连接到 FRP 服务器 (server_addrserver_port 错误):
    • 检查 frpc.ini 中的 server_addr 是否是你的云服务器公网 IP 或域名,且拼写正确。
    • 检查 frpc.ini 中的 server_port 是否与 frps.ini 中的 bind_port 一致。
    • 确保云服务器的防火墙/安全组已放行 bind_port 端口。
    • 在云服务器上,使用 netstat -tulnp | grep 7000 (假设端口是 7000) 检查 frps 是否正在监听该端口。
  • 服务无法访问 (remote_portlocal_port 错误):
    • 确保你的云服务器防火墙/安全组已放行你为每个代理服务配置的 remote_port
    • frpc.ini 中,检查 local_iplocal_port 是否正确指向内网中的目标服务。
    • 确保内网中的服务(如 SSHD、Web 服务器)正在运行,并且没有被内网防火墙阻止。你可以在内网设备上,使用 telnet 127.0.0.1 local_port (如果服务在本机) 或 telnet internal_ip local_port (如果服务在内网其他设备) 来测试内网服务是否可达。
  • token 认证失败:
    • 确保 frps.inifrpc.ini 中的 token 值完全一致,区分大小写,没有多余的空格或字符。
  • 连接断开频繁:
    • 检查云服务器和内网设备的网络稳定性。
    • frps.inifrpc.ini[common] 段中,可以尝试增加 heartbeat_intervalheartbeat_timeout 的值来调整心跳包间隔和超时时间,这有助于在不稳定的网络环境下保持连接。
  • 性能不佳:
    • 检查云服务器和内网设备的实际带宽。
    • 考虑更换更高带宽的云服务器。
    • 尝试使用 FRP 的压缩功能(在 [common] 段中设置 compression = true),但仅对未加密或未压缩的数据有效。

总结:你的 5 元学生机也能创造奇迹!

恭喜你!通过本教程,你已经成功搭建并配置了你的第一个 FRP 内网穿透服务。从现在开始,你的 NAS、本地 Web 服务、甚至是私人电脑,都将拥有“公网身份”,无论身处何地,你都能轻松远程访问它们。即使是你那台看似不起眼的 5 元学生机,也摇身一变,成为了连接你内网和外部世界的强大桥梁。

FRP 的强大之处在于其简洁、高效和灵活性。它不仅解决了内网穿透的难题,更降低了远程访问的门槛,让每个人都能轻松掌控自己的网络资源。

掌握 FRP,你将解锁更多有趣的玩法:

  • 远程管理家中的智能设备。
  • 分享内网中的个人博客或测试网站给朋友。
  • 在外地也能随时访问家里的文件和照片。
  • 搭建自己的私人云存储或开发环境。

当然,网络安全始终是第一位的。在使用 FRP 享受便利的同时,请务必注意以下几点:

  • 务必设置强壮的 token
  • 仅暴露必要的服务和端口。
  • 确保你的内网服务本身是安全的。
  • 定期更新 FRP 版本,获取最新的安全补丁。

通过本教程,你已经迈出了内网穿透的第一步。FRP 还有更多高级功能等待你去探索,例如 P2P 穿透、身份验证、更细粒度的权限控制等。希望你能够灵活运用这些知识,让你的网络生活更加便捷和安全!

现在,去享受你的远程自由吧!