阻止连接泛滥

时间:2016-06-02 14:21:48

标签: c# sockets networking tcp network-programming

问题:

假设我的应用程序充满了连接尝试(尝试DDoS攻击),并且我想从现在开始忽略来自某个端点的任何流量和连接尝试,那么过滤的最佳位置是什么?

使用案例

在我的应用程序中,我使用System.Net.TcpListener来侦听传入的连接。 我天真的方法是接受所有连接,检查端点,然后立即关闭连接。

某事告诉我,这不是很有效率。即使只是在我的应用程序中单独接受而创建TcpClient也会消耗资源。

那么,我可以做些什么来可靠地拒绝来自某些端点/ ip的连接,同时在Windows上花费最少的资源呢? Linux系统上的情况怎么样?

在Linux上有“iptables”,它是否有效率? 在Windows上,可以使用内置防火墙系统。

是否还有其他方法可以阻止来自ip的软件连接,这可能更有效?如果是这样的话是什么?

硬件防火墙:

请不要试图提及硬件防火墙和过滤器。我知道它们并知道它们是为此目的而制作的,但这个问题明确是关于软件方面的事情。

4 个答案:

答案 0 :(得分:1)

  

有些东西告诉我,这可能非常有效。即使只是   创建TcpClient,同时在我的应用程序中单独接受   消耗资源。

你是对的。一旦流量到达您的应用程序,您的机器已经投入了大量资源来打开新形成的会话。至少,您已经耗尽了网络资源,加​​上操作系统分配的缓冲区和新套接字的各种数据结构。

  

那么我该怎样做才能可靠地拒绝某些端点/ ip的连接   在Windows上花费最少的资源吗?关于   Linux系统上的情况相同吗?

您已经在自己的问题中提到了答案 - 使用防火墙。如果不是硬件防火墙,那么软件防火墙。如果您从特定的已知IP地址充斥,或者恶意流量具有您可以为其定义防火墙规则的其他属性,请执行此操作。在Windows上,您可以在Linux上使用常规Windows防火墙 - 只需使用Iptables。两者都比应用程序级别过滤更有效。

您可能还想考虑使用Syn Cookies,有时必须明确启用它。它们对某些类型的DDos攻击有效。

答案 1 :(得分:0)

如果您希望在应用程序到达您的应用程序之前阻止基于IP地址和/或端口的请求通过应用程序服务器接收它或从接受系统调用返回,您需要在操作系统上停止这些请求水平。如你所提到的,这将是像Linux或Windows防火墙中的iptables一样的解决方案。一旦您的应用程序收到请求,就会在从accept系统调用返回之前发生三次握手,并且读取了整个请求。

如果您想根据内容阻止请求,可能必须在应用程序中执行此操作,如果您不想拥有第5层或第7层路由器。

考虑有不同类型的DDoS攻击,有些在TCP层创建半连接,中断TCP三次握手,有些发送看起来有效的实际请求,它们只消耗CPU,带宽,磁盘,数据库连接资源,但是一般情况下,不可能阻止带有黑名单IP地址的DDoS,因为攻击者拥有大量的地址来欺骗。

答案 2 :(得分:0)

为什么没有第二个程序监控您的网络,有点像过滤器?让它监听您正在使用的端口,并让它花费时间从IP地址连接之间的时间并检查内容请求。如果来自地址的连接超过阈值,则将用户列入黑名单。此外,您可以监控一天中的平均请求率并获得平均值。如果请求计数非常高,几乎可以肯定是DDOS,您应该降低从IP地址到更严格的约束的连接请求之间的时间阈值。注意:这是严格扫描传入连接:检查传入连接不会消耗系统资源,就像您启动套接字以接受连接一样。

只是一个想法。

答案 3 :(得分:0)

我在DDOS Attacking的时候也遇到过这个问题,为了解决这个问题,我实现了一个方法,当TCPlistener崩溃时,系统重建它,这个snake大大增加了系统的稳定性。