Network programming UDP套接字的安全管理

Network programming UDP套接字的安全管理,network-programming,Network Programming,我正在开发我的第一款多人RTS游戏,我自然会使用UDP套接字来接收/发送数据 我一直想弄清楚的一件事是如何保护这些端口不被DoS攻击中的假数据包淹没。通常情况下,防火墙可以防止洪水攻击,但我需要在我使用的端口上允许数据包,并且必须依靠我自己的软件来拒绝虚假数据包。什么能阻止人们嗅探我的数据包,观察我使用的任何身份验证或特殊结构,并用类似的数据包向我发送垃圾邮件?源地址可以很容易地改变,使侦查和禁止罪犯几乎不可能。有没有被广泛接受的方法来防止此类攻击 我知道UDP和TCP之间的所有区别,所以请不要

我正在开发我的第一款多人RTS游戏,我自然会使用UDP套接字来接收/发送数据

我一直想弄清楚的一件事是如何保护这些端口不被DoS攻击中的假数据包淹没。通常情况下,防火墙可以防止洪水攻击,但我需要在我使用的端口上允许数据包,并且必须依靠我自己的软件来拒绝虚假数据包。什么能阻止人们嗅探我的数据包,观察我使用的任何身份验证或特殊结构,并用类似的数据包向我发送垃圾邮件?源地址可以很容易地改变,使侦查和禁止罪犯几乎不可能。有没有被广泛接受的方法来防止此类攻击

我知道UDP和TCP之间的所有区别,所以请不要把这变成一个关于这个的讲座

============================编辑=========================

我应该补充一点,我也在努力研究如何通过发送我认为来自我的游戏的数据包来防止有人“入侵”游戏和作弊。序列号/同步号或id很容易被伪造。我可以使用加密,但我担心这会降低服务器的响应速度,并且无法提供DoS保护

我知道这些是每个使用UDP套接字的程序员必须遇到的基本问题,但就我的一生而言,我找不到任何关于解决这些问题的方法的相关文档


任何方向都将不胜感激

最重要的是:永远不要相信客户!始终跟踪服务器端的所有内容。如果一个数据包看起来是假的(比如一个单位每秒移动Y个单位,而它应该每秒只能移动X个单位),那么只需丢弃该数据包

此外,如果每秒的数据包数量增加到很大,也开始丢弃数据包


不要将UDP数据包用于“不重要”的事情。。。游戏中聊天和类似的事情可以通过正常的TCP流进行。

您需要的技术不是特定于UDP的:您正在寻找处理欺骗的通用消息身份验证、处理DoS的速率限制以及处理客户端攻击的服务器端状态启发式(“此数据包有意义吗?”)

为了有效地处理拒绝服务,您需要分层检测。首先在不查看内容的情况下删除无效的源地址。在每个数据包的开头放置一个会话ID,该ID未分配或与正确的源不匹配。接下来,跟踪每个会话的到达率。开始从输入速度过快的地址中删除。除了能够实时嗅探合法数据包的人之外,这些技术将阻止一切

但是,基于实时嗅探的DoS攻击将非常罕见,攻击速率将限制在单个源网络的速度。阻止数据包嗅探的唯一方法是使用加密和校验和,这将是大量工作。因为这是你的“第一个多人RTS”,我建议你做加密以外的事情


如果您决定使用加密,AES-128将相对快速且非常安全。Brian Gladman的参考Rijndael实现是一个很好的起点,如果您真的想要优化,或者有很多AES库。可以使用简单的CRC-16对明文数据进行校验和。但是,对于您可能的攻击向量来说,这可能是杀伤力过大。

当然,我会处理来自我客户端的所有消息,以确保它们是合法的,但取消加密(如果我采用该路径)并处理这些数据包到我知道它们是伪造的程度的过程将给服务器带来足够的压力,以进行良好的DoS攻击@这就是为什么大型在线游戏都使用多服务器架构:一台服务器处理连接,一台数据库服务器,一台“应用程序”服务器。(将“一台服务器”替换为“一个服务器集群”)。另一方面,我记得我了解到,您不能同时使用TCP和UDP,因为它们稍后都在同一网络上工作(或其他东西)。。。当然,这可能只是基于每个端口,或者我可能完全错了:)所以你基本上是说,确保服务器足够坚固,能够经受任何DoS攻击?在我看来,必须有更好的方法来早期检测可疑活动。@Scotty TCP和UDP完全不同,甚至可以与相同的端口号一起使用。网络堆栈会小心地将它们分开。很好的总结,非常感谢!我不知道如何判断源IP是否无效?如果游戏是在笔记本电脑/智能手机上进行的,那么会话的IP可能会发生变化。以下是我到目前为止要做的:*登录身份验证以开始活动会话*向所有数据包添加会话ID*用每个数据包的操作标记它(移动/拍摄/保持活动)并限制每秒发送的数据包数*让服务器与客户端验证在过去30秒内发送了多少个X类型的数据包*从逻辑上删除任何看似损坏或伪造的数据包*终止经常违反这些规则的会话