使iptables更容易维护

我的networking已完全locking,只有less数网站列入白名单。 这一切都是通过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说:

地址可以是networking名称,也可以是主机名 (请注意,指定使用远程查询(如DNS)parsing的任何名称是一个非常糟糕的主意),networkingIP地址(带/掩码)或纯IP地址。

但是我关心的是“指定任何需要解决的名字…… DNS是一个非常糟糕的主意”的部分。 为什么这是一个坏主意? 它只是放慢了一切?

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

  • DNS名称在添加规则时parsing,而不是在检查数据包时parsing。 这违反了大多数人的期望。
    • 该规则不会更新以反映更改的DNS结果。 它被添加解决,就是这样。 您需要定期重新加载规则,否则某些网站可能会中断。
  • 有一点安全问题,因为你基本上是把控制你的防火墙规则委托给一个外部实体。
    • 如果您的父DNS服务器遭到入侵并返回错误数据,该怎么办?

如果您的目的是阻止HTTP访问,那么您通常会更好地设置一个旨在在该级别进行过滤的软件(例如,squid + squidquard)。

如果您在防火墙中使用主机名,则您的防火墙现在依赖于DNS。 这将打开防火墙的一些问题:

  • 大量的DNS查询可能会导致延迟。
  • DNS更改不会立即传播。 所以你的防火墙可以使用caching的IP地址。
  • DNS可能被欺骗,被劫持,被黑客入侵。
  • DNS可能失败 – 意味着您的防火墙失败。
  • 您的防火墙规则现在由第三方控制。

如果您使用主机名,而您不控制DNS,则其他人有效地控制您的IPtables规则。 错误,错误或安全问题在他们的最终成为你的问题。

我唯一见过的主机名就是内部操作。 我在办公室工作,IP和主机名是通过DHCP分配的。 防火墙使用主机名来在不同的组之间设置障碍。 由于这是所有内部控制,它运作良好。

你可以使用一个类似shorewall的iptables包装器来使你的规则更容易维护。

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

你可以做的是:

  1. 使用自定义链从逻辑上分离规则
  2. 使用ipset s将地址分组并从规则中分离出来
  3. 添加评论到规则

也没有人说主机名是什么坏东西解决的DNS(即在hosts中指定。你可以使用它们,如果你真的需要。

我个人在/ etc / hosts中手动指定一个主机名为ip,然后在iptables中使用它。

这样你

  1. 不要将防火墙规则卸载到外部实体
  2. 有易于维护的iptables