介绍
防火墙是可以被配置为保护服务器和基础设施的重要工具。 在Linux生态系统iptables
是一种广泛使用的防火墙工具,与内核的接口netfilter
包过滤框架。 对于不了解这些系统架构的用户和管理员,创建可靠的防火墙策略可能会令人生畏,不仅是由于语法的挑战,而且还因为框架中存在大量的相互关联的部分。
在本指南中,我们将潜入iptables
架构,使其成为谁需要建立自己的防火墙策略的用户更容易理解的目的。 我们将讨论如何iptables
与之交互netfilter
和各个组成部分是如何组合在一起提供一个全面的过滤和重整制度。
什么是IPTables和Netfilter?
在Linux中最常用的基本防火墙软件被称为iptables
。 在iptables
防火墙的工作原理是在Linux内核的网络包过滤挂钩互动。 这些内核钩子被称为netfilter
框架。
进入网络系统(传入或传出)的每个数据包将在进行时触发这些钩子,允许注册这些钩子的程序与关键点的流量进行交互。 与相关联的内核模块iptables
,以便在这些钩子注册,以确保通信符合由防火墙规则中规定的条件。
Netfilter挂钩
有五个netfilter
程序可以用注册挂钩。 当数据包通过时,它们将触发已经注册到这些钩子的内核模块。 数据包将触发的挂钩取决于数据包是传入还是传出,数据包的目的地,以及数据包是否在上一点丢弃或拒绝。
以下钩子表示网络中的各种明确定义的点:
-
NF_IP_PRE_ROUTING
:这个钩子将被任何传入流量很快进入网络后触发。 在做出关于在哪里发送分组的任何路由决定之前处理该钩子。 -
NF_IP_LOCAL_IN
:此挂钩后,如果将数据包发往本地系统中的传入数据包已经排到触发。 -
NF_IP_FORWARD
:后如果分组是要被转发到另一主机输入分组已经排到该钩子被触发。 -
NF_IP_LOCAL_OUT
:这个钩子被任何本地创建的对外交通,将触发它击中了网络。 -
NF_IP_POST_ROUTING
:路由已经发生并且只是被放出来上线后前这个钩子被任何传出或转发流量触发。
希望在这些钩子上注册的内核模块必须提供优先级编号以帮助确定当钩子被触发时它们被调用的顺序。 这提供了用于以确定性排序连接到每个挂钩的多个模块(或相同模块的多个实例)的手段。 每个模块将依次调用,并且将返回一个决定向netfilter
处理后框架,指示应如何处理该分组来完成。
IPTables表和链
在iptables
防火墙使用表格来组织规则。 这些表根据它们用于做出的决定的类型来分类规则。 例如,如果一个规则与网络地址转换交易,将被放入nat
表。 如果规则被用来决定是否允许数据包继续到它的目的地,它可能会被添加到filter
表。
在每个iptables
表,规则进一步内的独立“枷锁”组织。 虽然表由其所持有的规则的总体目标的定义,内建链代表netfilter
这触发它们挂钩。 链基本上确定何时规则将进行评估。
正如你所看到的,内建链的名称镜像的名字netfilter
它们所关联挂钩:
-
PREROUTING
:由触发NF_IP_PRE_ROUTING
钩子。 -
INPUT
:由触发NF_IP_LOCAL_IN
挂钩。 -
FORWARD
:由触发NF_IP_FORWARD
挂钩。 -
OUTPUT
:由触发NF_IP_LOCAL_OUT
钩子。 -
POSTROUTING
:由触发NF_IP_POST_ROUTING
钩子。
链接允许管理员控制分组的传递路径中的规则将被评估的位置。 由于每个表具有多个链,因此可以在处理中的多个点处施加表的影响。 因为某些类型的决策只有在网络栈的某些点才有意义,每个表都不会有一个链注册到每个内核钩子。
有只有五个netfilter
内核钩,所以从多个表链在每个钩子的登记。 例如,三表有PREROUTING
链。 当这些链的相关注册NF_IP_PRE_ROUTING
钩,他们规定,决定什么样的顺序每个表的优先PREROUTING
链被调用。 每个的优先级最高的内部规则PREROUTING
链移动到下一之前顺序地评估PREROUTING
链。 我们将看一下每个链的特定顺序。
哪些表可用?
让我们退一步了一会儿,看看是不同的表iptables
提供。 这些表示按照关注区域组织的用于评估分组的不同的规则集。
过滤表
过滤表是在最广泛使用的表中的一个iptables
。 该filter
表用于做出关于是否允许分组继续到其预期目的地或拒绝其请求的决定。 在防火墙说法中,这被称为“过滤”数据包。 此表提供了人们在讨论防火墙时想到的大量功能。
NAT表
的nat
表用于执行网络地址转换规则。 当分组进入网络栈时,该表中的规则将确定是否以及如何修改分组的源或目的地地址,以便影响分组和任何响应业务被路由的方式。 当直接访问不可能时,这通常用于将数据包路由到网络。
Mangle表
的mangle
表用于改变各种方式的数据包的IP报头。 例如,您可以调整数据包的TTL(生存时间)值,延长或缩短数据包可以承受的有效网络跳数。 其他IP头可以以类似的方式改变。
该表还可以在分组上放置内部内核“标记”,以便在其他表和其他网络工具中进一步处理。 此标记不接触实际数据包,但将标记添加到数据包的内核表示形式。
原始表
在iptables
防火墙是有状态的,这意味着数据包的问候评估,以他们的关系以前的数据包。 建在顶部的连接跟踪功能netfilter
框架允许iptables
,以查看数据包作为正在进行的连接的一部分或会话而不是作为分立的,不相关的分组的流。 连接跟踪逻辑通常在分组到达网络接口之后很快应用。
在raw
表有一个定义非常狭窄的功能。 其唯一的目的是提供用于标记分组以便选择退出连接跟踪的机制。
安全表
该security
表用于设置数据包内部的SELinux安全环境标志,这将影响到SELinux的系统或其他系统如何能够解释SELinux的安全上下文处理的数据包。 这些标记可以基于每个分组或每个连接来应用。
在每个表中实现哪些链?
我们已经分开谈论了表和链。 让我们来看看每个表中有哪些链。 在本讨论中暗示关于注册到相同钩的链的评估顺序的进一步讨论。 如果三个表有PREROUTING
链,其顺序他们评估?
下表表示每个内可用的链iptables
左到右读取时表。 例如,我们可以告诉大家, raw
表有两个PREROUTING
和OUTPUT
链。 当从顶部至底部阅读,它也显示在其中相关联的时各链被称为顺序netfilter
钩子被触发。
一些事情应该注意。 在下面的表示中, nat
表已之间分开DNAT
操作(那些改变的分组的目的地地址)和SNAT
操作(那些改变的源地址),以便更清楚地显示其排序。 我们还包括表示进行路由决策以及启用连接跟踪的点的行,以便更全面地查看发生的进程:
表↓/链 | PREROUTING | INPUT | 前锋 | 输出 | POSTROUTING |
---|---|---|---|---|---|
(路由决策) | ✓ | ||||
生的 | ✓ | ✓ | |||
(启用连接跟踪) | ✓ | ✓ | |||
。 | ✓ | ✓ | ✓ | ✓ | ✓ |
NAT(DNAT) | ✓ | ✓ | |||
(路由决策) | ✓ | ✓ | |||
过滤 | ✓ | ✓ | ✓ | ||
安全 | ✓ | ✓ | ✓ | ||
NAT(SNAT) | ✓ | ✓ |
作为分组触发netfilter
钩,因为它们是在表中从顶部至底部上面列出相关联的链将被处理。 数据包将触发的钩子(列)取决于它是传入或传出数据包,进行的路由决策以及数据包是否通过过滤标准。
某些事件将导致在处理期间跳过表的链。 例如,只有连接中的第一个数据包将根据NAT规则进行评估。 任何nat
的第一分组的决定将在没有附加评价的连接可以应用于所有后续数据包。 对NAT的连接的响应将自动具有应用于正确路由的反向NAT规则。
链遍历顺序
假设服务器知道如何路由分组,并且防火墙规则允许其传输,以下流程表示在不同情况下将被遍历的路径:
- 往本地系统传入数据包 :
PREROUTING
- >INPUT
- 注定到另一台主机传入的数据包 :
PREROUTING
- >FORWARD
- >POSTROUTING
- 本地生成的包 :
OUTPUT
- >POSTROUTING
如果我们结合在上表中规定的订货以上信息,我们可以看到,发往本地系统传入数据包将首先对评估PREROUTING
的链raw
, mangle
和nat
表。 然后它会遍历INPUT
的链mangle
, filter
, security
,和nat
最后被交付给本地套接字之前表。
IPTables规则
规则放置在特定表的特定链中。 当每个链被调用时,将按顺序对链中的每个规则检查所讨论的分组。 每个规则都有一个匹配的组件和一个动作组件。
匹配
规则的匹配部分指定分组必须满足的标准,以便执行相关联的动作(或“目标”)。
匹配系统非常灵活,可以与显著扩大iptables
系统上可用扩展。 可以构造规则以根据协议类型,目的地或源地址,目的地或源端口,目的地或源网络,输入或输出接口,报头或连接状态与其他标准进行匹配。 这些可以组合以创建相当复杂的规则集,以区分不同的流量。
目标
目标是当分组满足规则的匹配标准时触发的动作。 目标一般分为两类:
- 终止目标 :终止目标上执行该终止链中的评估和控制权返回给一个动作
netfilter
钩子。 根据提供的返回值,挂钩可能丢弃数据包或允许数据包继续到下一个处理阶段。 - 非终止目标 :非终止目标执行操作和内链继续评估。 虽然每个链最终必须传回最终终止判定,但是可以预先执行任何数量的非终止目标。
规则中每个目标的可用性将取决于上下文。 例如,表和链类型可能决定可用的目标。 在规则中激活的扩展和匹配子句也会影响目标的可用性。
跳转到用户定义的链
我们应该提到一个特殊类的非终止目标:跳跃目标。 跳转目标是导致评估移动到不同链的额外处理的动作。 我们已经谈过不少关于内置链这是密切联系在一起的netfilter
调用它们挂钩。 但是, iptables
还允许管理员创建组织的目的自己的连锁店。
规则可以放置在用户定义的链中,方式与放置到内置链中的方式相同。 不同的是,用户定义链可以仅通过从规则“跳”到它们(它们不与注册到达netfilter
钩本身)。
用户定义链作为调用它们的链的简单扩展。 例如,在一个用户定义的链,评价将如果达到或者如果该规则列表的末尾传回给调用链RETURN
目标是由一个匹配规则激活。 评估还可以跳转到其他用户定义的链。
这个结构允许更大的组织并提供更强健分支所需的框架。
IPTables和连接跟踪
我们介绍了关于之上实现连接跟踪系统netfilter
框架时,我们讨论了raw
表和连接状态匹配条件。 连接跟踪可以让iptables
做出关于在一个正在进行连接的情况下查看数据包的决定。 连接跟踪系统提供iptables
它需要执行“状态”操作的功能。
数据包进入网络后很快应用连接跟踪。 在raw
表链和一些基本的完整性检查是在事先的分组与连接相关联的数据包执行的唯一逻辑。
系统根据一组现有连接检查每个数据包。 如果需要,它将更新其存储中的连接的状态,并在必要时向系统添加新的连接。 已经打上了包NOTRACK
于一体的目标raw
链将绕过连接跟踪程序。
可用状态
连接跟踪系统跟踪的连接将处于以下状态之一:
-
NEW
:当数据包到达不与现有的连接相关联,而不是作为一个第一分组无效,新的连接将被添加到与该标签的系统。 这对于连接感知协议(如TCP)和无连接协议(如UDP)都会发生。 -
ESTABLISHED
:一个连接是从变更NEW
至ESTABLISHED
当它接收在相反方向有效响应。 对于TCP连接,这意味着一个SYN/ACK
和UDP和ICMP流量,这意味着那里源和原始数据包的目的地被切换的响应。 -
RELATED
:包不属于现有连接的一部分,但与已经在系统连接相关联的标记RELATED
。 这可能意味着帮助连接,如FTP数据传输连接的情况,或者可以是对其他协议的连接尝试的ICMP响应。 -
INVALID
:包可以标记INVALID
,如果它们不与现有连接相关联,并且不适合用于打开新的连接,如果它们不能被识别,或者如果它们不是在其他原因中路由。 -
UNTRACKED
:数据包可以被标记为UNTRACKED
如果他们已经在一个被有针对性的raw
餐桌链条绕过跟踪。 -
SNAT
:当源地址已经被NAT操作改变了一个虚拟的状态中。 这由连接跟踪系统使用,使得它知道将回复分组中的源地址改变回来。 -
DNAT
:当目的地址已经被NAT操作改变了一个虚拟的状态中。 这由连接跟踪系统使用,使得它知道在路由答复分组时改变目的地地址。
连接跟踪系统中跟踪的状态允许管理员制定针对连接生命周期中的特定点的规则。 这提供了更全面和安全的规则所需的功能。
结论
在netfilter
包过滤框架和iptables
防火墙是在Linux服务器上大多数防火墙解决方案的基础。 在netfilter
内核挂钩足够接近网络超过数据包提供强大的控制,因为它们是由系统处理。 在iptables
防火墙利用这些功能来提供通信政策要求对内核的一个灵活的,可扩展的方法。 通过了解这些部分如何组合在一起,您可以更好地利用它们来控制和保护您的服务器环境。
如果您想了解更多关于如何选择有效的iptables
政策,看看这个指南 。
这些指南可以帮助您开始实施你iptables
防火墙规则: