/openapi/v1/acl/rules
查询规则列表
curl -k -H "Authorization: Bearer $KEY" "$WAF/openapi/v1/acl/rules"响应示例
无需面板登录,通过 API Key 直接调用 WAF 管理接口 —— 适合脚本自动化、监控告警与 CI/CD 集成。每次请求实时校验 PRO 授权,Scope 细粒度控权,高危操作永久屏蔽。
https://<WAF管理地址>:<端口>/openapi/v1/<path>
FOXWAF OpenAPI 允许 PRO 用户通过 API Key 调用 WAF 管理接口,与面板加密通道完全独立。
WAF="https://127.0.0.1:8088"
KEY="fwk_你的前缀_你的secret"
curl -k \
-H "Authorization: Bearer $KEY" \
"$WAF/openapi/v1/acl/rules"
-k 用于跳过自签名证书;生产环境请配置可信证书后去掉。
fwk_<前缀10位>_<secret32位>
示例:fwk_lu2LAk9HFj_qL9ioS4cmjVhW7dEfBxzRpYKnuA1G
| 操作 | 说明 |
|---|---|
| 生成 | 填写名称、作用域、过期时间;Secret 仅创建时展示一次;支持「全选 / 清空 / 仅只读」一键选择 |
| 禁用 / 启用 | 临时停用某个 Key,不删除记录 |
| 吊销 | 永久删除,立即生效;已有调用收到 invalid_key |
| 吊销选中 | 勾选多个密钥后批量吊销 |
| 全部吊销 | 一键吊销当前全部密钥 |
列表中作用域较多时会自动折叠,点击 +N 可展开查看全部。
/api,需登录)以下接口不可通过 OpenAPI Key 调用,防止 Key 泄漏后提权管理自身。
| 方法 | 路径 | 说明 |
|---|---|---|
GET | /api/openapi/keys | 密钥列表 |
POST | /api/openapi/keys | 生成(返回明文 secret,仅一次) |
POST | /api/openapi/keys/:id/toggle | 启用/禁用,Body {"enabled":true/false} |
DELETE | /api/openapi/keys/:id | 吊销单个 |
DELETE | /api/openapi/keys | 批量吊销 Body {"ids":[1,2,3]};全部吊销 Body {"all":true} |
| 字段 | 说明 |
|---|---|
name | 备注名称 |
prefix | Key 前缀(显示为 fwk_前缀_***) |
scopes | 作用域列表 |
enabled | 是否启用 |
expire_at | 过期时间(Unix 秒,0 = 永不过期) |
last_used_at | 最近使用时间(30 秒异步持久化) |
创建 Key 时必须至少选择一个作用域。
write 自动蕴含 read(有写权限即可读)* 为通配符,匹配所有模块read;POST / PUT / DELETE 需要 write| Scope | 说明 |
|---|---|
*:read | 全部模块只读 |
*:write | 全部模块读写(含 read) |
acl:read / acl:write | ACL 规则只读 / 读写 |
cc:read / cc:write | CC 防护只读 / 读写 |
custom-rules:read / custom-rules:write | 自定义规则只读 / 读写 |
site:read / site:write | 站点管理只读 / 读写 |
settings:read / settings:write | 全局设置只读 / 读写 |
各模块均有对应的 :write 作用域;不确定时可使用 *:read 或 *:write。
| 接口路径前缀 | 所需模块 |
|---|---|
/openapi/v1/acl/* | acl |
/openapi/v1/cc/* | cc |
/openapi/v1/custom-rules/* | custom-rules |
/openapi/v1/sites、/openapi/v1/site/*、/openapi/v1/health* | site |
/openapi/v1/attack/* | attack |
/openapi/v1/cache/* | cache |
/openapi/v1/rule*、/openapi/v1/rules* | rule |
/openapi/v1/monitor/*、/openapi/v1/traffic/*、/openapi/v1/stats | monitor / traffic / stats |
/openapi/v1/obs/* | obs |
/openapi/v1/cert-template* | cert-template |
/openapi/v1/plugins/* | plugins |
/openapi/v1/waf/* | waf |
/openapi/v1/settings | settings |
/openapi/v1/feedbacks | feedbacks |
/openapi/v1/letsencrypt/* | letsencrypt |
/openapi/v1/cert/* | cert |
/openapi/v1/realtime/* | realtime |
/openapi/v1/qrcode | qrcode |
/openapi/v1/ping、/openapi/v1/config、/openapi/v1/maintenance-server*、/openapi/v1/captcha/*、/openapi/v1/waf/language | 公开(无需 scope) |
Authorization: Bearer <api_key>
Content-Type: application/json # POST / PUT / DELETE 时需要
OpenAPI 路径与面板内部 API 一一对应:
/openapi/v1/<path> → /api/<path>
| OpenAPI 路径 | 内部路径 |
|---|---|
/openapi/v1/acl/rules | /api/acl/rules |
/openapi/v1/cc/rules/5 | /api/cc/rules/5 |
/openapi/v1/sites | /api/sites |
分页接口需传 page 和 page_size:
curl -k -H "Authorization: Bearer $KEY" \
"$WAF/openapi/v1/attack/logs?page=1&page_size=20"
所有错误响应统一格式:
| HTTP | code | 原因 |
|---|---|---|
401 | missing_token | 缺少 Authorization: Bearer 头 |
401 | invalid_key | Key 不存在或 secret 错误 |
403 | https_required | 使用了 HTTP 而非 HTTPS |
403 | key_disabled | Key 已被手动禁用 |
403 | key_expired | Key 已超过设定的过期时间 |
403 | pro_required | PRO 授权到期或无效(实时检测) |
403 | scope_denied | Key 作用域不含所需权限 |
403 | endpoint_not_exposed | 该路径不对外开放(敏感模块) |
429 | rate_limited | 触发限流(每 Key 每 60 秒上限 120 次) |
PRO 门控功能(CC、自定义规则、观察室、HTTP/3 等)在授权失效时额外返回 {"error":"此功能需要 Pro 授权","pro_required":true}。
| 项 | 值 |
|---|---|
| 粒度 | 每个 API Key 独立计数 |
| 窗口 | 60 秒固定窗口 |
| 上限 | 120 次 / 60 秒 |
| 触发响应 | HTTP 429 + {"code":"rate_limited"} |
{"message":"…成功"};创建类接口额外带资源 IDpro_required: trueWAF="https://127.0.0.1:8088"、KEY="fwk_…"/openapi/v1/acl/rules查询规则列表/openapi/v1/acl/rules添加规则/openapi/v1/acl/rules/:id更新规则/openapi/v1/acl/rules/:id/toggle启用 / 禁用/openapi/v1/acl/rules/:id删除规则/openapi/v1/acl/rules
查询规则列表
curl -k -H "Authorization: Bearer $KEY" "$WAF/openapi/v1/acl/rules"响应示例
/openapi/v1/acl/rules
添加规则
请求体字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
type | string | 必填 | global(全局)或 host(按域名) |
rule_type | string | 必填 | ip、ua、url、header、country 等 |
pattern | string | 必填 | 匹配内容 |
action | string | 必填 | block(拦截)或 allow(放行) |
enabled | bool | 必填 | 是否启用 |
host | string | 条件 | type=host 时必填 |
description | string | 可选 | 备注 |
# 封禁 IP
curl -k -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"type":"global","rule_type":"ip","pattern":"1.2.3.4","action":"block","enabled":true,"description":"恶意扫描"}' \
"$WAF/openapi/v1/acl/rules"
# 按域名封禁 UA
curl -k -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"type":"host","host":"example.com","rule_type":"ua","pattern":"sqlmap","action":"block","enabled":true}' \
"$WAF/openapi/v1/acl/rules"响应
/openapi/v1/acl/rules/:id
更新规则
请求体字段同「添加规则」。
curl -k -X PUT -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"type":"global","rule_type":"ip","pattern":"1.2.3.4","action":"allow","enabled":true}' \
"$WAF/openapi/v1/acl/rules/10"/openapi/v1/acl/rules/:id/toggle
启用 / 禁用
Body: {"enabled": false}
/openapi/v1/cc/rulesCC 规则列表/openapi/v1/cc/rules添加 CC 规则/openapi/v1/cc/rules/:id更新/openapi/v1/cc/rules/:id删除/openapi/v1/cc/stats统计概览/openapi/v1/cc/logs日志(分页)/openapi/v1/cc/logs删除日志/openapi/v1/cc/clear-counters清空计数器/openapi/v1/cc/rules
添加 CC 规则
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
host | string | 必填 | 域名,* 匹配所有 |
path | string | 必填 | 路径前缀 |
threshold | int | 必填 | 时间窗口内最大请求数 |
window | int | 必填 | 时间窗口(秒) |
ban_duration | int | 必填 | 封禁时长(秒) |
action | string | 必填 | block 或 challenge |
enabled | bool | 必填 | 是否启用 |
curl -k -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"host":"*","path":"/api/login","threshold":10,"window":60,"ban_duration":300,"action":"block","enabled":true}' \
"$WAF/openapi/v1/cc/rules"/openapi/v1/cc/stats
CC 统计 & 日志
/cc/logs 需分页参数 ?page=1&page_size=20{"all": true} 或 {"ids": [1,2,3]}/cc/stats 响应
/cc/logs 响应
写操作响应
/openapi/v1/custom-rules规则列表/openapi/v1/custom-rules添加规则/openapi/v1/custom-rules/:id更新/openapi/v1/custom-rules/:id/toggle启停/openapi/v1/custom-rules/:id删除/openapi/v1/custom-rules/export导出 ZIP/openapi/v1/custom-rules/import导入 ZIP/openapi/v1/custom-rules/reload热重载/openapi/v1/custom-rules
添加自定义规则
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
name | string | 必填 | 规则名称 |
method | string | 必填 | HTTP 方法,any 匹配所有 |
action | string | 必填 | block(拦截) |
relation | string | 必填 | and(全部满足)或 or(任一满足) |
judges | array | 必填 | 判断条件列表 |
enabled | bool | 可选 | 是否启用 |
judges[] 子字段
| 字段 | 说明 |
|---|---|
position | uri、parameter_key、parameter_value、request_header、request_body、any |
keyword | 关键词(与 content / rix 三选一) |
content | 内容匹配(string / array) |
rix | 正则表达式 |
negate | 是否取反 |
curl -k -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"name":"拦截敏感文件探测","method":"any","action":"block","enabled":true,"relation":"or",
"judges":[{"position":"uri","keyword":"/.env"},{"position":"uri","keyword":"/.git/config"}]}' \
"$WAF/openapi/v1/custom-rules"响应
GET /custom-rules/export 返回 application/zipPOST /custom-rules/import 表单字段 file(ZIP)→ {"message":"自定义规则导入成功","count":N}POST /custom-rules/reload → {"message":"自定义规则重新加载成功"}/openapi/v1/sites站点列表/openapi/v1/site/add添加站点/openapi/v1/site/add-with-cert带证书添加/openapi/v1/site/delete删除站点/openapi/v1/site/:id/certificate标准证书/openapi/v1/site/:id/sm2-certsSM2 证书/openapi/v1/site/status启用 / 禁用/openapi/v1/site/https开关 HTTPS/openapi/v1/site/update更新站点/openapi/v1/site/update-cert更新站点证书/openapi/v1/site/:id/renew-certificate续期证书/openapi/v1/site/:id/replace-certificate替换证书/openapi/v1/site/:id/remove-certificate移除证书/openapi/v1/site/:id/sm2-certs绑定 SM2 证书/openapi/v1/site/:id/sm2-certs移除 SM2 绑定/openapi/v1/health全部健康检查/openapi/v1/health/:id单站点健康检查/openapi/v1/sites
查询站点列表
/openapi/v1/site/add
添加站点
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
name | string | 是 | 站点名称 |
domain | string | 是 | 域名(多域名可用逗号、分号、换行分隔) |
target_url | string | 否 | 回源目标 URL |
enable_https | bool | 否 | 启用 HTTPS(自动生成自签名证书) |
force_https_redirect | bool | 否 | 强制 HTTP→HTTPS 跳转 |
enable_http2_upstream | bool | 否 | 回源启用 HTTP/2(默认 true) |
enable_anti_devtools 等 Pro 字段 | bool | 否 | 反 DevTools / 反爬虫 / UA 检测 / 响应检测 / 缓存 / 负载均衡 |
curl -k -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-X POST "$WAF/openapi/v1/site/add" \
-d '{"name":"主站","domain":"example.com","target_url":"http://127.0.0.1:8080"}'site:write scope。免费版最多 2 个站点,Pro 无限制。POST /site/delete Body: {"id":1} → {"message":"站点删除成功"}POST /site/add-with-cert 使用 multipart/form-data,附加 cert_file、key_file/openapi/v1/site/status
站点状态与证书操作
/openapi/v1/site/status{"id":1,"status":1}{"message":"站点启用成功","status":1}status:1=启用,0=禁用
/openapi/v1/site/https{"id":1,"enable_https":true}{"message":"站点证书更新成功","cert_type":"..."}/openapi/v1/site/update{"message":"站点更新成功"}/openapi/v1/site/update-cert{"id":1,"cert_name":"..."} 或 PEM 文本{"message":"站点证书更新成功"}/openapi/v1/site/:id/renew-certificate无 Body。重新签发自签名证书。
/openapi/v1/site/:id/replace-certificatemultipart:cert_file + key_file。替换 PEM 证书。
/openapi/v1/site/:id/remove-certificate取消 HTTPS,不删除证书库文件。
/openapi/v1/site/:id/sm2-certs{"sign_cert_id":5,"enc_cert_id":6}/openapi/v1/site/:id/sm2-certs移除 SM2 绑定。
/openapi/v1/health
健康检查
/openapi/v1/attack/logs日志列表/openapi/v1/attack/logs/:id单条详情/openapi/v1/attack/stats统计概览/openapi/v1/attack/ip-groups按 IP 分组/openapi/v1/attack/export导出 json/csv/openapi/v1/attack/logs删除日志/openapi/v1/attack/logs
查询攻击日志
| 参数 | 说明 |
|---|---|
page | 页码(必填,min=1) |
page_size | 每页条数(必填,1–100) |
host | 按域名过滤 |
client_ip | 按客户端 IP 过滤 |
method | 按 HTTP 方法过滤 |
rule_id | 按规则 ID 过滤 |
start_time / end_time | 时间范围(Unix 秒) |
curl -k -H "Authorization: Bearer $KEY" \
"$WAF/openapi/v1/attack/logs?page=1&page_size=20&host=example.com"/openapi/v1/attack/stats
统计 & 导出
/attack/export?format=json 或 format=csv 返回文件流DELETE /attack/logs → {"message":"删除成功","affected":N}/openapi/v1/cache/stats缓存统计/openapi/v1/cache/stats/detail详细统计/openapi/v1/cache/files文件列表/openapi/v1/cache/files查询文件内容/openapi/v1/cache/config更新配置/openapi/v1/cache/clear清空缓存/openapi/v1/cache/files/delete删除指定文件/openapi/v1/cache/js-obfuscate启动 JS 混淆/openapi/v1/cache/js-obfuscate/status混淆进度/openapi/v1/cache/config
更新缓存配置
curl -k -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"enabled": true, "ttl": 3600}' "$WAF/openapi/v1/cache/config"POST /cache/files Body: {"file": "/path"}/cache/clear 全站 → {"message":"全部缓存已清空"};按站点 → {"message":"该站点缓存已清空","host":"..."}POST /cache/js-obfuscate Body: {"host":"example.com"} → {"message":"JS混淆任务已启动","task_id":"..."}GET /cache/js-obfuscate/status?host=... 返回进度百分比/openapi/v1/rule/blockRuleId已禁用规则 ID/openapi/v1/rules/reload热重载 WAF 规则/openapi/v1/rules/status批量更新规则状态/openapi/v1/rule/blockRuleId→{"id": [], "rules": []}/openapi/v1/rules/reload→{"message": "规则重新加载成功", "preserved_status": 609}/openapi/v1/rules/status→{"message": "规则状态更新成功"}/openapi/v1/monitor/systemCPU / 内存 / 负载/openapi/v1/monitor/connections连接数/openapi/v1/monitor/history历史监控/openapi/v1/traffic/trend流量趋势/openapi/v1/statsWAF 全局统计/openapi/v1/monitor/system
系统指标
/openapi/v1/stats
WAF 全局统计
/openapi/v1/obs/config观察室配置/openapi/v1/obs/config更新配置/openapi/v1/obs/rules观察规则/openapi/v1/obs/rules添加规则/openapi/v1/obs/rules/:id更新规则/openapi/v1/obs/rules/:id删除规则/openapi/v1/obs/records观察记录/openapi/v1/obs/records/:id记录详情/openapi/v1/obs/records/:id/raw原始请求/响应/openapi/v1/obs/records/clear清空记录/openapi/v1/obs/stats观察统计{"error":"此功能需要 Pro 授权","pro_required":true}{"message":"…成功"}/openapi/v1/plugins已安装插件/openapi/v1/plugins/config插件配置/openapi/v1/plugins/config更新配置/openapi/v1/plugins/reload重载插件/openapi/v1/plugins/:name/toggle启停插件/openapi/v1/plugins/:name/order调整顺序/openapi/v1/plugins/:name/sites站点作用域/openapi/v1/plugins/:name删除插件/openapi/v1/plugins/upload上传 zip/openapi/v1/plugins/import-urlURL 导入/openapi/v1/plugins/marketplace插件市场/openapi/v1/plugins/events/recent最近事件/openapi/v1/plugins/events/stats事件统计/openapi/v1/plugins/events/ws事件 WebSocket/openapi/v1/plugins/events/clear清空事件curl -k -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"enabled": false}' "$WAF/openapi/v1/plugins/ai-shield-1.0.0/toggle"toggle → {"message":"插件 ai-shield-1.0.0 已禁用"}reload → {"message":"插件配置重新加载成功"}PUT /plugins/:name/sites Body: {"sites":[1,2]}(空数组 = 全局生效)/upload 表单字段 file(zip);/import-url Body: {"url":"https://..."}/events/ws 为 WebSocket 长连接(AES-GCM 加密帧),不建议脚本调用/openapi/v1/cert-templates模板列表/openapi/v1/cert-template添加模板/openapi/v1/cert-template/:id模板详情/openapi/v1/cert-template/:id更新模板/openapi/v1/cert-template/:id删除模板/openapi/v1/cert/upload上传证书到库/openapi/v1/cert/reload热重载证书POST /cert/upload:multipart/form-data,字段 cert_file、key_file、可选 name;自动识别 RSA/ECDSA/SM2POST /cert/reload → {"message":"证书重新加载成功"}(将证书库全部加载到 TLS 引擎)/openapi/v1/waf/http3HTTP/3 状态/openapi/v1/waf/http3开启/关闭 HTTP/3/openapi/v1/waf/tls-versionsTLS 版本/openapi/v1/waf/tls-versions更新 TLS 版本/openapi/v1/waf/cc-challenge/generate生成 CC 挑战/openapi/v1/waf/cc-challenge/verify验证 CC 挑战/openapi/v1/waf/language面板语言(公开)curl -k -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"enabled": true}' "$WAF/openapi/v1/waf/http3"/openapi/v1/waf/http3→{"enabled": true}/openapi/v1/waf/http3→{"success": true, "enabled": true, "message": "HTTP/3 已开启(UDP :443)"}/openapi/v1/waf/tls-versions{"versions": ["1.2","1.3"]}/openapi/v1/settings查询设置/openapi/v1/settings更新设置/openapi/v1/settings→{"settings": {"base64_depth": 2, "url_depth": 2, "unicode_depth": 2, "rule_match_rate": 100}}/openapi/v1/settings→{"message": "系统设置更新成功"}/openapi/v1/feedbacks反馈列表(分页)/openapi/v1/feedbacks/:id/status更新状态/openapi/v1/feedbacks删除反馈/openapi/v1/letsencrypt/alerts到期提醒/openapi/v1/letsencrypt/list待处理订单/openapi/v1/letsencrypt/status/:id订单状态/openapi/v1/letsencrypt/check-dns/:id检查 DNS/openapi/v1/letsencrypt/order创建订单/openapi/v1/letsencrypt/save保存证书/openapi/v1/letsencrypt/renew-order续期/openapi/v1/letsencrypt/cancel/:id取消订单/openapi/v1/letsencrypt/dismiss-alert/:id忽略提醒curl -k -H "Authorization: Bearer $KEY" "$WAF/openapi/v1/letsencrypt/alerts"与 8.8 系统监控、8.4 站点管理 · 健康检查 共用以下端点:
/openapi/v1/statsWAF 全局统计/openapi/v1/health全部站点健康/openapi/v1/health/:id单站点健康/openapi/v1/realtime/ws实时数据 WebSocket用于面板健康探测、配置初始化、验证码等;也可用于监控脚本,不需要 Authorization 头。
/openapi/v1/ping健康探测 → pong/openapi/v1/config面板公共配置/openapi/v1/maintenance-server-status维护服务器状态/openapi/v1/maintenance-server维护服务器地址/openapi/v1/captcha/challenge滑块验证码 challenge/openapi/v1/captcha/verify提交滑块验证/openapi/v1/qrcode二维码图片(data URI)curl -k "https://127.0.0.1:8088/openapi/v1/ping"
# → "pong"POST /captcha/verify Body: {"challenge_id":"...","user_ratio":0.5,"trail":[...],"duration_ms":N}以下接口永远不对外暴露,即使使用 *:write 也会返回 endpoint_not_exposed (403):
| 前缀 | 原因 |
|---|---|
/openapi/v1/update/* | 升级 / 重启 / 回滚,高危操作 |
/openapi/v1/panel/* | 面板配置(端口、TLS、密码),高危操作 |
/openapi/v1/license/* | License 激活 / 迁移 |
/openapi/v1/order* | 订单相关(order-config / order-list 等) |
/openapi/v1/internal/* | 内部接口 |
/openapi/v1/openapi/* | 禁止用 API Key 管理 API Key 自身(防提权) |
pro_required (403)last_used_at 字段每 30 秒持久化一次,用于判断 Key 活跃度文档基于 FOXWAF 当前版本生成,接口行为以实际部署版本为准。