TCP的面向连接的语义表明套接字一次只能连接到一个端点。但是使用UDP,单个开放套接字可以向/从任意数量的端点发送/接收数据报。我的理解是,一旦调用sendto
,大多数操作系统(至少Linux和Windows)都会自动将短暂端口分配给UDP套接字。
我的问题是:在使用UDP时,在编写可能一次向多个远程端点发送数据报的应用程序时,在安全性方面有哪些最佳做法?在将数据报发送到不同的远程端点之前,套接字是否应“关闭”并重新打开?
例如,考虑需要解析查询的DNS服务器。当递归地解析主机名时,DNS服务器可能需要将数据报发送到许多不同的远程端点 - 即,首先,它必须从某个根服务器发送/接收数据报,然后从TLD服务器发送/接收数据报,等等。在这种情况下,DNS服务器在向所有这些不同的服务器发送/接收数据报时是否应重用相同的套接字/临时端口?或者在发送到其他服务器之前关闭/重新打开套接字是否更好?这里有任何安全隐患吗?
答案 0 :(得分:2)
取决于您对“安全”的意思以及您愿意保护您的数据免受窃听,损坏,攻击,劫持等的影响...每个会话的不同套接字端口通常不会受到影响 - 使调试更容易如果你需要点燃wireshark来弄清楚发生了什么。
我是这样看的。如果对所有套接字会话或不同端口使用相同的端口,则没有区别。如果使用TCP与UDP,则无关紧要。最重要的是,确定的黑客可以根据需要窃听和/或劫持正在交换的消息。您愿意在多大程度上防止这类攻击?如果您只是试图避免仅在选择以前使用过的端口时发生的杂散会话中导致临时数据损坏,那么另一个端口可能会有所帮助。但是,每条消息中用于标识会话的事务ID总是更好。根据事务ID验证传入消息,而不是它来自的地址。
想要一直使用端到端加密,完整性检查和身份验证吗?然后DTLS可能是一个很好的起点。
答案 1 :(得分:0)
但是使用UDP,单个开放套接字可以向/从任意数量的端点发送/接收数据报。
正确。
我的理解是,一旦调用
sendto()
,大多数操作系统(至少Linux和Windows)都会自动将短暂端口分配给UDP套接字。
仅当套接字尚未绑定时。对于UDP服务器,它已经是。
我的问题是:在使用UDP时,在编写可能一次向多个远程端点发送数据报的应用程序时,在安全性方面有哪些最佳做法?套接字应该关闭"并在将数据报发送到不同的远程端点之前重新打开?
它根本不应该关闭和打开。它应该只有一个套接字保持打开状态。
在这种情况下,DNS服务器在向所有这些不同的服务器发送/接收数据报时是否应重用相同的套接字/临时端口?
DNS服务器没有临时端口。它通过接收请求的同一套接字和端口发回响应。
或者在发送到其他服务器之前关闭/重新打开套接字是否更好?
任何其他UDP服务器都是如此。任何UDP服务器都不需要使用临时端口。
您似乎对UDP服务器的工作方式有完全错误的模型。它不像TCP,每个连接都有一个套接字。没有连接,UDP服务器中不需要多个UDP套接字。