|
|
||
|---|---|---|
| .. | ||
| example-config.yaml | ||
| mikrotik_addresslist_impl.go | ||
| mikrotik_addresslist.go | ||
| README.md | ||
MikroTik Address List 插件
这个插件用于将 DNS 解析得到的 IP 地址自动添加到 MikroTik 路由器的 address list 中。
🚀 最新优化内容
✅ 解决多IP地址写入问题
之前版本只能写入DNS响应中的第一个IP地址,现在已完全支持写入所有IP地址。
示例:像 www.youtube.com 这样的域名返回16个IP地址,现在全部都会被写入到MikroTik地址列表中。
🔧 主要改进
- 多IP地址支持:默认写入DNS响应中的所有IP地址
- 精确IP写入:默认使用
/32(IPv4) 和/128(IPv6) 掩码,确保每个IP单独添加 - IPv6完整支持:新增完整的IPv6地址处理
- 数量限制:可通过
max_ips限制每个域名写入的IP数量 - 向后兼容:通过
add_all_ips: false保持旧行为
功能特性
- ✅ 支持所有IP地址写入(新增)
- ✅ IPv4 和 IPv6 完整支持(增强)
- ✅ 精确IP地址控制(优化)
- ✅ 数量限制(新增)
- 自动创建网络前缀(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: 32 # 默认32,确保每个IP单独添加
mask6: 128 # 默认128,确保每个IP单独添加
comment: "from_dns"
timeout_addr: 3600
add_all_ips: true # 默认true,添加所有IP地址
max_ips: 0 # 默认0(无限制),可设置最大IP数量
cache_ttl: 3600 # 缓存TTL(秒)
verify_add: false # 是否验证添加结果
3. 新增配置选项说明
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
add_all_ips |
bool | true |
是否添加DNS响应中的所有IP地址 |
max_ips |
int | 0 |
每个域名最多添加的IP数量,0表示无限制 |
mask4 |
int | 32 |
IPv4掩码,32表示单个IP,24表示网段 |
mask6 |
int | 128 |
IPv6掩码,128表示单个IP |
cache_ttl |
int | 3600 |
内存缓存TTL(秒) |
verify_add |
bool | false |
是否在添加后验证地址确实存在 |
使用示例
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地址
- 数量限制:根据
max_ips配置限制处理的IP数量(可选) - 网络前缀创建:根据配置的掩码创建 CIDR 格式的网络前缀
- 默认
/32(IPv4) 和/128(IPv6) 确保每个IP单独添加 - 可配置为网段掩码(如
/24)将多个IP合并到同一网段
- 默认
- 缓存检查:检查内存缓存中是否已存在该地址,避免重复操作
- 异步批量添加:通过 MikroTik API 异步并发将所有地址添加到指定的 address list 中
- 验证:如果启用验证,会在后台验证地址是否成功添加(可选)
🔄 批量处理优势
- 并发处理:多个IP地址同时处理,显著提升性能
- 异步操作:不阻塞DNS响应,保证查询速度
- 智能分批:自动将大量IP分批处理,避免资源耗尽
- 错误恢复:单个IP添加失败不影响其他IP的处理
安全注意事项
- 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