假设我们有一台连接到互联网的示例机器。这台机器通常是客户端,它没有运行 ssh 之类的服务。这种机器是否需要任何防火墙来限制传入连接?一方面,没有服务可以接受网络数据包,因此不会对系统造成威胁,但是在不丢弃它们的情况下接受这些数据包真的安全吗?linux内核是否有可能误解此类数据包并以不可预测的方式运行?
没有任何监听服务的机器是否需要防火墙来阻止传入连接?
这接近于询问关闭的计算机是否需要更新。答案不是当且仅当您确定它会一直关闭时。您的问题应该得到类似的答案:如果您确定没有监听服务处于活动状态并且永远不会处于活动状态,则您不需要阻止传入连接。
但在现实世界中,根本没有网络服务是很难实现的。至少 XWindow 是一个面向网络的协议,并且在新安装的系统上默认安装了许多服务并处于活动状态。
此外,防火墙不应仅限于阻止传入连接,还应控制允许哪些传出连接。这样做可以防止用户只是在受感染的应用程序中通过邮件(通过合法的传出连接...)下载或接收,该应用程序稍后会尝试泄露私人信息,或者更糟糕的是会打开一个隧道,让攻击者获得本地访问权限。传出过滤器越严格,攻击者就越难。
没有监听服务的机器是否严格需要防火墙?并不真地。
实践中是否存在没有监听服务的机器?不是真的,如果我们谈论的是更常见的桌面和服务器操作系统。
如果您以某种方式识别并禁用侦听 TCP 或 UDP 端口的每个服务,则对包的更新可能会在以后引入新的。如果您的支票错过了 IPv6 服务,您可能会在不知不觉中暴露敏感服务。对于这种情况,防火墙是一个很好的补偿控制。
另一个问题是并非所有网络服务都基于 TCP 或 UDP。您完全有可能拥有运行 SCTP、DCCP、RSVP 或其他传输层协议的服务,这些协议会被防火墙的默认阻止策略禁止。如果您只查看过 IPv4/IPv6 上的 TCP 和 UDP,您可能会错过任何在其他协议上侦听的内容。
在这种情况下,不运行防火墙绝对没有任何价值。您的iptables
设置可以仅包含一个默认的 DROP 策略 onINPUT
和FORWARD
,加上一个允许与现有连接相关的入站 TCP 数据包的规则 - 就像防火墙规则一样简单。过滤出站流量是可取的,但不是强制性的。
归根结底,这归结为深度防御。您的安全控制应该在系统的当前状态下提供保护,但也应该在可预见的未来状态下提供保护。这包括更新引入的潜在更改,以及您将来在管理系统时可能犯的任何错误。
这取决于风险状况和所涉及的风险(这些又取决于机器的用途)。
您可能需要防火墙的几个原因:
- 即使不存在开放的 TCP 或 UDP 端口,机器网络堆栈中的潜在漏洞也可能导致攻击。
我想到了著名的“死亡之平”攻击。
也可能存在利用传出连接的漏洞。
在现代的、充斥着膨胀软件的计算机中,人们永远无法确定究竟是什么与网络堆栈挂钩。
您是否曾经费心禁用 IRDP?IGMP 有人吗?
您可能不需要防火墙的原因:
- 增加了攻击面
如果机器具有足够简单的功能和软件堆栈,防火墙本身(内部或外部)可能会为攻击者提供有价值的额外可能漏洞以供选择。我记得至少有一个案例,当时配置简单的 MS ISA 服务器启用了攻击,最终导致攻击者拥有整个 AD 域。
- 增加的复杂性/cpu 和内存负载/成本/故障点/维护点
所有这些事情本身都是不好的。成本可能超过可能的收益。
简而言之,没有。为此使用防火墙确实是一种不好的做法(将网络层视为访问控制的一种形式,一种大的被认为是有害的),这不可避免地会导致一些不好的事情,例如不安全的服务对 LAN 或本地主机开放,其方式可能是被剥削。但是,如果您使用的操作系统具有大量默认服务,这些默认服务很难或不可能在不破坏的情况下删除,那么防火墙可能是您唯一简单的选择。
历史上防火墙有时提供额外保护的一种方式可以追溯到“nuke”和“ping of death”攻击的时代,大多数操作系统网络堆栈都存在错误,导致格式错误的数据包可能崩溃(或者有时甚至实现任意代码执行!)目标系统的内核。如果防火墙在单独的路由器/网关机器上运行,它可以完全阻止这些(尽管可能会自行崩溃)。但是,在同一台主机上,防火墙是否会在导致崩溃的层之前或之后捕获数据包的问题有很大不同。
防火墙仍然有益的另一种方法是防止操作系统指纹识别和资源浪费来回复(拒绝)不必要的连接尝试。