在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模块而得到的补偿)
- 如果盒子也是路由器,则只有一个规则(显然,对于每个规则来说都行),因为无需为过滤器/转发添加相同的规则
我只进行了快速测试,所以效果很好。
我发现的文档总是描述在严格情况下要使用的原始表。但是没有人给出最小的理由。
问题:除了教条式之外,是否有任何理由不使用原始表?