我有一个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你的设置,但是:
请注意,这些是两种不同的angular色/types的服务器,但是,你可能想要实际上有每个单独的进程(powerdns点'鼓励'这不允许通过权威和recursion由同一过程完成,如果我回忆正确 – 并有一个专门的二进制)。
你可以通过以下方式实现你想要的控制:
iptables和在你的DNS结构上花费一些时间之间的主要区别在于iptables阻止了一切,或者什么也不做(因为stream量是允许的或者不允许的)。 通过configurationDNS来满足您的特定需求,您可以进行更细致的控制,即依靠应用程序的“意识”(即可以根据请求内容做出决定)。
我基本上说这可能是值得做深度的防御,但是你的防火墙规则听起来像是他们应该处理的基本需求。 设置DNS只能按照你描述的方式工作,绝对是在防火墙之上,而不是防火墙。