设为首页收藏本站language→→ 语言切换

鸿鹄论坛

 找回密码
 论坛注册

QQ登录

先注册再绑定QQ

查看: 648|回复: 0
收起左侧

Linux安全—iptables(一)

[复制链接]
发表于 2017-6-9 18:33:45 | 显示全部楼层 |阅读模式
本帖最后由 yeslab官方 于 2017-6-9 18:34 编辑

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


                               
登录/注册后可看大图

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


                               
登录/注册后可看大图

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


                               
登录/注册后可看大图

      【表】      

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

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


                               
登录/注册后可看大图

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

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

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


                               
登录/注册后可看大图

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


                               
登录/注册后可看大图


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

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



                               
登录/注册后可看大图



您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2024-4-27 10:41 , Processed in 0.055435 second(s), 8 queries , Redis On.  

  Powered by Discuz!

  © 2001-2024 HH010.COM

快速回复 返回顶部 返回列表