Security

採取哪些步驟來保護 java 伺服器免受 cpu 過載?

  • July 26, 2011

我已經為我正在擺弄的軟體解決方案編寫了一個 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

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