mosdns/plugin/executable/mikrotik_addresslist/README.md

205 lines
6.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`: 是否使用 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 配置格式
```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 配置中使用
```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
```