当前位置: 首页 > news >正文

防火墙开通的自动化尝试和感悟

    对于一个从零到一的系统或者平台,你会有几十次几百次的调试,为的是能让系统/平台真正跑起来,用起来。我想这背后需要的坚持真是百般煎熬,一方面希望能够像建造高楼大厦一般拔地而起,另外一方面又要介入各种细节,前期cover各种角色。今天看了下傅盛的一篇文章。

    调子是拔高了,可能今天要说的事情对大家而已是很简单的一件事情,那就是防火墙开通的一个需求。

    这是一个多么基础简单的需求,但是如果绑定了一些硬性的需求或者规范,这个事情要落实起来就会发现比想象的要难不少。为了这样一个看似简单的事情,今天也算是做了多次迭代,都有点怀疑人生了,最后悟到了之后,发现其实我已经拿到了钥匙,只是需要一个一些技巧和设计上的改进。

    首先,基本的需求是防火墙权限要能够正常开通,在这个基础上需要分为两个维度,内存中生效还有配置文件中也同步更新。

    对此就有两种常见的防火墙更新方法,一种是iptables内存中生效,然后service iptables save即可。一种是直接修改iptables文件,然后直接service iptables reload即可。

    其实在开始的时候我觉得都OK,只要能够实现需求即可。但是在结合目前的网络配置的时候,发现iptables文件内容还挺丰富的,里面有不少的注释,比如某年某月某日,因为什么原因开通了某某访问的权限,所以问题的纠结之处就在于如果我service iptables save之后,这些注释信息都会被刷干净。

    第二个问题这些注释现在有什么用,目前来看不足以成为完全的依据,但是本着最小改动维度的眼光来看,其实保留注释也没什么错。

    于是问题升级,我要注释,同时保证配置文件中也生效,即无法service iptables save。

    一种折衷思路就是我在内存中使用iptables的comment属性,但是回到根本,怎么映射到配置文件中,这就是一个难点,难点的问题不是apped到iptables文件,而是如果找到配置文件中的一个位置。这个位置不固定也没有特殊的标识,所以这就是难点了。

    总体要做的事情是下面的这些。

640?wx_fmt=png

    所以我把需求做了一个初步的整合,面向需求来看看有哪些解决方案。

方案1:

直接在web页面中修改配置,然后在后台生效,这是看起来最直接,简单的方式,类似于GPCC中提供的一个功能点,修改配置,完全通过web页面即可实现。

640?wx_fmt=png

我设计了如下的步骤:

1.从远程服务器拷贝文件到中控端

使用ansible的模块,shell脚本来组织  10分钟

2.编辑中控端传送的文件

Web端编辑文件   20分钟

编辑后推送到中控端 20分钟

3.中控端推送文件到目标端

Shell或者ansible模块 20分钟

4.新的配置文件reload生效

Shell或者ansible 模块 10分钟

为此我还规划了时间,但是时间到了之后,我发现这个事情远比我想的复杂。

难点和缺点:

1)前后端的数据/文件同步,看似简单,实则复杂

2)操作习惯,更偏向于专业方向,对于业务来说不友好

于是想了下,如果先放弃一些要求,保证下基本的需求实现。

方案2:

1.备份iptables文件,比如iptables_201805100310

i2.ptables -I 内存生效  ,加入加密串

3.Iptables save转储文件 

4.iptables文件和加密串比对,找到前后的行

5.修改iptables_201805100310的内容

6.替换iptables_201805100310和iptables

7.Reload生效

潜在问题:

1)Save之后会生成大量的注释信息

2)save之后会刷掉以后的注释。

所以方案二也失败了,

于是继续设计,想到了方案三,通过文件的对比来避免iptables save。

方案三:

1.备份iptables文件,比如iptables_201805100310

2.iptables -I 内存生效  ,加入加密串

3.在内存中根据加密串比对,找到前后的行

4.添加指定的防火墙信息和注释

5.Reload生效

    这些做了一部分之后,我突然想到一点,如果我现在用有的运维平台的功能,因为ssh运行命令已经是调通的情况下。

    我不借助脚本是否能够实现,所以摆在我面前的其实就是一个透明的通道入口。只通过这个通道入口,是否可以实现我的需求。

    当然这种情况下,我就可以对需求做真正的裁剪了,我完全可以分为几个步骤,要到哪一行更改,我完全可以先读到里面的内容再做决定,然后第二步变更,如果要批量变更,只是多几条相关的命令。我不需要在脚本中做大量的逻辑判断和分析了,这些逻辑可以在后端程序中来做了。

    所以我对我的需求有了更本质的理解

    1)可以先读取iptables的内容,决定在哪里插入新的记录

    2)执行插入的步骤

    对上面的需求继续分析,为什么需要读取,我们不可以指定一个标注的参考位置吗,显然会有两种情况,新的环境和已有的环境。对于新的环境而言,我们需要固化到配置模板中,而对于已有的环境,我们则要设定完善这个标志位。否则就会是我花了很大的功夫去做的一个看似通用的事情,其实到头来是败给了没有标准。

    明白了这些之后,我们再来聊一聊里面的注释有什么用,到底有没有用。

相关文章:

  • 使用shell脚本得到MySQL实例列表
  • 运维开发的开源项目
  • 关于运维开发,说说你的看法
  • Greenplum集群故障修复小记
  • 运维开发流程梳理和思考
  • MySQL 8.0初体验
  • Oracle Cloud初体验
  • MySQL权限开通的设计方案
  • Oracle Cloud for MySQL的初步测试
  • 技术分享活动的小结
  • 两道简单的数学题
  • 技术学习的一些建议
  • 我的女儿二三事(十一)
  • 一些技术认证的学习成本感想
  • 快高考了,写点东西给你们
  • 自己简单写的 事件订阅机制
  • [NodeJS] 关于Buffer
  • ECS应用管理最佳实践
  • k8s 面向应用开发者的基础命令
  • KMP算法及优化
  • LeetCode18.四数之和 JavaScript
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 从tcpdump抓包看TCP/IP协议
  • 关于Flux,Vuex,Redux的思考
  • 来,膜拜下android roadmap,强大的执行力
  • 聊聊sentinel的DegradeSlot
  • 前端知识点整理(待续)
  • NLPIR智能语义技术让大数据挖掘更简单
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​什么是bug?bug的源头在哪里?
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (windows2012共享文件夹和防火墙设置
  • (搬运以学习)flask 上下文的实现
  • (附源码)springboot教学评价 毕业设计 641310
  • (四) Graphivz 颜色选择
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)甲方乙方——赵民谈找工作
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ***监测系统的构建(chkrootkit )
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .jks文件(JAVA KeyStore)
  • .Net core 6.0 升8.0
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .net反编译的九款神器
  • .net下简单快捷的数值高低位切换
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [BUAA软工]第一次博客作业---阅读《构建之法》