首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >防火墙开通的自动化尝试和感悟

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

作者头像
jeanron100
发布2018-07-26 15:17:41
4970
发布2018-07-26 15:17:41
举报

对于一个从零到一的系统或者平台,你会有几十次几百次的调试,为的是能让系统/平台真正跑起来,用起来。我想这背后需要的坚持真是百般煎熬,一方面希望能够像建造高楼大厦一般拔地而起,另外一方面又要介入各种细节,前期cover各种角色。今天看了下傅盛的一篇文章。11位CEO自述:真正决定一个人价值的,是那些艰难时刻的选择,我从业快10年来,我从来没有这样焦虑要做一件事情,我想这个方向应该是对的。

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

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

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

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

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

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

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

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

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

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

方案1:

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

我设计了如下的步骤:

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)执行插入的步骤

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档