|
Some checks failed
Test mosdns / build (push) Has been cancelled
1. 连接管理优化 mikrotik_addresslist_impl.go:132
- 添加连接状态管理和重连锁机制
- 改进重连逻辑,防止并发重连
2. 缓存机制增强 mikrotik_addresslist_impl.go:162-202
- 优化缓存锁使用,避免死锁
- 添加缓存大小限制和LRU驱逐策略
- 定期清理过期缓存项
3. 智能重试机制 mikrotik_addresslist_impl.go:420
- 指数退避算法
- 更智能的连接错误识别
- 改进的错误处理
4. 动态并发控制 mikrotik_addresslist_impl.go:589
- 根据地址数量动态调整工作池大小
- 批量处理优化
5. 性能监控改进
- 更详细的日志记录
- 缓存统计信息
- 处理过程可观察性
|
||
|---|---|---|
| .. | ||
| mikrotik_addresslist_impl.go | ||
| mikrotik_addresslist.go | ||
| README.md | ||
MikroTik Address List 插件
这个插件用于将 DNS 解析得到的 IP 地址自动添加到 MikroTik 路由器的 address list 中。
功能特性
- 支持 IPv4 和 IPv6 地址
- 自动创建网络前缀(CIDR 格式)
- 支持地址超时设置
- 支持添加注释
- 避免重复添加相同地址
- 支持 TLS 连接
- 可配置连接超时
依赖
需要添加以下依赖到 go.mod:
require (
github.com/go-routeros/routeros/v3 v3.0.0
)
配置方式
1. 快速配置格式
host:port:username:password:use_tls:timeout:address_list4:address_list6:mask4:mask6:comment:timeout_addr
参数说明:
host: MikroTik 路由器 IP 地址port: API 端口(默认 8728)username: 用户名password: 密码use_tls: 是否使用 TLS(true/false)timeout: 连接超时时间(秒)address_list4: IPv4 address list 名称address_list6: IPv6 address list 名称mask4: IPv4 掩码(默认 24)mask6: IPv6 掩码(默认 32)comment: 地址注释timeout_addr: 地址超时时间(秒,0 表示永久)
示例:
192.168.1.1:8728:admin:password:false:10:my_list4:my_list6:24:32:from_dns:3600
2. YAML 配置格式
- exec: mikrotik_addresslist
args:
host: "192.168.1.1"
port: 8728
username: "admin"
password: "password"
use_tls: false
timeout: 10
address_list4: "my_list4"
address_list6: "my_list6"
mask4: 24
mask6: 32
comment: "from_dns"
timeout_addr: 3600
使用示例
1. 在 mosdns 配置中使用
plugins:
- tag: sequence
type: sequence
args:
- exec: forward
args:
upstream:
- addr: "8.8.8.8:53"
- exec: mikrotik_addresslist
args: "192.168.1.1:8728:admin:password:false:10:blocked_ips:blocked_ips6:24:32:blocked:86400"
servers:
- exec: sequence
args:
- sequence
2. 在 MikroTik 中创建 address list
在 MikroTik 路由器上,需要先创建 address list:
/ip firewall address-list add list=blocked_ips
/ip firewall address-list add list=blocked_ips6
3. 在防火墙规则中使用
/ip firewall filter add chain=forward src-address-list=blocked_ips action=drop
/ip firewall filter add chain=forward src-address-list=blocked_ips6 action=drop
工作原理
- DNS 查询处理:当 mosdns 收到 DNS 查询并返回响应时,插件被触发
- IP 提取:从 DNS 响应的 A 记录(IPv4)和 AAAA 记录(IPv6)中提取 IP 地址
- 网络前缀创建:根据配置的掩码创建 CIDR 格式的网络前缀
- 重复检查:检查地址列表中是否已存在该地址
- 地址添加:通过 MikroTik API 将地址添加到指定的 address list 中
安全注意事项
- API 访问权限:确保用于连接的 MikroTik 用户具有足够的权限来管理 address list
- 网络安全:建议使用 TLS 连接以提高安全性
- 密码安全:不要在配置文件中使用明文密码,考虑使用环境变量或加密配置
- 网络隔离:限制对 MikroTik API 端口的访问
故障排除
常见错误
-
连接失败:
- 检查 MikroTik IP 地址和端口是否正确
- 确认网络连接正常
- 检查防火墙设置
-
认证失败:
- 验证用户名和密码是否正确
- 确认用户具有管理 address list 的权限
-
权限不足:
- 确保用户具有
/ip/firewall/address-list/的读写权限
- 确保用户具有
调试
启用 mosdns 的调试日志来查看插件的执行情况:
log:
level: debug
测试
运行测试(需要设置环境变量):
# 运行基本测试
export TEST_MIKROTIK=1
go test ./plugin/executable/mikrotik_addresslist/
# 运行 RouterOS v3 API 测试(需要真实的 MikroTik 设备)
export TEST_ROUTEROS_V3=1
go test ./plugin/executable/mikrotik_addresslist/ -v -run TestRouterOSv3API