我的 GAE 应用程序有很多 dos 尝试,我无法将它们减少/组合成少于 100 个子网以适应限制。有没有办法可以阻止超过 100 个子网?
如果 Google App Engine 团队有机会读到这篇文章,我想说我真的很喜欢 GAE,但现在阻止 IP 的方式效率很低。应该有一些功能可以帮助应用程序所有者在请求率或更智能的方面动态地阻止 IP。
我的 GAE 应用程序有很多 dos 尝试,我无法将它们减少/组合成少于 100 个子网以适应限制。有没有办法可以阻止超过 100 个子网?
如果 Google App Engine 团队有机会读到这篇文章,我想说我真的很喜欢 GAE,但现在阻止 IP 的方式效率很低。应该有一些功能可以帮助应用程序所有者在请求率或更智能的方面动态地阻止 IP。
使用Guice和Sitebricks创建自己的动态速率限制非常简单。使用方法拦截器,您可以计算每个 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 时间付费。但是只要您的算法足够激进,这些成本就会很小,例如一个内存缓存获取和检查条件。在 GAE 提供自己的动态 DOS 保护之前,我会这样做。