在 HAProxy 中阻止 IP
客戶的網站目前受到攻擊,我已被要求修復它。
大量 IP(輕鬆超過 5,000 個)不斷攻擊
/login
,大概是試圖強行進入。我已經更改了站點,因此頁面返回 500 錯誤,但他們並沒有放棄。顯然,這對現在無法登錄的真實使用者不利。
負載平衡是通過HAProxy完成的,我對此知之甚少(儘管我比幾個小時前知道的要多得多)。我已經嘗試了很多我在網上找到的明智的方法,但似乎沒有任何幫助,可能是因為有這麼大的 IP 塊執行攻擊。
那麼問題來了: 如果 IP 在Y秒內命中****超過X**次,**我該如何拒絕它?
/login
而且,小點 - 我如何查看拒絕日誌,以便我知道它確實有效?
這是haproxy.log 的範例:
Jun 3 14:24:50 hap-server haproxy[11831]: 46.161.62.79:15290 [03/Jun/2017:14:24:49.505] www-https-test~ www-backend/www-03 751/0/202/38/991 500 220 - - ---- 428/428/120/38/0 0/0 "GET /login HTTP/1.1" Jun 3 14:24:50 hap-server haproxy[11831]: 46.161.63.132:47804 [03/Jun/2017:14:24:49.505] www-https-test~ www-backend/www-04 751/0/202/38/991 500 220 - - ---- 428/428/119/42/0 0/0 "GET /login HTTP/1.1" Jun 3 14:24:50 hap-server haproxy[11831]: 46.161.62.43:53176 [03/Jun/2017:14:24:49.505] www-https-test~ www-backend/www-02 751/0/202/38/991 500 220 - - ---- 428/428/118/38/0 0/0 "GET /login HTTP/1.1"
感謝 EEAA 的評論,我能夠使用 fail2ban 解決這個問題。
然而,關於如何在 HAProxy 中使用 fail2ban 的文件很少 - 事實上,這個頁面已經接近Google搜尋“haproxy fail2ban”的頂部,所以我將詳細說明我是如何做到的。
首先,安裝fail2ban。如果你不能做到這一點,你可能不應該在沒有更多幫助的情況下繼續前進。
fail2ban 通過掃描您的訪問日誌來工作,尋找您設置的模式。如果它在 Y 秒內發現該模式 X 次,它將自動禁止該 IP Z 秒。
您的 HAProxy 日誌應位於
/var/log/haproxy.log
. 如果你的負載很重,它可能太大而無法用 Vim 或 Nano 打開,所以只需使用 tail 查看最後幾行:tail -n50 /var/log/haproxy.log
我的日誌中的“壞”條目範例如下所示:
Jun 3 16:48:03 hap-server haproxy[21751]: 178.159.100.29:48806 [03/Jun/2017:16:48:03.735] www-https-test~ www-backend/www-04 172/0/2/3/177 200 339 - - ---- 36/36/0/0/0 0/0 "GET /login HTTP/1.1"
我們希望 fail2ban 獲取的重要資訊是攻擊者的 IP 和他們正在訪問的頁面。
為了告訴fail2ban 如何做到這一點,首先我們要創建一個過濾器。在文件夾中創建一個文件
/etc/fail2ban/filter.d
。我叫我的applogin.conf
,但你可以隨便叫它,只要它以.conf
.內容如下:
[Definition] failregex = ^.*haproxy\[[0-9]+\]: <HOST>:.* "(GET |POST )/login HTTP/1.1"$ ignoreregex =
<HOST>
是日誌中出現 IP 地址的行中的點。如果您想使用與我相同的正則表達式,請替換/login
為攻擊者在您的伺服器上針對的地址。現在你必須告訴fail2ban 你希望它尋找那個過濾器。複製一份
/etc/fail2ban/jail.conf
(以防萬一你搞砸了,需要重新開始),然後打開jail.conf
並在底部添加以下行。[app-login] enabled = true bantime = 1200 findtime = 120 maxretry = 6 filter = applogin logpath = /var/log/haproxy.log port = http,https
方括號中的部分只是一個名稱 - 使用你喜歡的。
bantime
是使用者被禁止的秒數。maxretry
是使用者可以點擊頁面的次數,以findtime
秒為單位。因此,在我的範例中,如果有人在 2 分鐘內嘗試訪問 www.mydomain.com/login 超過六次(或者可能正好六次,我不確定),那麼他們將被禁止 20 分鐘。filter
是您在其中創建的文件的名稱/etc/fail2ban/filter.d
(但沒有.conf
)。logpath
是您希望它在其中搜尋的日誌文件的路徑。保存該文件,然後重新啟動 fail2ban:
service fail2ban restart
跟踪 fail2ban 日誌文件:tail -f /var/log/fail2ban.log
希望在一兩分鐘後,您會開始看到類似的內容2017-06-03 17:04:32,040 fail2ban.actions: WARNING [app-login] Ban 146.185.200.122
就是這樣!您可以免受壞人的傷害(無論如何,那些試圖訪問該特定頁面的人)。
注意 - 您可能還會在 fail2ban 日誌中看到一些 SSH 禁令。它在安裝時會自動為 SSH 創建一些規則,所以不要驚慌。