FRP 内网穿透全流程部署指南 (Windows/Linux)
文章目录
- 前言
- 1. 概述
- 2. 准备工作
- 3. 服务端 (Frps) 部署 ( Linux )
- 3.1 安装与配置
- 3.1.1 使用 SSH 连接到你的公网服务器
- 3.1.2 上传并解压 FRP 压缩包
- 3.1.3 配置服务端文件 frps.toml
- 3.2 启动 Frps
- 方式一:命令行直接启动 (测试用)
- 方式二:使用 Systemd 创建服务 (推荐,持久化运行)
- 1. 创建 systemd 服务文件
- 2. 启用并启动服务
- 3. 检查状态
- 3.3 防火墙开放端口
- 4. 客户端 (Frpc) 部署
- 4.1 Windows 客户端
- 4.1.1 下载并解压 Windows 版的 FRP 压缩包
- 4.1.2 在解压目录中创建配置文件 frpc.toml
- 4.1.3 启动 Frpc
- 4.2 Linux 客户端
- 4.2.1 在内网 Linux 机器上下载并解压对应的 FRP 压缩包
- 4.2.2 配置 frpc.toml
- 4.2.3 启动 Frpc
- 4.2.3.1.命令行启动
- 4.2.3.2.使用 Systemd 创建服务 (推荐)
- 4.2.3.2.1 创建服务文件
- 4.2.3.2.2 启用并启动服务
- 4.2.3.2.3 检查状态
- 5. 核心配置参数详解
- 5.1 通用参数 (Frps & Frpc)
- 5.2 服务端 (Frps) 特有参数
- 5.3 客户端 (Frpc) 代理配置参数 (`[[proxies]]`)
- 6. 测试与验证
- 7. 常见问题与注意事项 (FAQ)
前言
在内网环境下部署的各类服务(如网站、远程桌面、数据库、NAS等),由于没有公网IP,无法被互联网上的用户直接访问,极大地限制了其应用场景。内网穿透技术正是解决这一痛点的关键。FRP作为一个高性能、轻量级的反向代理工具,凭借其配置简单、稳定可靠的特点,成为了实现内网穿透的热门选择。
1. 概述
FRP (Fast Reverse Proxy) 是一个高性能的反向代理应用,主要用于将内网服务暴露到公网,实现内网穿透。它非常轻量且易于配置。
核心概念:
- Frps (Server):部署在具有公网 IP 的服务器上,用于接收外部请求
- Frpc (Client):部署在内网的机器上,用于向 Frps 注册服务并建立稳定隧道
- 通信流程:外部用户 -> 公网 IP (Frps) -> 隧道 -> 内网 IP (Frpc) -> 内网服务
2. 准备工作
- 一台具有公网 IP 的服务器(如云服务器 VPS),用于运行
frps
(服务端) - 一台或多台内网机器(如个人电脑、树莓派、NAS、虚拟机等),用于运行
frpc
(客户端) - 下载 FRP 工具:从 FRP GitHub Releases 下载对应系统架构的压缩包
- 服务端:通常选择
linux_amd64
- 客户端 (Windows):选择
windows_amd64
- 客户端 (Linux):选择
linux_arm
、linux_arm64
或linux_amd64
等,根据你的内网机器架构选择
- 服务端:通常选择
3. 服务端 (Frps) 部署 ( Linux )
3.1 安装与配置
3.1.1 使用 SSH 连接到你的公网服务器
3.1.2 上传并解压 FRP 压缩包
# 假设压缩包名为 frp_0.64.0_linux_amd64.tar.gz
tar -zxvf frp_0.64.0_linux_amd64.tar.gz
cd frp_0.64.0_linux_amd64
3.1.3 配置服务端文件 frps.toml
(FRP v0.52.0 及以上版本使用 TOML 格式,旧版为
.ini
)
# frps.toml
bindPort = 7000 # 与客户端通信的端口,必须开放
auth.method = "token" # 认证方式,强烈建议设置
auth.token = "your_strong_password_here" # 认证令牌,客户端需要配置相同的才能连接# Web 控制台(可选,用于查看连接状态)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"# 启用仪表盘(可选)
enablePrometheus = false
3.2 启动 Frps
方式一:命令行直接启动 (测试用)
./frps -c ./frps.toml
方式二:使用 Systemd 创建服务 (推荐,持久化运行)
1. 创建 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=/usr/local/develop/frp/frp_0.64.0_linux_amd64/frps -c /usr/local/develop/frp/frp_0.64.0_linux_amd64/frps.toml[Install]
WantedBy=multi-user.target
注意:将
/usr/local/develop/frp/frp_0.64.0_linux_amd64
替换为你实际的 frps 文件所在路径。
2. 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable frps
sudo systemctl start frps
3. 检查状态
sudo systemctl status frps
3.3 防火墙开放端口
确保服务器的防火墙开放了 frps.toml
中配置的端口(如 7000
和 7500
)。
# 使用 UFW (Debian/Ubuntu)
sudo ufw allow 7000/tcp
sudo ufw allow 7500/tcp # 如果使用了 Web 控制台
sudo ufw reload# 使用 Firewalld (CentOS/RHEL)
sudo firewall-cmd --permanent --add-port=7000/tcp
sudo firewall-cmd --permanent --add-port=7500/tcp # 如果使用了 Web 控制台
sudo firewall-cmd --reload
注意:如果是云服务器,需要将这个端口在安全组也进行开放
4. 客户端 (Frpc) 部署
4.1 Windows 客户端
4.1.1 下载并解压 Windows 版的 FRP 压缩包
4.1.2 在解压目录中创建配置文件 frpc.toml
# frpc.toml
serverAddr = "your_server_ip" # 替换为你的公网服务器 IP
serverPort = 7000 # 与服务端 bindPort 保持一致
auth.method = "token"
auth.token = "your_strong_password_here" # 与服务端 auth.token 保持一致# 配置一个示例隧道(例如转发本机 RDP 服务)
[[proxies]]
name = "rdp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = 6000 # 外部用户通过 serverIP:6000 访问内网 RDP# 配置另一个示例(例如转发 Web 服务)
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 6080
4.1.3 启动 Frpc
-
命令行启动:在
frpc.toml
所在目录打开CMD
或PowerShell
,执行:.\frpc.exe -c .\frpc.toml
-
后台运行 (推荐):创建一个批处理文件
start_frpc.bat
,内容如下:@echo off :home frpc.exe -c frpc.toml goto home
双击运行此批处理文件,窗口会保持打开。如需完全隐藏窗口,可使用
nssm
等工具将其注册为系统服务。
4.2 Linux 客户端
4.2.1 在内网 Linux 机器上下载并解压对应的 FRP 压缩包
4.2.2 配置 frpc.toml
内容与 Windows 客户端完全相同
serverAddr = "your_server_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 = 6002
4.2.3 启动 Frpc
4.2.3.1.命令行启动
./frpc -c ./frpc.toml
4.2.3.2.使用 Systemd 创建服务 (推荐)
4.2.3.2.1 创建服务文件
sudo vim /etc/systemd/system/frpc.service
[Unit]
Description=Frp Client Service
After=network.target[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/path/to/your/frpc_directory/frpc -c /path/to/your/frpc_directory/frpc.toml[Install]
WantedBy=multi-user.target
4.2.3.2.2 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable frpc
sudo systemctl start frpc
4.2.3.2.3 检查状态
sudo systemctl status frpc
5. 核心配置参数详解
5.1 通用参数 (Frps & Frpc)
参数 (TOML) | 参数 (旧版 INI) | 说明 | 示例 | 必要性 |
---|---|---|---|---|
serverAddr | server_addr | 服务端公网 IP 地址或域名 | "x.x.x.x" | 必选 |
serverPort | server_port | 服务端 bindPort | 7000 | 必选 |
auth.method | authentication_method | 认证方式 | "token" | 推荐 |
auth.token | token | 认证令牌,两端需一致 | "your_password" | 推荐 |
5.2 服务端 (Frps) 特有参数
参数 (TOML) | 参数 (旧版 INI) | 说明 | 示例 | 默认值 |
---|---|---|---|---|
bindPort | bind_port | 监听客户端连接的端口 | 7000 | - |
webServer.addr | dashboard_addr | 仪表盘监听地址 | "0.0.0.0" | "0.0.0.0" |
webServer.port | dashboard_port | 仪表盘端口 | 7500 | - |
webServer.user | dashboard_user | 仪表盘用户名 | "admin" | - |
webServer.password | dashboard_pwd | 仪表盘密码 | "admin" | - |
enablePrometheus | - | 启用 Prometheus 指标 | true | false |
5.3 客户端 (Frpc) 代理配置参数 ([[proxies]]
)
每个 [[proxies]]
段落代表一个穿透规则。
参数 (TOML) | 参数 (旧版 INI) | 说明 | 示例 | 必要性 |
---|---|---|---|---|
name | name | 代理规则名称,唯一 | "ssh" | 必选 |
type | type | 代理类型:tcp , udp , http , https , stcp (安全) 等 | "tcp" | 必选 |
localIP | local_ip | 本地服务 IP | "127.0.0.1" | 必选 |
localPort | local_port | 本地服务端口 | 22 , 3389 | 必选 |
remotePort | remote_port | 服务端 暴露的端口 (type为 tcp/udp 时) | 6000 | type为 tcp/udp 时必选 |
customDomains | custom_domains | 自定义域名 (type为 http/https 时) | ["web.example.com"] | type为 http/https 时必选 |
6. 测试与验证
-
检查进程状态:在服务端和客户端分别执行
systemctl status frps
和systemctl status frpc
,确保状态为active (running)
-
查看日志:使用
journalctl -u frps -f
或journalctl -u frpc -f
跟踪日志,无报错即表示连接成功 -
访问仪表盘:在浏览器访问
http://your_server_ip:7500
,使用配置的用户名密码登录,可以看到客户端的连接和代理状态
-
测试连接:使用外部机器尝试连接你配置的服务。例如:
- 测试 RDP:用远程桌面连接
your_server_ip:6000
- 测试 SSH:
ssh -p 6002 user@your_server_ip
- 测试 RDP:用远程桌面连接
7. 常见问题与注意事项 (FAQ)
问题 | 可能原因与解决方案 |
---|---|
连接失败 / 超时 | 1. 防火墙/安全组未放行:检查服务端 7000 、7500 及代理使用的 remotePort (如 6000 ) 是否已开放。2. Token 认证失败:确保服务端和客户端的 auth.token 完全一致。3. 服务器 IP 或端口写错:仔细检查 serverAddr 和 serverPort 。 |
能连接但服务不可用 | 1. 客户端本地服务未启动:确保内网机器上的目标服务 (如 RDP, Web) 正在运行且可以正常访问。 2. localIP 或 localPort 配置错误:确保配置指向了正确的内网服务地址和端口。 |
端口已被占用 | 更换 frps.toml 中的 bindPort 或 webServer.port ,或者停止占用端口的程序。 |
权限不足 | 使用 sudo 或以 root 用户运行。如果使用 systemd,检查服务文件中的 User 和文件路径权限。 |
安全建议:
- 使用强 Token:不要使用默认或简单的密码。
- 限制端口访问:在云服务器安全组中,只允许特定 IP 访问管理端口(如
7500
)。 - 使用非默认端口:将
7000
和7500
改为其他不常见的端口。 - 使用 STCP:对于高风险服务(如 SSH、RDP),考虑使用
type = stcp
,它需要另一个已知的 frpc 作为访问者,避免直接暴露端口到公网。