205 lines
6.3 KiB
Markdown
205 lines
6.3 KiB
Markdown
# 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
|
||
``` |