侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

iptables(1)之防火墙与iptables相关概念

zze
zze
2020-02-19 / 0 评论 / 0 点赞 / 1091 阅读 / 7100 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

本篇文章转自 http://www.zsythink.net/archives/1199

防火墙相关概念

防火墙(Firewall)其实就是一个隔离工具组件,工作于主机或网络的边缘对于进出本主机或网络的报文根据事先定义好的检查规则做匹配检测,对于能够被规则所匹配到的报文做相应处理。

防火墙组件可以是硬件,也可以是软件,必要时甚至可以是硬软件结合。

  • 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高;
  • 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低;

从逻辑上来讲防火墙可分为主机防火墙和网络防火墙:

  • 主机防火墙:工作于主机边缘只为单个主机提供服务;
  • 网络防火墙:工作在网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网;

网络防火墙和主机防火墙并不冲突,可以理解为,网络防火墙主外(集体),主机防火墙主内(个人)。

防火墙机制就是由防火墙设计者在 TCP/IP 协议栈上精心选择了几个卡点(报文必然流经的位置)并在这些卡点上设定了钩子函数,然后我们再基于这个钩子函数定义我们的检查规则。

iptables

iptables 全称 “iptables/netfilter”,netfilter 是真正在内核空间实现防火墙核心功能的一个框架,而 iptables 只是工作在用户空间的一个管理(定义)防火墙规则的工具(应用程序),定义好的规则被 netfilter 加载到内存所使用而生效。

所以说,虽然我们常说使用 service iptables start 启动 iptables 服务,但是其实准确的来说,iptables 并不是一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。

netfilter/iptables(下文中简称为 iptables)组成 Linux 平台下的包过滤防火墙,与大多数的 Linux 软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

规则

我们知道 iptables 是按照规则来办事的,我们就来说说规则(rules),规则其实就是我们预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就如何处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如 TCP、UDP、ICMP)和服务类型(如 HTTP、FTP 和 SMTP)等。当数据包与规则匹配时,iptables 就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。而配置防火墙的主要工作就是添加、修改和删除这些规则。

这样说可能并不容易理解,我们来换个容易理解的角度,从头说起.

当客户端访问服务器的 Web 服务时,客户端发送报文到网卡,而 TCP/IP 协议栈是属于内核的一部分,所以,客户端的信息会通过内核的 TCP 协议传输到用户空间中的 Web 服务中,而此时,客户端报文的目标终点为 Web 服务所监听的套接字(IP:Port)上,当 Web 服务需要响应客户端请求时,Web 服务发出的响应报文的目标终点则为客户端,这个时候,Web 服务所监听的 IP 与端口反而变成起点。

我们说过,netfilter 才是真正的防火墙,它是内核的一部分,所以,如果我们想要防火墙能够达到“防火”的目的,则需要在内核中设置关卡,所有进出的报文都要通过这些卡点,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是,就出现了上述【防火墙相关概念】中的卡点,而这些卡点在 iptables 中不被称为“卡点”,而被称为"链"。

其实我们上面描述的场景并不完善,因为客户端发来的报文访问的目标地址可能并不是本机,而是其他服务器,当本机的内核支持 IP 转发(IP_FORWARD)时,我们可以将报文转发给其他服务器。也就是说,当我们启用了防火墙功能时,报文需要经过如下卡点,根据实际情况的不同,报文经过的链可能不同。如果报文需要转发,那么报文则不会经过 INPUT 链发往用户空间,而是直接在内核空间中经过 FORWARD 链和 POSTROUTING 链转发出去的。

netfilter工作模型

小结一下,上述链有如下几种:

  • PREROUTING:报文进入主机内核空间、选择路由之前时;
  • INPUT:报文进入本机用户空间时;
  • FORWARD:报文由本机内核空间转发时;
  • OUTPUT:报文由本机用户空间发出时;
  • POSTROUTING:做出路由决策后报文离开本机之前时;

报文的流向有如下几种:

  • 流入:进入本机内部的,经由链顺序为:PREROUTING > INPUT
  • 流出:从本机发出的,经由链顺序为:OUTPUT > POSTROUTING
  • 转发:由本机进来,又由本机出去的,经由链顺序为 PREROUTING > FORWARD > POSTROUTING

链的概念

现在,我们想象一下,这些“卡点”在 iptables 中为什么被称作“链”呢?我们知道,防火墙的作用就在于对经过的报文匹配“规则”,然后执行对应的“动作”,所以,当报文经过这些卡点的时候,则必须匹配这个卡点上的规则,但是,这个卡点上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了"链",每个经过这个"卡点"的报文,都要将这条"链"上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。

表的概念

我们再想想另外一个问题,我们对每个“链”上都放置了一串规则,但是这些规则有些很相似,比如,A 类规则都是对 IP 或者端口的过滤,B 类规则是修改报文,那么这个时候,我们是不是能把实现相同功能的规则放在一起呢,必须能的。
我们把具有相同功能的规则的集合叫做“表”,所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而 iptables 已经为我们定义了 4 种表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这 4 种功能的范围,所以,学习 iptables 之前,我们必须先搞明白每种表的作用。

iptables 为我们提供了如下规则的分类,或者说,iptables 为我们提供了如下“表”

  • filter:负责过滤、防火墙功能,内核模块为 iptables_filter
  • nat:network address translation,网络地址转换功能,内核模块为 iptables_nat
  • mangle:拆解报文后作出修改,然后封装报文,内核模块为 iptable_mangle
  • raw:关闭 nat 表上启用的连接追踪机制,内核模块为 iptables_raw

表链关系

但是我们需要注意的是,某些“链”中注定不会包含“某类规则”,就像某些“关卡”
天生就不具备某些功能一样,比如,“A 卡点”只负责打击陆地敌人,没有防空能力,“B 卡点”只负责打击空中敌人,没有防御步兵的能力,“C 卡点”可能比较 ?B,既能防空,也能防御陆地敌人,“D 关卡”最屌,海陆空都能防。

那让我们来看看,每个“卡点”都有哪些能力,或者说,让我们看看每个“链”
上的规则都存在于哪些“表”中。

image.png

由上图可知:

  • filter 表中的规则可定义在 INPUTFORWARDOUTPUT 链上;
  • nat 表中的规则可定义在 PREROUTING(DNAT)、OUTPUTPOSTROUTING(SNAT) 链上;
  • mangle 表中的规则可定义在 PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING 链上;
  • raw 表中的规则可定义在 PREROUTINGOUTPUT 链上;

其实我们还需要注意一点,因为数据包经过一个“链”的时候,会将当前链的所有规则都匹配一遍,但是匹配时总归要有顺序,我们应该一条一条的去匹配,而且我们说过,相同功能类型的规则会汇聚在一张“表”中,那么,哪些“表”中的规则会放在“链”的最前面执行呢,这时候就需要有一个优先级的问题。

无论在哪个链上表的优先级次序都为:raw > mangle > nat > filter

为了更方便的管理,我们还可以在某个表里面创建自定义链,将针对某个应用程序所设置的规则放置在这个自定义链中,但是自定义链接不能直接使用,只能被某个默认的链当做动作去调用才能起作用,我们可以这样想象,自定义链就是一段比较“短”的链子,这条“短”链子上的规则都是针对某个应用程序制定的,但是这条短的链子并不能直接使用,而是需要“焊接”在 iptables 默认定义链子上,才能被 iptables 使用,这就是为什么默认定义的“链”需要把“自定义链”当做“动作”去引用的原因。这是后话,后面再聊,在实际使用时我们即可更加的明白。

规则的概念

说了一圈又说回来了,在上述描述中我们一直在提规则,可是没有细说,现在说说它。

规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理。

那么我们来通俗的解释一下什么是 iptables 的规则,之前打过一个比方,每条“链”都是一个“卡点”,每个通过这个“卡点”的报文都要匹配这个卡点上的规则,如果匹配,则对报文进行对应的处理。
比如说,你我二人此刻就好像两个“报文”,你我二人此刻都要入卡,可是城主有命,只有器宇轩昂的人才能入卡,不符合此条件的人不能入卡,于是守关将士按照城主制定的“规则”,开始打量你我二人,最终,你顺利入关了,而我已被拒之门外,因为你符合“器宇轩昂”的标准,所以把你“放行”了,而我不符合标准,所以没有被放行。在这里,“器宇轩昂”就是一种“匹配条件”,”放行“就是一种“动作”,“匹配条件”与“动作”组成了规则。

匹配条件

匹配条件分为基本匹配条件与扩展匹配条件:

  • 基本匹配条件:源地址 IP(Source IP)、目标地址(Destination IP)都可以作为基本匹配条件。
  • 扩展匹配条件:除了上述的基本条件可以用于匹配,还有很多其他的条件可以用于匹配,这些条件泛称为扩展条件,这些扩展条件其实也是 netfilter 中的一部分,只是以模块的形式存在,如果想要使用这些条件,则需要依赖对应的扩展模块。

处理动作

处理动作指的是当链上的规则匹配到相应报文后所要做的动作,在 iptables 中被称为 target(这样说并不准确,我们暂且这样称呼),动作也可以分为基本动作和扩展动作。
此处列出一些常用的动作:

  • ACCEPT:允许数据包通过;
  • DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应;
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息;
  • SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题;
  • MASQUERADE:地址伪装,是 SNAT 的一种特殊形式,适用于动态的、临时会变的 IP 上。
  • DNAT:目标地址转换;
  • REDIRECT:端口重定向,即在本机做端口映射;
  • LOG:在 /var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配;
  • RETURN:返回调用链;
  • MARK:做防火墙标记;

target 甚至还可以是一个自定义链,指定由自定义链上的规则继续做匹配检查,这个后续再说。

规则的添加

iptables 的规则就是基于上述四表五链来定义的,所添加规则时有如下考量点:

  1. 要实现哪种功能:判断在哪张表上;
  2. 报文流经的路径:判断添加在哪个链上;

每个链上可定义多个功能,链上规则的次序,即为检查的次序,因此隐含一定的规则:

  1. 同类规则(访问同一应用),匹配范围小的放上面;
  2. 不同类规则(访问不同应用),匹配到报文频率较大的放上面;
  3. 将那些可由一条规则描述的多条规则合并为一个;
  4. 设置默认策略(默认允许或拒绝);

要想定义规则,可以使用 iptables 命令,它可以让我们编写完规则后立马将规则应用到 netfilter 上生效,这部分内容看下一节~

0

评论区