
大家好 本文适用于那些在公园中拥有许多Mikrotik设备并且希望最大程度地统一以便不分别连接每个设备的用户。 在本文中,我将描述一个不幸的项目,该项目由于人为因素未能达到战斗条件。 简而言之:超过200台路由器,快速配置和人员培训,按区域统一,过滤网络和特定主机,轻松向所有设备添加规则,日志记录和访问控制的能力。
下面描述的内容并不能算是完整的案例,但是希望对您的网络规划和最小化错误有帮助。 也许有些观点和决定对您来说不合适-如果是这样,请在评论中写下。 在这种情况下,批评将是普通存钱罐中的一种经验。 因此,请读者看一下评论,也许作者犯了一个严重的错误-社区会有所帮助。
路由器的数量为200-300,分布在不同城市的Internet连接质量不同。 有必要将所有事情做得漂亮,并随时向本地管理员说明一切如何工作。
因此,任何项目从哪里开始。 当然,使用
TK 。
- 根据客户要求为所有分支机构组织网络计划,进行网络分段(分支机构中从3到20个网络,具体取决于设备的数量)。
- 在每个分支中配置设备。 在不同的工作条件下检查提供商的实际带宽。
- 组织设备保护,白名单管理,在一定时间范围内通过自动将其列入黑名单来自动检测攻击,并尽量减少使用各种技术来拦截控制访问和拒绝服务。
- 根据客户要求,通过网络过滤来组织安全的VPN连接。 每个分支到中心至少3个VPN连接。
- 根据第1、2段。选择构建容错VPN的最佳方法。 如果承包商正确选择了动态路由技术,则可以选择。
- 根据客户使用的协议,端口,主机和其他特定服务来组织流量优先级。 (VOIP,提供重要服务的主机)
- 组织监视和记录路由器事件,以响应技术支持人员。
据我们了解,在许多情况下,传统知识是根据需求编制的。 在听完主要问题后,我自己制定了这些要求。 我承认其他人可能会执行这些要点。
将使用哪些工具来满足这些要求:
- ELK堆栈(一段时间后,人们了解到将使用fluentd代替logstash)。
- 太好了 为了简化管理和共享访问权限,我们将使用AWX。
- GITLAB。 无需解释。 没有配置的版本控制的地方。
- 威力 初始配置将有一个简单的脚本。
- Doku Wiki,用于编写文档和手册。 在这种情况下,请使用habr.com。
- 监视将通过zabbix完成。 将在此处绘制连接图以进行一般理解。
EFK设置时刻
在第一段中,我将仅描述构建索引所依据的意识形态。 有很多
关于从运行mikrotik的设备设置和接收日志的优秀文章。
我将在以下几点上做详细说明:
1.根据该方案,值得考虑从不同地方和不同端口接收日志。 为此,我们将使用日志聚合器。 此外,我们还希望为所有路由器制定通用时间表,以实现共享访问。 然后我们按如下方式构建索引:
这是流利的配置类型Elasticsearch
logstash_format为true
index_name mikrotiklogs.north
logstash_prefix mikrotiklogs.north
flush_interval 10秒
主持人
elasticsearch :9200
9200端口
因此,我们可以根据计划mikrotiklogs.west,mikrotiklogs.south,mikrotiklogs.east组合路由器和分段。 为什么使这个复杂化? 我们知道我们将拥有200台或更多的设备。 不要跟踪所有内容。 从Elasticsearch 6.8版开始,我们可以访问安全设置(无需购买许可证),因此我们可以在技术支持人员或本地系统管理员之间分配查看权限。
表格,图表-在这里您只需要同意-可以使用相同的表格,也可以各自使用适合自己的表格。
2.通过记录。 如果启用防火墙规则中的登录,那么我们将使用不带空格的名称。 可以看出,使用流利的简单配置,我们可以过滤数据并制作方便的面板。 在下面的图片中,我的家用路由器。

3.根据占用的地方和日志。 平均而言,每小时每小时有1000条消息,日志每天占用2-3 mb,这并不算多。 Elasticsearch 7.5版。
ANSI.AWX
对我们来说幸运的是,我们有一个现成的用于路由器的模块
我指出了AWX,但以下命令仅是最纯形式的ansible-我认为对于使用ansible的用户来说,使用gui awx不会有任何问题。
老实说,我承认在看过其他使用ssh的指南之前,每个人在响应时间和其他问题上都有不同的问题。 我再说一遍,它并没有进入战斗,将这些信息作为一次实验,并没有超出20台路由器的范围。
我们需要使用证书或会计。 由您决定,我需要证书。 关于权利的一些微妙之处。 我具有写权限-至少无法完成“重置配置”。
生成,复制证书和导入应该没有问题:
队伍短名单在您的电脑上
ssh-keygen -t RSA,回答问题,保存密钥。
复制到mikrotik:
用户ssh-keys导入public-key-file = id_mtx.pub user = ansible
首先,您需要创建一个帐户并为其分配权限。
通过证书检查连接
ssh -p 49475 -i /键/ mtx ansible@192.168.0.120
我们写vi / etc / ansible /主机
MT01 ansible_network_os =路由器oss ansible_ssh_port = 49475 ansible_ssh_user = ansible
MT02 ansible_network_os =路由器oss ansible_ssh_port = 49475 ansible_ssh_user = ansible
MT03 ansible_network_os =路由器oss ansible_ssh_port = 49475 ansible_ssh_user = ansible
MT04 ansible_network_os =路由器oss ansible_ssh_port = 49475 ansible_ssh_user = ansible
好吧,一个剧本的例子:-名称:add_work_sites
主持人:testmt
序列号:1
连接:network_cli
remote_user:mikrotik.west
collect_facts:是
任务:
-名称:添加Work_sites
routeros_command:
命令:
-/ ip防火墙地址列表添加地址= gov.ru列表= work_sites注释= Ticket665436_Ochen_nado
-/ ip防火墙地址列表添加地址= habr.com列表= work_sites注释= for_habr
从上面的配置可以看到,编译您的剧本非常容易。 掌握cli mikrotik就足够了。 设想一种情况,在所有路由器上,您都需要删除包含某些数据的地址列表,然后:
查找和删除/ ip firewal地址列表删除[查找列表=“ gov.ru”]
我故意没有在此处插入防火墙的整个清单。 每个项目都将是单独的。 但是可以肯定的是,仅使用地址列表。
通过GITLAB,一切都清楚了。 我不会在这一刻详述。 对于单独的任务,模板,处理程序,一切都很漂亮。
动力壳
将有3个文件。 为什么使用powershell? 任何人都可以选择生成配置的工具。 在这种情况下,每个人的PC上都有窗口,所以为什么在Powershell更方便的情况下在bash上执行此操作。 给谁比较方便。
脚本本身(简单明了):[cmdletBinding()]
参数(
[参数(必填= $ true)]
[string] $ EXTERNALIPADDRESS,
[参数(必填= $ true)]
[string] $ EXTERNALIPROUTE,
[参数(必填= $ true)]
[string] $ BWorknets,
[参数(必填= $ true)]
[string] $ CWorknets,
[参数(必填= $ true)]
[string] $ BVoipNets,
[参数(必填= $ true)]
[string] $ CVoipNets,
[参数(必填= $ true)]
[string] $ CClientss,
[参数(必填= $ true)]
[string] $ BVPNWORKs,
[参数(必填= $ true)]
[string] $ CVPNWORKs,
[参数(必填= $ true)]
[string] $ BVPNCLIENTSs,
[参数(必填= $ true)]
[string] $ cVPNCLIENTSs,
[参数(必填= $ true)]
[string] $ NAMEROUTER,
[参数(必填= $ true)]
[string] $ ServerCertificates,
[参数(必填= $ true)]
[string] $ infile,
[参数(必填= $ true)]
[string] $ outfile
)
获取内容$ infile | Foreach对象{$ _。替换(“ EXTERNIP”,$ EXTERNALIPADDRESS)} |
Foreach对象{$ _。替换(“ EXTROUTE”,$ EXTERNALIPROUTE)} |
Foreach对象{$ _。替换(“ BWorknet”,$ BWorknets)} |
Foreach对象{$ _。替换(“ CWorknet”,$ CWorknets)} |
Foreach对象{$ _。替换(“ BVoipNet”,$ BVoipNets)} |
Foreach对象{$ _。替换(“ CVoipNet”,$ CVoipNets)} |
Foreach对象{$ _。替换(“ CClients”,$ CClientss)} |
Foreach对象{$ _。替换(“ BVPNWORK”,$ BVPNWORKs)} |
Foreach对象{$ _。替换(“ CVPNWORK”,$ CVPNWORKs)} |
Foreach对象{$ _。Replace(“ BVPNCLIENTS”,$ BVPNCLIENTSs)} |
Foreach对象{$ _。替换(“ CVPNCLIENTS”,$ cVPNCLIENTSs)} |
Foreach对象{$ _。Replace(“ MYNAMERROUTER”,$ NAMEROUTER)} |
Foreach对象{$ _。替换(“ ServerCertificate”,$ ServerCertificates)} | 设置内容$ outfile
请原谅我,我不能列出所有规则,因为 它不会很漂亮。 您可以在最佳实践的指导下自己制定规则。
变量符号:以以下网络为例:
192.168.0.0/24工作网络
172.22.4.0/24 VOIP网络
10.0.0.0/24网络(无局域网访问)
大型分支机构的192.168.255.0/24 VPN网络
172.19.255.0/24小型VPN网络
网络地址由4个十进制数字组成,分别为ABCD,替换按照相同的原理工作,如果启动时要求输入B,则需要为网络192.168.0.0/24输入一个数字0,对于C = 0。
$ EXTERNALIPADDRESS-提供者的专用地址。
$ EXTERNALIPROUTE-到网络的默认路由是0.0.0.0/0
$ BWorknets-工作网络,在我们的示例中将为168
$ CWorknets-工作网络,在我们的示例中为0
$ BVoipNets-这里的示例中的VOIP网络22
$ CVoipNets-这里的示例中的VOIP网络4
$ CClientss-客户网络-仅Internet访问,此处为0
$ BVPNWORKs-大型分支机构的VPN网络,在我们的示例20中
$ CVPNWORKs-大型分支机构的VPN网络,在我们的示例中为255
$ BVPNCLIENTS-小型分支机构的VPN网络,然后是19
$ CVPNCLIENTS-小型分支机构的VPN网络,表示255
$ NAMEROUTER-路由器的名称
$ ServerCertificate-您预先导入的证书名称
$ infile-指定从中读取配置文件的路径,例如D:\ config.txt(英文路径最好不要带引号和空格)
$ outfile-指示保存路径,例如D:\ MT-test.txt
出于明显的原因,我有意更改了示例中的地址。
我略过了检测攻击和异常行为的要点-这值得一提。 但值得指出的是,在此类别中,您可以将监控数据的值与Zabbix结合使用+通过elasticsearch计算出卷曲数据。
在什么时候您需要关注:- 网络计划。 最好使其立即可读。 足够了。 不幸的是,我经常看到网络是按照以下原则编译的:“出现了一个新分支,这里是/ 24”。 没有人知道应该在给定位置放置多少台设备以及是否会进一步增长。 例如,开了一家小商店,最初很明显该设备将不超过10,为什么分配/ 24? 相反,在大型分支机构中-他们分配/ 24,并且有500台设备-您可以只添加一个网络,但您想立即考虑所有问题。
- 过滤规则。 如果项目假定网络和最大细分之间将存在分离。 最佳做法会随着时间而变化。 以前,他们共享一个PC网络和一个打印机网络,现在不共享这些网络是很正常的。 值得使用常识,不要在不需要它们的地方创建很多子网,也不要将所有设备都连接到一个网络中。
- 所有路由器上的“黄金”设置。 即 如果您已决定一个计划。 值得立即预见所有内容并尝试确保所有设置都相同-只有不同的地址列表和ip地址。 如果出现问题,调试时间将更少。
- 组织问题同技术问题一样重要。 通常,懒惰的员工会“手动”遵循这些建议,而不使用现成的配置和脚本,这最终会导致从头开始的问题。
通过动态路由。 使用带分区的OSPF。 但这是一个试验台,在战斗条件下,进行此类设置更有趣。
我希望没有人不发布路由器的配置而感到沮丧。 我认为将有足够的链接,然后一切都取决于需求。 当然,测试还需要更多测试。
我希望每个人都能在新的一年中实施他们的项目。 是的,授予访问权限将伴随您!!!