介绍
使用防火墙是一样关于做出明智的决策,因为它是关于学习的语法。 防火墙一样iptables
能够通过解释由管理员设置的规则执行政策。 但是,作为管理员,您需要知道什么类型的规则对您的基础架构有意义。
而其他指南着重于启动和运行所需的命令,在本指南中,我们将讨论一些你将不得不实施防火墙时做出的决定。 这些选择将影响您的防火墙行为,如何锁定您的服务器,以及它将如何响应可能会不时发生的各种情况。 我们将使用iptables
作为一个例子,讨论细节,但大多数的实际决定的将是相关的,无论所使用的工具。
确定默认策略
在构建防火墙时,必须做出的一个基本决策是默认策略。 这决定了当流量不与任何其他规则匹配时会发生什么。 默认情况下,防火墙可以接受由以前的规则所无法比拟的任何流量,或拒绝流量。
默认Drop vs默认接受
默认策略“接受”意味着允许任何不匹配的流量进入服务器。 这通常不建议,因为这意味着,有效地,你将保持一个黑名单。 黑名单是很难管理,因为你必须预见并明确禁止所有类型的恶意流量。 这可能导致维护困难,并且通常容易出现错误,错误配置,以及在既定策略中出现意料之外的漏洞。
备选方案是默认策略“丢弃”。 这意味着不允许与显式规则不匹配的任何流量。 这类似于白名单ACL。 每个服务都必须明确允许,这可能看起来像一个大量的研究和开始工作。 但是,这意味着您的策略趋向于安全性,并且您确切知道允许在您的服务器上接收流量的内容。
基本上,选择归结于默认情况下的安全趋势或可立即使用的服务。 虽然实施一个倾向于服务可用性的防火墙可能是诱人的,但除非明确允许,否则阻塞流量几乎总是一个更好的主意。
默认删除策略vs最终删除规则
上述选择默认丢弃策略导致另一个微妙的决定。 与iptables
和其他类似的防火墙,默认的策略可以使用防火墙的内置策略功能进行设置,或在规则列表的末尾添加一个包罗万象的下降规则执行。
这两种方法的区别在于如果防火墙规则被刷新会发生什么。
如果防火墙的内置策略功能设置为“丢弃”,并且防火墙规则被刷新(重置),或者某些匹配规则被删除,您的服务将立即无法远程访问。 当为非关键服务设置策略时,这通常是一个好主意,以便您的服务器不会暴露于恶意流量,如果规则被删除。
这种方法的缺点是,您的服务将完全不可用于您的客户,直到您重新建立宽松的规则。 如果您没有本地或带外访问来摆脱问题,您甚至可能将自己锁定在服务器之外(使用位于“访问”中的“控制台访问”按钮,无论网络设置如何,DigitalOcean服务器都可访问)控制面板中Droplet页面的部分)。 如果您的防火墙刷新是有意的,可以通过在重置规则之前简单地将默认策略切换为“接受”来避免。
使用内置策略功能设置删除策略的替代方法是将防火墙的默认策略设置为“接受”,然后使用常规规则实施“删除”策略。 您可以在链接末尾添加正常的防火墙规则,匹配并拒绝所有剩余的不匹配流量。
在这种情况下,如果您的防火墙规则被刷新,您的服务将可访问但不受保护。 根据您的本地或备用访问选项,这可能是一个必要的邪恶,以确保您可以重新输入您的服务器,如果规则被刷新。 如果您决定使用此选项,您必须确保包罗万象的规则始终保持在规则集中的最后一个规则。
掉落与拒绝流量
有几种不同的方式拒绝分组到达其预期目的地。 这些之间的选择对客户端如何感知其连接尝试以及它们能够确定他们的请求将不被服务的速度具有影响。
可以拒绝数据包的第一种方式是“drop”。 丢弃可用作默认策略或匹配规则的目标。 当一个数据包被丢弃, iptables
基本上只是它扔了出去。 它不向尝试连接的客户端发送响应,并且不给出它甚至已经接收到有问题的分组的任何指示。 这意味着客户端(合法或不合法)将不会收到任何接收到其数据包的确认。
对于TCP连接尝试,连接将停止,直到达到超时限制。 由于UDP是无连接协议,客户端的响应缺乏更加模糊。 事实上,在这种情况下不接收分组通常是指示分组被接受的指示。 如果UDP客户端关心其数据包的接收,它将必须重新发送它们,以尝试确定它们是否被接受,在传输中丢失或丢弃。 这可能会增加恶意actor花费时间来获取有关服务器端口状态的正确信息,但这也会导致合法流量出现问题。
另一种丢弃流量的方法是明确拒绝您不允许的数据包。 ICMP或因特网控制消息协议是在整个互联网中使用的元协议,用于在主机之间发送状态,诊断和错误消息作为不依赖于诸如TCP或UDP的常规通信协议的带外信道。 当您使用“拒绝”目标时,流量被拒绝,并且一个ICMP数据包被返回给发送者,通知他们他们的流量被接收但不被接受。 状态消息可以暗示原因。
这有一些后果。 假设ICMP流量被允许流出到客户端,他们将立即被告知他们的流量被阻塞。 对于合法客户端,这意味着他们可以联系管理员或检查其连接选项,以确保他们正在连接到正确的端口。 对于恶意用户,这意味着他们可以完成其扫描,并在更短的时间内映射出打开,关闭和过滤的端口。
决定是否丢弃或拒绝流量时需要考虑很多因素。 一个重要的考虑是大多数恶意流量实际上将由自动化脚本执行。 由于脚本通常不是时间敏感的,丢弃非法流量将不会有所期望的抑制,而它将对合法用户具有负面影响。 更多关于这个问题,可以发现在这里 。
删除和拒绝响应表
下表显示受防火墙保护的服务器如何根据应用于目标端口的策略对不同请求作出反应。
客户端数据包类型 | NMap命令 | 端口策略 | 响应 | 推断端口状态 |
---|---|---|---|---|
TCP | nmap [-sT | -sS] -Pn <server> | 接受 | TCP SYN / ACK | 打开 |
TCP | nmap [-sT | -sS] -Pn <server> | 下降 | (没有) | 过滤 |
TCP | nmap [-sT | -sS] -Pn <server> | 拒绝 | TCP复位 | 关闭 |
UDP | nmap -sU -Pn <server> | 接受 | (没有) | 打开或过滤 |
UDP | nmap -sU -Pn <server> | 下降 | (没有) | 打开或过滤 |
UDP | nmap -sU -Pn <server> | 拒绝 | ICMP端口不可达 | 关闭 |
第一列指示由客户端发送的分组类型。 在第二列中,我们已经包括了nmap
可以用来测试场景的命令。 第三列指示应用于端口的端口策略。 第四列是服务器将发回的响应,第五列是客户端可以基于其已经接收到的响应来推断端口的。
ICMP策略
类似于是否丢弃或拒绝拒绝的流量的问题,对是否接受发往您的服务器的ICMP数据包有不同的意见。
ICMP是一个用于许多事情的协议。 它通常被发送回,如我们上面看到的,使用其他协议提供请求的状态信息。 也许它的最公认的功能发送和响应网络ping以验证与远程主机的可连接性。 有许多其他用途的ICMP,但是不是众所周知,但仍然有用。
ICMP分组由“类型”组织,然后进一步由“代码”组织。 类型指定消息的一般含义。 例如,类型3意味着目的地不可达。 代码通常用于给出关于类型的进一步信息。 例如,ICMP类型3代码3意味着目标端口不可用,而ICMP类型3代码0意味着无法到达目标网络。
可以阻止的类型
一些ICMP类型已被弃用,因此它们应该被无条件地阻止。 其中包括ICMP源猝熄(类型4代码0)和备用主机(类型6)。 类型1,类型2,类型7和类型15及以上都已弃用,留作将来使用或试验。
要阻止的类型,具体取决于网络配置
一些ICMP类型在某些网络配置中是有用的,但在其他网络配置中应该被阻止。
例如,ICMP重定向消息(类型5)可以用来照亮坏的网络设计。 当更好的路由直接对客户端可用时,发送ICMP重定向。 因此,如果路由器接收到将被路由到同一网络上的另一主机的分组,则它发送ICMP重定向消息以告诉客户端将来通过另一主机发送分组。
如果您信任本地网络,并希望在初始配置期间发现路由表中的低效率(修复路由是一个更好的长期解决方案),这是有用的。 然而,在不受信任的网络上,恶意用户可能发送ICMP重定向以操纵主机上的路由表。
在一些网络中有用并且在其他网络中可能有害的其他ICMP类型是ICMP路由器通告(类型9)和路由器请求(类型10)数据包。 路由器通告和请求数据包用作IRDP(ICMP互联网路由器发现协议)的一部分,IRDP是允许主机在启动或加入网络时动态发现可用路由器的系统。
在大多数情况下,主机最好为要使用的网关配置静态路由。 这些数据包应该在与ICMP重定向数据包相同的情况下接受。 事实上,由于主机不知道任何发现的路由的流量的首选路由,重定向消息通常在发现后直接需要。 如果您没有运行发送路由器请求报文或修改的基础上通告报文的路由(如服务rdisc
),你可以放心地阻止这些数据包。
通常安全允许的类型
通常安全允许的ICMP类型如下所示,但如果您要特别小心,可以禁用它们。
- 类型8 - 回显请求:这些是针对您的服务器的ping请求。 通常安全地允许这些(拒绝这些数据包不隐藏您的服务器。有很多其他方法,用户找出你的主机是否已经启动),但你可以阻止他们或限制你回应的源地址,如果你想要。
- 类型13 - 时间戳请求:客户端可以使用这些数据包来收集延迟信息。 它们可用于某些操作系统指纹识别技术,因此如果您想要或限制响应的地址范围,请阻止它们。
下面的类型通常可以通过配置防火墙以允许它提出的要求(通过使用反应没有明确的规则允许conntrack
模块允许ESTABLISHED
和RELATED
流量)。
- 类型0 - 回应答复:这些是对回应请求(ping)的响应。
- 类型3 - 目标不可达:合法的目标不可达数据包是由您的服务器创建的请求的响应,表明无法传递数据包。
- 类型11 - 超过时间:如果您的服务器生成的数据包由于超过其TTL值而在到达目标前死亡,则返回此诊断错误。
- 类型12 - 参数问题:这意味着从您的服务器的传出数据包格式不正确。
- 类型14 - 时间戳响应:这些是服务器生成的时间戳查询的响应。
阻止所有传入的ICMP流量仍然由一些安全专家推荐,但是许多人现在鼓励智能ICMP接受策略。 这些链接在这里和这里有详细信息。
连接限制和限速
对于某些服务和流量模式,您可能希望允许访问,只要客户端不滥用该访问。 约束资源使用的两种方式是连接限制和速率限制。
连接限制
连接限制可使用状延伸来实现connlimit
检查客户端有多少活动连接已经打开。 这可以用于限制一次允许的连接数。 如果你决定施加连接限制,你将有一些决定如何应用它。 决定的一般分类是:
- 每个地址,每个网络或全局的限制?
- 匹配和限制特定服务或整个服务器的流量?
可以在逐个主机的基础上限制连接,或者可以通过提供网络前缀为网段设置限制。 您还可以为服务或整个机器设置全局最大连接数。 请记住,可以混合和匹配这些,以创建更复杂的策略来控制连接数。
速率限制
速率限制允许您构造规则,规定服务器接受流量的速率或频率。 有许多不同的扩展的,可用于速率限制包括limit
, hashlimit
,和recent
。 您使用将在很大程度上取决于您要限制流量的方式扩展的选择。
该limit
扩展将导致有问题的规则进行匹配,直到极限被击中,之后,进一步的数据包将被丢弃。 如果设置限制为“5 /秒”,并且规则将允许每秒匹配5个数据包,之后规则不再匹配。 这对于设置服务的全局速率限制很有用。
该hashlimit
扩展更加灵活,允许您指定的某些值iptables
会出现乱码评估匹配。 例如,它可以查看源地址,源端口,目标地址,目标端口或这四个值的任意组合以哈希每个条目。 它可以通过接收的数据包或字节进行限制。 基本上,这提供灵活的每客户端或每服务速率限制。
在recent
扩展动态地将客户端IP地址打击时,规则匹配现有列表列表或检查。 这允许您将限制逻辑扩展到用于复杂模式的多个不同规则之间。 它能够像其他限制器一样指定命中计数和时间范围,但如果看到额外的流量,也可以重置时间范围,有效地迫使客户端停止所有流量(如果它们受到限制)。
选择使用哪个速率限制扩展取决于您希望执行的确切策略。
单片式与链式管理
所有iptables
防火墙策略植根于延长内建的链。 对于简单的防火墙,这通常采取更改链的默认策略和添加规则的形式。 对于更复杂的防火墙,通常通过创建额外的链来扩展管理框架是个好主意。
用户创建的链本质上绑定到它们的调用链。 用户创建的链没有默认策略,因此如果数据包通过用户创建的链,它将返回到调用链并继续评估。 考虑到这一点,用户创建的链主要用于组织目的,使规则匹配条件更加干燥,并通过拆分匹配条件来提高可读性。
如果您发现自己针对大量规则重复了某些匹配条件,则可能需要创建一个具有新链路的共享匹配条件的跳转规则。 在新链中,您可以添加删除共享匹配条件的规则集。
除了简单的组织,这可以有一些有益的副作用。 例如,对于非常类似的规则集合的链的智能使用意味着在正确的位置添加规则可以更容易和更不容易出错。 它还可以更容易地显示和理解你所关心的政策的部分,通过链限制。
关于是将所有规则集成到内置链中还是创建和使用额外链的决定将在很大程度上取决于规则集的复杂和容易管理。
结论
现在,您应该对设计服务器防火墙策略时需要做出的一些决定有一个很好的了解。 通常,防火墙所涉及的时间投资倾向于初始设置,使管理相当简单。 虽然可能需要一些时间,想法和实验来制定最能满足您需求的策略,但这样做会让您更好地控制服务器的安全性。
如果您想了解更多关于防火墙和iptables
明确,请查看下面的文章:
以下指南可帮助您实施策略。 选择与您的防火墙匹配的指南开始: