在Linux下,我们通常使用“过滤器”表来做常见的过滤:
iptables --table filter --append INPUT --source 1.2.3.4 --jump DROP
iptables --table filter --append INPUT --in-interface lo --jump ACCEPT
Run Code Online (Sandbox Code Playgroud)
根据下面的 netfilter 流程图,数据包首先通过“原始”表:
所以我们可以写:
iptables --table raw --append PREROUTING --source 1.2.3.4 --jump DROP
iptables --table raw --append PREROUTING --in-interface lo --jump ACCEPT
Run Code Online (Sandbox Code Playgroud)
我只进行了快速测试,这非常有效。
我发现的文档总是描述在严格情况下使用的原始表。但没有人给出哪怕是最小的理由。
问题:除了教条之外,是否有任何理由不使用原始表?
Fac*_*tor 23
来自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)
Run Code Online (Sandbox Code Playgroud)
分析:
因此,RAW 表位于 conntrack 之前,其设计目的是用于在您不希望在 netfilter 中跟踪的数据包上设置 NOTRACK 标记。
-j 目标不仅限于 NOTRACK,所以是的,您可以在原始表中过滤数据包,从而减少 CPU/内存消耗。
大多数情况下,服务器不需要跟踪所有连接。如果您需要根据之前建立的连接过滤 iptables 中的数据包,您只需要跟踪。在仅用于简单目的的服务器上,例如仅打开端口 80(可能还有 21),则不需要这样做。在这些情况下,您可以禁用连接跟踪。
但是,如果您尝试运行 NAT 路由器,事情会变得稍微复杂一些。为了对某些内容进行 NAT,您需要跟踪这些连接,以便您可以将数据包从外部网络传送到内部网络。
如果整个连接设置为 NOTRACK,那么您也将无法跟踪相关连接,conntrack 和 nat 助手将不会对未跟踪的连接起作用,相关的 ICMP 错误也不会。换句话说,您必须手动打开这些文件。对于 FTP 和 SCTP 等复杂协议,这可能很难管理。
用例:
一个例子是,如果您有一个流量很大的路由器,您希望将传入和传出流量设置为防火墙,而不是路由流量。然后,您可以设置 NOTRACK 标记以忽略转发的流量以节省处理能力。
另一个可以使用 NOTRACK 的例子是,如果您有一个流量很大的网络服务器,那么您可以设置一个规则,在所有本地拥有的 IP 地址或实际服务于网络流量的 IP 地址上轮流跟踪端口 80。然后,您可以享受对所有其他服务的状态跟踪,但 Web 流量除外,这可能会在已经过载的系统上节省一些处理能力。
示例 --> running-a-semi-stateless-linux-router-for-private-network
结论:没有充分的理由不使用原始表,但在原始表中使用 NOTRACK 目标时有一些理由要小心。