在Linux / C ++ TCP服务器中,我需要防止恶意客户端打开多个套接字,否则他们只能打开数千个连接,直到服务器崩溃。
检查同一台计算机是否已在服务器上建立连接的标准方法是什么?如果我基于IP地址这样做并不意味着同一个房子里的两个人即使在不同的计算机上也无法同时连接到服务器?
任何信息都有帮助! 提前谢谢。
答案 0 :(得分:1)
TCP本身并不提供用于识别客户端的IP地址以外的任何内容。一些(非独家)选项:
1)将来自任何IP地址的连接数限制为合理的数量,例如10或20(取决于您的系统实际执行的操作。)这样,它将防止恶意DoS攻击,但仍允许合理的可用性。
2)将最大连接数限制在合理范围内。
3)您可以将此委托给更高层的解决方案。作为协议的一部分,让客户端发送仅生成一次的唯一标识符(每次安装等)。然而,这可能很容易被欺骗。
我相信1和2是处理它的服务器数量。将它们放在配置文件中,以便根据场景调整它们。
答案 1 :(得分:1)
除非你有某种订阅/登录系统(但有人可以尝试一次登录数十亿次,因为必须有某种类型)登录握手)。
如果两个客户端使用相同的路由器(使用NAT或某些类似的方案),您的服务器将看到相同的IP地址,因此每个IP地址只允许一个连接对于“来自的多个用户”不会很好同一个家“。如果它们例如使用大学网络或公司网络,这也适用。
因此,根据您提供的内容以及您可以从同一个地方获得的客户数量,您可能需要高于10分。当然,如果您在发生这种情况时进行记录,并且您看到一个公平的数字“看起来像有效的真实用户未能进入”,你可以调整数量。
拥有某种“滚动平均值”也是有意义的,因此每个IP地址每Y秒接受X个新连接,而不是具有固定的最大数量。如果连接持续相当长的时间,这是有意义的...对于短时连接,它是毫无意义的......