白名单配置
概述
MBS 使用 Callback URL 白名单机制控制哪些地址可以作为消息订阅的推送目标。创建订阅时,MBS 会从 Callback URL 中提取主机名或 IP,与白名单进行匹配。如果不在白名单中,订阅请求会被拒绝。
caution
白名单为空时,所有订阅请求都会被拒绝。使用 Subscribe Action 前,请确保管理员已正确配置白名单。
白名单类型
| 类型 | 格式 | 说明 | 示例 |
|---|---|---|---|
| 精确 IP | 纯 IP 地址 | 精确匹配 Callback URL 解析后的 IP | 10.0.0.1 |
| CIDR | IP/掩码 | 匹配指定网段内的所有 IP | 172.16.0.0/16 |
| 主机名 | 纯主机名 | 精确匹配 Callback URL 中的主机名 | api.example.com |
主机名格式要求
danger
主机名格式必须严格遵守以下规则,否则匹配会失败:
| 正确格式 | 错误格式 | 说明 |
|---|---|---|
api.example.com | https://api.example.com | 不要带协议前缀 |
api.example.com | api.example.com:8080 | 不要带端口 |
api.example.com | api.example.com/callback | 不要带路径 |
my-service.prod.internal | http://my-service.prod.internal/webhook | 纯主机名即可 |
匹配流程
MBS 在收到订阅请求时,会按以下流程校验 Callback URL:
从 Callback URL 提取主机名部分
例: https://api.example.com:8080/webhook → api.example.com
│
▼
主机名是 IP 地址?
│
┌───┴───┐
是 否
│ │
▼ ▼
直接匹配 先尝试精确匹配
IP/CIDR HOSTNAME 白名单
白名单 │
│ 匹配成功?
│ ┌───┴───┐
│ 是 否
│ │ │
│ ▼ ▼
│ 通过 DNS 解析为 IP
│ 再匹配 IP/CIDR
│ │
└──────────────┘
│
▼
匹配成功 → 允许创建订阅
匹配失败 → 拒绝请求
配置方式
通过管理后台配置
- 登录 MBS 管理后台(
http://mbs-host:8080/mbs/ui/) - 进入 "白名单配置" 页面
- 添加白名单条目(选择类型,填写值)
- 保存
通过管理 API 配置
curl -X PUT http://localhost:8080/mbs/api/admin/whitelist \
-H "Content-Type: application/json" \
-b cookies.txt \
-d '[
{"entryType": "CIDR", "value": "10.0.0.0/8"},
{"entryType": "CIDR", "value": "172.16.0.0/12"},
{"entryType": "HOSTNAME", "value": "my-service.prod.internal"},
{"entryType": "IP", "value": "192.168.1.100"}
]'
条目字段:
| 字段 | 说明 | 可选值 |
|---|---|---|
entryType | 白名单类型 | IP、CIDR、HOSTNAME |
value | 白名单值 | 对应类型的格式 |
常见配置场景
内网服务(固定 IP)
[
{"entryType": "IP", "value": "10.0.1.50"},
{"entryType": "IP", "value": "10.0.1.51"}
]
内网服务(网段)
[
{"entryType": "CIDR", "value": "10.0.0.0/8"},
{"entryType": "CIDR", "value": "172.16.0.0/12"}
]
K8s 集群内部服务
[
{"entryType": "CIDR", "value": "172.31.0.0/16"},
{"entryType": "HOSTNAME", "value": "order-service.default.svc.cluster.local"},
{"entryType": "HOSTNAME", "value": "notify-service.prod.svc.cluster.local"}
]
外部域名
[
{"entryType": "HOSTNAME", "value": "api.partner-company.com"},
{"entryType": "HOSTNAME", "value": "webhook.third-party.io"}
]
多实例同步
修改白名单后,通过 PostgreSQL 的 NOTIFY 机制实时同步到所有 MBS 实例。通常无需手动干预,变更会在几秒内生效。
常见问题
Q: 配置了主机名白名单但订阅还是报错?
排查步骤:
- 确认主机名是纯域名格式(不带
https://、端口、路径) - 确认拼写完全一致(大小写敏感)
- 如果还不行,可能是白名单缓存未刷新,等待 NOTIFY 同步或重启服务
Q: 使用 K8s 内部域名时如何配置?
两种方式(推荐同时使用):
- 添加 CIDR 类型覆盖 Pod 网段(如
172.31.0.0/16) - 添加 HOSTNAME 类型填写 K8s Service 完整域名(如
my-service.default.svc.cluster.local)
Q: Callback URL 中有端口号怎么办?
白名单只匹配主机名部分,端口会被忽略。例如 Callback URL 为 http://10.0.1.50:3000/webhook,白名单中只需添加 IP 10.0.1.50。
Q: 如何允许所有地址?
不建议这样做。如果确实需要(如测试环境),可以添加 0.0.0.0/0 的 CIDR 条目,但生产环境务必配置精确的白名单。