分類
Linux

使用 fail2ban 防止 Bind9 被用於 DNS 放大攻擊

前言

我在阿里雲搭建的自用 dnsmasq 服務器,用來做免污染的 DNS,最近由於公開了IP,果然就遭到了攻擊——其實是被用於 DNS 放大攻擊。

由於 dnsmasq 本身就沒有設計為對外提供 DNS 服務,所以它對於安全方面的配置文件不是很多(根本沒有!),但它的解析策略又很方便配置(比如中國DNS解析白名單等),所以我在原本的基礎上,再加了一個 Bind9 作為前端來做安全。

那麼,今天我們就一起來看看到底如何給 Bind9 做安全配置。

Bind9 自身安全配置

Bind9 本身支持很多安全策略,我們把它做好,就已經能夠讓 DNS 十分健壯:

編輯 /等等/捆綁/命名.CONF.選項 ,我們添加自定義策略:

詳細解釋:

隱藏掉 Bind9 的版本信息,避免黑客針對你的 Bind9 版本漏洞進行攻擊。

這句是開啟 Bind9 解析轉發,就像 dnsmasq 一樣,讓 Bind9 能夠向上獲取解析而不是自身去從根解析,就可以避免污染了(我這裡解析到了本地的 dnsmasq 上)

只允許轉發,禁用根解析,同時開啟外部解析和緩存。

關閉安全配置,因為我要向上轉發到dnsmasq,而前者的應答是非權威應答,所以要讓 Bind9 接受非權威應答,就要關閉它。你不這樣用的話就不必關。

在查詢一個域名時,可能會看到有“非權威應答”的提示,該提示表示你所查詢的域名不使用你當前所用的DNS查詢服務器上。

為每個 IP 進行限速,如果請求超過每秒 25 個,就不再響應直接丟包。

效果

這樣一來,你應該就能在 //日誌/系統日誌 裡看到大量的超限 drop 記錄了,不過,即使如此,vps的流量依舊如流水一般遠去,所以,我們還需要使用第三方的工具來處理這些 IP。

記得重啟服務 服務 BIND9 重新開始

使用 Fail2ban 自動屏蔽黑客 IP

沒錯, 如果你讀過我的 購買了VPS之後你應該做足的安全措施 這篇文章,那你的 vps 上應該已經安裝了這個工具,它默認就已經能夠很好的運行了,但要給 Bind9 使用,我們還要繼續定制一番。

定制 Bind9 以兼容 Fail2ban

Bind9 默認並不會單獨生成日誌的,我們需要把出錯的日誌輸出以便 Fail2ban 能夠記錄,所以編輯 /等等/捆綁/命名.CONF ,在文件末尾另起一行插入如下語句:

這是重定向 Bind9 的默認日誌到 //高速緩存/捆綁/安全.日誌 大小保持30M

這時候如果你用 尾巴 -F //高速緩存/捆綁/安全.日誌 來查看,就會看到一大堆類似這樣的記錄了:

顯然,現在有人在利用我的 DNS 進行反射攻擊,接下來我們配置 Fail2ban 來幹掉這些 IP。

讓 Fail2ban 對 Bind9 生效

其實 Fail2ban 原生支持 Bind9 的,甚至其列表裡就已經內置——不過那個策略與我們的期望不甚相符,還得自己改改。

編輯過濾配置

編輯 /等等/的fail2ban/監獄.CONF 文件,在裡邊找到關於 Bind9 的配置部分,默認如下:

我們給它改改,udp 和 tcp 都啟用:

這裡的意思是一旦在1秒內發現5次記錄,就會把對應的 IP 給加入黑名單,時間則是默認的3600秒。不過不要擔心,這個記錄是 drop 記錄,不是正常的 query 記錄

修改過濾規則

接下來我們改一下默認規則,默認的規則是探測被攻擊——而我們是要探測被用於攻擊……編輯 /等等/的fail2ban/過濾/命名-拒絕.CONF 文件,找到如下幾行:

改為:

重啟服務

使用命令 服務 的fail2ban 重新開始 來重啟服務,這時候使用命令可查看其狀態:

你看,已經抓到一個了。

總結

總之,一番折騰下來,我們得到瞭如下收穫:Bind9 能夠對單個 IP 的每秒請求進行限制(隨後你可以根據需求進行修改),一旦某IP再一秒內對服務器請求次數超過限制,則會被記錄並丟棄請求,如果超過的次數超過五次,那麼就會被拉入黑名單被防火牆拒絕(對方顯示目標地址不可達)。

關於UDP的一點討論

如你所見,在 Fail2ban 配置文件當中也寫明了對 UDP 的策略很有危險,因為黑客可以很容易偽造不同的地址,這樣可能會被用來利用你的規則惡意屏蔽某些 IP ,如果你的服務器出現這個情況,你就需要關掉針對 UDP 的策略了。

擴展閱讀

Iptables-Fail2ban處理bind 非法攻擊

十分鐘架設DNS轉發緩存服務器

阻止使用的fail2ban包DNS DDOS

本文由 落格博客 原創撰寫:落格博客 » 使用 fail2ban 防止 Bind9 被用於 DNS 放大攻擊

轉載請保留出處和原文鏈接:https://www.logcg.com/archives/1681.html

通過 落格博客

如非聲明,本人所著文章均為原創手打,轉載請註明本頁面鏈接和我的名字。

10 在回答“使用 fail2ban 防止 Bind9 被用於 DNS 放大攻擊”

只是為了確保其他人不會犯此錯誤.
在TCP監獄下:
[命名拒絕TCP]

更改為:
動作= iptables-多端口[name =已命名, 端口= 53, 協議= udp]

這個:
動作= iptables-多端口[name =已命名, 端口= 53, 協議= TCP] << 這個

站長好,我的dns服務器收到的攻擊日誌如下:
202.9.120.7#13620 (aaa.com): 視圖G-1: 限速下降SERVFAIL錯誤響應 202.9.120.7/32

可能是由於啟用了view?在使用您教程裡的正則表達式failregex = #S+( \([\S.]+\))?\: rate limit drop時無法匹配,請問我這種日誌,如何修改正則表達式,使其能匹配日誌?盼求回复,謝謝!

我使用您提到的兩個正則式,都不行。是不是什麼地方漏寫了什麼?
日誌中一條為
120.9.20.2#52774 (Chef.vpn.qianxin.com): 查看cnc用戶: 限速下降

我文中的例子是 “#80 (nhl.msk.su): 限速下降”, 你的日誌是 “#52774 (Chef.vpn.qianxin.com): 查看cnc用戶: 限速下降”,比我的多了“ view cnc-user:“ 這麼個字段,如果它是固定的,那就把正则改成“#\S+( \([\S.]+\))?\: view cnc-user\: rate limit drop“ 試試,如果是變化的,干脆变成 “#\S+( \([\S.]+\))?\:.+\: rate limit drop“ 得了。

簡單來說就是你的日誌格式和我的不一致~

發表評論

您的電子郵件地址不會被公開. 必填字段標 *