RouterOS 地址列表同步
需求
有一游戏工作室,有若干台RouterOS设备,这些设备需要进行一个地址列表同步的需求--以其中一台设备为主,其它设备定期去主RouterOS设备取地址列表更新即可。
提示:地址条目以增量为主。
RouterOS 地址列表导出导入
实现思路:主路由上定期将地址列表以文件导出,从路由通过FTP服务定期下载主路由导出的地址列表到本地,再导入到本机
前置条件
- 主路由开启FTP服务(配置好ACL)
- 主路由创建一个FTP专用账号
- 主从路由的时间为一致,建议配置NTP服务
开启FTP服务
/ip service set ftp disabled=no address=xx.xx.xx.xx
创建同步账号
# 账号一个FTP账号组
/user group add name=ftpGroup policy=ftp
# 创建FTP专用用户
/user add name=fetch_address_list password=Ll4zFau76usj group=ftpGroup
地址导出
# 定义地址列表
:local lists {"demo-list"}
# 导出的地址列表文件名称
:local exportFile ExportAddressList
# 删除存在的地址列表文件
/file remove [:file find name=$exportFile]
# 定义IP地址
:local ipAddress
# 定义列表名称
:local listEntry
# 定义文件内容
:local fileContents
:set fileContents "/ip firewall address-list\n"
:foreach listName in=$lists do={
:foreach listEntry in=[/ip firewall address-list find where list=$listName] do={
:set ipAddress [/ip firewall address-list get $listEntry address]
:log info "=$listName"
:set fileContents "$fileContents :do {add list=$listName address=$ipAddress} on-error={} \n"
}
}
/file print file=$exportFile
/file set $exportFile contents=$fileContents
地址导入
# 路由导入的文件名称,注意需要与导出文件名称一致
:local importFile ExportAddressList.txt
# 主路由IP地址
:local primaryROS 1.2.3.4
# 定义FTP用户名与密码
:local ftpUser fetch_address_list
:local ftpPassword Ll4zFauWdusj
/tool fetch address=$primaryROS src-path=$importFile dst-path=$importFile mode=ftp user=$ftpUser password=$ftpPassword
:local fileContent [/file get [/file find name=$importFile] contents]
#导入新路由
/import file-name=ExportAddressList.txt
常见问题
问题1: 动态IP地址列表无法正常导出
解决:使用循环进行组合再拼接。
问题2:使用import无法导入存在的地址表
解决方案1:加入忽略参数,如下:
/import file-name=ExportAddressList.txt verbose=yes fro
m-line=100
from-line 行数不确定,放弃。
解决方案2:使用do,导出之前每条地址列表中加入 :do
:
/ip firewall address-list
:do {add list=demo-list address=54.223.72.132} on-error={}
:do {add list=demo-list address=104.16.248.249} on-error={}
...
方法虽然笨拙,然可以接受,采之。
解决方案3:导入之前删除存在的,目测可靠,然如果条目数过多,每个IP地址都需要匹配。速度慢。