mosdns/plugin/executable/mikrotik_addresslist
2025-09-15 17:23:43 +08:00
..
example-config.yaml 删除 mosdns 二进制文件,并增强 README 文件,添加详细的项目概述和使用说明。为 MikroTik 地址列表插件引入新的示例配置,支持多个 IP 地址条目,并改进了默认设置,以提高可用性。 2025-08-22 09:14:12 +08:00
mikrotik_addresslist_impl.go 删除 mosdns 二进制文件,并增强 README 文件,添加详细的项目概述和使用说明。为 MikroTik 地址列表插件引入新的示例配置,支持多个 IP 地址条目,并改进了默认设置,以提高可用性。 2025-08-22 09:14:12 +08:00
mikrotik_addresslist_optimized.go 新增内存缓存优化版和性能优化版的DNS插件配置,移除验证功能,支持启动时加载现有IP到内存,优化IP存在性检查,使用/24网段掩码以减少条目数量。更新了相关文档以指导实施优化。 2025-09-15 17:23:43 +08:00
mikrotik_addresslist.go 删除 mosdns 二进制文件,并增强 README 文件,添加详细的项目概述和使用说明。为 MikroTik 地址列表插件引入新的示例配置,支持多个 IP 地址条目,并改进了默认设置,以提高可用性。 2025-08-22 09:14:12 +08:00
README.md 删除 mosdns 二进制文件,并增强 README 文件,添加详细的项目概述和使用说明。为 MikroTik 地址列表插件引入新的示例配置,支持多个 IP 地址条目,并改进了默认设置,以提高可用性。 2025-08-22 09:14:12 +08:00

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

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: 是否使用 TLStrue/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表示单个IP24表示网段
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

工作原理

  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 的调试日志来查看插件的执行情况:

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