Bind 防禦 DNS Amplification Attacks ( DNS 放大攻擊 )

最近在新加坡設立了一臺 AWS 主機,並且搭配 WHM/cPanel 做為網站伺服器。多數的運作都還算不錯,除了 DNS 伺服器,被做為攻擊 cpsc.gov 美國消費品安全委員會的跳板。有大量 IP 向主機發出 dig 請求,雖然服務正常,但由於數量極大,保守估計耗費了 100M 的頻寬在回應攻擊請求。

DNS伺服器攻擊流量
DNS伺服器攻擊流量

由於 DNS 服務器不能關閉,因此第一時間先將 /etc/named.conf 的 recursion yes; 改為 recursion no;, recursion 選項表示當 DNS 伺服器沒有被查詢的資料時,是否向其他伺服器轉查詢。由於這台 DNS Server 並不是像 Google 的 8.8.8.8 或 Hinet 的 168.95.1.1 等公用 DNS 伺服器,因此直接關閉是沒有問題的。

同時,加上限制查詢速率 response-per-second ,當查詢者的速度過快時,便不回應查詢。
rate-limit {
    responses-per-second 5; /*每秒最多查詢 5 次*/
};

利用 service named restart 重啟 DNS 伺服器後,檢視相關紀錄能發現出現非常多的 denied 資料,例如:
client {IP}#26394: query (cache) ‘cpsc.gov/ANY/IN’ denied
雖然有 rate-limit 能將多數惡意的查詢丟棄,如果 IP 來源夠多,對伺服器仍有不小的負擔。此時可以利用 blackhole 選項,針對惡意攻擊 IP 一律不回應。

由於 IP 數量龐大,因此藉助 shell script 對 bind 記錄檔分析,
cat /var/named/data/named.run | grep denied | grep -E -o “([0-9]{1,3}[\.]){3}[0-9]{1,3}” | sort | uniq | awk ‘{print “\t\t”$0″;”}’
上述的指令是找出 denied 的查詢紀錄,並分析出 IP 位址,取出不重複的資料後,前面加上兩次 Tab 跳位,後面加上分號。

實務上,會建議搭配 crontab 與 shell script 直接產生 blackhole 需要的格式在某一檔案,定期重啟 DNS 伺服器:
blackhole {
    SOME_IP1;
    SOME_IP2;
};
而在/etc/named.conf 裡,利用 include 把 blackhole 的設定引入。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

數學難題 * 限制時效已用盡。請重新載入驗證碼。