大家好。 本文适用于那些拥有许多 Mikrotik 设备并且希望实现最大程度的统一以避免单独连接到每个设备的用户。 在这篇文章中,我将描述一个不幸的是由于人为因素而未能达到战斗条件的项目。 简而言之:超过 200 个路由器、快速设置和员工培训、按区域统一、过滤网络和特定主机、轻松向所有设备添加规则、日志记录和访问控制的能力。
下面描述的内容并不假装是现成的案例,但我希望它对您规划网络和最大限度地减少错误时有用。 也许有些观点和解决方案对您来说似乎并不完全正确 - 如果是这样,请写在评论中。 这种情况下的批评将成为共同金库的一次经验。 因此,读者,看看评论,也许作者犯了一个严重的错误——社区会有所帮助。
路由器数量为200-300个,分布在不同城市,互联网连接质量不同。 有必要把每件事都做得很漂亮,并向当地管理员清楚地解释一切将如何运作。
那么,任何项目从哪里开始呢? 当然,与 TK.
- 根据客户要求组织所有分支机构的网络规划,网络分段(根据设备数量,分支机构3到20个网络)。
- 在每个分支机构设置设备。 检查提供商在不同运行条件下的真实吞吐速度。
- 组织设备防护、白名单管理、自动检测攻击并在一定时间内自动列入黑名单,最大限度地减少使用各种拦截控制访问和拒绝服务的技术手段。
- 根据客户要求通过网络过滤组织安全 VPN 连接。 从每个分支机构到中心至少有 3 个 VPN 连接。
- 根据第 1、2 点,选择构建容错 VPN 的最佳方法。 如果合理的话,承包商可以选择动态布线技术。
- 按协议、端口、主机和客户使用的其他特定服务组织流量优先级。 (VOIP、提供重要服务的主机)
- 组织监控和记录路由器事件,以便技术支持人员做出响应。
据我们了解,在许多情况下,技术规范是根据要求制定的。 在听取了主要问题后,我自己制定了这些要求。 他承认其他人可以处理这些问题。
将使用哪些工具来满足这些要求:
- ELK 堆栈(一段时间后,很明显将使用 Fluentd 而不是 Logstash)。
- 安西布尔。 为了便于管理和访问共享,我们将使用 AWX。
- GITLAB。 这里无需解释。 如果没有配置的版本控制,我们会在哪里?
- 电源外壳。 将有一个用于初始生成配置的简单脚本。
- Doku wiki,用于编写文档和指南。 在本例中,我们使用 habr.com。
- 通过zabbix进行监控。 此处还将绘制连接图以供总体理解。
EFK 设置点
关于第一点,我仅描述指数构建的意识形态。 有许多
关于从运行 mikrotik 的设备设置和接收日志的优秀文章。
我将详细阐述以下几点:
1. 根据图,值得考虑从不同地方、不同端口接收日志。 为此,我们将使用日志聚合器。 我们还希望为所有具有共享访问能力的路由器制作通用图形。 然后我们构建索引如下:
这是 fluidd 的一部分配置 类型弹性搜索
Logstash_format true
索引名称 mikrotiklogs.north
logstash_prefix mikrotiklogs.north
刷新间隔 10s
为了
9200端口
这样我们就可以根据计划组合路由器和分段 - mikrotiklogs.west、mikrotiklogs.south、mikrotiklogs.east。 为什么要把事情搞得这么复杂呢? 我们知道我们将拥有 200 台或更多设备。 你无法跟踪一切。 使用elasticsearch 6.8版本,我们可以使用安全设置(无需购买许可证),因此我们可以在技术支持员工或本地系统管理员之间分配查看权限。
表格、图表——在这里你只需要同意——要么使用相同的,要么每个人都做他方便的事情。
2. 通过日志记录。 如果我们在防火墙规则中启用登录,那么我们的名称中不包含空格。 可以看出,通过在fluidd中使用简单的配置,我们可以过滤数据并制作方便的面板。 下图是我家的路由器。
3. 按占用空间和日志。 平均而言,每小时 1000 条消息,日志每天占用 2-3 MB,您会发现,这并不算多。 Elasticsearch 版本 7.5。
ANSIBLE.AWX
幸运的是,我们有一个现成的 routeros 模块
我提到了 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 /keys/mtx [电子邮件保护]
注册 vi /etc/ansible/hosts
MT01 ansible_network_os=routeros ansible_ssh_port=49475 ansible_ssh_user= ansible
MT02 ansible_network_os=routeros ansible_ssh_port=49475 ansible_ssh_user= ansible
MT03 ansible_network_os=routeros ansible_ssh_port=49475 ansible_ssh_user= ansible
MT04 ansible_network_os=routeros ansible_ssh_port=49475 ansible_ssh_user= ansible
好吧,一个示例剧本: - 名称:add_work_sites
主办方:testmt
序列号:1
连接:network_cli
远程用户:mikrotik.west
收集事实:是的
任务:
- 名称:添加工作站点
路由器命令:
命令:
— /ip 防火墙地址列表添加地址=gov.ru list=work_sites comment=Ticket665436_Ochen_nado
— /ip 防火墙地址列表添加地址=habr.com 列表=work_sites 注释=for_habr
从上面的配置可以看出,创建自己的 playbook 并不困难。 掌握好 cli mikrotik 就足够了。 假设有一种情况,需要删除所有路由器上包含某些数据的地址列表,那么:
查找并删除/ip 防火墙地址列表删除 [查找列表=“gov.ru”的位置]
我故意没有在此处列出整个防火墙列表,因为...... 每个项目都是单独的。 但我可以肯定地说一件事:仅使用地址列表。
根据 GITLAB 的说法,一切都很清楚。 我不会详述这一点。 对于个人任务、模板、处理程序来说,一切都很漂亮。
PowerShell的
这里会有3个文件。 为什么要使用powershell? 您可以选择任何对您来说更方便的工具来生成配置。 在这种情况下,每个人的 PC 上都有 Windows,那么当 powershell 更方便时为什么要在 bash 中执行呢? 哪一种比较方便呢?
脚本本身(简单易懂):[cmdletBinding()] 参数(
[参数(强制=$true)] [字符串]$EXTERNALIPADDDRESS,
[参数(强制=$true)] [字符串]$EXTERNALIPROUTE,
[参数(强制=$true)] [字符串]$BWorknets,
[参数(强制=$true)] [字符串]$CWorknets,
[参数(强制=$true)] [字符串]$BVoipNets,
[参数(强制=$true)] [字符串]$CVoipNets,
[参数(强制=$true)] [字符串]$CClientss,
[参数(强制=$true)] [字符串]$BVPNWORKs,
[参数(强制=$true)] [字符串]$CVPNWORKs,
[参数(强制=$true)] [字符串]$BVPNCLIENTSs,
[参数(强制=$true)] [字符串]$cVPNCLIENTSs,
[参数(强制=$true)] [字符串]$NAMEROUTER,
[参数(强制=$true)] [字符串]$ServerCertificates,
[参数(强制=$true)] [字符串]$infile,
[参数(强制=$true)] [字符串]$outfile
)
获取内容 $infile | Foreach-Object {$_.Replace("EXTERNIP", $EXTERNALIPADDRESS)} |
Foreach-Object {$_.Replace("EXTROUTE", $EXTERNALIPROUTE)} |
Foreach-Object {$_.Replace("BWorknet", $BWorknets)} |
Foreach-Object {$_.Replace("CWorknet", $CWorknets)} |
Foreach-Object {$_.Replace("BVoipNet", $BVoipNets)} |
Foreach-Object {$_.Replace("CVoipNet", $CVoipNets)} |
Foreach-Object {$_.Replace("CClients", $CClientss)} |
Foreach-Object {$_.Replace("BVPNWORK", $BVPNWORKs)} |
Foreach-Object {$_.Replace("CVPNWORK", $CVPNWORKs)} |
Foreach-Object {$_.Replace("BVPNCLIENTS", $BVPNCLIENTSs)} |
Foreach-Object {$_.Replace("CVPNCLIENTS", $cVPNCLIENTSs)} |
Foreach-Object {$_.Replace("MYNAMERROUTER", $NAMEROUTER)} |
Foreach-Object {$_.Replace("ServerCertificate", $ServerCertificates)} | 设置内容 $outfile
请原谅我,我无法发布所有规则,因为...... 它不会很漂亮。 您可以在最佳实践的指导下自己制定规则。
例如,以下是我关注的链接列表:
变量符号:以下面的网络为例:
192.168.0.0/24工作网络
172.22.4.0/24 网络电话
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 = XNUMX。
$EXTERNALIPADDDRESS - 来自提供商的专用地址。
$EXTERNALIPROUTE - 到网络 0.0.0.0/0 的默认路由
$BWorknets - 工作网络,在我们的示例中将有 168
$CWorknets - 工作网络,在我们的示例中为 0
$BVoipNets - 我们的示例中的 VOIP 网络 22
$CVoipNets - 我们的示例中的 VOIP 网络 4
$CClientss - 客户端网络 - 仅限互联网访问,在我们的例子中为 0
$BVPNWORKs - 大型分支机构的 VPN 网络,在我们的示例中为 20
$CVPNWORKs - 适用于大型分支机构的 VPN 网络,在我们的示例中为 255
$BVPNCLIENTS - 适用于小型分支机构的 VPN 网络,即 19
$CVNCLIENTS - 适用于小型分支机构的 VPN 网络,即 255 个
$NAMEROUTER - 路由器名称
$ServerCertificate - 您之前导入的证书的名称
$infile — 指定我们将从中读取配置的文件的路径,例如 D:config.txt (最好是不带引号和空格的英文路径)
$outfile — 指定保存路径,例如 D:MT-test.txt
出于显而易见的原因,我故意更改了示例中的地址。
我错过了关于检测攻击和异常行为的要点——这值得单独写一篇文章。 但值得指出的是,在这个类别中,您可以使用来自 Zabbix 的监控数据值 + 来自elasticsearch 的处理后的curl 数据。
需要注意哪些要点:
- 网络计划。 最好立即以可读的形式撰写。 Excel 就足够了。 不幸的是,我经常看到网络是根据“一个新分支已经出现,这里是/24给你”的原则构建的。 没有人知道某一特定地点预计有多少设备,或者是否会进一步增长。 例如,开了一家小商店,最初明确设备不会超过10个,为什么要分配/24? 相反,对于大型分支机构,他们分配 /24,并且有 500 个设备 - 您可以简单地添加一个网络,但您想立即考虑所有事情。
- 过滤规则。 如果该项目假设将存在网络分离和最大分段。 最佳实践随着时间的推移而变化。 以前,PC网络和打印机网络是分开的,但现在不分开这些网络是很正常的。 值得使用常识,不要在不需要的地方创建许多子网,也不要将所有设备组合到一个网络中。
- 所有路由器上的“黄金”设置。 那些。 如果你已经决定了一个计划。 值得立即预见一切并尝试确保所有设置都相同 - 只有地址列表和 IP 地址不同。 如果出现问题,调试时间将会减少。
- 组织问题与技术问题同样重要。 通常,懒惰的员工会“手动”执行这些建议,而不使用现成的配置和脚本,这最终会导致突然出现问题。
通过动态路由。 使用带有区域划分的OSPF。 但这是一个测试台;在战斗条件下设置这样的东西更有趣。
我希望没有人因为我没有发布路由器配置而感到不安。 我认为链接就足够了,然后一切都取决于要求。 当然,还需要测试,更多的测试。
祝愿大家在新的一年里实现自己的计划。 愿您获得访问权限!
来源: habr.com