netfilter / iptables:为什么不使用原始表?


22

在Linux下,我们通常使用“过滤器”表进行通用过滤:

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模块而得到的补偿)
  • 如果盒子也是路由器,则只有一个规则(显然,对于每个规则来说都行),因为无需为过滤器/转发添加相同的规则

我只进行了快速测试,所以效果很好。
我发现的文档总是描述在严格情况下要使用的原始表。但是没有人给出最小的理由。

问题:除了教条式之外,是否有任何理由不使用原始表?


如果您只想丢弃来自某些IP地址的所有流量,那么原始表就可以了。但是,防火墙通常比这更细粒度,因此您最终会在原始规则中创建一些规则,在过滤器中找到一些规则。这使维护工作变得头疼,简化工作值得几个CPU周期。
Wurtel

1
如果这只是一个令人头疼的问题,我认为我们应该找到一些有关原始表的示例。由于不是这种情况,所以头痛理论可能不是主要因素。
格雷戈里·穆萨特

1
ipset的作者建议将原始表用于ipset iptables规则ipset.netfilter.org/tips.html
Stuart Cardall '16

Answers:


17

来自man 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的另一个示例是,如果您的网络服务器流量非常大,则可以设置一个规则,该规则可以依次跟踪所有本地拥有的IP地址或实际为Web流量提供服务的端口80。然后,您可以享受对所有其他服务的状态跟踪,但Web流量除外,这可能会在已经超载的系统上节省一些处理能力。

示例-> 为私有网络运行一个半无状态Linux路由器

结论:没有充分的理由不使用原始表,但是在原始表中使用NOTRACK目标时,有一些理由要当心。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.