2011-05-21 119 views
1

我的java服務器目前正在被數千個不同的ip的DDoSed。爲了對抗它,我一直通過專用服務器防火牆阻止IP。然而越來越多的人不斷涌現。這種攻擊淹沒了我的登錄服務器,導致玩家無法登錄。Java登錄服務器淹沒保護

我已經問過其他地方,如我的類型的Java應用程序的論壇,我幾乎沒有得到任何答案。然而他們告訴我這是一種DDoS的形式,另一位用戶向我提到了這一點,但我不相信這會起作用。 http://www.java2s.com/Open-Source/Java-Document/Net/mina-2.0.0-M1/org/apache/mina/filter/firewall/ConnectionThrottleFilter.java.htm

顯然這是我的登錄服務器上的DoS,任何人都有任何線索?我將在下面提供登錄服務器的主要框架。

try { 
    shutdownClientHandler = false; 
    clientListener = new java.net.ServerSocket(serverlistenerPort, 1, null); 
    misc.println("Login server is now online!"); 
    while (true) { 
    try { 
     java.net.Socket s = clientListener.accept(); 
     s.setTcpNoDelay(true); 
     String connectingHost = s.getInetAddress().getHostName(); 
     if (true) { 
      if (checkLog("flooders", connectingHost)) { 
       //misc.println("Flooder Detected, closing connection."); 
       s.close(); // Closes the connection immediately. 
      } else { 
       connections.add(connectingHost); 
       if (checkHost(connectingHost)) { 
        misc.println("Connection from "+connectingHost+":"+s.getPort()); 
        try { 
         playerHandler.newPlayerClient(s, connectingHost); 
        } catch (Exception E) {misc.println("Login Server crash detected. Protecting..."); 
        s.close(); 
       } 
      } else { 
       misc.println("ClientHandler: Rejected "+connectingHost+":"+s.getPort()); 
       s.close(); 
      } 
     } 
     } else { 
      misc.println("ClientHandler: Rejected "+connectingHost+":"+s.getPort()); 
      s.close(); 
     } 
     Thread.sleep(30; 
    } catch (Exception e) { 
     logError(e.getMessage()); 
    } 
    } 
} catch (java.io.IOException ioe) { 
    if (!shutdownClientHandler) { 
     misc.println("World is already online!"); 
    } else { 
     misc.println("ClientHandler was shut down."); 
    } 
} 

回答

4

有幾個選項可以嘗試處理DDoS,但您需要對某些部分進行優化。

例如,您checkLog功能必須是驚人的快,所以你可能需要使用一個「HashMap的」也許,這樣你就可以快速檢查,但爲了確保萬無一失快,你可能想看看的ConcurrentHashMap( http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ConcurrentHashMap.html),所以你可以更好地閱讀和寫入它。

你也可以看看負載平衡你的前端,以便一臺服務器不必做任何事情。

根據服務器上需要執行的操作,找到驗證某人已通過身份驗證的快速方法,但如果您沒有特殊硬件來更好地處理令牌解密,這可能會降低服務器速度, 例如。

您可能還想看看使用NIO(http://tutorials.jenkov.com/java-nio/index.html),以更好地擴展到大量的連接。

+0

謝謝詹姆斯,我已經用hashmap替換了checklog方法,並試圖從IO切換到MINA,但是出現了問題,所以也許又有一次,有更多的建議嗎? – Travis 2011-05-22 00:49:10

+0

配置您的應用程序,並查看減速在哪裏。 – 2011-05-22 15:07:24

2

理想情況下,您不希望惡意請求根本打到您的應用程序,而是在流量到達您的應用程序服務器之前攔截/刪除流量。這樣你的閱讀客戶將不會遇到任何問題。 G。在攻擊正在進行的同時性能下降。

ServerFault可能是一個很好的地方問,如果你打算走下那條路。