网络防火墙系统集群搭建
发布时间:2023-05-22 阅读: 分享

1 序言

本次文章系列将会逐步分享作者亲身经历以及解决思路,让大家一起身临其境,作为开篇,会先和大家聊点有趣的,做这件事的动机,对我的职业道路有什么影响等,大家可以仁者见仁智者见智。

1. 为什么要了解网络防火墙?

其实对我们正常程序员的工作流程来说,网络这块对我们来说基本不会涉及,因为公司的职责分配,大家都会只负责自己的部分,例如ui只负责ui,测试只负责功能测试性能测试,软件开发只负责软件开发,运维只负责服务器资源调配整合管理,网络管理等等,但是其实对于大多数程序员来说,公司的规模不大的情况下,一般都会身兼数职,又是软件开发,又是测试,还需要去部署项目。那么既然大家都有机会横向拓展自身的技能,其实真的可以利用好机会去学习,去实践,看的再多,了解的再多不如实际去试试。

1.1 我与防火墙的不解之缘

又到了我最喜欢的讲故事环节啦~ 曾经我也是一名普通的Java程序开发,每天写写bug,调试一下代码,和产品斗斗嘴,日子一天天这样愉快的过去。

图片
满是开心

突然一天,接到公司电话:"大事不好了,所有用户都无法正常使用应用啦,用户投诉已经快把公司电话打爆了。你赶快解决!" 当时还在休周末假期的我,一下就从床上挺直了身板,心想:不会吧,代码应该没问题啊,我不可能错的啊(ps:程序员的蜜汁自信) 紧接着马上打开笔记本电脑,开始排查问题,首先从用户反馈的截图来看,应用其实连接超时,没有任何响应。那此时可以排除掉app应用本身的问题,然后立马使用接口测试工具postman测试一个线上的接口,发现确实无任何响应了,糟糕,难道我的Java服务挂了?然后怀着忐忑的心情登录远程服务器,发现服务器居然也无法登录了,这是什么情况?

图片
啥情况?

由于我使用的是阿里云的云产品,所以立马登录阿里云账号,发起一个工单咨询阿里云的技术支持,在明确告知了云服务器实例id以及无法访问的异常情况后,等待对方的反馈。在这里给阿里云技术支持点个赞,技术反馈很快,并且态度十分友好。最后阿里云技术支持反馈工单说我们的服务器请求流量异常,进入他们的黑洞机制了。wtf?说的白话一点就是有人在对我们服务器进行ddos攻击,我们服务器的资源被耗尽并且触发了阿里云的黑洞机制,我们服务器被丢进"小黑屋"了,什么都做不了,第一次进入黑洞就是两个小时,后面在进入黑洞就会逐渐时长增加。

1.2 如何快速解决当前问题

这可不得了,首先在联系客户,安抚客户的同时,也马上开始针对这次攻击做出反应。期间黑客甚至还匿名联系过我们,态度十分嚣张,说什么不给"保护费"就会一直对我们服务器进行攻击,不让我们正常营业,还趾高气昂的说什么今天不交5k的保护费,明天再交那就是一个达不溜,这话听着怎么这么耳熟呢?今日割五城,明日割十城,然后得一夕安寝。取自<<六国论>>中的经典短句,今日你割让5个城池,明天再让你割让10个城池,以此换来睡一个安稳的觉,然而第二天一看,秦国的军队又来了。

图片

坏人的欲望是无法满足的。于是我紧急查找做网络防火墙的解决方案提供商,阿里云的高防,一年40多万的费用,让我们望而却步,毕竟公司的业务暂时没有这么大的量级,这个方案属于不适合当前的,最后接入了一家小众公司的网络防火墙方案,最后以一个月599的价格购买了一个标准套餐的防火墙,测试通过后就将流量全部转移到他们的防火墙进行流量清洗和监控,最后回源到我们服务中,而攻击我们的黑客最后也是费劲心思的攻击几次后,眼看攻击无果,最后灰溜溜的消失在了我们视线中。

1.3 事后思考

在经历了服务不可用之后再恢复正常使用的这段黑暗时刻后,其实心里还是很紧张的,首先就是自身处于舒适圈,没有保持一个良好的学习热忱,导致技术栈相对狭隘,认为一个软件应用从开发好后,把服务部署到服务器上,解析一个域名绑定服务器ip,然后让app调用这个域名跟服务接口就完成了任务,认为自己这样做开发效率还很快,沾沾自喜,其实正是落入自己给自己设下的糖衣陷阱,限制了自己的思想,阻碍了自己思考的能力,于是我利用接入了第三方的防火墙这段时间,自己也在恶补网络相关的知识,弥补自己对互联网中的知识匮乏。

图片

2.0 攻击如何做到的?

首先这次攻击,再通过第三方防火墙的管理后台中,我们可以清楚的看到所有的请求ip以及各个ip的请求次数,可以看到正常ip的请求频率在一分钟以内一般也就几十个连接请求,但是有一批ip的请求都是几万次,明显不正常,通过百度搜索这些ip,无一例外都是海外的ip,也就是什么马来西亚啊,柬埔寨啊等等是非之地的ip,这一看就是被控制了肉鸡对我们同时进行的ddos攻击,导致我们服务的瘫痪。

2.1 什么是ddos?和dos是什么关系呢?

引用百度百科中,DDOS一般指分布式拒绝服务攻击,分布式拒绝服务攻击(英文意思是Distributed Denial of Service,简称DDoS)是指处于不同位置的多个攻击者同时向一个或数个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。由于攻击的发出点是分布在不同地方的,这类攻击称为分布式拒绝服务攻击,其中的攻击者可以有多个。也就是上面我们所遇到的对方使用非法技术手段控制多台计算机,同时对我们的这台服务进行攻击。而单一的DoS攻击一般是采用一对一方式的,它利用网络协议和操作系统的一些缺陷,采用欺骗和伪装的策略来进行网络攻击,使网站服务器充斥大量要求回复的信息,消耗网络带宽或系统资源,导致网络或系统不胜负荷以至于瘫痪而停止提供正常的网络服务。也就是dos就是1v1单挑,拼的是谁的主机资源性能更好,而ddos就是不讲武德,多人运动,以多欺少。

2.2 如何防范呢?

既然知道了攻击手段,那如何防范呢?那就要说说防火墙的分类了,一般防火墙是有物理硬件防火墙和软件防火墙两种,硬件防火墙代表有著名的F5,Symantec等,这类软硬一体防火墙,国内也有很多做硬件防火墙的厂家,例如天融信,启明星辰,联想网御,华为,深信服等等。软件防火墙有firewall,iptables等等

图片

2.3 两种防火墙区别

其中软件防火墙也称为个人防火墙,它是最常用的防火墙,通常作为计算机系统上的程序运行,它是可定制的,允许用户控制其功能。软件防火墙单独使用软件系统来完成防火墙功能,将软件部署在系统主机上,其安全性较硬件防火墙差,同时占用系统资源,在一定程度上影响系统性能。硬件防火墙是指把防火墙程序做到芯片里面,由硬件执行这些功能,能减少CPU的负担,使路由更稳定。一般的软件安全厂商所提供的硬件防火墙便是在硬件服务器厂商定制硬件,然后再把linux系统与自己的软件系统嵌入。(Symantec的SGS便是DELL+Symantec的软件防火墙)这样做的好处是linux相对Windows的server相对安全。

2.4 两种防火墙优劣对比

至于价格高,原因在于,软件防火墙只有包过滤的功能,硬件防火墙中可能还有除软件防火墙以外的其他功能,例如CF(内容过滤)IDS(入侵侦测)IPS(入侵防护)以及VPN等等的功能。软件防火墙一般可以是包过滤机制。包过滤过滤规则简单,只能检查到第三层网络层,只对源或目的IP做检查,防火墙的能力远不及状态检测防火墙,连最基本的黑客攻击手法IP伪装都无法解决,并且要对所经过的所有数据包做检查,所以速度比较慢。硬件防火墙主要采用第四代状态检测机制。状态检测是在通信发起连接时就检查规则是否允许建立连接,然后在缓存的状态检测表中添加一条记录,以后就不必去检查规则了只要查看状态监测表就OK了,速度上有了很大的提升。

2.5 保护范围

软件防火墙只能保护安装它的系统。硬件防火墙保障整个内部网络安全。它的安全和稳定,直接关系到整个内部网络的安全。如果所在的网络环境中,攻击频度不是很高,用软件防火墙就能满足要求了。软件防火墙的优点是定制灵活,升级快捷。倘若攻击频度很高,建议用硬件来实现。

2.6 安全性对比

硬件防火墙的抗攻击能力比软件防火墙的高很多,通过硬件实现的功能,效率高,专门为了防火墙这一个任务设计的,内核针对性很强。软件防火墙在遇到密集的DDOS攻击的时候,它所能承受的攻击强度远远低于硬件防火墙。因为硬件防火墙将防火墙功能集成到芯片中,有硬件执行,对于计算机的cpu使用可以算是0占用,稳定性要高得多,而软件防火墙是安装和运行在计算机中,在运行时是会占用当前计算机的cpu以及内存,所以相对硬件要差一些。

2.7 成本对比

不用说,那肯定是硬件防火墙的成本是最高的,毕竟设备厂商是靠买这些硬件挣钱的,一般的硬件防火墙在1到几万不等,好点的都是十万开外了,而软件防火墙相对就要友好的多了,只需要能安装软件防火墙能力的主机即可,成本直线下降。对于小型企业或者个人用户来说,使用软件防火墙是最适合的。

3.0 软件防火墙安装

那么此次的防火墙集群搭建的第一小步,就是先在单机上部署好一个软件防火墙并且设定规则。我先是在阿里云上购买了一台1核1g的云服务器,系统镜像选择centos 7.5 64位的。磁盘由于可能只需要存一点点日志,对于磁盘要求不大,所以选择40G的一个磁盘挂载,网络带宽我们选择按量付费,最高带宽值拉满100M,这样的配置,一台服务器的费用仅仅需要53块一个月!流量费用在超过每月赠送的固定值后按照每GB8毛钱来结算。

图片

3.1 软件安装

centos7.5版本以后系统内核编译的防火墙默认是firewall,而本次我们使用的是iptables,所以我们需要先关闭原本的firewall,然后下载安装iptables,再使用iptables命令来进行添加规则,最后安装一个nginx做前置网关,负载均衡到自己软件服务主机上,以此来完成软件防火墙的闭环搭建。

  1. 首先关闭系统自身的firewall
systemctl stop firewalld
systemctl mask firewalld
  1. 下载iptables
yum install -y iptables
yum update iptables
yum install iptables-services
  1. 添加iptables规则
iptables -P INPUT ACCEPT
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
  • 第一处代表先允许所有输入,避免防火墙屏蔽所有的输入请求,导致连ssh 22端口都无法访问等情况
  • 第二处表示清除filter表所有规则
  • 第三处表示清除链表规则
  • 第四处表示将计数器清零
  • 第五处表示将tcp协议22端口放开,用于ssh连接
  • 第六处表示将tcp协议80端口放开,一般作为服务入口
  • 第七处表示将tcp协议443端口放开,用于ssl证书服务,也就是https
  1. 保存并启动iptables
service iptables save
systemctl enable iptables.service
systemctl start iptables.service
  1. 下载nginx
yum install -y nginx
  1. 启动nginx
systemctl start nginx.service
systemctl enable nginx.service
  1. 至此,你的软件防火墙单机版本就有了一个雏形,一个缩影。让我们来整理一下架构。

4.0 使用防火墙前后的架构图解

  1. 使用前

图片

客户端的请求直接通过域名解析访问到实际业务主机上,形同裸体,不设防备,所有请求直接打在业务服务器上,在没有架设后置网关的情况,没有负载均衡能力,服务容易被攻击,不安全。并且服务器的真实ip暴露,容易被不法分子进行ssh爆破攻击,对服务器运行带来许多不稳定因素。

  1. 使用后

图片

客户端的请求通过域名解析来到了防火墙所在的主机上,在验证了请求ip是否符合规范等情况后,由nginx转发请求到业务服务器上,返回地址也使用防火墙的ip地址信息,从而隐藏了真实的服务ip,避免暴露。本篇文章作为第一章节,只介绍单机版本的搭建,以及实现逻辑,下一章节便给大家带来集群如何实现,以及为什么要用集群的防火墙,单机的为什么不行。

  1. 如何拦截攻击ip?

既然我们已经搭建好并且启动了上述iptables,我们知道iptables也能拒绝连接,甚至可以拒接指定ip的连接,那我们只需要写一个脚本,每次启动都检测一下当前的ip连接数,对于单个ip连接数异常高的进行一个封禁,那这个ip所有的请求在达到防火墙这一层就会被自动丢弃,不占用系统的资源了,也不影响正常的用户ip的请求。

#iptables 禁用单个ip连接
iptables -I INPUT -s 1.2.3.4 -j DROP
#
iptables -A INPUT -s 1.2.3.4 -j DROP
  • -A 指定规则应该添加到的 chain 的名称。例如,使用 INPUT 将会把规则添加到默认的 INPUT(入站)链的末尾,而使用 OUTPUT 则会将规则添加到出站链的末尾。

  • -I 将规则添加为 chain 中的第 rulenum 条规则,原先的第 rulenum 条及以后各条的需要顺次 +1。如上面一样,1 表示该 chain 中第一条。默认为 1,即,如果没有指定 rulenum 则将该 chain 中第一条规则替换掉。

  1. 如何获取到攻击ip呢?此处给大家我这边写的一个脚本,里面有获取访问ip以及访问ip的连接数
wget 'http://blog.houlangmark.com/ddos.sh' -O /etc/ddos/ddos.sh
  • 此命令会下载一个我这边写好的ddos防御脚本,并且下载后安装到/etc/ddos 目录下

vim 这个ddos脚本,主要的命令为下面这行

cd /etc/ddos
vim ddos.sh

netstat -an |grep ^tcp.*:80|egrep -v 'LISTEN|127.0.0.1'|awk -F"[ ]+|[:]" '{print $6}'|sort|uniq -c|sort -rn
  • 第三句便是这个脚本的核心,通过监听网络服务,tcp的80端口并且状态为LISTEN的,将他们出现的频率相加并且倒序排列,显示count数量

此时便可以通过定时启动脚本一直检测网络连接的ip,找到非法的ip进行操作。

  1. 利用ipset 将非法ip进行添加 ipset是iptables的一个拓展,类似于我们编程中的集合,当然也不只是简单的集合,还对集合内存储的内容可以设置时效性,设置集合容量等等,这样我们就可以只维护集合,而不用对iptables的链表进行无休止的添加拒绝规则。ipset,nginx等相关内容咱们下期详细仔细聊聊。

5 梳理

由于文章的篇幅有限,这个防火墙系列的第一篇文章便只先介绍如何单机搭建好一个防火墙的简单软件,我这边给大家提供我自己编写的一个初始化脚本,大家可以在一台新的服务器上自己试试效果,脚本中每个步骤都有注释,大家可以先自行理解一下。

wget http://blog.houlangmark.com/install.sh

下载后的初始化脚本,只需要执行 sh install.sh即可完成所有步骤,无需你操心。大家可以先看看里面的步骤,这里粘一个部分截图。

图片

给大家在这里梳理总结一下,我的实现过程,在一台新的主机上下载初始化脚本,执行脚本会把nginx下载下来,并把一个模板nginx.conf下载下来放置nginx的目录下,启动好nginx后会安装iptables,安装好后会先把所有规则先清理掉,然后开放基本的一些端口服务,然后关闭当前主机原本默认的firewall,启动iptables,接下来会安装ipset拓展组件,用于记录ip黑名单和白名单,然后通过iptables命令将ipset的集合绑定起来,保存并重启iptables,最后下载我这边写的ddos防御脚本,并且启动这个脚本一直监听网络请求ip,将异常请求ip记录到黑名单中,实现自动拉黑ip,阻止请求。最后就是利用nginx将正常Ip的请求转发到业务服务器上去,到此第一部分,思路与大概实现就给大家分享完毕了。

5.1 结语

最后在这里给大家说一下,由于第一次分享这类自己一个人摸索实现的功能,语言整理这块还有很大的进步空间,我也希望通过更多的分享来锻炼自己的语言组织能力,给大家带来更好的观感体验,能很直观并且不枯燥的看完,更想能让读者自己动手时可以利用我提供的部分下载实例能直接运行测试,后面我会越来越努力学习给大家分享的,欢迎大家给作者一些建议,我会虚心接受。敬请期待下一期《iptables,ipset详解》


13905190502 南京市玄武区洪武北路188号长发数码大厦11楼E座
友情链接
百度 网络安全和信息化委员会 FreeBuf网络安全行业门户

分享:
Copyright © 2020-2022 南京明科网络科技有限公司 版权所有  苏ICP备2021002458号-1
技术支持:飞酷网络