我在我们的主机托管中有两个运行 CentOS 6.0 的 Web 服务器。一个运行我们的主要营销网站(生产服务器),另一个是生产服务器的临时服务器,因此几乎是完全相同的副本。它们都位于防火墙后面,并具有私有 IP 地址。防火墙通过站点到站点 VPN 隧道连接到我们的总部。两台服务器的名称服务器都设置为使用我们总部的内部 DNS 服务器。
在生产服务器上,我面临这个问题完全一样,甚至主机名也是 phx1-ss-2-lb.cnet.com。问题是,每当我 ping 一个不存在的域名时,我都会得到 cnet.com 主机名。即使在我自己的域名上,如果我执行 somestupidsubdomain.mydomain.com,它也会返回 cnet 地址。在该线程中,他们说这是 NXDOMAIN 劫持,他们应该使用不同的名称服务器。在我的情况中,此生产服务器使用的名称服务器与公司中的其他所有人相同,但这对其他人来说都不是问题。即使是作为生产服务器镜像的暂存服务器也没有问题。
我检查了 /etc/hosts 文件,没有任何异常。我查找了如何通过 nscd 或 bind 刷新本地 DNS 缓存,但都没有安装。我使用 nslookup 查询了我分配的两个 DNS 服务器,结果返回了域未找到错误,这是意料之中的。
我下一步应该看哪里?
编辑
我在端口 53 上使用 tcpdump,然后 ping 一些乱码域名,这是我得到的输出
14:55:39.884442 IP 192.168.4.11.59726 > 192.168.0.22.域: 27749+ A?asdfjjjf.com. (30) 14:55:39.905778 IP 192.168.0.22.域 > 192.168.4.11.59726: 27749 NXDomain 0/1/0 (103) 14:55:39.905930 IP 192.168.4.11.46752 > 192.168.0.22.域: 18476+ A?asdfjjjf.com.com. (34) 14:55:39.926982 IP 192.168.0.22.域 > 192.168.4.11.46752: 18476 2/0/0 CNAME phx1-ss-2-lb.cnet.com.,A 64.30.224.112 (82)
14:55:39.962067 IP 192.168.4.11.44686 > 192.168.0.22.域: 5275+ PTR?112.224.30.64.in-addr.arpa. (44)
14:55:39.983324 IP 192.168.0.22.域 > 192.168.4.11.44686: 5275 1/0/0 PTR phx1-ss-2-lb.cnet.com. (79)
所以如果我没看错的话,这是否意味着我的 DNS 服务器肯定响应了 cnet.com 地址?如果我使用 nslookup,将其设置为 192.168.0.22 服务器,并查询乱码域 A 记录,它不会返回任何内容。
答案1
啊哈!您有一个搜索后缀com
- 您的第一个查询asdfjjjf.com
得到了正确的NXDOMAIN
,而第二个查询则asdfjjjf.com.com
返回了 的准确信息,显然是 的通配符CNAME
。*.com.com
删除该搜索后缀,您应该没问题。
答案2
现在正在进行更详细的讨论
http://centos.org/modules/newbb/viewtopic.php?topic_id=36693&forum=59
使用“strace”对“ping”进行跟踪可以清楚地表明问题确实出在本地库中。跟踪显示了 DNS 调用,本地库确实在 DNS 请求重试时附加了一个额外的“.com”。跟踪清楚地显示了库发出“noexample.com”的 DNS 请求,然后尝试“noexample.com.com”,然后使用“noexample.com.com”的结果进行 ping。
答案3
我在 Codero 的专用服务器上也看到了完全相同的情况。这是一台完全专用的服务器,64 位 CentOS 6,没有虚拟化,由 Webmin 管理。它不运行“named”;所有 DNS 查询都发送到 Codero 的内部 DNS 服务器。与上面的例子一样,“ping”(以及使用 getaddrinfo 的任何操作)将在“.com”中给出不存在的域时返回 CNET 上的主机:
ping noexample.com PING phx1-ss-2-lb.cnet.com (64.30.224.112) 56(84) 字节数据。来自 phx1-ss-2-lb.cnet.com (64.30.224.112) 的 64 字节:icmp_seq=1 ttl=246 时间=11.8 毫秒来自 phx1-ss-2-lb.cnet.com (64.30.224.112) 的 64 字节:icmp_seq=2 ttl=246 时间=12.0 毫秒
但是,“nslookup”和“host”无法正确找到“noexample.com”。所以Codero 的 DNS 服务器没有这样做。
/etc/resolv.conf(由 WebMin 生成)就是这个:
名称服务器 69.64.66.11 名称服务器 69.64.66.10
如果我尝试“noexample.net”,它找不到 IP 地址。这只是一个 .com 问题。
我注意到“getaddrinfo”现在尝试在无法解析的内容末尾添加“.com”。如果我尝试解析“example”,它会找到“example.com”。所以我明白了 A 记录的想法。
这看起来像是“getaddrinfo”中的一个错误。它不应该将“.com”添加到已经拥有“.com”的内容中。
答案4
事情是这样的。
我想我知道发生了什么。请参阅“resolv.conf”的手册页:
http://linux.die.net/man/5/resolv.conf
注意默认值是什么:
域 本地域名。 此域内名称的大多数查询都可以使用相对于本地域的短名称。如果不存在域条目,则域由 gethostname(2) 返回的本地主机名确定;域部分被视为第一个“.”之后的所有内容。最后,如果主机名不包含域部分,则假定为根域。
在本例中,服务器的默认名称是“sitetruth.com”。因此“域部分”是“.com”,任何失败的查找都会在附加“.com”后重试。
为什么这种情况不经常发生?因为大多数服务器的名称都是由某些托管服务分配的,例如“gator123.hostgator.com”。在这种情况下,默认域名是“hostgator.com”,在域名搜索失败时会附加该域名。但是,如果您的服务器的主名称由两个部分组成,则会出现问题。
“resolv” 中的默认值选择不正确。
回到最初的问题,问题只发生在生产服务器上,我敢打赌,生产服务器的名称是“companyname.com”,而测试服务器的名称更长,如“test.companyname.com”。这足以造成这种情况。
将“ndots”设置为 0,或者提供一个空的“搜索”行应该可以禁用此行为,但到目前为止,它还没有这样做。所以我还没有修复。