Linux防火墙学习笔记 3

本次主要记录iptables的学习。

1.  通过前面的实验我们了解到,防火墙就是工作在主机或者网络边缘,对进出的报文按事先设定的规则进行检查,并对匹配的数据包作出处理的一组硬件或者软件,或者是软硬件的结合体。

2. iptables就是工作于新版Linux内核中的强大的数据包过滤软件,它主要由两个部分组成:①iptables:主要工作于用户空间,为用户提供一个编辑规则的接口。②netfilter:主要工作于内核空间,是内核的一部分,由一些过滤表组成。

 3. netfilter工作于系统的内核空间,最底层的工作,所以真正令过滤规则生效的并不是iptables而是netfilter,而iptables工作在netfileter之上,是一个让用户编写规则的工具。

4.netfilter是Linux内核中的一个框架,是以模块的形式存在于Linux中,采用模块化设计,让它拥有更好的扩充性和灵活性。iptables这个应用层的程序便是调用它的接口实现规则的修改。

5.Netfilter所设置的规则是存放在内存中的,而iptables通过Netfiler放出的内核接口ip_tables来对存放在内存中的Netfilter配置表进行修改,这个配置表主要是由tables、chains、target组成。

(图片来源:http://byrev.space/free/2015/09/13/iptables-ip-addresses-ranges/

该表主要有这四张:filter表、NAT表、mangle表、raw表。每个表中可用的chains不全相同。而target大多数是通用的。

filter表的认识:

filter 表的主要作用就是对数据包的过滤,访问控制。该表有以下三个规则链:

INPUT链:INPUT针对那些从外进入本地的包。

FORWARD链:针对所有不是本地产生的并且目的地不是本地的包,即本机只是负责转发。

OUTPUT链:OUTPUT是用来针对所有本地生成的包。

NAT表的认识:

NAT表主要用于修改数据包的报头的IP地址、端口号等信息,可以实现数据包伪装、平衡负载、端口转发和透明代理(NAT是一种把内部网络的IP地址转换为合法的公网IP地址)

mangle表:主要用于修改数据包的TOS(type of service)、TTL以及为数据包设置Mark标记、Qos调整以及策略路由等应用。

raw表:主要用于决定数据包是否被状态跟踪机制处理。

  当有数据包进入网卡时,数据包首先到 PREROUTING 链中,若是有表对应的表匹配,首先应该是到 raw 中,然后到 mangle 中最后到 NAT 的 PREROUTING 链中,PREROUTING 链中我们有机会在到内核的路由模块之前修改数据包的目的 IP ,然后内核的"路由模块"根据数据包目的 IP 以及内核中的路由表判断往哪里转发(注意,这个时候数据包的目的地址有可能已经被我们修改过了)
  若是该数据包的目的地址就是本机的地址,也就是该数据包就是发送给本地的,那么就会进入 INPUT 链,而进入 INPUT 链首先到 mangle 表中看看,然后到 filter 表中看看。通过之后便会发给本地的相应的程序
  本地相应的程序若是做出响应,产生新的数据包往外发送,数据包将进入到 OUTPUT 链,而在 OUTPUT 链中与 INPUT 链匹配表的顺序相同,依旧是首先查看 raw 表,然后查看 mangle 表,查看 NAT表 ,最后查看 filter 表,若是该数据包还能继续前进将会被发送到 POSTROUTING 链中。
  若是之前该数据包的目的地址并不是本机,只是把这里当中转站的话,就会将该数据包发给 FORWARD 链,在 FORWARD 链中,依旧先查看 mangle 表,然后查看 filter 表,若是该包还能进去前进则将进入 POSTROUTING 链中
在 POSTROUTING 链中首先查看 mangle 表,然后查看 NAT 表,因为他们可以在最后发送出去之前修改数据包中的源地址。
通过这些的层层把关,最后数据包便可以从网卡发送出去了
从数据包在内核中的走向我们可以得出以下几点,也是我们需要着重注意的几点:

iptables 中匹配规则的表示有顺序的,我们可以得出优先级的顺序是 raw 表> mangle 表> NAT 表> filter 表
iptables 中的表里面的链的规则也是有匹配顺序的,优先级的顺序是 PREROUTING > INPUT FORWARD OUTPUT POSTROUTING
我们在使用 iptables 的时候特别应该注意我们的规则顺序,在一个表中的规则是从上到下的读取,而一经查看到匹配的规则,便不会继续往下读取匹配,所以我们时常会遇到我们写了规则之后似乎并没有生效的情况便是这样。

  我们可以使用:sudo iptables -nL来查看当前Iptables中已经写下的规则。

从结果中我们也可以看出分布在每条链中的已经写入的规则。

我们可以通过iptables-save查看已经生效的规则。

猜你喜欢

转载自blog.csdn.net/weixin_40602516/article/details/81102191