假设您有一条如下的 iptables 规则:源 A ------> 源 B 接受源 B ------> 源 A 删除。
我观察到: - 从 A 到 B 的第一个 TCP 数据包被接受 - 来自 B 的回复数据包被丢弃。
为什么回复数据包会被丢弃?由于第一个来自 A -> B 的数据包已被允许并接受,因此它应该被添加到连接表中。当数据包从 B -> A 进入时,在运行规则匹配和接受之前应该进行查找,而无需运行决定丢弃的规则库。为什么 iptables 不执行查找?
谢谢。
答案1
是的,我添加了它,但没有任何变化。我观察到这是一般行为,当我查看 Iptables 源代码时,这是预期行为。我不知道如何使用 iptables,因为添加反向规则是完全荒谬的事情。管理这样的规则库是不可能的。我希望我们能澄清这一点。谢谢。
答案2
iptables 非常底层,当您编写 iptables 规则时,您正在处理原始 IP 数据包。这有许多含义,其中之一您已经发现了。
有一些非常有效的用例,例如应该允许传出流量,但不允许任何相应的传入流量通过防火墙;或者反过来,允许传入流量但不允许传出。一个常见的例子是日志存储服务器(这反过来通常对审计有用):应该允许日志流量在,但不应该允许出去. 在极端情况下,应允许日志流量在, 但没有其他的应该允许要么进要么出。
通过 iptables 不对您想要的内容做出任何假设,您不仅可以提高安全性,还可以提高性能,因为规则集可以根据您希望防火墙实际执行的操作进行优化。
如果您想允许与已建立的连接或会话相关的传入流量,那么只需告诉它:
sudo iptables -I INPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT
或对于 IPv6:
sudo ip6tables -I INPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-I INPUT 1
根据需要调整该部分(例如,如果您有其他规则,这些规则应优先于允许与已建立的连接或会话相关的流量的一般规则)。