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

对于一个从零到一的系统或者平台,你会有几十次几百次的调试,为的是能让系统/平台真正跑起来,用起来。我想这背后需要的坚持真是百般煎熬,一方面希望能够像建造高楼大厦一般拔地而起,另外一方面又要介入各种细节,前期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)执行插入的步骤

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

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

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2018-05-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Go 语言构建高并发分布式系统实践

你知道互联网最抢手的技术人才有哪些吗?最新互联网职场生态报告显示,最抢手的十大互联网技术人才排名中Go语言开发人员位居第三,从中不难见得,Go语言的渗透率越来越...

3674
来自专栏社区的朋友们

浅聊 API 网关

在微服务概念流行之前,API 网关的就已经诞生了,如银行、证劵等领域常见的前置机系统,解决访问认证、报文转换、访问统计等;而我今天的切入点是从 API-cent...

1.4K2
来自专栏JAVA高级架构

微服务架构选型实践

背景 随着公司一年多的成长,我们已经开发了数十个项目了,后台有 JAVA 的有 PHP 的,为了更好地提升开发与管理效率,各技术大牛小牛们时常进行激烈的 PK,...

4816
来自专栏FreeBuf

中国深圳一家厂商的智能摄像头曝出漏洞:至少 17.5 万设备可被远程攻击

安全企业 Bitdefender 和 Checkmarx 均发布报告表示,安全研究员在多个常用智能摄像头中发现远程侵入漏洞,涉及 VStarcam、Loftek...

3265
来自专栏北京马哥教育

远离故障的十大原则

故障是运维人员永远的痛。相信每一个运维人员的KPI中都有一项:可用性。可用性高就是不出故障,各个公司对可用性和故障评级的标准都不相同,但是避免故障的方法却是殊途...

2986
来自专栏java一日一条

浅析数据一致性

在数据有多分副本的情况下,如果网络、服务器或者软件出现故障,会导致部分副本写入成功,部分副本写入失败。这就造成各个副本之间的数据不一致,数据内容冲突。 实践中,...

4571
来自专栏美团技术团队

常见性能优化策略的总结

本文要感谢我职级评定过程中的一位评委,他建议把之前所做的各种性能优化的案例和方案加以提炼、总结,以文档的形式沉淀下来,并在内部进行分享。力求达到如下效果: 1....

5055
来自专栏Java架构师历程

WebBuilder —— Web 开发平台

WebBuilder是一款跨平台、数据库和浏览器的可视化Web应用开发平台,使用了多项最新的技术,使Web应用的开发更快捷和简单。

8704
来自专栏JAVA高级架构

多研究些架构,少谈些框架(3)-- 微服务和事件驱动

接上篇,我们采用了领域驱动的开发方式,使用了充血模型,享受了他的好处,但是也不得不面对他带来的弊端。这个弊端在分布式的微服务架构下面又被放大。 事务一致性 事务...

3444
来自专栏ThoughtWorks

组件测试:改建遗留系统的起点 | 洞见

在遗留系统中工作,无论是开发新功能,还是对旧功能进行修改,抑或是通过重构以期重拾其往日的雄风,都会面临大量的挑战。这些挑战主要来自于流失的业务知识、失传的技术和...

1323

扫码关注云+社区