我正在考虑开发我的第一个多人RTS游戏,我自然会使用UDP套接字来接收/发送数据。
我一直在试图弄清楚的一件事是,如何保护这些端口不被DoS攻击中的虚假数据包淹没。通常情况下,防火墙可以防止泛洪攻击,但我需要允许我正在使用的端口上的数据包,并将不得不依靠我自己的软件来拒绝虚假数据包。什么会阻止人们嗅探我的数据包,观察我使用的任何身份验证或特殊结构,并用类似的数据包向我发送垃圾邮件?可以很容易地更改源地址,从而几乎不可能检测和禁止违规者。是否有任何被广泛接受的方法来防御这类攻击?
我知道UDP和TCP之间的所有区别,所以请不要把这变成一堂关于那个的讲座。
=====================编辑=========================
我应该补充的是,我也在努力研究如何通过发送我认为来自我的游戏的数据包来防止有人‘黑’游戏和作弊。序列/同步号或id很容易被伪造。我可以使用加密,但我担心这会在多大程度上减慢我的服务器的响应速度,并且这不会提供针对DoS的保护。
我知道这些都是每个使用UDP套接字的程序员都会遇到的基本问题,但在我的一生中,我找不到任何有关解决这些问题的方法的相关文档!
任何方向都将不胜感激!
发布于 2012-02-03 23:47:54
您需要的技术不是特定于UDP的:您正在寻找用于处理欺骗的通用消息身份验证、用于处理DoS的速率调节以及服务器端状态启发式方法(“这个数据包有意义吗?”)来处理客户端的黑客攻击。
为了有效地处理DoS,您需要多个检测层。首先,在不查看内容的情况下删除无效的源地址。在每个数据包的开头放置一个会话ID,其中的ID未分配或与正确的源不匹配。接下来,跟踪每个会话的到达率。从传入过快的地址开始丢弃。这些技术将阻止任何东西,除了能够实时嗅探合法数据包的人。
但是,基于实时嗅探的DoS攻击将非常罕见,并且攻击率将被限制在单个源网络的速度。阻止数据包嗅探的唯一方法是使用加密和校验和,这将是大量的工作。由于这是你的“第一个多人RTS",我建议做除加密之外的所有事情。
如果您决定使用加密,则AES-128相对较快且非常安全。如果您真的想要优化,Brian Gladman的参考Rijndael实现是一个很好的起点,或者有大量的AES库。可以使用简单的CRC-16来完成明文数据的校验和。但对于你可能的攻击载体来说,这可能是大材小用了。
发布于 2012-02-03 18:24:37
最重要的是:永远不要相信客户!始终跟踪服务器端的所有内容。如果一个包到达时看起来是假的(比如一个单位每秒移动Y个单位,而它每秒只能移动X个单位),那么简单地丢弃这个包。
此外,如果每秒的数据包数增长到很大,也可以开始丢弃数据包。
并且不要将UDP数据包用于“不重要”的事情...游戏中的聊天和类似的事情可以通过正常的TCP流进行。
https://stackoverflow.com/questions/9126973
复制相似问题