插件扩展指引
- controller(控制器):负责核心业务逻辑的调度和协调,监听 Kubernetes 中 IPBlock 自定义资源的变化,维护和管理其生命周期。
- engine(封禁后端):负责封禁命令的实际执行。
- notify(通知机制):负责将封禁、解封等事件以多种方式通知给运维人员或其他系统。
- trigger(触发器):事件触发中心,负责监听外部告警系统或业务事件(如 Grafana Alert等),并根据 Alert 策略触发相关封禁操作,自动创建 IPBlock CR,且支持自动解封。
- policy(封禁策略):定义 IP 封禁的判定规则和执行策略。
engine
介绍
封禁后端均被抽象为API,IPBlock-Operator-Plus通过调用API来实现实际的封禁行为。
目前通过engine/control.py来实现API,接口列表如下:
| 接口 | 方法 | 说明 |
|---|---|---|
| /limit | GET | iptables限流接口 |
| /unlimit | GET | iptables解限流接口 |
| /limits | GET | iptables查看当前限流情况 |
| /update | XDP封禁端口 | |
| /remove | XDP解封禁端口 | |
| /ban | GET | (弃用)可从nginx日志查,返回超过一定次数的IP |
| /execute | GET | (弃用)接收IP,对其执行XDP封禁 |
engine支持列表:
iptables:依赖于Linux工具iptables。
规则为 IP 每分钟最多发起10个新连接(可突发20次),否则DROP
iptables -A INPUT -s <IP> -p tcp --dport <TARGET_PORT> \
-m state --state NEW \
-m hashlimit --hashlimit 10/min --hashlimit-burst 20 \
--hashlimit-mode srcip --hashlimit-name limit_<IP_REPLACED> \
-j ACCEPT
iptables -A INPUT -s <IP> -p tcp --dport <TARGET_PORT> -j DROP
扩展开发指南
engine定义了接口,新adapter只需要实现这两个方法即可。
type Adapter interface { |
然后在NewAdapter注册对应的adapter
func NewAdapter(name, gatewayHost string) Adapter { |
接着在controller.py中要实现对应的API,最后在configmap中engine字段指定对应的adapter名即可。
notify
介绍
notify支持列表:
- lark:飞书,通过机器人来进行通知
扩展开发指南
notify定义了接口,新notify只需要实现这个接口即可。
// Notifier 是通知发送接口的抽象定义, |
以lark为例,在lark.go中实现两个方法
// NewLarkNotify 创建一个 LarkNotify(飞书通知器)实例。 |
最后在main.go中watchConfigMap中完善loadNotify。
// 以飞书为例 |
trigger
介绍
trigger支持列表:
- grafana:可以 Grafana Alert 联动,通过 Webhook 进行触发。
扩展开发指南
注意新 trigger 在开发时需要考虑并发问题。具体实现可查看 grafana.go 中的处理逻辑,也可参考核心功能模块开发文档中并发处理的逻辑介绍。
trigger同样定义了接口,新trigger只需要实现接口即可。
// Trigger 是封禁事件的触发器接口,Start 启动监听任务,Stop 停止监听任务 |
trigger在manager.go中实现了StartAll和StopAll,会启动在configmap中指定的所有trigger。
triggers: # 触发器,目前仅支持 Grafana |
trigger自定义的配置字段,在main.go中进行配置
// Grafana Trigger 示例 |
policy
policy支持功能列表:
- whitelist:白名单机制
policy实现比较灵活,下面描述白名单机制的实现流程。
在
policy/watchlist.go中实现三个函数// 白名单机制
// 单IP白名单
// CIDR白名单
// 标签匹配
type Whitelist struct {
ipNets []*net.IPNet // IPNet的指针切片,保存CIDR网段
ips []net.IP // 精确IP白名单
}
// 新建白名单
func NewWhitelist(ipList []string) *Whitelist {}
// 判断目标IP是否在白名单中
func (w *Whitelist) IsWhitelisted(ip string) bool {}
// 打印所有白名单内容
func (w *Whitelist) StringSlice() []string {}在
config/loader.go中实现一个LoadWhitelistFromConfigMap,用于加载定义在configmap中的白名单IP。在
main.go的watchConfigMap中来监听白名单的新建和更新情况。
