对于一个云网络来说,可以看做是一个小区,对于一个小区物业,可能遇上好的住户和不好的住户

就好比公有云的环境,里面会有着一些黑客的人,扫描端口,探测启动应用了没有,看下是否具有漏洞,就好比小偷潜入了小区,看看屋里面有啥,能不能进去一样

比较常见的攻破的环境就是,有一个虚拟机,里面跑了一个电商环境,这是一个非常重要的应用,加固的很好,但是在这个虚拟机的系统里面,还有一个另外的后台应用,这个应用的端口就没这么安全

于是黑客扫描到了这个端口,通过这个后台应用的端口侵入到了机器内,将加固好的电商黑掉

所以对于公有云上的虚拟机,仅仅开发需要的端口,将其他的端口一概关闭,这个时候,就只需要守护这唯一一个入口就可以了,可以使用ACL,Access Control List,访问控制列表控制IP和端口

设置好了这些规则,只有指定的部分IP段可以访问某些接口,于是就算有个不安全的端口,也没法被访问到,这些规则的集合被称为安全组,具体的ACL实现方式是

首先拿下MAC头看看,是不是我的,如果是,拿下IP头来,得到了目标IP之后呢,就进行路由的判断,判断之前,这个节点被称为PREROUTING,发现IP是我的,就需要转发出去,这个节点被称为FORWARD,如果是我的,上层处理完成,会有处理结果,处理的节点被称为OUTPUT,无论是FORWARD还是OUTPUT,都是在路由判断之后的发生的,在这时候,有一个节点,POSTROUTING

图片

这个包的处理流程和以前一样,不过,在Linux内核中,有一个框架Netfilter,可以再这些节点中插入hook函数,这些函数可以截获这些数据包,然后进行干预,比如做一些的修改,然后决策是否交给TCP/IP处理,或者直接返回,这就是ACCEPT,如果不符合,可以直接DROP,还有就是QUEUE,发给某个用户态去处理

于是利用这个框架,可以在IP转发的过程中,随时干预这个过程,只要能实现这个hook函数

ip_tables就是利用这个框架实现的,在这五个节点上埋下函数,然后根据规则进行包的转发,可以分为四大类,连接追踪,数据包的过滤,网络地址的转换,数据包的修改,连接追踪是基本功能,其他三个基于此实现了包的过滤,修改和网络地址转换

iptables的表分为四种,raw->mangle->nat->filter,这四个优先级依次降低,raw不常用,所以主要功能都在其他的表里面实现了

filter的作用点在于

INPUT:过滤所有目标地址是本机的数据包

FORWARD:过滤所有路过本机的数据包

OUTPUT:过滤所有由本机产生的数据包

nat表用于处理网络地址的转换,进行Snat,改变数据包的源地址,Dnat改变数据包的目标地址,作用点在于

PREROUTING:在数据包到达防火墙时候改变目标地址

OUTPUT:可以改变本地产生数据包的目标地址

POSTROUTING:数据包离开防火墙时候改变数据包的源地址

mangle表用于修改数据包,作用点在于

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

图片

于是整体的数据包处理流程如下:

1.数据包进入的时候,先进入mangle表的PREROUTING链,可以根据需要,,改变数据包头的内容后,进入nat表的 PREROUTING的链,这时候可以根据需要做Dnat,目标地址转换

2.进入路由判断,判断是否进入本地还是转发

3.如果进入了本地,就进入INPUT链,然后按照条件过滤限制进入

4.如果进入本机,就进入OUTPUT链,按照条件过滤限制出去,离开本地

5.如果是转发就进入FORWARD链,然后根据条件过滤限制转发

6.之后进入POSTROUTING链,可以做Snat,离开网络接口

有了iptables命令,就可以在云中实现一定的安全策略,比如关闭所有的端口

iptables -t filter -A INPUT -s 0.0.0.0/0.0.0.0 -d x.x.x.x -j DROP

-s表示源IP地址段,-d表示目标地址段 DROP表示丢弃,说明谁访问我都丢弃

这时候,ssh访问也会被拒绝

于是加上了ssh的端口访问

iptables -I INPUT -s 0.0.0.0/0.0.0.0 -d X.X.X.X -p tcp -dport 22 -j ACCEPT

并且打开了web服务的80端口,

iptables -A input -s 0.0.0.0/0.0.0.0 -d X.X.X.X -p tcp –dport 80 -j ACCEPT

这样就将其他的端口都进行封死了

但是每一台虚拟机都需要自己安装iptables去配置,去安装,对于用户来说,就太麻烦了,这时候需要云平台进行统一的管理

在云平台上,一般可以一个多个虚拟机属于某个安全组,在属于不同安全组的虚拟机之间的访问,或者外网的访问,都需要安全组去过滤

图片

我们创建了一个网站,前端在Tomcat,对外开放了8080端口,数据库使用MySQL,开放3306端口

为了方便使用,我们创建了两个安全组,将Tomcat所在的虚拟机放在安全组A里面,在安全组A里面,可以让任意IP的0.0.0.0/0访问8080端口,对于ssh的22的端口,允许管理员网段203.0.113.0/24访问

同样将Mysql所在的虚拟机放在安全组B上面,安全组B上面,只能让安全组A的机器访问3306端口,对于ssh的22端口,同样允许管理员网段203.0.113.0/24访问

这些安全组的规则都可以自动下发到每个在安全组内的虚拟机上,但是怎么批量下发的呢?

图片

两个VM都可以通过tap网卡连接到一个网桥上,但是网桥是二层的,两个VM之间可以任意互通,需要一个地方统一的配置iptables

可以多加一个网桥,在网桥上配置iptables规则,然后配合agent,将用户配置的安全组变成iptables规则,配置在网桥上

这样安全问题解决了,iptables很牛逼,但是iptables除了filter,还有着nat这个功能

这个功能也是相当的重要,再设计云平台的时候,我们想要虚拟机之间的网络和物理网络相隔离,但是虚拟机毕竟还是需要物理网络和外接通信,于是要做网络地址转换,这个可以利用iptables来做

我们学过,Ip头包含了源IP和目标IP,这两种IP都可以转换为其他的地址,转换源IP地址的,我们称为Snat,转换目标IP地址的,称为Dnat

但是,TCP的访问都是一去一回的,在家里连接的IP地址是一个私网ip,192.168.1.X,当利用本地路由器,如果去访问公网,网站的返回怎么到自己的电脑,这是个私网IP.不具有公网的定位功能

当从你家访问163的网站的时候,在出口会做Snat,运营商也会做Snat,将私网Ip地址,最终转换为公网IP地址,然后163网站,你的路由器的出口,会被Snat,出口也可能Snat,将私网地址,转为公网IP地址,然后163网站可以通过这个公网IP地址返回结果,然后再nat回来,到达笔记本电脑

云平台的虚拟机也是这个样子,只有私网IP地址,到达外网的时候做一次Snat,转换为机房网络IP,出数据中心的时候,转换为公网IP

图片

这样在外网网口上做Snat的时候,是全部转换为一个机房IP呢.还是每个虚拟机对应一个机房网IP呢?因为公网IP比较贵,虚拟机也很多,当然不能每个都是一个公网IP,因此这种Snat是一种特殊的Snat,地址伪装

在这种方式,所有的虚拟机都共享一个公网IP,那么公网回来的数据包,给谁呢?

这就是Netfilter的连接追踪功能了,对于TCP协议来讲,这肯定是上来先建立一个连接

用源/目的IP+源/目的端口来标识一个连接,这个连接会放在conntrack里面,这个机器请求163网站的,虽然源地址已经Snat成公网IP地址了,但是conntrack表里面有连接记录,当163返回数据的时候,会寻找记录,返回到对应的私网IP地址上

这就是虚拟机做为客户端的情况,如果虚拟机作为服务器呢?

这就需要给这个网站配置固定的物理网的IP地址和公网地址,这就需要详细的Snat和Dnat规则了

当外部冯文进来的话,外网网口会通过Dnat规则将公网的IP地址转化为私网的IP地址,到达虚拟机中,虚拟机是163网站的服务器,返回结果,外网网口通过Snat规则,将私网IP地址转换为分配给它的固定的公网IP地址

类似的规则为

源地址转换 Snat:iptables -t nat -A -s 私网 IP -j Snat –to-source 外网IP

目的地址转换 Dnat:iptables -t nat -A -PREROUTING -d外网IP -j Dnat –to -destinantion私网IP

本章小结:

1.云中的安全策略的常用方式是,使用iptables的规则,在iptables中,有五个对应的阶段,PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

2.iptables分为四种表,raw,mangle,nat,filter,其中安全策略在filter中实现,虚拟网络和物理网络的转换在nat表中实现

课后思考:

1,本章讲了iptables的filter和nat功能,iptables可以通过QUEUE实现负载均衡,怎么做到的呢?

2.这一节只是讲了云中防止偷窥的问题,对于共用网络通道,却被他人占用过多资源,怎么采用策略呢?

在k8s的kube-proxy中,就是利用了iptables做的流量转发和负载均衡的,service利用nat将相应的流量转发到对应的pod中,iptables还有一个probability特性,设置这个百分比,从而实现负载均衡

对于一个疑问,用户组配置的安全组变成iptables规则,配置在这个网桥上,那么新加的网桥是哪个呢?又怎么下发到虚拟机上的呢?

对于一台机器上的虚拟机而言,二层互通,所以只在物理机的层面,多加一个网桥,将安全组的物理机连接起来,统一的在这个网桥通过iptables设置安全组信息,然后每台机器跑一个anent程序将网桥的安全组规则变为机器内部的iptables,统一下发

对于物理机,使用的nat别忘了,说到底,还是只能在65536个内,所以并发不会超过这个数

1.对于QUEUE出现的问题,iptables规则制定queue,把网络数据包送入用户空间制定的消息队列ID,让用户自己控制

iptables还可以扩展NFQUEUE,分配给某个范围多个队列号,更高级的负载均衡策略

具体的NFQUEUE的配置方式如下

-A PREROUTING -p tcp -m set –match-set minuteman dst,dst -m tcp –tcp-flags FIN,SYN,RST,ACK SYN -j NFQUEUE –queue-balance 50:58

-A OUTPUT -p tcp -m set –match-set minuteman dst,dst -m tcp –tcp-flags FIN,SYN,RST,ACK SYN -j NFQUEUE –queue-balance 50:58

NFQUEUE的规则表示将包的处理权交给用户态的一个进程,queue-balance表示将包发给几个Queue

libnetifilter_queue是一个用户态库,用户态进程使用libnetfilter_queue连接到queue中,将包读出来,然后根据包的内容,做出决策,放回内核进行发送

发表评论

邮箱地址不会被公开。 必填项已用*标注