Skip to content

FRP配置详解

本页面详细介绍MISEB FRP客户端的配置选项和平台管理功能。

客户端配置

配置文件

配置文件位于 config/frp-client.json,JSON格式:

json
{
  "serverHost": "frp.your-domain.com",
  "serverPort": 7000,
  "authCode": "YOUR_AUTH_CODE",
  "proxies": [
    {
      "proxyName": "erp-api",
      "proxyType": "tcp",
      "localIp": "192.168.1.10",
      "localPort": 8080,
      "remotePort": 0,
      "enabled": true,
      "remark": "ERP系统API"
    }
  ]
}

基础配置项

配置项类型必填默认值说明
serverHoststring127.0.0.1FRP服务器地址
serverPortint7000FRP服务器端口
authCodestring-平台分配的授权码
proxiesarray[]代理配置列表

代理配置项

每个代理规则包含以下配置:

配置项类型必填默认值说明
proxyNamestring-代理名称,需唯一
proxyTypestringtcp代理类型(目前仅支持tcp)
localIpstring127.0.0.1内网服务地址
localPortint-内网服务端口
remotePortint0远程端口,0表示自动分配
enabledbooltrue是否启用
remarkstring-备注

典型对接配置

对接内网ERP系统

场景:将订单数据同步到内网ERP

json
{
  "serverHost": "frp.example.com",
  "serverPort": 7000,
  "authCode": "ABC123XYZ",
  "proxies": [
    {
      "proxyName": "erp-api",
      "localIp": "192.168.1.10",
      "localPort": 8080,
      "remotePort": 0,
      "remark": "ERP HTTP接口"
    },
    {
      "proxyName": "erp-mysql",
      "localIp": "192.168.1.10",
      "localPort": 3306,
      "remotePort": 0,
      "remark": "ERP数据库"
    }
  ]
}

Magic-API使用示例

javascript
// 调用内网ERP API(假设分配端口15001)
var result = http.post('http://localhost:15001/api/sales/order', {
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + env.get('ERP_TOKEN')
    },
    body: {
        orderNo: order.order_id,
        customerCode: 'C' + order.uid,
        items: products.map(p => ({
            itemCode: p.bar_code,
            qty: p.cart_num,
            price: p.price / 100
        })),
        totalAmount: order.pay_price / 100
    }
});

对接内网WMS仓储系统

场景:库存同步、发货单推送

json
{
  "proxies": [
    {
      "proxyName": "wms-api",
      "localIp": "192.168.1.20",
      "localPort": 9000,
      "remotePort": 0,
      "remark": "WMS HTTP接口"
    }
  ]
}

Magic-API使用示例

javascript
// 查询WMS库存(假设分配端口15010)
var stock = http.get('http://localhost:15010/api/inventory', {
    params: { skuCode: product.bar_code },
    headers: { 'Authorization': 'Bearer ' + env.get('WMS_TOKEN') }
});

// 推送发货单
var shipResult = http.post('http://localhost:15010/api/shipment/create', {
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + env.get('WMS_TOKEN')
    },
    body: {
        orderNo: order.order_id,
        receiverName: address.real_name,
        receiverPhone: address.user_phone,
        receiverAddress: address.province + address.city + address.district + address.detail,
        items: products.map(p => ({
            skuCode: p.bar_code,
            qty: p.cart_num
        }))
    }
});

对接内网财务系统(SQL Server)

场景:收款数据同步到财务系统

json
{
  "proxies": [
    {
      "proxyName": "finance-sqlserver",
      "localIp": "192.168.1.30",
      "localPort": 1433,
      "remotePort": 0,
      "remark": "财务系统SQL Server"
    }
  ]
}

Magic-API数据源配置

yaml
magic-api:
  datasource:
    finance:
      url: jdbc:sqlserver://localhost:15020;databaseName=FinanceDB
      username: miseb_sync
      password: your_password
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver

Magic-API使用示例

javascript
// 同步收款记录到财务系统
db['finance'].insert(`
    INSERT INTO T_Receipt
    (ReceiptNo, OrderNo, Amount, PayType, PayTime, CustomerCode, Remark)
    VALUES (?, ?, ?, ?, ?, ?, ?)
`,
    'REC' + order.order_id,
    order.order_id,
    order.pay_price / 100,
    order.pay_type,
    order.pay_time,
    'C' + order.uid,
    'MISEB订单同步'
);

对接多个内网系统

json
{
  "serverHost": "frp.example.com",
  "serverPort": 7000,
  "authCode": "ABC123XYZ",
  "proxies": [
    {
      "proxyName": "erp-api",
      "localIp": "192.168.1.10",
      "localPort": 8080,
      "remotePort": 0,
      "remark": "ERP API"
    },
    {
      "proxyName": "erp-mysql",
      "localIp": "192.168.1.10",
      "localPort": 3306,
      "remotePort": 0,
      "remark": "ERP MySQL"
    },
    {
      "proxyName": "wms-api",
      "localIp": "192.168.1.20",
      "localPort": 9000,
      "remotePort": 0,
      "remark": "WMS API"
    },
    {
      "proxyName": "finance-db",
      "localIp": "192.168.1.30",
      "localPort": 1433,
      "remotePort": 0,
      "remark": "财务SQL Server"
    }
  ]
}

客户端运行模式

图形界面模式

双击 start.bat(Windows)或运行 start.sh(Linux/Mac)启动图形界面。

主界面功能:

  • 服务器配置:地址、端口、授权码
  • 代理管理:添加、删除、启用/禁用代理
  • 连接控制:连接、断开、取消连接
  • 状态显示:连接状态、流量统计、实时速率
  • 日志查看:运行日志实时滚动显示

无界面模式(服务模式)

适用于Linux服务器或后台运行:

bash
# 使用启动脚本
./start-headless.sh start    # 启动
./start-headless.sh stop     # 停止
./start-headless.sh restart  # 重启
./start-headless.sh status   # 查看状态

# 或直接运行
java -jar miseb-frp-client.jar --service

服务模式特点:

  • 窗口不显示,最小化到系统托盘(Windows)
  • 自动读取配置文件并连接
  • 支持自动重连

命令行参数

参数说明
--service服务模式,最小化到托盘启动
-service同上(兼容写法)

平台管理

授权码管理

菜单路径:平台管理后台 → 系统设置 → FRP管理 → 授权码管理

管理员功能:

  • 新增授权码:为商户生成授权码
  • 查看详情:授权码、商户、状态、分配端口
  • 设置有效期:配置过期时间
  • 禁用/启用:临时禁用或恢复授权码
  • 重置绑定:解除机器码绑定,允许在新机器使用

授权码状态

状态说明
未使用已生成,尚未激活
已绑定已被客户端激活并绑定机器
已禁用被管理员禁用
已过期超过有效期

客户端监控

菜单路径:平台管理后台 → 系统设置 → FRP管理 → 客户端列表

可查看:

  • 在线客户端列表
  • 客户端IP地址
  • 客户端版本和操作系统
  • 连接时间、最后心跳时间
  • 流量统计(入站/出站)

服务配置

菜单路径:平台管理后台 → 系统设置 → FRP管理 → 服务配置

可配置:

  • 启用/禁用FRP服务
  • 隧道端口:默认7000
  • 代理端口范围:默认10000-20000
  • 心跳超时时间:默认90秒
  • 最大客户端数:并发连接限制

协议说明

消息类型

MISEB FRP使用自定义二进制协议:

类型代码说明
AUTH_REQUEST0x01认证请求
AUTH_RESPONSE0x02认证响应
HEARTBEAT0x03心跳请求
HEARTBEAT_ACK0x04心跳响应
PROXY_REGISTER0x20代理注册请求
PROXY_REGISTER_ACK0x21代理注册响应
NEW_CONNECTION0x40新连接通知
DATA_TRANSFER0x42数据传输
CONNECTION_CLOSE0x43连接关闭
DISCONNECT0x05断开连接
TRAFFIC_REPORT0x60流量上报

连接流程

  1. 建立连接:客户端连接服务端隧道端口(7000)
  2. 认证:发送AUTH_REQUEST(授权码+客户端ID)
  3. 验证:服务端验证授权码,绑定机器码
  4. 注册代理:发送PROXY_REGISTER注册代理规则
  5. 分配端口:服务端分配远程端口,返回PROXY_REGISTER_ACK
  6. 数据转发:外部访问远程端口,通过隧道转发到内网服务
  7. 心跳保活:定期发送HEARTBEAT保持连接

故障排查

日志位置

  • 客户端日志:logs/frp-client.log
  • 服务端日志:查看MISEB Admin服务日志

常见错误

错误信息原因解决方案
认证失败:授权码无效授权码不正确检查授权码
认证失败:授权码已过期授权码过期联系管理员续期
认证失败:机器码不匹配授权码已绑定其他机器联系管理员重置
连接超时网络问题检查网络连接
代理注册失败:端口已占用远程端口冲突使用自动分配或换端口
本地服务不可达内网服务未启动或地址错误检查内网服务

连接测试

在客户端机器上测试:

bash
# 测试到FRP服务器的连通性
telnet frp.example.com 7000

# 测试内网HTTP服务
curl http://192.168.1.10:8080/api/health

# 测试内网MySQL连接
mysql -h 192.168.1.10 -P 3306 -u user -p

# 测试内网端口连通性
telnet 192.168.1.10 8080

安全配置

授权码安全

  • 授权码首次使用会绑定机器特征码(MAC地址+系统信息)
  • 更换机器需要管理员重置授权码
  • 建议定期更换授权码

网络安全

  • 服务端可配置防火墙限制来源IP
  • 代理端口范围可控
  • 所有通信基于自定义协议

内网服务保护

建议商户在内网服务端做好访问控制:

javascript
// 即使通过FRP访问,内网服务仍需验证
var result = http.post('http://localhost:15001/api/order', {
    headers: {
        'Authorization': 'Bearer ' + env.get('ERP_TOKEN'),
        'X-Source': 'MISEB'  // 来源标识
    },
    body: data
});

下一步

成都艾唯特软件有限公司