IP和域名限制

6
我们的ASP.NET网站托管在Windows Server 2008和IIS7上。
最近,我们遇到了来自某些IP的“攻击”,这些IP通过提交带有无效参数的不同表单生成大量错误。
我希望能够基于ASP.NET代码生成的列表,在24小时内阻止一系列IP地址。我知道可以使用Web.config中的ipSecurity标签实现此目的。我找到了以下示例:

http://www.dantor.com/support/misc/web-config-ip-address-restriction.aspx

问题在于更改/更新 web.config 会导致网站重新启动/回收。
是否可以更新已阻止的 IP 列表而不进行池回收?
编辑:
也许更好的想法是使用 HttpModule - Scott Hanselman 在他的博客中写了一篇关于这个主题的文章: http://www.hanselman.com/blog/AnIPAddressBlockingHttpModuleForASPNETIn9Minutes.aspx 你认为这会造成性能损失吗?将所有网站请求通过 httpmodule 进行路由可能会对页面加载时间产生影响吗? 还有其他方法可以完成此操作吗?
编辑 2:
该网站受 Fortigate 200a 防火墙保护,但据我所知,防火墙无法自动阻止生成错误或尝试进行 SQL 注入的 IP。

嘿,首先我不知道有任何在修改配置文件时不需要重启站点的方法。 但是我找到一篇博客说,在IIS 7中这些配置并没有保存在配置文件中,所以你可以尝试这个方法。 这是链接:http://weblog.west-wind.com/posts/2007/Apr/28/Blocking-IIS-IP-Addresses-with-ASPNET - Liran
3
你编写这段代码所需的时间,可能比购买一台硬件防火墙更划算,后者可以为你完成同样的任务。 - DavidG
我认为那个答案不太准确——在2014年使用硬件防火墙已经没有多大意义了。只需要将你的网站放在像CloudFlare这样的软件之后,你不仅可以提高性能,而且还可以节省成本。 - TomTom
@sharru 真的吗?为什么?考虑到Cloudflare对于大多数网站每月只需支付0至20美元。此外,你的评论忽略了他们在全球所有代理服务器中提供的显著性能提升...缓存输出。他们也是CDN,这意味着如果你正确使用它们,可以获得更好的性能。 - TomTom
这是错误的。如果你想要完整的DDOS防护 - 但很多基本保护都在免费套餐中。阅读会有所帮助,不要只是浏览文本。 - TomTom
显示剩余3条评论
2个回答

5

是否可以在不重新启动池的情况下更新已屏蔽的IP列表?

我敢肯定地说,不行。

您认为使用HttpModule会导致性能损失吗?

可能会有一些,但不会很大。但请确保IP地址查找部分非常高效。例如,将列表缓存到HashSet中,不要每次从文件中读取列表。

问题是您仍然需要使用Web请求处理能力来抵御无用的请求。但如果您不阻止IP,则查找请求是否无用所需的处理量可能会比这少,因此总体上可能实际上是性能提升。但是,存在一个风险,即这些IP地址发送的请求太多,会使您的服务器不堪重负。

其他选择

很可能可以安装软件防火墙或使用Windows内置防火墙。

正如其他人所说,获取硬件防火墙将完全卸载您的服务器负载。您可以获得可以通过您的Web服务器动态更新以禁止IP地址的硬件防火墙。尽管我从未使用过其中之一,因此无法推荐或评论它们的工作效果。如果您处于基于云的设置中,则可能值得与服务提供商讨论他们可以做些什么。
考虑更新防火墙的一件事是,您真的想允许您的Web应用程序具有更新防火墙的安全特权吗?听起来像是等待发生的安全漏洞,因此在执行此操作时请非常小心,并确保安全特权仅允许将IP添加到阻止列表中。
如果您真的受到了攻击,您可以通过第三方ddos protection service(例如来自VeriSign的服务)路由所有流量。但是期望支付大量费用以获得此特权。
应用程序池回收真的那么糟糕吗?

我刚想到的另一件事是,应用程序池回收可能并不像你想象的那么糟糕。假设您正在使用共享状态服务器,很可能您的用户实际上都不会注意到这种情况发生。原因在于,IIS通常会同时运行两个进程一段时间进行回收,以便新请求由新进程处理,已经开始的请求在旧进程上完成。只有在所有未处理的请求都由旧进程处理完毕后,IIS才会将其关闭。只要您没有在内存中存储状态,这通常意味着您网站的用户不会注意到切换。


你认为我提供的示例代码怎么样?http://www.hanselman.com/blog/AnIPAddressBlockingHttpModuleForASPNETIn9Minutes.aspx,你能提供更好的代码来管理被阻止的IP列表吗?我查看了http://www.incapsula.com/解决方案,我认为它类似于verisigninc。 - RuSh
最简单的方法是使用具有DDOS保护功能的代理服务器,如CloudFlare。价格:0。 - TomTom
像Scott一贯的风格,他的实现很不错。它使用了一个没有值的StringDictionary,这与使用HashSet<String>几乎是一样的。此外,结果是根据文件变化进行缓存的。所以我真的看不出有什么改进的方法。 - Martin Brown

0

我加入DavidG,使用NetShell从命令行添加规则,甚至可以从您的代码中添加规则(c# example),这应该会立即生效,无需重新启动。

只有在您想要接收请求时才使用HTTP模块(例如,IP地址属于公司或热点,并且您希望在终止请求之前分析Cookie),防火墙将在数据发送到服务器之前拒绝连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接