Linux

掛在 ubuntu 伺服器 14.04.1 上的 BIND/DNSMASQ 查詢

  • December 30, 2014

我正在我的 VPS 上測試 BIND 和 DNSMASQ 配置。當我執行一個送出一堆查詢(大約每秒 10-20 個)的程序時,我的 DNS 回復會隨機停止返回。如果每秒發送 3 個查詢,查詢似乎不會鎖定。

例如:

  • 我可以查詢 45 秒並得到答复。然後突然5秒鐘我沒有得到回复。
  • 我可以查詢 15 秒並得到答复。然後突然10秒鐘我看不到回复。

我試圖通過查看以下內容來弄清楚發生了什麼:

  • 記憶體使用情況
  • CPU使用率
  • 來自綁定調試的 syslog 條目
  • 觀看 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 規則仍然出現問題。然而,當觀察傳入的數據包計數時,總計數會不斷增長,就像有規則時一樣。

如果它的 iptables 不能足夠快地處理傳入的數據包,我仍然不知道 100%?(即使所有規則都被清除了?)(我認為每秒 20 次左右的 DNS 查詢不太可能導致 iptables 在處理數據包時掛起)

究竟是什麼導致了這種掛斷?以下讓我很困惑:

  • SSH 終端在查詢掛起時刷新控制台螢幕/執行命令完全沒問題
  • 當查詢掛起時,其他程序(如 top/htop)也會繼續更新。
  • iptables 整體傳入數據包計數器不斷滾動,而我的 IP 計數器的獨立規則沒有增長

我當時無法嘗試同時測試從兩個 IP 發送查詢(我知道這整個問題可能是我的 ISP/路由器導致我發送的 DNS 流量掛斷?)。但是,我從我的網路上的兩台不同的客戶端電腦發送,它們通過一個公共 IP 路由。我也不認為這是可能的問題。

由於 BIND 和 DNSMASQ 在相同類型的配置設置下存在相同的問題,我發現很難找出問題所在,它甚至是綁定/dnsmasq 問題還是某種系統數據包處理問題?

我還測試了指向 google 的 DNS 8.8.8.8 並且我遇到了同樣的問題,這讓我相信它可能與我的 ISP/路由器有關?很奇怪,這麼少的流量會導致我的路由器/ISP 崩潰?如果他們來得那麼快,也許Google的 dns 會阻止請求?

有什麼想法嗎?

我的 VPS 是 1 個 CPU 核心,256mb 記憶體,10gb ssd。系統使用量通常在 130-160mb 左右。

它可能是您選擇的 DNS 轉發器(您的 ISP 和 Google 的)的速率限制。

也可能是路由器中的連接跟踪(狀態防火牆)導致表填滿,因此新的 DNS 請求無法在 NAT 表中分配條目,因此無法轉發。但是,如果您有 VPS,您似乎沒有使用 NAT?

iptables對大量數據包沒有問題。我已經看到它用於具有 4Gbit/s 和更多流量的非對稱路由設置,每秒有數千個請求。只要確保conntrack桌子足夠大,我net/nf_conntrack_max = 524288sysctl.conf.

將您的 BIND 配置為您自己的 IP 的遞歸轉發器可能會有所幫助,這樣您就不會依賴任何外部轉發器。然後,您將 DNS 請求發送到廣泛的 DNS 伺服器,而不僅僅是 2 或 3 個,這可能有助於 NAT。

引用自:https://unix.stackexchange.com/questions/176560