2011-05-21 100 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可能是一个很好的地方问,如果你打算走下那条路。