Files
My-Blog/content/Network-frp.md
2025-07-05 15:03:43 +08:00

464 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

+++
title = "网络艺术:FRP使用指南"
date = 2025-03-01
[taxonomies]
tags = ["Network"]
+++
前言 FRP (Fast Reverse Proxy) 是一个用Go语言开发的高性能反向代理应用可以帮助您轻松地进行内网穿透对外提供服务.
<!-- more -->
## 简介
FRP (Fast Reverse Proxy) 主要功能包括:
- 支持TCP、UDP、HTTP、HTTPS等多种协议
- 支持Web服务、远程桌面、SSH、游戏服务器等多种应用场景
- 提供加密和压缩功能,保证数据安全性
- 支持多个客户端连接服务端,适用于复杂网络环境
FRP分为客户端(frpc)和服务端(frps)两部分:
- **服务端(frps)**: 部署在有公网IP的服务器上
- **客户端(frpc)**: 部署在内网机器上,负责将内网服务映射到公网
## 安装
### 服务端安装
服务端需要部署在具有公网IP的服务器上。
1. 下载最新版本的FRP发行包
```bash
wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_amd64.tar.gz
```
2. 解压文件:
```bash
tar -xzvf frp_0.51.3_linux_amd64.tar.gz
cd frp_0.51.3_linux_amd64
```
3. 现在您可以看到以下文件:
- frps: 服务端可执行文件
- frps.ini: 服务端配置文件
- frpc: 客户端可执行文件
- frpc.ini: 客户端配置文件
### 客户端安装
客户端需要安装在您的内网设备上例如需要提供服务的电脑、服务器或IoT设备上。
- Linux/macOS
与服务端安装步骤相同只需使用frpc程序和frpc.ini配置文件。
- Windows
同样下载Windows版本解压后使用frpc.exe和frpc.ini。
## 配置
### 服务端配置
服务端配置文件为frps.ini基本配置如下
```ini
[common]
# 服务端监听端口,用于与客户端建立连接
bind_port = 7000
# 用于身份验证的token
token = yourSecureToken
# 后台管理页面端口(可选)
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
# 日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
```
### 客户端配置
客户端配置文件为frpc.ini基本配置如下
```ini
[common]
# 服务端的IP地址或域名
server_addr = x.x.x.x
# 服务端的端口
server_port = 7000
# 认证token需要与服务端匹配
token = yourSecureToken
# 示例SSH服务代理
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
# 示例HTTP服务代理
[web]
type = http
local_ip = 127.0.0.1
local_port = 80
custom_domains = www.yourdomain.com
```
### 常用配置示例
#### 1. 代理SSH服务
```ini
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
token = yourSecureToken
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
```
使用方法:`ssh -p 6000 username@服务端IP`
#### 2. 代理HTTP网站
```ini
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
token = yourSecureToken
[web]
type = http
local_ip = 127.0.0.1
local_port = 80
custom_domains = www.yourdomain.com
```
在服务端需要将域名解析到服务端IP。
#### 3. 代理HTTPS网站
```ini
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
token = yourSecureToken
[web-https]
type = https
local_ip = 127.0.0.1
local_port = 443
custom_domains = www.yourdomain.com
```
#### 4. 代理远程桌面(RDP)
```ini
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
token = yourSecureToken
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001
```
## 启动与运行
### 服务端启动
#### Linux/macOS
```bash
./frps -c frps.ini
```
后台运行:
```bash
nohup ./frps -c frps.ini &
```
#### Windows
双击frps.exe或在命令行运行
```
frps.exe -c frps.ini
```
### 客户端启动
#### Linux/macOS
```bash
./frpc -c frpc.ini
```
后台运行:
```bash
nohup ./frpc -c frpc.ini &
```
#### Windows
双击frpc.exe或在命令行运行
```
frpc.exe -c frpc.ini
```
### 设置为系统服务
#### Linux (Systemd)
1. 创建服务文件 `/etc/systemd/system/frps.service` (服务端) 或 `/etc/systemd/system/frpc.service` (客户端)
**服务端示例 (frps.service):**
```ini
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/frps -c /etc/frps/frps.ini
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
```
**客户端示例 (frpc.service):**
```ini
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/frpc -c /etc/frpc/frpc.ini
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
```
2. 启用并启动服务:
```bash
# 服务端
sudo systemctl enable frps
sudo systemctl start frps
# 客户端
sudo systemctl enable frpc
sudo systemctl start frpc
```
3. 查看服务状态:
```bash
sudo systemctl status frps
# 或
sudo systemctl status frpc
```
#### Windows
1. 使用NSSM (Non-Sucking Service Manager) 创建服务:
- 下载NSSM: http://nssm.cc/download
- 安装服务:
```
nssm.exe install frpc C:\path\to\frpc.exe -c C:\path\to\frpc.ini
```
- 启动服务:
```
nssm.exe start frpc
```
## 进阶功能
### HTTPS支持
要支持HTTPS服务需要在服务端添加配置
```ini
# frps.ini
[common]
bind_port = 7000
vhost_https_port = 443
```
客户端配置:
```ini
# frpc.ini
[web]
type = https
local_ip = 127.0.0.1
local_port = 443
custom_domains = www.yourdomain.com
```
### 多路复用
使用多路复用可以减少连接数,提高性能:
```ini
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
token = yourSecureToken
# 启用多路复用
tls_enable = true
pool_count = 5
```
### 加密与压缩
增加数据传输的安全性:
```ini
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
token = yourSecureToken
# 启用加密和压缩
use_encryption = true
use_compression = true
```
### 负载均衡
通过配置多个后端服务实现负载均衡:
```ini
# frpc.ini
[web]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 8080
group = web
group_key = 123456
[web2]
type = tcp
local_ip = 127.0.0.1
local_port = 8081
remote_port = 8080
group = web
group_key = 123456
```
### 访问控制
限制客户端连接数量和带宽:
```ini
# frps.ini
[common]
bind_port = 7000
token = yourSecureToken
max_pool_count = 50
max_ports_per_client = 10
```
## 常见问题排查
### 1. 连接被拒绝
**问题**: 客户端报错 "dial tcp x.x.x.x:7000: connect: connection refused"
**解决方案**:
- 检查服务端IP和端口是否正确
- 确认服务端frps是否正在运行
- 检查防火墙是否允许7000端口通信
### 2. 认证失败
**问题**: 客户端日志显示 "login to server failed: authentication failed"
**解决方案**:
- 确认客户端和服务端的token设置一致
- 检查服务端日志是否有更多错误信息
### 3. 端口已被占用
**问题**: 服务端启动失败,提示 "bind: address already in use"
**解决方案**:
- 更改配置中的端口
- 终止占用该端口的其他应用
- 使用 `netstat -tunlp | grep 端口号` 查看占用该端口的进程
### 4. 无法访问代理服务
**问题**: 代理设置正确,但无法访问服务
**解决方案**:
- 检查本地服务是否正常运行
- 确认local_ip和local_port设置正确
- 使用 `curl localhost:本地端口` 测试本地服务
- 检查服务端防火墙是否开放了remote_port
### 5. 代理连接不稳定
**问题**: 连接经常断开
**解决方案**:
- 增加心跳包频率,在[common]部分添加:
```
heartbeat_interval = 30
heartbeat_timeout = 90
```
- 启用多路复用和连接池
### 6. 域名解析失败
**问题**: 使用custom_domains配置但无法通过域名访问
**解决方案**:
- 确保域名已正确解析到服务端IP
- 检查frps.ini中是否配置了http/https的监听端口
- 使用 `dig` 或 `nslookup` 命令验证域名解析
🔗
- [FRP官方文档](https://gofrp.org/docs/)
- [FRP GitHub仓库](https://github.com/fatedier/frp)
- [FRP常见问题解答](https://github.com/fatedier/frp/issues)
---
**Done.**