BIND/DNSMASQ 查询挂在 ubuntu 服务器 14.04.1 上

BIND/DNSMASQ 查询挂在 ubuntu 服务器 14.04.1 上

我正在我的 VPS 上测试 BIND 和 DNSMASQ 配置。当我运行一个提交大量查询(每秒大约 10-20 个)的程序时,我的 DNS 回复会在随机的时间内停止返回。如果每秒发送 3 个查询,则查询不会出现锁定。

例如:

  • 我可以查询 45 秒并得到回复。然后突然有 5 秒钟我没有收到回复。
  • 我可以查询 15 秒并得到回复。然后突然有 10 秒钟我看不到回复。

我试图通过查看以下内容来弄清楚发生了什么:

  • 内存使用情况
  • CPU使用率
  • 来自绑定调试的系统日志条目
  • 观看 IPTABLES 数据包流,看看 iptables 是否无法同时处理这么多数据包。(我有 iptables 规则来限制 DNS 请求仅来自我的 IP,并阻止任何端口的所有其他 IP 请求)
  • 测试了 BIND 和 DNSMASQ。

我所看到的:

  • BIND 和 DNSMASQ 存在相同的问题。
  • 内存使用情况显示正常,服务器没有终止进程并重新启动进程。
  • 整个系统的 CPU 使用率永远不会超过 0.7%。
  • 限制绑定缓存大小不会导致明显的差异。
  • 当使用适当的规则观看 IPTABLES 时,我发现当 DNS 查询停止回复并且 DNS 日志停止滚动时,IPTABLES 传入数据包正常流式传输。但是,在 DNS 日志停止的同时,我在 IPTABLES 中看到 STOP 的是,IPTABLES 规则中发送到我的特定 IP 的数据包被冻结,而总体传入数据包不断滚动,而且我的 SSH 终端窗口明显不断更新,因为我可以看到传入的数据包数量总体上在增长。
  • 然后我测试了刷新所有 IPTABLES 规则,确认刷新 iptables 规则后问题仍然存在。然而,当观察传入数据包计数时,总体计数不断增长,就像有规则时一样。

我仍然 100% 不知道它的 iptables 是否无法足够快地处理传入数据包? (即使规则全部被刷新?)(我认为每秒 20 个左右的 DNS 查询不太可能导致 iptables 在处理数据包时挂起)

究竟是什么原因导致了这种挂起?以下内容让我非常困惑:

  • SSH 终端在查询挂起时刷新控制台屏幕/执行命令完全没问题
  • 当查询被挂起时,其他程序(如 top/htop)也会继续更新。
  • iptables 总体传入数据包计数器不断滚动,而我的 IP 计数器的独立规则不增长

我当时无法尝试测试同时从两个 IP 发送查询(我知道这整个问题可能是我的 ISP/路由器导致我发送的 DNS 流量挂起?)。但是,我从网络上的两台不同的客户端计算机发送数据,这些计算机通过一个公共 IP 进行路由。我也不认为这是可能的问题。

由于 BIND 和 DNSMASQ 在相同类型的配置设置中存在相同的问题,我发现很难找出问题所在,它甚至是绑定/dnsmasq 问题还是某种系统数据包处理问题?

我还测试了指向 googles DNS 8.8.8.8 的情况,我遇到了同样的问题,这让我相信它可能与我的 ISP/路由器有关?只是很奇怪,这么小的流量会导致我的路由器/ISP 瘫痪吗?如果请求来得那么快,也许谷歌 DNS 会阻止请求?

有什么想法吗?

我的 VPS 是 1 个 CPU 核心、256mb 内存、10GB 固态硬盘。系统使用量通常在130-160mb左右。

答案1

它可能是您选择的 DNS 转发器(您的 ISP 和 Google 的)的速率限制。

也可能是路由器中的连接跟踪(状态防火墙)导致表已填满,导致新的 DNS 请求无法在 NAT 表中分配条目,因此无法转发。但是,如果您有 VPS,看起来您没有使用 NAT?

iptables对于非常大数量的数据包没有问题。我见过它用于 4Gbit/s 和更多流量的非对称路由设置,每秒有数千个请求。只要确保conntrack桌子足够大,我net/nf_conntrack_max = 524288sysctl.conf

将 BIND 配置为您自己的 IP 的递归转发器可能会有所帮助,以便您不依赖于任何外部转发器。然后,您将 DNS 请求发送到广泛的 DNS 服务器,而不仅仅是 2 或 3 个,这可能有助于 NAT。

相关内容