我正在设置 ipfw,并且有人向我建议:如果我制定规则仅丢弃 TCP 的 SYN 数据包,则无法建立连接,防火墙甚至不必查看其他数据包。
对我来说这似乎违反直觉。我认为如果我阻止指定端口上的所有通信(涉及的数据包检查较少),防火墙的性能会更好,而且由于无论如何都无法建立连接,因此传入数据包的数量将相同。
真的有区别吗?
编辑:具体问题,阻止来自某些主机的 SSH:
ipfw add deny tcp from somehost to any port 22 via em0 tcpflags syn
对阵
ipfw add deny tcp from somehost to any port 22 via em0
答案1
仅丢弃 syn 数据包是有目的的,但这并不是(主要)为了性能;这是创建默认拒绝规则的简单方法,该规则将应用于传入连接,但不适用于传出连接的返回数据包。 规则如下:
deny tcp from any to any in setup
(请注意,“setup”是“tcpflags syn,!ack”的简写)将阻止所有传入的 TCP 连接(未被高优先级规则允许的连接)。
实际上可能存在性能方面的考虑,因为替代方法——使用保持状态规则允许在传出连接上返回数据包——涉及动态规则(以及创建、管理和检查所有数据包),这可能会对性能产生一定影响。
请注意,如果规则阻止特定的低编号端口(例如示例中的 22),则这并不相关,因为您可以肯定不会为传出连接分配 1024 以下的端口。
答案2
全局阻止所有到指定端口的流量似乎比阻止某些类型的流量更有效,正如您所说的那样,减少数据包检查。这实际上取决于您的意图。如果您希望服务开放并可用,但不希望有人对该端口进行 SYN 扫描,则还有其他方法可以检测此类活动。如果您不希望服务完全可用,请关闭端口。
我认为这很有趣,“如果我制定的规则只是丢弃 TCP 的 SYN 数据包,那么就无法建立连接,防火墙甚至不必查看其他数据包。”
好吧...如果你根本不想让防火墙查看任何数据包,那就全部拒绝吧!如果你想要记录(出于某种原因)发往指定端口的 SYN 数据包,那么你可以这样做,但老实说,我根本看不到任何好处。
无论是谁建议阻止 SYN 数据包并提高性能,他都需要研究一下他的 Net+
答案3
我的理论未经验证,认为丢弃所有数据包到端口比只丢弃数据syn
包要快。原因如下:
- 意外数据包通常可能会生成 TCP 重置或 ICMP 端口不可达消息。仅针对 SYN 数据包编写规则才会导致其他数据包触发进入操作系统。
- 规则仍然需要匹配。这两条规则都检查端口 22,但必须再检查第二条规则中是否存在 SYN。
为了有效,防火墙必须检查每个数据包。作为状态防火墙,它还可能花费一些时间尝试将非 SYN 数据包与其他规则集中的现有允许流进行匹配。
如果要丢弃与某个端口的 TCP 连接,请丢弃发往该端口的所有 TCP 数据包。