让 iptables 更易于维护

让 iptables 更易于维护

我的网络完全被锁定,除了几个列入白名单的网站。这一切都是通过 iptables 完成的,它看起来就像这样:

# Allow traffic to google.com
iptables -A zone_lan_forward -p tcp -d 1.2.3.0/24 -j ACCEPT
iptables -A zone_lan_forward -p udp -d 1.2.3.0/24 -j ACCEPT
iptables -A zone_lan_forward -p tcp -d 11.12.13.0/24 -j ACCEPT
iptables -A zone_lan_forward -p udp -d 11.12.13.0/24 -j ACCEPT
iptables -A zone_lan_forward -p tcp -d 101.102.103.0/24 -j ACCEPT
iptables -A zone_lan_forward -p udp -d 101.102.103.0/24 -j ACCEPT
...

显然这些地址都是假设的,但你明白我的意思。我的防火墙越来越庞大了。如果我能这样做,维护起来会容易得多:

# Allow traffic to google.com
iptables -A zone_lan_forward -p tcp -d google.com -j ACCEPT
iptables -A zone_lan_forward -p udp -d google.com -j ACCEPT

我相信这是可能的,因为man iptables说:

地址可以是网络名称,主机名(请注意,指定任何要通过远程查询(如 DNS)解析的名称都是一个非常糟糕的想法)、网络 IP 地址(带有 /mask)或普通 IP 地址。

但我担心的是“指定任何名称来解析...DNS 是一个非常糟糕的主意”。为什么这是一个坏主意?它只会减慢一切速度吗?

如果我确实不应该在 iptables 规则中使用主机名,那么我应该怎么做才能简化我的防火墙?

答案1

  • DNS 名称是在添加规则时解析的,而不是在检查数据包时解析的。这违背了大多数人的预期。
    • 该规则不会更新以反映更改的 DNS 结果。添加后即可解决。您需要定期重新加载规则,否则某些网站可能会中断。
  • 由于您基本上将防火墙规则的控制权委托给外部实体,因此存在一些安全问题。
    • 如果您的父 DNS 服务器受到损害并返回错误数据,该怎么办?

如果您的目的是阻止 HTTP 访问,那么最好设置一个专门用于该级别过滤的软件(例如 squid+squidquard)。

答案2

如果您在防火墙中使用主机名,则防火墙现在依赖于 DNS。这会导致防火墙出现许多问题:

  • 大量 DNS 查找可能会导致延迟。
  • DNS 更改不会立即生效。因此您的防火墙可能正在使用缓存的 IP。
  • DNS 可能被欺骗、劫持、黑客攻击。
  • DNS 可能出现故障 - 这意味着您的防火墙出现故障。
  • 您的防火墙规则现在由第三方控制。

如果您使用主机名,但无法控制 DNS,那么其他人实际上会控制您的 IPtables 规则。他们那边的错误、失误或安全问题会成为您的麻烦。

我唯一见过主机名被很好地利用的情况是用于内部操作。我曾在一个办公室工作,那里的 IP 和主机名是通过 DHCP 分配的。防火墙使用主机名在不同组之间设置障碍。由于这一切都是内部控制的,所以它运行良好。

答案3

您可以使用像 shorewall 这样的 iptables 包装器来使您的规则更易于维护。

答案4

正如其他人已经说过的,您不应该在 iptables 规则中使用 DNS 可解析名称。它们不准确,由第三方控制,通常是一件坏事 (tm)。我还要补充一点,在 iptables 服务启动时,您的 DNS 可能会失败或无法访问。在这种情况下,规则根本不会被添加,并且可能会发生一种全新的问题(例如重启后失去 ssh 访问权限)。

您可以做的是:

  1. 使用自定义链在逻辑上分离规则
  2. 使用ipsets 将地址分组并与规则分开
  3. 为规则添加评论

也没有人说过主机名有什么不好不是由 DNS 解析(即在 中指定hosts。如果您确实需要,您可以使用它们。

相关内容