Linux 防火墙 iptables 之概念篇(图文并茂)

语言: CN / TW / HK
  • 为什么要学Linux防火墙?当你所在公司,出于安全原因,想上防火墙,而各大云厂商云防火墙和硬件防火墙费用极其昂贵,出于成本考虑,此时Linux的防火墙就是最好的解决方案,如果有较高且复杂的防护需求时,也可以考虑上开源的WAF,如OpenResty、OpenWAF等,这里就不过多叙述了,可以自行谷歌了解。

  • Docker底层的网络转发是通过Linux内核模块netfilter/iptables完成工作的,以及流行编排工具Kubernetes的各个网络插件也是,如果对iptables的理解不够深入以及操作不熟练的话,那么在排查网络、路由问题的时候,必然会困难重重。所以学好netfilter/iptables,必将事半功倍。

netfilter/iptables是什么?

netfilter/iptables 是在Linux下工作的免费防火墙,完成拆包、过滤、封包、重定向、网络地址转换(NAT)等功能。相比各大厂商昂贵的硬件防火墙来比,它是当前最完善最稳定的防火墙解决方案。

Linux的iptables只是作为内核netfilter的代理,转储rule,真正完成安全防护功能的是位于内核空间中的netfilter模块。

iptables只是作为用户操作的一个记录、更新、删除rule的使用工具。

iptables中最核心的是 四表五链 ,所有rule动作都是基于  四表五链 操作内核模块netfilter完成工作的。

对于ubuntu的ufw,是基于iptables封装的一层及其友好的操作命令,会在第二篇 Linux防火墙iptables之Kubernetes篇 中,做延伸讲解。

为了更好地理解iptables原理与实践,引入 Kubernetes 作为演示案例,以图文形式循序渐进地来讲解iptables在 Kubernetes 中是怎样完成工作的。

此篇主要是通过图文形式讲解iptables的四表五链对应关系、工作过程以及相关名词,用于了解iptables的整体概念。

iptables 基础

我们都知道iptables是按照rule来工作的,rule其实就是操作人员预定义的条件,rule一般的定义为: "如果数据包符合条件,就对对应的数据进行操作"。rule存放在内核空间的信息包filter表中,这些规则包括了源地址、目标地址、源端口、目标端口、传输协议(如ICMP/UDP/TCP)与服务协议(HTTP/FTP/SSH)等。当数据包与rule匹配时,iptables会根据rule定义的条件来处理对应的数据包,比如accept/rejct/drop等操作,用于对防火墙rule的添加、修改、删除等。

如果仅仅通过上述就可以理解netfilter/iptables,那是基本不可能的,因为iptables的抽象层级还是非常高的,为了能很好的理解netfilter/iptables,我们简单的举个例子来理解。

当客户端访问服务器的某个服务的时候,首先是客户端发送数据报文到网卡,而TCP/IP协议栈是属于内核的一部分,客户端的信息会通过内核的TCP协议传输给用户空间(用户态)的某服务,此时,客户端的数据报文到目标地址为服务所监听的套接字IP地址:端口上,服务响应客户端请求时,会发出响应数据报文的目标地址是客户端,也就是说目标地址转换成了源地址。上面已经提过,netfilter是防火墙的核心工作模块,工作在Linux内核中,想让防火墙达到防护的功能,就需要对内核中的netfilter配置对应的拦截rule,可以理解为检查站。所有进出的数据报文必须经过检查站,经过rule筛选后,放行符合rule的数据包,拦截拒绝rule的数据包,这里面就有了 input 和  output 的概念 ,在iptables中的名词是_链_,也就是  四表五链 中的五链之二,对于  四表五链 ,后面会详细的讲解。

上面的描述仅仅是逻辑的一种抽象表达,因为发起者也有可能不是客户端而是其他的服务器,当本机开启了ip_forward功能,就具备了路由转发功能,这个时候就会用到iptables 四表五链 中的  PREROUTINGFORWARDPOSTROUTING

当开启了防火墙的时候,数据报文会经过以下的步骤完成,根据实际场景的改变,经过的链也会有所改变。

当数据报文不需要转发的时候,会进入 input 链到用户空间经过服务进程处理完成后,然后再由 output 链通过 postrouting 链返回目标地址。如果数据报文需要转发的时候,会直接在内核中通过 forward 链完成转发动作,经由 output 链直接将数据报文送向目标地址。

由上图可以看出来, 四表五链 中的五链完整的的工作过程。

  • 由当前主机转发数据报文: prerouting –> forward –> postrouting

  • 进入当前主机,到达用户空间的服务进程数据报文: prerouting –> input

  • 由当前主机中的用户空间服务进程处理的数据报文: output –> postrouting

什么是链?

通过上述已经了解到,iptables是对经过的数据报文匹配rule,然后执行对应的操作,当数据报文经过检查站的时候,必须匹配当前检查站的rule,而每个检查站中存在的不是一个rule,而是由多个rule组成,当所有rule被应用执行的时候,就形成了链。每个链经过的数据报文都会以顺序匹配对应rule,对符合条件的做对应的操作,如下图所示。

什么是表?

通过上述已经了解到了什么是链,而且也了解到每个链是对n+1的rule做匹配与数据报文处理,那么我们现在想要实现另外一个功能,比如rule1是修改数据报文,rule2是对IP端口做开放或限制,这个时候,我们就用到了iptables中的 功能。iptables的 其实就是把不同功能的rule做了分类管理,而这个功能就是我们上面提到的 四表五链 中的四表,所有的rule都是由以下的四表归类管理。

filter 负责过滤功能。

模块: iptables_filter

nat 网络地址转换。

模块:iptable_nat

mangle 对数据报文拆解、修改、重新封装的功能;

模块: iptable_mangle

raw 关闭nat表上启用的连接追踪机制

模块: iptable_raw

链与表的关系

首先要知道,某些链并不是万能的,它可能不具备你需要的功能,所以这个时候,必须要了解每个链上的rule与每个表的对应关系。

如下图,来看看filter表支持哪些链?

上图的意思其实就是说 filler表 所具备的功能可以被应用的链被限定为 input foward output

综上所述,我们可以总结一下表链之间的关系:

Filter 可以被应用的链为 INPUT、FORWARD、OUTPUT。

Nat可以被应用的链为OUTPUT、PREROUTING、POSTROUTING

Mangle 可以被应用在所有链:INPUT、FORWARD、OUTPUT、PREROUTING、POSTROUTING。

Raw可以被应用的链为OUTPUT、PREROUTING

如下图:

为了更好的理解,换个思路再理解一下对应关系,哪些链的rule可以被哪些表调用?

INPUT 可以调用的表: mangle、filter

OUTPUT 可以调用的表: raw、mangle、nat、filter

PREROUTING 可以调用的表: raw、mangle、nat

FORWARD 可以调用的表: mangle、filter。

POSTROUTING 可以调用的表: mangle、nat

如下图:

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

另外需要注意的是,数据报文经过链的时候,会顺序匹配所有rule,那么这里就会涉及到优先级的问题,哪些表的rule会先于链被执行?到底谁先被执行?

请看下图:

如上所述,PREROUTING链可以被调用的是这三张表,其优先级是 raw -->  mangle -->  nat

但是我们知道iptables的表是四张,当他们同时被应用在一个链的时候,优先级如下图:

但是,如上述所言,某些链的rule不能被应用到某些表,所以,你要知道,当前能被四表调用的链只有OUTPUT链。

为了便于管理,可以在表中自定义链,把自己需要的rule放在这个自定义链中,但是要注意的是,这个链不能被表直接调用,而是在某个默认链将这个链引用,也就是在五链之一中的某个链中配置成动作才会生效。

iptables工作流程

下图是数据包通过iptables的流程:

上图描述的工作流程:

根据路由匹配发送给服务进程的数据包

  1. 数据包由客户端发送到网卡,然后由网卡传入内核态中的 prerouting链 ,在 raw、mangle、nat表 由上到下的顺序对rule进行匹配,对数据包处理完成后,经过路由判断,确定发送目标地址为本机的服务进程,进入 input 链,在 mangle、nat、filter表 由上到下的顺序对rule进行匹配,然后对数据包进行处理后,交由用户空间的服务进程对数据包进行处理。
  2. 当数据包在用户空间的服务进程处理完成后,由本机作为源地址根据路由判断将数据包经由 output 链对 raw、mangle、nat、filter 由上到下的顺序对rule进行匹配,对数据包进行处理,送由 postrouting链 ,在 mangle、nat表 由上到下的顺序对rule进行匹配,根据匹配rule对数据包进行最后的封装处理,离开内核空间,经由网卡,返回给客户端。

根据路由匹配发送给其他服务器的数据包

  1. 数据包由客户端发送到网卡,然后传入内核态中的 prerouting链 ,在 raw、mangle、nat表 由上到下的顺序对rule进行匹配,对数据包处理完成后,经过路由判断,如果不是发送本机的服务进程的数据包,则由 forward链 ,在 mangle、filter链 由上到下的顺序对rule进行匹配,对数据包进行处理。
  2. forwanrd链 对数据包处理完成后,送至 postrouting链 ,在 mangle、nat表 由上到下的顺序对rule进行匹配,对数据包进行最后封装处理,离开内核空间,经由网卡,发送给其他服务器。

当把上述图以及流程理解透彻了,这个时候,你对iptables的工作流程已经完全掌握了,在后续的实践操作中可以灵活的应用各种rule了。

什么是rule?

在上述中四表五链中提的rule的时候,都是简单的一带而过,现在我们来详细的说下什么是rule,rule其实就是根据既定条件匹配每个链经过的数据报文,当匹配到对应的rule以后,则由匹配的rule配置好的相关动作来处理对应的操作。

其实简单来讲,就如上述所言iptables每条链都是一个检查站,每个通过检查站的数据报文都要在此处经过rule规则处理一遍,如果匹配,则对数据报文进行对应的操作。比如:此时rule配置中对80端口开放了通行规则,而没有对443开放,这个时候俩个带有标记的数据报文在进入检查站的时候,80会匹配对应的规则而被放行,进入到目标地址,经过数据的拆包、封装等处理之后返回给客户端。而443不在放行规则内,则会被丢弃。这里的80、443是rule当中的一种条件,而放行、拒绝则是rule匹配之后对应的动作,也就是说,条件+动作组成了相应的规则。

匹配条件

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

  1. 基本匹配条件

源地址Source IP

目标地址Destination IP

  1. 扩展匹配条件:

除了基本匹配条件之外,还有名词为扩展匹配条件,这些属于netfilter中的一部分,只是以模块形式存在,如果想使用对应的扩展匹配条件,需要依赖对应的扩展模块。

源地址Source IP:Port

目标地址Destination IP:Port

处理动作

处理动作在iptables中名词为target,动作分为基本动作和扩展动作。

ACCEPT 允许数据包通过。

DROP 直接丢弃数据包,不返回任何回应信息,只对超时时间才有回应信息。

REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。

SNAT 对源地址做出转换,用于内网用户用同一个公网地址上网。

MASQUERADE 是SNAT的一种特殊形式,适用于动态的IP上。

DNAT 目标地址转换。

REDIRECT 在本机端口转发、映射。

LOG 只是记录对应的数据包传递过程的日志,不对数据报文做任何动作,用于审计与DEBUG。

  • 本文对iptables中四表五链的对应关系、工作流程通过图文的形式做了详细讲解,也对相关名词做了简要的描述,读完的同学,对iptables的概念基本了解清楚了,下一篇  Linux防火墙iptables之Kubernetes篇 中,会引入 Kubernetes 作为案例使大家对 iptables 有更为详细深入的理解。
  • 本文提及到内核态到用户态进程之间切换涉及到的知识点,并没有深入讲解,后面会单独出一个对内核以图文方式由浅入深讲解的文章,敬请期待。