使 iptables 更易于维护

Big*_*uge 16 domain-name-system firewall iptables hostname ip-address

除了一些列入白名单的网站外,我的网络已完全锁定。这一切都是通过 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
...
Run Code Online (Sandbox Code Playgroud)

显然,这些地址是假设的,但您明白了。我的防火墙变得巨大。如果我可以这样做,维护起来会容易得多:

# 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Zor*_*che 30

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

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


jef*_*aid 10

如果您在防火墙中使用主机名,则您的防火墙现在依赖于 DNS。这使防火墙面临许多问题:

  • 大容量下的 DNS 查找可能会导致延迟。
  • DNS 更改不会立即传播。因此,您的防火墙可能正在使用缓存 IP。
  • DNS 可以被欺骗、劫持、黑客攻击。
  • DNS 可能会失败 - 意味着您的防火墙失败。
  • 您的防火墙规则现在由第 3 方控制。

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

我唯一一次看到主机名使用得很好是用于内部操作。我曾在通过 DHCP 分配 IP 和主机名的办公室工作。防火墙使用主机名在不同组之间设置障碍。由于这一切都是内部控制的,因此运行良好。

  • 这是一个很好的答案,但它缺少可以帮助我简化防火墙的部分。 (2认同)