# MikroTik Address List 插件 这个插件用于将 DNS 解析得到的 IP 地址自动添加到 MikroTik 路由器的 address list 中。 ## 🚀 最新优化内容 ### ✅ 解决多IP地址写入问题 之前版本只能写入DNS响应中的第一个IP地址,现在已完全支持写入所有IP地址。 **示例**:像 `www.youtube.com` 这样的域名返回16个IP地址,现在全部都会被写入到MikroTik地址列表中。 ### 🔧 主要改进 1. **多IP地址支持**:默认写入DNS响应中的所有IP地址 2. **精确IP写入**:默认使用 `/32` (IPv4) 和 `/128` (IPv6) 掩码,确保每个IP单独添加 3. **IPv6完整支持**:新增完整的IPv6地址处理 4. **数量限制**:可通过 `max_ips` 限制每个域名写入的IP数量 5. **向后兼容**:通过 `add_all_ips: false` 保持旧行为 ## 功能特性 - ✅ **支持所有IP地址写入**(新增) - ✅ **IPv4 和 IPv6 完整支持**(增强) - ✅ **精确IP地址控制**(优化) - ✅ **数量限制**(新增) - 自动创建网络前缀(CIDR 格式) - 支持地址超时设置 - 支持添加注释 - 避免重复添加相同地址 - 支持 TLS 连接 - 可配置连接超时 ## 依赖 需要添加以下依赖到 `go.mod`: ```go 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 配置格式 ```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 配置中使用 ```yaml 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 ``` ## 工作原理 1. **DNS 查询处理**:当 mosdns 收到 DNS 查询并返回响应时,插件被触发 2. **所有IP提取**:从 DNS 响应的所有 A 记录(IPv4)和 AAAA 记录(IPv6)中提取所有IP地址 3. **数量限制**:根据 `max_ips` 配置限制处理的IP数量(可选) 4. **网络前缀创建**:根据配置的掩码创建 CIDR 格式的网络前缀 - 默认 `/32` (IPv4) 和 `/128` (IPv6) 确保每个IP单独添加 - 可配置为网段掩码(如 `/24`)将多个IP合并到同一网段 5. **缓存检查**:检查内存缓存中是否已存在该地址,避免重复操作 6. **异步批量添加**:通过 MikroTik API 异步并发将所有地址添加到指定的 address list 中 7. **验证**:如果启用验证,会在后台验证地址是否成功添加(可选) ### 🔄 批量处理优势 - **并发处理**:多个IP地址同时处理,显著提升性能 - **异步操作**:不阻塞DNS响应,保证查询速度 - **智能分批**:自动将大量IP分批处理,避免资源耗尽 - **错误恢复**:单个IP添加失败不影响其他IP的处理 ## 安全注意事项 1. **API 访问权限**:确保用于连接的 MikroTik 用户具有足够的权限来管理 address list 2. **网络安全**:建议使用 TLS 连接以提高安全性 3. **密码安全**:不要在配置文件中使用明文密码,考虑使用环境变量或加密配置 4. **网络隔离**:限制对 MikroTik API 端口的访问 ## 故障排除 ### 常见错误 1. **连接失败**: - 检查 MikroTik IP 地址和端口是否正确 - 确认网络连接正常 - 检查防火墙设置 2. **认证失败**: - 验证用户名和密码是否正确 - 确认用户具有管理 address list 的权限 3. **权限不足**: - 确保用户具有 `/ip/firewall/address-list/` 的读写权限 ### 调试 启用 mosdns 的调试日志来查看插件的执行情况: ```yaml log: level: debug ``` ## 测试 运行测试(需要设置环境变量): ```bash # 运行基本测试 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 ```