Security
採取哪些步驟來保護 java 伺服器免受 cpu 過載?
我已經為我正在擺弄的軟體解決方案編寫了一個 java 伺服器應用程序。
伺服器使用多執行緒處理套接字和 postgresql 作為數據庫。我擔心潛在的作惡者,因為現在,有人很容易通過快速反复連接來弄亂我的伺服器。
基本上,我正在尋找一種僅接受來自電腦的連接的方法,這些電腦在過去一秒內或 w/e 內沒有連接。我想我可以註冊所有連接並設置一個計時器,但我也認為伺服器仍然可能會因為必須同時檢查許多連接而超載,儘管不如沒有計時器的情況那麼多。
我已經搜尋了 stackoverflow 和 serverfault,但沒有找到這個特定問題的結果:/。
設置非常簡單。在 main 方法中接受所有連接並轉發到相應的執行緒:
public static void main(String[] args) { gui = new mainFrame(); try { ServerSocket serverSock = new ServerSocket(80); while (true) { Socket sock = serverSock.accept(); new Thread(new listenThread(sock)).start(); } } catch (IOException ex) { methods.log("Couldn't create server"); ex.printStackTrace(); } }
將不勝感激任何幫助。麥克風。
您可以使用 iptables 在作業系統級別解決此問題。以下幾行來自 debian linux, YMMV。它將在 60 秒內將連接限制為 3 個。
iptables -I INPUT -p tcp --dport 5432 -i eth0 -m state --state NEW -m recent --set iptables -I INPUT -p tcp --dport 5432 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
這假設您在埠 5432 上執行您的 postgresql 伺服器,並且 eth0 是面向網際網路的卡。
如果您希望限制任何其他埠,則只需替換埠號即可。
來源和更多範例(對於 ssh,埠 22) http://www.debian-administration.org/articles/187