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"
}
]
}基础配置项
| 配置项 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| serverHost | string | 是 | 127.0.0.1 | FRP服务器地址 |
| serverPort | int | 是 | 7000 | FRP服务器端口 |
| authCode | string | 是 | - | 平台分配的授权码 |
| proxies | array | 否 | [] | 代理配置列表 |
代理配置项
每个代理规则包含以下配置:
| 配置项 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| proxyName | string | 是 | - | 代理名称,需唯一 |
| proxyType | string | 否 | tcp | 代理类型(目前仅支持tcp) |
| localIp | string | 是 | 127.0.0.1 | 内网服务地址 |
| localPort | int | 是 | - | 内网服务端口 |
| remotePort | int | 否 | 0 | 远程端口,0表示自动分配 |
| enabled | bool | 否 | true | 是否启用 |
| remark | string | 否 | - | 备注 |
典型对接配置
对接内网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.SQLServerDriverMagic-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_REQUEST | 0x01 | 认证请求 |
| AUTH_RESPONSE | 0x02 | 认证响应 |
| HEARTBEAT | 0x03 | 心跳请求 |
| HEARTBEAT_ACK | 0x04 | 心跳响应 |
| PROXY_REGISTER | 0x20 | 代理注册请求 |
| PROXY_REGISTER_ACK | 0x21 | 代理注册响应 |
| NEW_CONNECTION | 0x40 | 新连接通知 |
| DATA_TRANSFER | 0x42 | 数据传输 |
| CONNECTION_CLOSE | 0x43 | 连接关闭 |
| DISCONNECT | 0x05 | 断开连接 |
| TRAFFIC_REPORT | 0x60 | 流量上报 |
连接流程
- 建立连接:客户端连接服务端隧道端口(7000)
- 认证:发送AUTH_REQUEST(授权码+客户端ID)
- 验证:服务端验证授权码,绑定机器码
- 注册代理:发送PROXY_REGISTER注册代理规则
- 分配端口:服务端分配远程端口,返回PROXY_REGISTER_ACK
- 数据转发:外部访问远程端口,通过隧道转发到内网服务
- 心跳保活:定期发送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
});下一步
- FRP内网穿透 - 快速入门指南
- 事件+Magic-API - 结合事件推送同步数据
- Magic-API数据库操作 - 多数据源操作
