在Linux下,我们通常使用“filter”表来进行常见的过滤:
iptables --table filter --append INPUT --source 1.2.3.4 --jump DROP
iptables --table filter --append INPUT --in-interface lo --jump ACCEPT
根据下面的 netfilter 流程图,数据包首先通过“原始”表:
所以我们可以写:
iptables --table raw --append PREROUTING --source 1.2.3.4 --jump DROP
iptables --table raw --append PREROUTING --in-interface lo --jump ACCEPT
- 数据包处理得更快,无需经过 conntrack+mangle+nat+routing。因此使用的 CPU/内存稍微少一些(反过来又通过必须加载 iptable_raw 模块来进行轻微补偿)
- 只有一个规则,以防该盒子也是路由器(显然,不适用于每个规则),因为不需要为过滤/转发添加相同的规则
我只做了快速测试,效果非常好。
我发现的文档总是描述在严格情况下使用的原始表。但没有人给出哪怕是最小的理由。
问题:除了教条之外,还有什么理由不使用原始表吗?
答案1
从人 iptables:
raw: This table is used mainly for configuring exemptions from connection
tracking in combination with the NOTRACK target. It registers at the
netfilter hooks with higher priority and is thus called before
ip_conntrack, or any other IP tables.
It provides the following built-in chains:
- PREROUTING (for packets arriving via any network interface)
- OUTPUT (for packets generated by local processes)
分析:
因此,RAW 表位于 conntrack 之前,其设计目的是用于在您不希望在 netfilter 中跟踪的数据包上设置 NOTRACK 标记。
-j 目标不仅限于 NOTRACK,所以是的,您可以在原始表中过滤数据包,并具有减少 CPU/内存消耗的优点。
大多数情况下,服务器不需要跟踪所有连接。仅当需要根据先前建立的连接过滤 iptables 中的数据包时,才需要跟踪。在仅用于简单目的(例如仅打开端口 80(也可能是 21))的服务器上,不需要这样做。在这些情况下,您可以禁用连接跟踪。
然而,如果您尝试运行 NAT 路由器,事情就会变得稍微复杂一些。为了进行 NAT,您需要跟踪这些连接,以便可以将数据包从外部网络传送到内部网络。
如果使用 NOTRACK 设置整个连接,那么您也将无法跟踪相关连接,conntrack 和 nat 帮助程序将无法用于未跟踪的连接,相关的 ICMP 错误也不起作用。换句话说,您必须手动打开这些。当涉及 FTP 和 SCTP 等复杂协议时,这可能很难管理。
用例:
一个例子是,如果您有一台流量很大的路由器,您希望在其上对传入和传出流量进行防火墙设置,但不对路由流量进行防火墙设置。然后,您可以设置 NOTRACK 标记来忽略转发的流量以节省处理能力。
可以使用 NOTRACK 的另一个示例是,如果您有一个流量很高的 Web 服务器,那么您可以设置一个规则,在所有本地拥有的 IP 地址或实际提供 Web 流量的 IP 地址上关闭对端口 80 的跟踪。然后,您可以享受对所有其他服务的状态跟踪,但网络流量除外,这可能会在已经过载的系统上节省一些处理能力。
示例 -->为专用网络运行半无状态 Linux 路由器
结论:没有充分的理由不使用原始表,但在原始表中使用 NOTRACK 目标时有一些原因需要小心。