UDP 连接和安全
UDP connections and security
TCP 的面向连接的语义表明套接字一次只能连接到一个端点。但是使用 UDP,单个打开的套接字可以 send/receive 数据报 to/from 任意数量的端点。我的理解是,大多数操作系统(至少 Linux 和 Windows)会在 sendto
被调用时自动将临时端口分配给 UDP 套接字。
我的问题是:在使用 UDP 时,在编写可能一次将数据报发送到多个远程端点的应用程序时,就安全性而言,最佳做法是什么?在将数据报发送到不同的远程端点之前,套接字是否应该 "close" 并重新打开?
例如,考虑需要解析查询的 DNS 服务器。在递归解析主机名时,DNS 服务器可能需要将数据报发送到许多不同的远程端点 - 即首先,它必须 send/receive 来自某个根服务器的数据报,然后来自 TLD 服务器,依此类推。在这种情况下,当 sending/receiving 数据报到所有这些不同的服务器时,DNS 服务器是否应该重用相同的 socket/ephemeral 端口?或者在发送到不同的服务器之前 close/reopen 套接字更好?这里有任何安全隐患吗?
But with UDP, a single open socket can send/receive datagrams to/from any number of endpoints.
正确。
My understanding is that most operating systems (at least Linux and Windows) will assign an ephemeral port to a UDP socket automatically as soon as sendto()
is called.
仅当套接字尚未绑定时。对于 UDP 服务器,它已经是。
My question is: when using UDP, what are the best practices, in terms of security, when writing applications that may send datagrams to multiple remote endpoints at a time? Should the socket "close" and reopen each before sending datagrams to a different remote endpoint?
它根本不应该关闭和打开。它应该只有一个插座保持打开状态。
Should a DNS server in this case reuse the same socket/ephemeral port when sending/receiving datagrams to all these different servers?
DNS 服务器没有 临时端口。它通过接收请求的相同套接字和端口发回响应。
Or is it better to close/reopen a socket before sending to a different server?
任何其他 UDP 服务器也是如此。任何 UDP 服务器都不需要使用临时端口。
您似乎对 UDP 服务器的工作方式有一个完全错误的模型。它不像 TCP,每个连接都有一个套接字。没有连接,在一台 UDP 服务器中不需要多个 UDP 套接字。
取决于您所说的 "secure" 的意思以及您愿意在多大程度上保护您的数据免遭窃听、损坏、攻击、劫持等...每个会话使用不同的套接字端口通常不会有什么坏处- 如果您需要启动 wireshark 来弄清楚发生了什么,可以更轻松地进行调试。
我是这样看的。如果您对所有套接字会话使用相同的端口或使用不同的端口,这没有区别。使用 TCP 还是 UDP 甚至都没有关系。底线是 确定 黑客可以窃听 and/or 劫持正在交换的消息,如果他愿意的话。您愿意在多大程度上防止这些类型的攻击?
如果您只是想避免因选择以前使用的端口时发生的杂散会话而造成的偶然数据损坏,那么不同的端口可能会有帮助。但是在每条消息中使用事务 ID 来标识会话总是更好。根据事务 ID 验证传入消息,而不是消息到达的地址。
想要全程进行端到端加密、完整性检查和身份验证吗?那么 DTLS 可能是一个很好的起点。
TCP 的面向连接的语义表明套接字一次只能连接到一个端点。但是使用 UDP,单个打开的套接字可以 send/receive 数据报 to/from 任意数量的端点。我的理解是,大多数操作系统(至少 Linux 和 Windows)会在 sendto
被调用时自动将临时端口分配给 UDP 套接字。
我的问题是:在使用 UDP 时,在编写可能一次将数据报发送到多个远程端点的应用程序时,就安全性而言,最佳做法是什么?在将数据报发送到不同的远程端点之前,套接字是否应该 "close" 并重新打开?
例如,考虑需要解析查询的 DNS 服务器。在递归解析主机名时,DNS 服务器可能需要将数据报发送到许多不同的远程端点 - 即首先,它必须 send/receive 来自某个根服务器的数据报,然后来自 TLD 服务器,依此类推。在这种情况下,当 sending/receiving 数据报到所有这些不同的服务器时,DNS 服务器是否应该重用相同的 socket/ephemeral 端口?或者在发送到不同的服务器之前 close/reopen 套接字更好?这里有任何安全隐患吗?
But with UDP, a single open socket can send/receive datagrams to/from any number of endpoints.
正确。
My understanding is that most operating systems (at least Linux and Windows) will assign an ephemeral port to a UDP socket automatically as soon as
sendto()
is called.
仅当套接字尚未绑定时。对于 UDP 服务器,它已经是。
My question is: when using UDP, what are the best practices, in terms of security, when writing applications that may send datagrams to multiple remote endpoints at a time? Should the socket "close" and reopen each before sending datagrams to a different remote endpoint?
它根本不应该关闭和打开。它应该只有一个插座保持打开状态。
Should a DNS server in this case reuse the same socket/ephemeral port when sending/receiving datagrams to all these different servers?
DNS 服务器没有 临时端口。它通过接收请求的相同套接字和端口发回响应。
Or is it better to close/reopen a socket before sending to a different server?
任何其他 UDP 服务器也是如此。任何 UDP 服务器都不需要使用临时端口。
您似乎对 UDP 服务器的工作方式有一个完全错误的模型。它不像 TCP,每个连接都有一个套接字。没有连接,在一台 UDP 服务器中不需要多个 UDP 套接字。
取决于您所说的 "secure" 的意思以及您愿意在多大程度上保护您的数据免遭窃听、损坏、攻击、劫持等...每个会话使用不同的套接字端口通常不会有什么坏处- 如果您需要启动 wireshark 来弄清楚发生了什么,可以更轻松地进行调试。
我是这样看的。如果您对所有套接字会话使用相同的端口或使用不同的端口,这没有区别。使用 TCP 还是 UDP 甚至都没有关系。底线是 确定 黑客可以窃听 and/or 劫持正在交换的消息,如果他愿意的话。您愿意在多大程度上防止这些类型的攻击?
如果您只是想避免因选择以前使用的端口时发生的杂散会话而造成的偶然数据损坏,那么不同的端口可能会有帮助。但是在每条消息中使用事务 ID 来标识会话总是更好。根据事务 ID 验证传入消息,而不是消息到达的地址。
想要全程进行端到端加密、完整性检查和身份验证吗?那么 DTLS 可能是一个很好的起点。