我试图把我的头围绕在DNS上的美妙世界。
我为example.com创build了一个区域文件,其中包含:
@ A 1.2.3.4 * A 1.2.3.4
不过,我也build立了我的本地DNS,local.example.com,我已经创build了一个单独的区域文件,包含以下内容:
machine1 A 192.168.0.1 machine2 A 192.168.0.2
当我挖掘machine1.local.example.com它返回一个logging192.168.0.1,很好。
可悲的是,badmachine.local.example.com和local.example.com一样返回1.2.3.4。
我不确定最好的方法来防止这种情况。 如果我将以下内容添加到local.example.com空的Alogging返回上述2个示例是我所希望的行为:
@ A * A
我希望anything.example.com使用通配符除了local.example.com子域中的任何东西,除非指定,我不想给出响应。 基本上我需要一个通配符排除。
这是允许的吗? 这是最好的做法,还是我做的事情非常错误? 我使用PowerDNS和BIND后端。
谢谢你的想法!
首先,你对克里斯S的评论上面澄清(确实是修改)你原来的问题,我希望你能原谅我把它编辑成原来的问题。
其次,正如其他人所指出的,空logging是不允许的。
第三,我认为做你想做的事情的方式是声明local.example.com是一个合适的子域:
local IN NS ns1.example.com local IN NS ns2.example.com
列出与您当前为example.com运行相同的两个名称服务器( 注意:我不知道PowerDNS,所以我上面的条目是BIND格式 )。 然后在这些名称服务器(我认为是这个名称服务器)上声明local.example.com的zonefile,它只包含你想parsing的主机,并且没有通配符logging。
所以当人们查找foo.example.com ,假设没有列出,它将匹配现有的通配符logging,并返回1.2.3.4 (或其他)。 但是当人们查找foo.local.example.com , foo.local.example.com的名称服务器logging将被返回并进行进一步recursion,您的名称服务器现在查看local.example.com的local.example.com ,并说(在没有foo的特定logging和 local.example.com中的通配符的情况下)“不,没有这样的logging”。
确切地知道你以后的反应是有用的。 您的问题中引用的前两行设置了域的默认响应,以及不匹配的logging响应。 因此,example.com将由“@”logging提供服务,而任何-that-doesnt-exist.exmaple.com将由“*”logging提供服务。 他们没有必要,你可以摆脱两者。 将它们设置为空值是一种无效configuration(在大多数系统上)。
我想不出一个方法来“空”一个条目。 空Alogging是不允许的。
也许*.example.com A 1.2.3.4会阻止覆盖.local.example.com条目? 这听起来像PowerDNS是从规范行为不端。 定义local.example.com域应该防止通配符在该域中的任何东西上跺脚。 你能发布完整的区域文件吗? 这将解决一些小问题。
您应该查看正在运行的服务器的特定行为,因为此function尚未得到一致实施:
引用RFC 4592,许多DNS实现以不同的方式与通配符的原始定义不同。
通配符在实践中
你需要的通配符条目是正确的,因为我理解通配符用法的定义(更好地把它看作是最后的手段的默认值)。 我会尽量找时间阅读澄清RFC和更新在这里…