我有一个分为 4 个部分的网络:外部 DMZ、内部 DMZ、用户空间和集群。
我还有 4 个防火墙:Internet 和外部 DMZ 之间的边界路由器、外部 DMZ 和集群之间的集群前端、外部和内部 DMZ 之间的主防火墙以及内部 DMZ 和用户空间之间的内部防火墙。
外部 DMZ 中有一个外部 DNS 服务器,内部 DMZ 中有一个内部 DNS 服务器。
我的目标是使用 iptables 规则来允许或阻止特定查询。我希望来自 Internet 的查询由外部 DNS 服务器处理,但仅允许解析外部 DMZ 的名称。换句话说,我希望阻止这些查询到达内部 DNS 服务器。但是,我希望允许来自集群的所有查询(由外部 DNS 服务器处理)以及来自用户空间的所有查询(由内部 DNS 服务器处理)。
例如,我在内部 DMZ 中有一个 Web 服务器。我希望集群能够访问它(这意味着内部 DNS 服务器必须回答来自集群的请求),但我想阻止它从 Internet 访问(或者说隐藏它?)。由于来自 Internet 的查询被定向到外部 DNS 服务器,因此我想阻止这些查询通过主防火墙。
仅使用 iptables 规则是否可行?我很难想出一种方法来仅允许集群查询到达内部 DNS 服务器。
这是我目前正在使用的(对于每个防火墙,eth0 面向 Internet,而 eth1 面向另一侧,“向内”)。
在边界路由器上:
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to $extdns
iptables -A FORWARD -p udp -d $extdns --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p udp -s $extdns --sport 53 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -s $extdns --sport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp -d $extdns --dport 53 -m state --state ESTABLISHED -j ACCEPT
在集群前端:
iptables -t nat -A PREROUTING -i eth1 -p udp --dport 53 -j DNAT --to $extdns
iptables -A FORWARD -p udp -d $extdns --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p udp -s $extdns --sport 53 -m state --state ESTABLISHED -j ACCEPT
在主防火墙上:
iptables -A INPUT -p udp -s $intdns --sport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp -d $intdns --dport 53 -m state --state ESTABLISHED -j ACCEPT
在内部防火墙上:
iptables -t nat -A PREROUTING -i eth1 -p udp --dport 53 -j DNAT --to $intdns
iptables -A FORWARD -p udp -d $intdns --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p udp -s $intdns --sport 53 -m state --state ESTABLISHED -j ACCEPT
默认策略设置为丢弃数据包(INPUT、FORWARD 和 OUTPUT)。
答案1
我怀疑您可能需要使用不仅仅是 iptables。
您现在所拥有的是处理 DNS 流的东西,但不是实际的查询。
就 DNS 流而言,您的规则和设置对我来说看起来是正确的。
然而,在这种情况下,您确实希望在 DNS 配置中内置一些防御措施 - 例如,限制允许查询给定服务器的范围以及查询的内容(例如,是否递归)。
您特别想要限制的查询类型的示例会很有用,但由于您的大部分问题似乎都围绕查询展开,我不得不怀疑您需要某种应用程序级机制(即根据允许执行的操作配置每种“类型”的 DNS 服务器)。
更新根据您的示例,iptables 足以实现您的要求,主要是确保来自外部 DMZ 的查询无法到达任何内部服务器。
您可能需要花一些时间研究DNS 服务器的类型,以及研究您可以实施的客户端/查询限制。
我实际上无法为您设计您的设置,但是:
- 您的内部 DMZ 中有一个内部 DNS。最简单的做法是让该服务器成为您内部区域的权威服务器
- 如果您的内部主机需要能够解析内部域之外的内容,那么您将需要将这些查询转发到外部 DMZ DNS 服务器。
- 然后,外部 DNS DMZ 服务器(如果需要)可以拥有任何所需公共记录的权威区域,并配置为将不在您域中的任何内容转发到外界。
但请注意,这是两个不同的角色/类型的服务器,并且您可能希望为每个角色/类型设置单独的进程(如果我没记错的话,powerdns 在某种程度上通过禁止权威和递归由同一个进程完成来“鼓励”这一点 - 并且为每个角色/类型设置一个专用的二进制文件)。
您可以通过以下方式实现所需的控制:
- 禁止从外部 DMZ 到内部服务器的任何查询
- 允许查询您的外部 DMZ 服务器仅有的来自内部 DNS 服务器(并考虑将内部 DNS 拆分为一个转发服务器和一个权威服务器)。
- 禁止来自网络外部的任何查询到您的外部 DNS 服务器,或者允许来自网络外部的查询仅查找您需要的权威记录。
iptables 与花费一些时间研究 DNS 结构之间的主要区别在于,iptables 会阻止所有内容,或者什么都不阻止(因为流量是否被允许)。通过配置 DNS 以满足您的特定需求,您可以进行更精细的控制,这依赖于对应用程序的“感知”(即,您可以根据请求内容做出决策)。
我基本上是说,纵深防御可能是值得的,但你的防火墙规则听起来应该可以满足基本需求。将 DNS 设置为仅以你描述的方式工作肯定是在防火墙之上,而不是代替防火墙。