Linux基础服务 ·

防火墙的工作机制

Linux 的防火墙为什么功能是由 Linux 内核所提供,由于直接经过内核来处理,因此效能非常好! 不过,不同 内核版本所使用的防火墙软件是不一样的!

  • Version 2.0:使用 ipfwadm 这个防火墙机制;
  • Version 2.2:使用的是 ipchains 这个防火墙机制;
  • Version 2.4 与 2.6 :主要是使用 iptables 这个防火墙机制,不过在某些早期的 Version 2.4 版本的 distributions 当中,同时支持 ipchains (编译成为模块),好让用户仍然可以使用来自 2.2 版的 ipchains 的防火墙规划。不过,不建议在 2.4 以上的内核版本使用 ipchains !

因为不同的内核使用的防火墙机制不同,且支持的软件指令与语法也不相同,所以在 Linux 上头设定属于你自己的防火墙规则时,要先用 uname -r 追踪一下你的内核版本再说!不过 2004 年以后推出的 distributions 几乎都使用 kernel 2.6 版的内核!

报文流向

我们的 Linux 内核划分了内核空间与用户空间,而我们在互联网通讯的数据流会先通过内核空间的 TCP/IP 协议栈,然后才能被用户空间的用户进程发起调用,因此数据就会出现三种流向,如下图所示:

  1. 由网络到本机某进程的报文:PREROUTING --> INPUT
  2. 由网络到本机,然后本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
  3. 由本机的某进程发出报文:OUTPUT --> POSTROUTING

iptables/netfilter:

netfilter:防火墙框架,framework;位于内核空间;承载并生效规则;

Netfilter 是 Linux 2.4.x 引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的 hooks function(钩子函数)的管理机制。

由于会有三种数据报文的流向方式:入站、出站、转发,而这三种数据流向至少可以组合成五种方式,因此在数据流管控中 Netfilter 提供了五种 hooks function 。

prerouting(路由前):入站数据与转发数据流,这两个数据流分开前时。

input (入站):当入站数据与转发数据分开后,只剩入站数据时。

forward (转发):当入站数据与转发数据分开后,只剩转发数据时。

output (出站):由本机发起出站数据时。

postrouting(路由后):当出站数据与转发数据汇合之后时。


iptables:命令行工具程序,位于用户空间;规则管理工具;

iptables 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信 息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。


netfilter 处于内核空间提供 hooks function ,iptables 处于用户空间管理规则。netfilter与iptables结合在一起,就成为了我们的防火墙啦。

规则顺序

iptables 是利用封包过滤的机制, 所以他会分析封包的表头数据。根据表头数据与定义的『规则』来决定该封包是否可以进入主机或者是被丢弃。 意思就是说:『根据封包的分析资料 "比对" 你预先定义的规则内容, 若封包数据与规则内容相同则进行动作,否则就继续下一条规则的比对!』 重点在那个『比对与分析顺序』上。

举个简单的例子,假设我预先定义 10 条防火墙规则,那么当 Internet 来了一个封包想要进入我的主机, 那么防火墙是会由前到后、自上而下的一条一条规则进行匹配,若是匹配失败,则交由下一条进行匹配,若匹配成功则 执行预设策略,若所有规则都匹配失败,则根据预设放行策略给予权限。

当一个网络封包要进入到主机之前,会先经由 NetFilter 进行检查,那就是 iptables 的规则了。 检查通过则接受 (ACCEPT) 进入本机取得资源,如果检查不通过,则可能予以丢弃 (DROP) ! 上图中主要的目的在告知你:『规则是有顺序的』!例如当网络封包进入 Rule 1 的比对时, 如果比对结果符合 Rule 1 ,此时这个网络封包就会进行 Action 1 的动作,而不会理会后续的 Rule 2, Rule 3.... 等规则的分析了

而如果这个封包并不符合 Rule 1 的比对,那就会进入 Rule 2 的比对了!如此一个一个规则去进行比对就是了。 那如果所有的规则都不符合怎办?此时就会通过预设动作 (封包政策, Policy) 来决定这个封包的去向。 所以啦,当你的规则顺序排列错误时,就会产生很严重的错误了。 怎么说呢?让我们看看底下这个例子:

假设你的 Linux 主机提供了 WWW 的服务,那么自然就要针对 port 80 来启用通过的封包规则,但是你发现 IP 来源为 192.168.100.100 老是恶意的尝试入侵你的系统,所以你想要将该 IP 拒绝往来,最后,所有的非 WWW 的封包都给他丢弃,就这三个规则来说,你要如何设定防火墙检验顺序呢?

  1. Rule 1 先抵挡 192.168.100.100 ;
  2. Rule 2 再让要求 WWW 服务的封包通过;
  3. Rule 3 将所有的封包丢弃。

这样的排列顺序就能符合你的需求,不过,万一你的顺序排错了,变成:

  1. Rule 1 先让要求 WWW 服务的封包通过;
  2. Rule 2 再抵挡 192.168.100.100 ;
  3. Rule 3 将所有的封包丢弃。

此时,那个 192.168.100.100 『可以使用你的 WWW 服务』!只要他对你的主机送出 WWW 要求封包,就可以使用你的 WWW 功能了,因为你的规则顺序定义第一条就会让他通过,而不去考虑第二条规则!

iptables 的表格 (table) 与链 (chain)

在 iptables 中,其规则对应的 Netfilter 的 hooks function 被称为内置链,我们使用大写来表示,并且在 iptables 中用户还可以自定义链,需要用户手动将自定义链关联至指定的钩子才可生效。

事实上,上小结图示所列出的规则仅是 iptables 众多表格当中的一个链 (chain) 而已。 什么是链呢?这得由 iptables 的名称说起。为什么称为 ip"tables" 呢? 因为这个防火墙软件里面有多个表格 (table) ,每个表格都定义出自己的默认政策与规则, 且每个表格的用途都不相同。我们可以使用底下这张图来稍微了解一下:

在预设的情况下,咱们 Linux 的 iptables 至少有三个表格,包括管理本机进出的 filter 、管理后端主机 (防火墙内部的其他计算机) 的 nat 、管理特殊旗标使用的 mangle (较少使用) 。更有甚者,我们还可以自定义额外的链!

每个表格与其中链的用途分别是这样的:

  • filter (过滤器):主要跟进入 Linux 本机的封包有关,这个是预设的 table !
    • INPUT(入站):主要与想要进入 Linux 本机的封包有关;
    • OUTPUT(出站):主要与 Linux 本机所要送出的封包有关;
    • FORWARD(转发):这个与 Linux 本机比较没有关系, 他可以『转递封包』到后端的计算机中,与下列 nat table 相关性较高。
  • nat (网络地址转换):是 Network Address Translation 的缩写, 这个表格主要在进行来源与目的之 IP 或 port 的转换,与 Linux 本机较无关,主要与 Linux 主机后的局域网络内计算机较有相关。
    • PREROUTING(路由前):在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
    • POSTROUTING(路由后):在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
    • OUTPUT(出站):与发送出去的封包有关
  • mangle (拆解报文,做出修改,并重新封装):这个表格主要是与特殊的封包的路由旗标有关, 早期仅有 PREROUTING 及 OUTPUT 链,不过从 kernel 2.4.18 之后加入了 INPUT 及 FORWARD 链。 由于这个表格与特殊旗标相关性较高,所以像咱们这种单纯的环境当中,较少使用 mangle 这个表格。
  • raw:关闭nat表上启用的连接追踪机制;PREROUTING,OUTPUT。

所以说,如果你的 Linux 是作为 www 服务,那么要开放客户端对你的 www 要求有响应,就得要处理 filter 的 INPUT 链; 而如果你的 Linux 是作为局域网络的路由器,那么就得要分析 nat 的各个链以及 filter 的 FORWARD 链才行。也就是说, 其实各个表格的链结之间是有关系的!简单的关系可以由下图这么看:

由上图可以看出来,我们的 iptables 可以控制三种封包的流向:

  • 封包进入 Linux 主机使用资源 (路径 A): 在路由判断后确定是向 Linux 主机要求数据的封包,主要就会通过 filter 的 INPUT 链来进行控管;
  • 封包经由 Linux 主机的转递,没有使用主机资源,而是向后端主机流动 (路径 B): 在路由判断之前进行封包表头的修订作业后,发现到封包主要是要通过防火墙而去后端,此时封包就会通过路径 B 来跑动。 也就是说,该封包的目标并非我们的 Linux 本机。主要经过的链是 filter 的 FORWARD 以及 nat 的 POSTROUTING, PREROUTING。
  • 封包由 Linux 本机发送出去 (路径 C): 例如响应客户端的要求,或者是 Linux 本机主动送出的封包,都是通过路径 C 来跑的。先是通过路由判断, 决定了输出的路径后,再通过 filter 的 OUTPUT 链来传送的!当然,最终还是会经过 nat 的 POSTROUTING 链。

由于 mangle 这个表格很少被使用,如果将图 9.3-3 的 mangle 拿掉的话,那就容易看的多了:

通过上图就可以更轻松的了解到,事实上与本机最有关的其实是 filter 这个表格内的 INPUT 与 OUTPUT 这两条链,如果你的 iptables 只是用来保护 Linux 主机本身的话,那 nat 的规则根本就不需要理他,直接设定为开放即可。

不过,如果你的防火墙事实上是用来管制 LAN 内的其他主机的话,那么你就必须要再针对 filter 的 FORWARD 这条链,还有 nat 的 PREROUTING, POSTROUTING 以及 OUTPUT 进行额外的规则订定才行。 nat 表格的使用需要很清晰的路由概念才能够设定的好。

小结:

优先级次序(由高而低):
raw --> mangle --> nat --> filter

功能<-->钩子:
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT

参与评论