3 min read

RouterOS 地址列表同步

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地址都需要匹配。速度慢。