Sco*_*tty 4 network-programming
我正在开发第一款多人RTS游戏,并且自然会使用UDP套接字接收/发送数据。
我一直试图弄清的一件事是如何保护这些端口免遭DoS攻击中的虚假数据包淹没。通常,防火墙可以防止洪水攻击,但是我将需要允许正在使用的端口上的数据包,并且必须依靠自己的软件来拒绝虚假数据包。什么能阻止人们嗅探我的数据包,观察我正在使用的任何身份验证或特殊结构以及向我发送类似数据包的垃圾邮件?可以很容易地更改源地址,从而几乎不可能检测和禁止违法者。是否有防止这种攻击的广泛接受的方法?
我了解UDP和TCP之间的所有区别,因此请不要将其变成关于此的讲座。
=====================编辑=========================
我还应该补充一点,我还试图通过发送我认为来自我的游戏的数据包来防止他人“黑客”游戏和作弊。排序/同步编号或ID很容易被伪造。我可以使用加密,但是我担心这会减慢服务器的响应速度,并且不能为DoS提供保护。
我知道这些是使用UDP套接字的每个程序员都必须遇到的基本问题,但是对于我来说,我找不到有关解决它们的方法的任何相关文档!
任何方向将不胜感激!
最重要的是:永远不要信任客户!始终跟踪服务器端的所有内容。如果到达的数据包似乎是虚假的(就像一个单位每秒移动Y个单位,而它每秒只能移动X个单位),则只需丢弃该数据包。
另外,如果每秒的数据包数量增加,则也开始丢弃数据包。
并且不要将UDP数据包用于“不重要的”事情...游戏中的聊天和类似的事情可能会通过普通的TCP流进行。
您所需的技术并非特定于UDP:您正在寻找用于处理欺骗的常规消息身份验证,用于处理DoS的速率限制,以及用于处理客户端黑客攻击的服务器端状态试探法(“此数据包有意义吗?”)。
为了有效处理DoS,您需要进行检测。首先丢弃无效的源地址,甚至不看内容。将会话ID放在每个数据包的开头,其ID未分配或与正确的来源不匹配。接下来,跟踪每个会话的到达率。从速度太快的地址开始删除。这些技术将阻止一切,除了能够实时嗅探合法数据包的人。
但是基于实时嗅探的DoS攻击将非常罕见,并且攻击速度将受限于单个源网络的速度。阻止数据包嗅探的唯一方法是使用加密和校验和,这将需要大量工作。由于这是您的“第一个多人RTS”,因此我建议您进行除加密外的所有操作。
如果您决定使用加密,则AES-128相对较快且非常安全。如果您真的想优化,或者有很多AES库,Brian Gladman的参考Rijndael实现是一个很好的起点。可以使用简单的CRC-16对明文数据进行校验和。但这对于您可能的攻击媒介来说可能是过高的。