Networking

UFW 拒絕通過 HTTPS 訪問特定埠?

  • November 30, 2018

我們在某個 IP 上執行了一個開發伺服器,我們的 API 暴露在埠 5000 上,nginx 監聽 80。但是,當向埠 5000 發出 HTTPS 請求時,整個後端將崩潰。因此,我注意到了一個漏洞,當一個訪問https://SERVER_IP:5000,因為它無法處理 HTTPS 請求,請求掛起並且整個後端停止(因此 API 也為任何其他請求掛起)。我只是希望該請求永遠不會到達後端。

我為 UFW 設置了以下規則。

To                         Action      From
--                         ------      ----
8000                       ALLOW       Anywhere
22/tcp                     ALLOW       Anywhere
80                         ALLOW       Anywhere
5000                       ALLOW       Anywhere
443/tcp                    DENY        Anywhere
8000 (v6)                  ALLOW       Anywhere (v6)
22/tcp (v6)                ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
5000 (v6)                  ALLOW       Anywhere (v6)
443/tcp (v6)               DENY        Anywhere (v6)

但是,當導航到https://SERVER_IP:5000時,伺服器仍然崩潰。我認為這是因為 https 流量不一定來自埠 443,而是 5000 並且已暴露(它只需要用於 HTTP 流量)。那麼有什麼方法可以通過 UFW 禁止 5000 上的 HTTPS 流量,還是我必須使用 nginx 配置一些東西?

不,UFW 做不到。

確定 TCP 連接中的流量是否是有效的 HTTP 請求需要接受連接並查看客戶端嘗試發送的數據類型。換句話說,它是基於內容的過濾。

UFW 需要根據 TCP 連接的初始 SYN 數據包中的數據做出決定,該數據包不包含任何數據。那時您無法判斷客戶的請求是什麼。聽起來你寧願在你的 API 前面需要某種 HTTP 反向代理,以過濾掉所有不是適用於你的 API 的格式良好的 HTTP 請求的所有內容。

我是否還可以向您建議您也改進了 API 的輸入驗證,至少在將其投入生產之前,通過發送隨機廢話它不再可能崩潰?否則,看起來您的 API 很可能容易受到微不足道的拒絕服務攻擊,例如nc your.API.server.example 5000 < /dev/urandom,或者可能nc your.API.server.example 5000 < War_and_Peace.txt,其中 War_and_Peace.txt 是絕對大於 API 服務的輸入緩衝區的任何內容。

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