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