iptables规则允许从外部到内部networking的特定DNS请求

我有一个networking分为4个部分:外部DMZ,内部DMZ,用户空间和群集。

我还有4个防火墙:Internet和外部DMZ之间的边界路由器,外部DMZ和集群之间的集群前端,外部和内部DMZ之间的主要防火墙以及内部DMZ和内部DMZ之间的内部防火墙用户空间。

外部DMZ中有一个外部DNS服务器,内部DMZ中有一个内部DNS服务器。

我的目标是使用iptables规则来允许或阻止特定的查询。 我想要从外部DNS服务器处理来自Internet的查询,但只允许parsing外部DMZ的名称。 换句话说,我想阻止这些查询到达内部DNS服务器。 但是,我想允许来自群集的所有查询(由外部DNS服务器处理)以及来自用户空间的所有查询(由内部DNS服务器处理)。

例如,我在内部DMZ中有一个Web服务器。 我希望群集能够访问它(这意味着内部DNS服务器将不得不回答来自群集的请求),但是我想阻止它从Internet访问(或者更确切地说,隐藏它?)。 由于来自Internet的查询被定向到外部DNS服务器,我想阻止这些查询通过主防火墙。

只有iptables规则可能吗? 我遇到了麻烦,只允许集群查询到达内部DNS服务器。

这是我目前使用的(对于每个防火墙,eth0面向互联网,而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)。

我怀疑你可能需要使用更多的不仅仅是iptables。

你现在拥有的是处理DNSstream量的事情,而不是实际的查询。

就DNSstream量而言,您的规则和设置对我来说很合适。

然而,这可能是你真的想要在你的DNSconfiguration中有一些防御措施的例子 – 例如,限制哪些范围被允许查询给定的服务器,以及什么(例如recursion或不是)。

你特别想要限制的查询types的一个例子是有用的,但是由于你的许多问题似乎围绕着查询,我不得不怀疑你需要有某种应用程序级别的机制(即configuration每个“types”的DNS服务器根据什么被允许做)。

根据你的例子更新 ,iptables足以实现你想要的,主要是通过确保外部DMZ的查询不能到达任何内部服务器。

您可能需要花一些时间研究DNS服务器的types ,以及查看可以实施的客户端/查询限制。

我无法为你devise你的设置,但是:

  • 您的内部DMZ中有一个内部DNS。 最简单的做法是让这个服务器对你的内部区域具有权威性
  • 如果您的内部主机需要能够解决您的内部域以外的事情,那么您将需要将这些查询转发到外部DMZ DNS服务器。
  • 那么外部DNS DMZ服务器可以(如果需要的话)拥有任何所需公共logging的授权区域,并且被configuration为将不在您域中的任何内容转发到外部世界。

请注意,这些是两种不同的angular色/types的服务器,但是,你可能想要实际上有每个单独的进程(powerdns点'鼓励'这不允许通过权威和recursion由同一过程完成,如果我回忆正确 – 并有一个专门的二进制)。

你可以通过以下方式实现你想要的控制:

  • 禁止从您的外部DMZ到内部服务器的任何查询
  • 允许仅从内部DNS服务器向外部DMZ服务器进行查询(并考虑将内部DNS分为一个转发服务器和一个权威)。
  • 禁止从您的networking以外的任何查询到您的外部DNS服务器,或者允许来自您的networking之外的查询只查找您需要的权威logging。

iptables和在你的DNS结构上花费一些时间之间的主要区别在于iptables阻止了一切,或者什么也不做(因为stream量是允许的或者不允许的)。 通过configurationDNS来满足您的特定需求,您可以进行更细致的控制,即依靠应用程序的“意识”(即可以根据请求内容做出决定)。

我基本上说这可能是值得做深度的防御,但是你的防火墙规则听起来像是他们应该处理的基本需求。 设置DNS只能按照你描述的方式工作,绝对是在防火墙之上,而不是防火墙。