新网工在YESLAB   

IT技术专业学习平台
IT人才专业服务提供商

 

VUE考试注册预约电话:010-82608710

全国热线:400-004-8626

Linux安全—iptables(一)

首页    技术博文    Python/Linux    Linux安全—iptables(一)

      防火墙概念
      防火墙:
      工作在主机或网络边缘,对进出的报文按事先定义的规则进行检查,并且由匹配到的规则进行处理的一组硬件或软件。
      主机防火墙
      工作于主机边缘,只能对一台主机起到保护作用
      网络防火墙:
      工作于网络边缘,对多台主机起到保护作用

http://www.yeslab.net/Uploads/201706/5938ee7aa2565.jpg

      那我们就来聊聊 Linux 系统中的 iptables
      准确的说 iptables 是一个工作在 Linux 系统用户空间的命令行工具,用户通过 iptables 将自己的安全设置执行到对应的安全框架中,这个安全框架才是真正的防火墙,这个框架的名字就叫做 netfilter
      Netfilter 工作 Linux 内核空间中,它是 Linux 操作系统核心层内部的一个数据包处理模块,它的功能包括:
       网络地址转换
       数据包内容修改
       数据包过滤
      所以当我们使用 Linux 主机防火墙开启 iptables 服务时,记住它只是个前台,干活的是内核中的 Netfilter 模块。
      Iptables 介绍】
      Iptables 是按照规则来办事的,所以我们先要知道规则(rules)是什么,规则其实就是网络管理员预定义的条件,规则一般的定义为如果数据包头符合这条,就这样处理这个数据包。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目标地址、传输协议(TCP/UDP等)和服务类型( HTTPFTP  等)等。当数据包与规则匹配时 iptables 就根据规则所定义的方法来处理这些数据包,方法包括 acceptdropreject  等。管理员可以通过添加、删除、修改操作来对这些规则进行管理。
      举个例子,当客户端访问服务器的 web 服务时,客户端发送报文到网卡,而 tcp/ip 协议栈是属于内核的,所以,当客户端的信息通过内核 TCP 协议传输到用户空间中的 web 服务中,而此时,客户端报文的目标为 web 服务所监听的套接字(IP:PORT),当 web 服务需要响应客户端请求时,web 服务发出的响应报文目标终点则为客户端,这时 web 服务所监听的 IP 与端口反而变成了原点。
      由于 netfilter 才是真正的防火墙,它又是内核的一部分,所以如果我们想要对这些进出内核的数据包进行过滤,那我们就需要在内核中设置关卡,所有进出的报文都需要过这些关卡,符合检查条件的才能放行,所以在内核中就出现了 INPUTOUTPUT 关卡,而这些关卡 iptables 中准确的命名不叫关卡,而被称为(记住哦)

http://www.yeslab.net/Uploads/201706/5938eeffa5f48.png

      其实上面这个图并不是一个完整的链(关卡)图,因为客户端发来的报文访问的目的地址可能并不是本机,而是其他服务器设备,这时候就需要转发这些报文给其他服务器,所以 Linux 内核中会包含五个链(关卡),他们分别是 PREROUTINGINPUTOUTPUTFORWARD POSTROUTING
      【链】
      现在我们想象一下,这些关卡 iptables 中为什么被称作?我们知道防火墙的作用就在于对经过的报文匹配规则,然后执行对应的操作,所以当报文经过这些关卡时,必须匹配这个关卡上的规则,但这个关卡上可能有很多条规则,当我们把这些规则串到一个链条上时就形成了
      所以,我们把每一个关卡想象成如下图中的模样,每个关卡上挂着很多条的规则,这个关卡看上去是不是像条链子,而每个经过关卡的报文都要将这个条子上的所有规则匹配一遍,遇到匹配的规则就执行相应的操作。

http://www.yeslab.net/Uploads/201706/5938ef9c44f96.jpg

      【表】       

      好了,链上被设置了很多条的规则,而这些规则中又有很多相似的规则,那我们就可以把这些相似的规则都放在一起。比如,A类规则是专门用来做过滤的,B类规则是转用来修改报文的等。

      我们把具有相同功能的规则的集合叫做,不同功能的规则都放置在不同的表中进行管理,iptables 中定义了4种表,每种表对应不同的功能,而我们所需要定义的规则绝大部分(应该是所有)也都逃脱不了这4种功能的范围,所以我们必须先搞明白这4种表的功能。
      1Filter 表:负责过滤功能,也是用的最多的表;
      2Nat 表:网络地址转换功能;
      3Mangle 表:功能是拆解报文做出修改,并重新封装;
      4Raw 表:关闭 nat 表上启用的连接追踪机制(没怎么用过);
    【表与链的关系】
      在实际的应用中我们会发现某些链中注定了不会包含某类规则。
      那让我们来看看每个链(关卡)都有哪些能力,或者说来看下每个链上的规则都存在于哪些表中。
      PREROUTING 链上的规则都存在于哪些表中:
      如下图中所示 PREROUTING 链只拥有 nat 表、raw 表和 mangle 表所对应的功能,所以PREROUTING中的规则只能放在 nat表、raw 表和 mangle 表中。

http://www.yeslab.net/Uploads/201706/5938effaa083a.jpg

      根据 PREROUTING 链的思路我们来总结下每个链中的规则都存放于哪些表中(从链到表的对应关系)
      PREROUTING 链的规则可以存放于——raw 表、mangle 表和 nat 表中;
      INPUT 链的规则可以存放于——mangle 表、filter 表中;
      FORWARD 链中的规则可以存放于——mangle 表、filter 表中;
      OUTPUT 链中的规则可以存放于——raw 表、mangle 表、nat 表和 filter 表中;
      POSTROUTING 链中的规则可以存放于——mangle 表、nat 表中;
      但在我们的实际使用过程中,往往是通过作为操作入口,对规则进行定义的。上面这么介绍只是从关卡的角度比较好理解,但是为了便于实际使用的时候更加流畅的理解它们,我们还是要将的关系罗列出来。
      一般情况下我们会把定义为功能,把定义为钩子(从表到链的对应关系)
      Raw 表中的规则可以被使用的链:——PREROUTINGOUTPUT
      Mangle 表中的规则可以被使用的链:——PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING
      Nat 表中的规则可以被使用的链:——PREROUTINGOUTPUTPOSTROUTING
      Filter 表中的规则可以被使用的链:——INPUTFORWARDOUTPUT

      需要注意到是在同一个链上不同表是之间是有优先级的:Raw-->mangle-->nat-->filter

      为了更方便的管理,我们还可以在某个表里创建自定义链,将针对某个应用程序所设置的规则放置在这个自定义链中,但自定义链不能直接使用,只能被某个默认链当作动作去调用才起作用。这点其实我们可以理解链既然是内核中的固定的5个钩子,那你想随便在系统内核里放钩子是不行的。如果你想自己做一个钩子那就必须把这个小钩子挂在 iptables 定义好的钩子上才能被 iptables 使用。

http://www.yeslab.net/Uploads/201706/5938f19069c28.jpg

      数据包的流向过程】
      我们再来聊聊数据包是怎么通过 netfilter 这个安全框架的。
对于计算机收到的每个数据包,都从“PREROUTING”链进来,经过路由判断,如果是发送给本机的就送到“INPUT”链,然后发送给上层协议栈继续处理;OR,如果路由判断该数据包的目的地不是本机,那么就发送给“FORWARD”链,再经过路由判断这个包要从哪个网卡出去,然后再到“POSTROUTING”链将该包发送出去。
      对于计算机发送的每个数据包,都先进过“OUTPUT”链,经过路由判断从那个网卡出去,然后再到“POSTROUTING”链将该包发送出去。

http://www.yeslab.net/Uploads/201706/5938f1b7f3c23.jpg


      规则】
      规则就是根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功则由规则后面指定处理动作进行处理;
      匹配条件:
      匹配条件分为基本匹配条件和扩展匹配条件
      基本匹配条件就是以源地址或目标地址作为匹配的内容
      扩展匹配条件其实也是 netfilter框架中的一部分,只是匹配这些条件需要依赖特定的扩展模块(以后慢慢聊)
      处理动作:
      处理动作也分为基本动作和扩展动作两种,这里列举一些常用的处理动作先。
      ACCEPT :允许数据包通过;
      DROP:直接丢弃数据包;
      REJECT :拒绝数据包通过;
      SNAT:源地址转换;
      DNAT:目标地址转换;

      MASQUERADE:是SNAT的一种特殊形式(docker 的通信会使用到)

2018年8月14日 14:45
浏览量:0
收藏