Haproxy

在 HAProxy 中阻止 IP

  • June 4, 2017

客戶的網站目前受到攻擊,我已被要求修復它。

大量 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 創建一些規則,所以不要驚慌。

引用自:https://serverfault.com/questions/853806