iptables 是否能够指定规则中的第一个或最后一个匹配?如果可以,如何指定?
其次,当指定规则时,是否存在隐式删除,或者以下仅提供该功能?
iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP
答案1
首次匹配对性能有非常大的影响。首次匹配允许在数据包匹配后立即停止扫描。因此,通常将 ESTABLISHED、RELATED 规则放在其链的顶部。如果没有首次匹配规则,则每个数据包都需要与每个适用链中的每个规则进行匹配,随着规则集的增长,成本会越来越高。繁忙的防火墙可能会有更大的规则集,并且可能在最后一次匹配时出现性能问题。
使用最后匹配方法读取规则集可能很困难,因为一旦找到第一个匹配,您就不知道是否完成了。随着规则集大小的增加,这也会变得更加困难。
可以在前一个规则之后添加规则,但让其出现在之前添加的规则之前。这可以通过使用iptables -I
而不是 来添加规则来实现iptables -A
。使用您希望绕过的规则的索引将使规则保持在链中。如果您正在修改一组正在运行的规则,这种方法可能会完成您需要做的事情。我建议对您的规则进行排序,以便它们与第一个匹配项一起工作。
我用 岸墙构建我的规则集并通常按照以下顺序添加我的规则。
- 已建立、已关联(由 ShoreWall 自动完成)
- 延迟敏感协议(NTP 等)。
- 所需协议(DNS等)。
- 大量使用的协议(HTTP、SMTP、IMAP 等)。
- 不常用的协议。
内置链具有策略,可以是接受、拒绝或丢弃。如果未匹配任何规则,则适用此策略。用户定义的链具有隐式返回策略,可以通过使用与所有数据包匹配的所需操作的规则结束链来覆盖此策略。
答案2
iptables 以首次匹配为基础运行,我认为没有任何方法可以改变这一点。如何设置规则取决于您是否希望默认为包容性或排他性。
例如,如果您运行一个 Web 服务器,希望除了 150.0.0.0/8 类中的任何人之外的所有人都可以访问,那么您会将规则设置为默认包含。
iptables -A INPUT -p tcp -s 150.0.0.0/8 -dport 80 -j DROP
iptables --policy INPUT ACCEPT
如果您想将您的服务器设置为独有的,您需要像这样进行设置。
iptables -A INPUT -p tcp -s 150.0.0.0/8 -dport 80 -j ACCEPT
iptables --policy INPUT DROP
我认为我的规则示例应该可以回答您关于 DROP 的问题。如果您在规则上添加 -j DROP,它将删除该匹配。