我的GAE应用程序有很多dos尝试,我无法将它们减少/合并到少于100个子网中以适应限制。有没有办法阻止超过100个子网?
如果Google App Engine团队有机会阅读此内容,我想说我真的很喜欢GAE,但现在阻止IP的方式效率很低。应该有一些功能可以帮助应用所有者动态阻止IP,无论是请求率还是更智能的东西。
答案 0 :(得分:0)
使用Guice和Sitebricks创建自己的动态速率限制非常简单。 Using method interceptors,您可以计算每个servlet的每个IP地址的请求数。这些计数器可以存储在memcache中,用于根据您自己的规则快速失败请求。这些可以完全针对具体应用。
@Service
class Servlet {
@Get
@At("/your/servlet")
@IpRateLimited
public Reply<?> foo(Request request) {
return Reply.with("Hello World");
}
}
class IpBasedRateLimiter implements MethodInterceptor {
public Object invoke(final MethodInvocation invocation) throws Throwable {
// Inspect the request argument on the invoked method to get the IP address
if (isDenialOfServiceAttempt(invocation)) {
// Fail the request
return Reply.saying().error();
} else {
// Continue executing the original request
return invocation.proceed();
}
}
}
...
bindInterceptor(Matchers.any(), Matchers.annotatedWith(IpRateLimited.class),
new IpBasedRateLimiter());
...
您仍然需要支付用于检测DOS尝试的CPU时间。但只要您的算法具有足够的积极性,那么这些成本将是最小的,例如一个memcache获取并检查条件。在GAE提供自己的动态DOS保护之前,我会这样做。