161 lines
3.9 KiB
Markdown
161 lines
3.9 KiB
Markdown
# MikroTik Address List 插件
|
||
|
||
这个插件用于将 DNS 解析得到的 IP 地址自动添加到 MikroTik 路由器的 address list 中。
|
||
|
||
## 功能特性
|
||
|
||
- 支持 IPv4 和 IPv6 地址
|
||
- 自动创建网络前缀(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: 24
|
||
mask6: 32
|
||
comment: "from_dns"
|
||
timeout_addr: 3600
|
||
```
|
||
|
||
## 使用示例
|
||
|
||
### 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. **网络前缀创建**:根据配置的掩码创建 CIDR 格式的网络前缀
|
||
4. **重复检查**:检查地址列表中是否已存在该地址
|
||
5. **地址添加**:通过 MikroTik API 将地址添加到指定的 address list 中
|
||
|
||
## 安全注意事项
|
||
|
||
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
|
||
``` |