介绍
我目前正在尝试从头开始为 Unity 构建网络层。目前,我正在使用 Node.js 为服务器和客户端测试通过 UDP 的通信。但是我想实现的语言对于我所要求的并不重要。
目前的方法
当前将 Node.js 用于服务器和客户端的方法非常基本。当客户端和服务器不在同一个本地网络中时,我只是将一个数据包从客户端发送到我的服务器。两者都在路由器后面,因此也在 NAT 后面。
然后,服务器向从客户端发送的 UDP 数据包中收到的 IP 和端口发送回一个应答。
问题
我对客户端机器和路由器上打开的端口的安全性感到好奇。到目前为止,我假设我不需要做任何事情来保护客户端免受攻击者或其他任何可以对我的应用程序使用的端口做某事的事情。以下假设说明了为什么我认为我不需要做任何事情来保护客户。
假设
服务器正在设置回调。
服务器开始侦听特定端口,该端口也转发到路由器内的服务器机器。
服务器现在将在收到 UDP 消息时调用回调。然后服务器会向接收到的消息所获得的客户端的地址和端口发送一个UDP消息。
客户端正在设置回调。
客户端开始监听端口 0,这对于 Node.js
dgram
意味着:对于 UDP 套接字,使 dgram.Socket 侦听指定端口和可选地址上的数据报消息。如果端口未指定或为 0,操作系统将尝试绑定到随机端口。- https://nodejs.org/api/dgram.html#dgram_socket_bind_port_address_callback
- 所以操作系统现在知道发送到这个端口的数据包属于我的应用程序。
- 没有人可以将其用于恶意内容。
知道服务器地址和端口的客户端开始向服务器发送 UDP 消息的过程。
客户端路由器收到 UDP 消息。NAT 创建一个随机端口(用于公共端)并将其映射到客户端(本地)地址和端口。
- 所以路由器现在知道发送到公共地址和新生成的端口的数据包属于本地地址和端口。
- 没有人可以将其用于恶意内容。
客户端路由器向服务器发送包含公共地址和 NAT 生成端口的 UDP 消息。
- 可能发生的最糟糕的事情是中间人攻击者可以读取客户端发送的数据。由于仅发送诸如位置等游戏数据,因此在开发基础知识时这不是大问题。
- 没有人可以将其用于恶意内容。
服务器接收到消息并调用3中描述的回调。因此服务器发送到公共地址和客户端的NAT生成端口。
- 可能发生的最糟糕的事情是中间人攻击者可以读取服务器正在发送的数据。由于仅发送诸如位置等游戏数据,因此在开发基础知识时这不是大问题。
- 没有人可以将其用于恶意内容。
同 7. 使用服务器路由器和服务器本地地址和端口。
与 8. 与服务器路由器相同。
客户端接收到服务器的 UDP 消息,并调用处理消息内容的回调。
- 由于客户端的本地端口绑定到我的应用程序,只有没有人可以将其用于恶意内容,因为如果内容不是来自真实服务器,我会忽略这些内容。
问题
那么我的假设是否正确,我真的不需要保护客户端免受任何会以任何方式伤害客户端的攻击?