前言
就像 Linux 中的所有内容一样,我确信有很多方法可以使用iptables
. 我想将答案限制在以下类别:
- 选项之间有什么区别?
- 哪个选项最好(或者它们是否相同)?
- 为什么你更喜欢其中之一?
并且请清楚您在说什么类别。陈述偏好是可以的,但不要暗示它是最好的。
例如
我更喜欢把
--jump
它作为第一个参数,因为我认为首先有意图会更好,而且我喜欢垂直对齐多个命令的参数。
问题
其中一个比另一个更好吗?
iptables -I INPUT --jump ACCEPT --in-interface lo
iptables -I INPUT --jump ACCEPT --source localhost
其中一个比另一个更好吗?
iptables -A INPUT --jump REJECT
iptables -P INPUT REJECT
在这两种情况下,您要比较的两个 iptables 命令具有不同的语义,并且彼此的行为也不同。这不一定是哪个“最好”的问题,而是你试图匹配或提供什么行为的问题。
第一的:
其中第一个接受
lo
接口上的所有本地流量,无论其 IP 地址如何。第二个接受来自 127.0.0.1 的所有流量,无论它到达哪个接口。在这种情况下,第一个显然更好。在第一种情况下,本地流量不一定使用 127.0.0.1 作为其 IP 地址,但您可能希望接受它,(其中最著名的是 Debian 的奇数 127.0.1.1,但可以附加全局 IP 地址to
lo
),在第二种情况下,有人可能会向您发送以 127.0.0.1 作为其源地址的欺骗数据包,而您可能不想接受。第二:
这些通常在功能上相同,除了:
当有人在 INPUT 链的末尾添加更多规则时,这些规则将没有任何效果。这里的档案中有很多人对此感到困惑的例子。所以你可能想使用第二种形式。
链策略不能接受参数,但 REJECT 目标确实接受参数。如果你想指定拒绝原因,或者想在不同的情况下给出不同的拒绝原因,你必须使用第一种形式(
iptables-extensions
拒绝原因列表见手册页)。关于偏好,我设置 iptables 使其易于管理且难以管理不善。
对于无意义的格式,我更喜欢按这样的顺序记下我的规则,以便我可以最轻松地验证防火墙状态,无论使用的工具多么简单。检查更改应该是微不足道的
diff -wu <(iptables-save | egrep -v ^#) <(egrep -v ^# rules.v4)
当常见配置下的两种类似方法导致相同行为时,我选择一种即使在不常见配置下也能表达我真正意思的方法。因此我更喜欢后者,因为后者带有一个假设(在健全的设置中,没有其他接口可以接收这样的数据包)
-A INPUT -i lo -J ACCEPT
-A INPUT -s localhost -J ACCEPT
当 2 个限制意味着相同的事情时,我会选择两者或不能无意解除的一个。虽然
-A INPUT -j REJECT
可以-R
替换规则,但此类错误不会影响链策略,例如-P INPUT REJECT