当前位置: 首页 > 科技观察

Linux防火墙Iptables的概念(附图文)

时间:2023-03-21 18:18:20 科技观察

为什么要学习Linux防火墙?当你的公司出于安全原因想要使用防火墙,而各大云厂商的云防火墙和硬件防火墙都极其昂贵,出于成本考虑,此时Linux防火墙是最好的解决方案。如果你对防护要求高且复杂,也可以考虑使用开源的WAF,比如OpenResty、OpenWAF等,这里就不过多描述了,大家自行google。.Docker底层的网络转发是通过Linux内核模块netfilter/iptables,以及流行的编排工具Kubernetes的各种网络插件来完成的。如果对iptables的理解不够深入,操作不熟练,那么在排查网络和路由问题的时候,难免吃力。所以学好netfilter/iptables一定会事半功倍。什么是netfilter/iptables?netfilter/iptables是一款工作在Linux下的免费防火墙,完成解包、过滤、打包、重定向、网络地址转换(NAT)等功能。与各大厂商昂贵的硬件防火墙相比,是目前最完善、最稳定的防火墙解决方案。Linux的iptables只是作为内核netfilter的代理,转储规则,位于内核空间的netfilter模块才是真正完成安全保护功能的。iptables只是作为记录、更新、删除用户操作规则的工具。iptables的核心是四表五链。所有的规则动作都是基于四表五链来运行内核模块netfilter来完成工作的。对于ubuntu的ufw,是基于一层iptables的封装及其友好的操作命令,将在Linux防火墙iptablesforKubernetes第二章进行扩展。为了更好的理解iptables的原理和实践,以演示案例的形式介绍Kubernetes,以图文形式说明iptables是如何一步步完成Kubernetes中的工作的。本文主要以图文形式讲解iptables的四表五链对应关系、工作过程及相关术语,以了解iptables的整体概念。iptables的基础知识我们都知道iptables是按照规则来工作的。规则实际上是运营商预定义的条件。规则的大致定义是:“如果数据包满足条件,则对相应的数据进行操作”。这些规则存储在内核空间的数据包过滤表中。这些规则包括源地址、目的地址、源端口、目的端口、传输协议(如ICMP/UDP/TCP)和服务协议(HTTP/FTP/SSH)等。当数据包符合规则时,iptables会处理根据规则定义的条件对相应的数据包进行accept/rejct/drop等操作,用于添加、修改、删除防火墙规则。仅仅通过上面的理解netfilter/iptables基本是不可能的,因为iptables的抽象层次还是很高的。为了更好的理解netfilter/iptables,我们简单举个例子来理解。当客户端访问服务器的一个服务时,客户端首先向网卡发送一个数据包,TCP/IP协议栈是内核的一部分,客户端信息会通过TCP协议传输到用户空间内核(用户态),此时客户端数据包的目的地址为服务监听的套接字IP地址:端口。当服务响应客户端的请求时,响应数据包的目的地址为客户端,即目标地址转换为源地址。前面已经提到,netfilter是防火墙的核心工作模块。它在Linux内核中工作。如果想让防火墙实现防护功能,需要在内核中为netfilter配置相应的拦截规则,可以理解为检查点。所有传入和传出的数据包都必须通过检查点。经规则筛选后,符合规则的数据包被释放,被规则拒绝的数据包被拦截。这里,有输入和输出的概念。iptables中的名词是链。是四表五链中五链中的第二个。对于四表五链,后面会详细说明。以上描述只是逻辑的抽象表达,因为发起方可能不是客户端,而是其他服务器。本机开启ip_forward功能后,具有路由转发功能。这时iptables的四张表会在五个链中使用PREROUTING、FORWARD、POSTROUTING。启用防火墙后,数据包会经过以下几个步骤完成,其经过的链条也会根据实际场景的变化而变化。当数据报文不需要转发时,经过服务进程处理后进入输入链到达用户空间,然后输出链通过postrouting链返回目标地址。如果数据报文需要转发,则直接通过内核中的转发链完成转发动作,并通过输出链直接将数据报文发送到目标地址。从上图可以看出,四表五链中五链的完整工作流程。从当前主机转发数据包:prerouting–>forward–>postrouting进入当前主机,到达用户空间的服务进程数据包:prerouting–>input。当前主机中用户空间服务进程处理的数据包:output–>postrouting什么是链?从上面我们了解到,iptables会对传入的数据包进行规则匹配,然后进行相应的操作。当数据包经过一个检查点时,必须匹配当前检查点的规则,每个检查点不是一条规则,而是由多条规则组成。当应用程序执行完所有规则后,就形成了一条链。经过每条链的数据包会依次匹配相应的规则,对满足条件的进行相应的操作,如下图所示。什么是桌子?通过上面,我们了解了什么是链,也知道了每条链是为n+1条规则匹配处理数据包,所以我们现在要实现另外一个功能,比如rule1是修改数据报文,rule2是开放或限制IP端口。这时候我们就用到了iptables中的表功能。iptables的表其实就是对不同功能的规则进行分类管理,而这个功能就是我们上面说的四表五链中的四表。所有规则都通过以下四个表进行分类和管理。filter负责过滤功能。模块:iptables_filternat网络地址转换。模块:iptable_natmangle对数据包进行拆解、修改、重新打包;module:iptable_mangleraw禁用在nat表上启用的连接跟踪机制;module:iptable_raw链和表的关系首先,有些链不是万能的。它可能没有你需要的功能,所以这个时候,你必须了解每条链上的规则和每张表的对应关系。如下图所示,我们来看看过滤表支持哪些链。上图其实是说fillertable的功能可以应用到仅限于inputforwardoutput的链上。综上所述,我们可以总结出表链之间的关系:可以应用Filter的链是INPUT、FORWARD、OUTPUT。Nat可以应用于OUTPUT、PREROUTING、POSTROUTING链。Mangle可用于应用于所有链:INPUT、FORWARD、OUTPUT、PREROUTING、POSTROUTING。可以应用于Raw的chain有OUTPUT和PREROUTING,如下图:INPUT可以调用的表:mangle、filterOUTPUT可以调用的表:raw、mangle、nat、filterPREROUTING可以调用的表:raw、mangle、natFORWARD可以调用的表:mangle、filter。POSTROUTING:mangle,nat可以调用的表如下图所示:其实我们需要注意一点,因为当一个数据包经过一个“链”的时候,它会匹配所有的规则当前链,但是匹配的时候总要有顺序的,我们应该是一个一个匹配的,而且我们说了相同函数类型的规则会聚集在一个“表”中,那么“表”中有哪些规则会在“链”的最前面执行,这时候就需要有一个优先级的问题,我们也用预路由“链”来举例说明。另外需要注意的是,数据报文在经过链的时候,会依次匹配所有的规则,所以这里就会有优先级的问题。链前会执行哪些表规则?谁先被处决?请看下面:上面提到PREROUTING链可以被这三个表调用,其优先级为raw-->mangle-->nat。但是我们知道有四个iptables表。当它们同时应用到一个链上时,优先级如下图所示:但是,正如上面所说,某些链的规则不能应用到某些表上,所以你必须知道,只有四个表可以调用的链是OUTPUT链。为了方便管理,可以在表中自定义链,把自己需要的规则放在这个自定义链中,但是需要注意的是这个链不能被表直接调用,而是在一个默认链中引用,也就是说,它只有在配置为五个链之一中的动作时才会生效。iptables工作流程下图为数据包经过iptables的流程:上图描述的工作流程:根据路由匹配数据包发送给服务进程的数据包由客户端发送给网卡,然后由网卡传给内核态的prerouting链,从上到下依次匹配raw、mangle、nat表中的规则。数据包处理后,通过路由判断确定发送目的地址为本机服务进程,进入输入链。在mangle、nat、filter表中从上到下匹配规则,然后对数据包进行处理,然后交给用户空间的服务进程处理数据包。数据包在用户空间的服务进程处理时,以本地机器为源地址,通过输出链按照从上到下的顺序匹配数据包到raw、mangle、nat、filter路由判断,对数据包进行处理,发送到postrouting链,按照mangle和nat表从上到下的顺序匹配规则,根据匹配规则对数据包进行最终封装处理,离开内核空间,通过网卡返回客户端。根据路由匹配,发送到其他服务器的数据包由客户端发送到网卡,然后在内核态进入预路由链,在raw、mangle、nat表中进行规则匹配从上到下,数据包处理完成后,经过路由判断,如果不是本地服务进程发送的数据包,forward链会从上到下匹配mangle和filter链中的规则,并处理数据包。当forwanrd链处理完数据包后,发送到postrouting链,从上到下在mangle和nat表中匹配规则,最后封装数据包,离开内核空间,发送到其他服务器通过网卡。当你对上面的图和流程有了深入的了解之后,这时候你就已经完全掌握了iptables的工作流程,在后续的实际操作中就可以灵活运用各种规则了。什么是规则?上面四表五链提到的规则简单说了之后,再详细说一下什么是规则。一个规则其实就是按照既定的条件去匹配每条链所传递的数据。当消息匹配到相应的规则时,相应的操作将被匹配规则配置的相关动作处理。其实简单的说,正如诉求所说,iptables的每条链都是一个checkpoint,每一个经过checkpoint的数据包都要经过这里的规则处理,如果匹配上,数据包就会进行相应的操作.例如:此时在规则配置中,访问规则是对80端口开放的,而不是对443端口开放的。此时,当两个标记的数据包进入检查点时,80会匹配相应的规则并放行。到目标地址,经过数据拆包、封装等处理后返回给客户端。而443不在发布规则中,会被丢弃。这里的80和443是规则中的条件,放行和拒绝是规则匹配后对应的动作,也就是说条件+动作构成对应的规则。匹配条件匹配条件分为基本匹配条件和扩展匹配条件。1.基本匹配条件源地址SourceIP目的地址DestinationIP2。扩展匹配条件:除了基本匹配条件外,还有名词叫扩展匹配条件,它是netfilter的一部分,只以模块的形式存在。如果要使用相应的扩展匹配条件,需要依赖相应的扩展模块。SourceaddressSourceIP:PortDestinationaddressDestinationIP:PortProcessingActionsiptables中处理动作的术语是target,动作分为基本动作和扩展动作。ACCEPT允许数据包通过。DROP直接丢弃数据包,不返回任何响应信息,只响应超时时间。REJECT拒绝数据包通过,必要时会给数据发送方一个响应信息,客户端刚请求完就会收到拒绝信息。SNAT对源地址进行转换,用于内网用户使用同一个公网地址访问Internet。MASQUERADE是SNAT的一种特殊形式,适用于动态IP。DNAT对象地址转换。REDIRECT被转发并映射到本地端口。LOG只记录对应数据包投递过程的日志,不对数据包做任何动作,用于审计和DEBUG。本文以图文形式详细讲解了iptables中四张表和五张链接的对应关系及工作流程,并对相关术语进行了简要说明。看完的同学对iptables的概念有了基本的了解。接下来在Linux防火墙iptables的Kubernetes章节中,将Kubernetes作为案例进行介绍,让大家对iptables有更详细、更深入的了解。这篇文章提到了内核态和用户态进程切换涉及的知识点,但没有深入讲解。后面会有单独的文章以图文形式由浅入深讲解内核,敬请期待。在基于DevOps思想的自动化运维变革的道路上,我们一直在砥砺前行,没有停下脚步。本文转载自微信公众号《Kubernetes技术栈》,可通过以下二维码关注。转载本文请联系Kubernetes技术栈公众号。