前言 FRP (Fast Reverse Proxy) 是一个用Go语言开发的高性能反向代理应用,可以帮助您轻松地进行内网穿透,对外提供服务.

简介

FRP (Fast Reverse Proxy) 主要功能包括:

  • 支持TCP、UDP、HTTP、HTTPS等多种协议
  • 支持Web服务、远程桌面、SSH、游戏服务器等多种应用场景
  • 提供加密和压缩功能,保证数据安全性
  • 支持多个客户端连接服务端,适用于复杂网络环境

FRP分为客户端(frpc)和服务端(frps)两部分:

  • 服务端(frps): 部署在有公网IP的服务器上
  • 客户端(frpc): 部署在内网机器上,负责将内网服务映射到公网

安装

服务端安装

服务端需要部署在具有公网IP的服务器上。

  1. 下载最新版本的FRP发行包:
wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_amd64.tar.gz
  1. 解压文件:
tar -xzvf frp_0.51.3_linux_amd64.tar.gz
cd frp_0.51.3_linux_amd64
  1. 现在您可以看到以下文件:
    • frps: 服务端可执行文件
    • frps.ini: 服务端配置文件
    • frpc: 客户端可执行文件
    • frpc.ini: 客户端配置文件

客户端安装

客户端需要安装在您的内网设备上,例如需要提供服务的电脑、服务器或IoT设备上。

  • Linux/macOS

与服务端安装步骤相同,只需使用frpc程序和frpc.ini配置文件。

  • Windows

同样下载Windows版本,解压后使用frpc.exe和frpc.ini。

配置

服务端配置

服务端配置文件为frps.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,基本配置如下:

[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服务

# 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网站

# 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网站

# 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)

# 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

./frps -c frps.ini

后台运行:

nohup ./frps -c frps.ini &

Windows

双击frps.exe或在命令行运行:

frps.exe -c frps.ini

客户端启动

Linux/macOS

./frpc -c frpc.ini

后台运行:

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):

[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):

[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
  1. 启用并启动服务:
# 服务端
sudo systemctl enable frps
sudo systemctl start frps

# 客户端
sudo systemctl enable frpc
sudo systemctl start frpc
  1. 查看服务状态:
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服务,需要在服务端添加配置:

# frps.ini
[common]
bind_port = 7000
vhost_https_port = 443

客户端配置:

# frpc.ini
[web]
type = https
local_ip = 127.0.0.1
local_port = 443
custom_domains = www.yourdomain.com

多路复用

使用多路复用可以减少连接数,提高性能:

# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
token = yourSecureToken
# 启用多路复用
tls_enable = true
pool_count = 5

加密与压缩

增加数据传输的安全性:

# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
token = yourSecureToken
# 启用加密和压缩
use_encryption = true
use_compression = true

负载均衡

通过配置多个后端服务实现负载均衡:

# 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

访问控制

限制客户端连接数量和带宽:

# 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的监听端口
  • 使用 dignslookup 命令验证域名解析

🔗


Done.