防火墙ACL配置自动化 - 配置采集
本篇目的是说明防火墙配置的采集方案,实际上适用于所有网络设备,并且具体举例时,也可能会用其他设备说明。
采集通过paramiko,采用invoke_shell模式
1,SSH登录设备采集数据场景分类
通过SSH登录设备,执行命令时,根据设备表现情况不同,分为“需要交互”和“无需交互”两类。
“无需交互”:采集机单向推送命令后,监听并接收对端设备发回的内容即可
“需要交互”:采集机推送命令后,需要等待对端设备发回的内容,收到特定内容后,再次发送其他命令
2,无需交互
所有思科设备,新版本华为防火墙,junper防火墙等均属于“无需交互”
即采集配置命令时,只需要单向无脑推送。
对于常见的“More”确认,可以通过“取消分屏” 的命令,避免交互。
例如:华为(screen-length 0),思科IOS交换机/路由器(terminal length 0),思科防火墙(terminal pager 0),天融信防火墙(show nostop),juniper防火墙(set cli screen-length 0 )
以思科设备为例,采集机单向推送如下命令(假设enable密码为cisco789),同时另起一个线程接收防火墙发回的信息,即可完成配置收集:
enable
cisco789
conf t
terminal pager 0
show run
exit
3,需要交互
需要交互的设备,根据交互的情况,又可以分为“简单交互”和“复杂交互”
“简单交互”: 推送某条命令后,需要等到对端回送某些特定字符串后,才能继续推送下一条命令,这个”特定字符串“是肯定会出现的
”复杂交互“: 推送某条命令后,需要等到对端回送某些特定字符串后,返回的字符串出现次数,和出现情况是不可预估的
3.1,简单交互
典型的“简单交互”场景,是有些设备在退出时,需要有个确认
例如老版本的天融信防火墙,输入exit后,需要等待如下字符串后再次输入y:
Save system config?[Y/N]:
新版本的天融信防火墙,输入exit后,需要等待如下字符串后再次输入y:
Save system config?[y/n]:
还有些设备,再保存save时,同样会有回显进行确认
3.2,复杂交互
复杂交互的典型场景,如:
1)不支持取消分屏的设备
老版本的华为防火墙,以及新版本的trx防火墙(没看错,trx墙更新后居然不支持show nostop)等
这些设备在采集时,会回送"---More----"之类的字符串,要求确认后,再回送后续配置,代码中发送一个"\n"即可,但是这个“---More---”出现的次数是不可预估的
2)输入命令后,回显的内容不确定
例如思科光纤交换机,enhance模式,做完配置,需要等待几秒再commit,如果等待时间不够,可能会出现"...in progress"(大致)字符串,commit失败
此时需要过几秒再次发起commit
4,采集脚本设计
脚本采用paramiko
主线程负责发送命令
子线程负责接收设备回收的内容,回收内容保存在全局变量中(有交互的场景,需要主线程去读取回收内容)
发送命令设计为字典列表,每个字典包含的key-value说明如下:
key:"cmd", value:需要推送的一组命令,多条命令以"\n"分割
key: "expect", value:需要等待对端设备回送的内容,如果等不到就不执行后续的命令
key: "sleep", value:等待时间,发送完本组命令后,sleep x秒后,再发送后一组命令
对于简单交互的场景,比如思科防火墙,不需要指定"expect"和“sleep”,直接无脑单向推送配置即可完成采集,例如
[{"cmd": "enable\ncisco789\nterminal pager 0\nshow run\nexit\n"}]
简单交互的场景,比如天融信防火墙,退出时需要指定expect:
[
{"cmd": "show nostop\nexit\n", "expect": "Save system config?[Y/N]: "},
{"cmd": "y\n"}
]
用到sleep参数的,即发送完命令后需要等待几秒再发下一条,映像中目前只有天融信防火墙(保存还是同步时),光交commit时
复杂交互的场景,单靠目前三个参数cmd, expect, sleep无法解决,只能在采集代码中根据实际情况定制
例如可以在发送的一组命令中添加"special_handle"标志,主线程中根据标志进行定制开发,以新版本天融信防火墙为例,由于不支持分屏的防火墙,发送一组命令时:
{"cmd": "show\n", "special_handle": "trx_more"}
主线程可以设置获取到"trx_more"时,去监听接收内容,收到"---More---"后发送"\n"
保存配置时,可以去掉"---More---"
5,其他
有些设备回送的内容会自动换行,表现为在不该换行的地方插入换行\n,例如一条acl策略被自动分割,这样做会影响后续解析。可以在invoke_shell中设置width避免。
但是新版本trx防火墙,不支持宽度设置(老版本支持),只能拿到配置后进行二次处理。
有时遇到过手动ssh登录正常,脚本登录报认证失败,通过在connect()中,设置allow_agent=False, look_for_keys=False,问题解决。
原文地址:https://www.cnblogs.com/guxh/p/15182568.html
- 数据库进程间通信解决方案IPC
- 苹果后端的Oracle数据库
- C#基础知识回顾--C#遍历enum类型、获取enum项个数
- 用香蕉也能玩电脑游戏—Tensorflow对象检测接口的简单应用
- 通过图片定位给一张图片添加多个链接
- Struts Interceptor Example
- 微信服务号模板消息接口新增"设置行业"和"添加模板"及细节优化
- WPF备忘录(3)如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter
- WPF备忘录(2)WPF获取和设置鼠标位置与progressbar的使用方法
- WPF文字修饰——上、中、下划线与基线
- 微信公众平台数据接口正式对所有认证公众号开放
- 参考基因组没有,经费也没那么多,怎么办?
- .Net下SQLite的DBHelp
- 数据库进程间通信解决方案之MQ
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 好用的PHP高性能多并发restful的HTTP Client
- Golang程序调试工具介绍(gdb vs dlv)
- tcp_tw_reuse、tcp_tw_recycle注意事项
- PHP性能规范
- PHP代码规范
- php调试利器之phpdbg
- 【DB笔试面试860】在Oracle中,如何判断Oracle是32位还是64位?
- JsonPath实践(四)
- Python代码转Latex公式,这个开源库用一行代码帮你搞定
- Golang/Go goroutine调度器原理/实现
- 如何定位 golang 进程 hang 死的 bug
- Docker/Dockerfile debug调试技巧
- 使用 HTTP/2 提升性能的几个建议
- 玩树莓派(raspberry pi) 2/3 raspbian的遇到的一些问题
- Dnsmasq加速本地DNS请求