深信服 AC 上网行为管理设备开放接口 SDK(Node.js)
基于深信服 AC 开放接口文档 v1.0(2019-05),覆盖文档中全部 30+ 端点。
- 零外部依赖,仅使用 Node.js 内置模块(
http+crypto) - 完整覆盖 Status / User / Group / Policy / BindInfo / OnlineUsers 六大模块
- 全部端点带 JSDoc 注释,IDE 自动补全友好
- 统一响应格式
{ code, message, data } - 支持配置覆盖和自定义超时/语言
##安装
# 直接克隆到项目中使用
git clone ...
# 或使用 npm link
npm link sangfor-ac-apiconst SangforAC = require('sangfor-ac-api');
// 必须传入完整配置
const ac = new SangforAC({
host: '10.0.0.1',
port: 9999,
sharedKey: 'your-shared-key',
timeout: 5000
});
// 获取设备基本信息
const ver = await ac.status.version();
console.log(ver.data); // 'AC12.0.40.002 Build20191102'
const online = await ac.status.onlineUser();
console.log(`在线用户: ${online.data} 人`);| 方法 | 说明 | 请求方式 |
|---|---|---|
version() |
获取设备版本号 | GET |
onlineUser() |
获取在线用户数 | GET |
sessionNum() |
获取会话数 | GET |
insidelib() |
获取内置库版本信息 | GET |
log() |
获取行为日志数量 | GET |
cpuUsage() |
获取 CPU 使用率 | GET |
memUsage() |
获取内存使用率 | GET |
diskUsage() |
获取磁盘使用率 | GET |
sysTime() |
获取系统时间 | GET |
throughput(filter) |
获取吞吐量(上行/下行) | POST |
userRank(filter) |
获取用户流量排行 | POST |
appRank(filter) |
获取应用流量排行 | POST |
bandwidthUsage() |
获取带宽使用率 | GET |
fluxUnits() |
获取流速单位配置 | GET |
// 获取吞吐量(指定 eth1 网口)
const tp = await ac.status.throughput({
unit: 'bits',
interface: 'eth1'
});
console.log(`上行: ${tp.data.send} | 下行: ${tp.data.recv} ${tp.data.unit}`);
// 获取用户流量 Top 10
const rank = await ac.status.userRank({ top: 10, line: '0' });
rank.data.forEach(u => {
console.log(`${u.name}: 上行 ${u.up}B / 下行 ${u.down}B`);
});| 方法 | 说明 | 请求方式 |
|---|---|---|
add(userInfo) |
添加用户 | POST |
delete(name) |
删除用户 | POST |
search({ search_type, search_value }) |
搜索用户 | POST |
update(name, data) |
修改用户信息 | POST |
detail(name) |
获取用户详细信息 | GET |
setNetPolicy(opr, user, policy) |
关联上网策略 | POST |
getNetPolicy(user) |
获取上网策略 | GET |
setFluxPolicy(opr, user, policy) |
关联流控策略 | POST |
getFluxPolicy(user) |
获取流控策略 | GET |
verifyPassword(name, password) |
验证密码 | GET |
// 添加用户并设置密码
await ac.user.add({
name: 'zhangsan',
father_path: '/研发部',
desc: '研发工程师',
extend: {
self_pass: { enable: true, password: 'abc123', modify_once: false },
bind_cfg: ['192.168.1.100']
}
});
// 给用户关联策略
await ac.user.setNetPolicy('add', 'zhangsan', ['默认策略']);
// 搜索用户
const res = await ac.user.search({
search_type: 'user',
search_value: '张三'
});| 方法 | 说明 | 请求方式 |
|---|---|---|
add(path, desc) |
添加组 | POST |
delete(path) |
删除组 | POST |
update(path, desc) |
修改组信息 | POST |
setNetPolicy(opr, group, policy) |
关联上网策略 | POST |
getNetPolicy(path) |
获取上网策略 | GET |
setFluxPolicy(opr, group, policy) |
关联流控策略 | POST |
getFluxPolicy(path) |
获取流控策略 | GET |
// 创建组并关联策略
await ac.group.add('/研发部', '研发部门');
await ac.group.setNetPolicy('add', '/研发部', ['办公策略']);| 方法 | 说明 | 请求方式 |
|---|---|---|
netpolicy() |
获取所有上网策略 | GET |
fluxpolicy() |
获取所有流控策略 | GET |
⚠️ 只读:不支持通过 API 创建/修改/删除策略,策略内容需在 AC 设备本地配置。
// 获取所有策略名(用于关联时引用)
const policies = await ac.policy.netpolicy();
const names = policies.data.map(p => p.policy_info.name);
console.log('可用策略:', names);| 方法 | 说明 | 请求方式 |
|---|---|---|
searchUserBind(search) |
查询用户-IP/MAC 绑定 | GET |
searchIpMac(search) |
查询 IP/MAC 绑定 | GET |
deleteUserBind(addr) |
删除用户-IP/MAC 绑定 | POST |
deleteIpMac(ip) |
删除 IP/MAC 绑定 | POST |
addUserBind(data) |
增加用户-IP/MAC 绑定 | POST |
addIpMac(data) |
增加 IP/MAC 绑定 | POST |
// 绑定用户到 IP
await ac.bindInfo.addUserBind({
enable: true,
name: 'zhangsan',
addr_type: 'ip',
addr: '192.168.1.100',
limitlogon: true,
noauth: { enable: false, expire_time: 0 }
});
// IP+MAC 双绑定
await ac.bindInfo.addUserBind({
enable: true,
name: 'zhangsan',
addr_type: 'ipmac',
addr: '192.168.1.100+aa-bb-cc-dd-ee-ff',
limitlogon: true,
noauth: { enable: true, expire_time: 0 }
});| 方法 | 说明 | 请求方式 |
|---|---|---|
list(filter) |
获取在线用户列表 | POST |
kick(ip) |
强制注销用户 | POST |
login(data) |
单点登录上线 | POST |
// 查看在线用户
const list = await ac.onlineUsers.list({ status: 'active' });
console.log(`在线: ${list.data.count} 人`);
// 强制注销
await ac.onlineUsers.kick('192.168.1.100');
// 单点登录
await ac.onlineUsers.login({
ip: '192.168.1.100',
name: 'zhangsan',
mac: 'aa-bb-cc-dd-ee-ff'
});深信服 AC 使用 MD5 签名 认证,规则如下:
- 客户端生成随机字符串
random - 计算签名
md5(共享密钥 + random) - 将
random和md5值附加到请求中:- GET:URL 查询参数
?random=xxx&md5=xxx - POST/PUT/DELETE:JSON body 中
{ random, md5, ...data }
- GET:URL 查询参数
SDK 内部自动处理认证签名,无需手动计算。
共享密钥: 在 AC 设备「高级设置 - 开放接口」中配置
random: 客户端随机字串(同一 random 1 小时内只能使用 1 次)
md5: md5(共享密钥 + random),注意顺序不能颠倒
所有接口返回统一格式:
| 字段 | 类型 | 说明 |
|---|---|---|
code |
number |
0=成功,1=失败 |
message |
string |
响应消息 |
data |
* |
响应数据(成功时存在) |
const res = await ac.status.cpuUsage();
if (res.code === 0) {
console.log(`CPU: ${res.data}%`);
} else {
console.error(`获取失败: ${res.message}`);
}
// 网络错误会 reject,用 try/catch 捕获
try {
await ac.status.version();
} catch (e) {
console.error(`请求失败: ${e.message}`);
}- 白名单:请求方 IP 必须在 AC 设备中配置为白名单
- RESTful 服务:需在 AC 设备「高级设置 - 开放接口」中启用
- 随机字串:同一 random 1 小时内只能使用 1 次
- 策略不可创建:API 只支持查询策略,不能创建策略内容
- 性能开销:流量排行类接口(userRank / appRank)开销较大,避免频繁请求
- 语言切换:Status 接口支持
Accept-Language: zh-CN切换中文;User/Group 接口语言跟随设备
sangfor-ac-api/
├── index.js # SDK 统一入口(SangforAC 类)
├── package.json
├── README.md # 本文档
├── LICENSE # MIT 许可证
├── .gitignore
├── .npmignore
├── lib/
│ ├── auth.js # 认证签名模块(MD5)
│ └── client.js # HTTP 客户端封装
├── api/
│ ├── status.js # Status 接口(14 个端点)
│ ├── user.js # User 接口(10 个端点)
│ ├── group.js # Group 接口(7 个端点)
│ ├── policy.js # Policy 接口(2 个端点)
│ ├── bindinfo.js # BindInfo 接口(6 个端点)
│ └── online-users.js # OnlineUsers 接口(3 个端点)
└── examples/
├── config.js # 示例配置(需根据实际情况修改)
└── demo.js # 全模块演示脚本
MIT