【问题标题】:UDP connections and securityUDP 连接和安全性
【发布时间】:2015-05-20 17:48:50
【问题描述】:

TCP 面向连接的语义表明一个套接字一次只能连接到一个端点。但是使用 UDP,单个打开的套接字可以向/从任意数量的端点发送/接收数据报。我的理解是,大多数操作系统(至少是 Linux 和 Windows)会在调用 sendto 时自动为 UDP 套接字分配一个临时端口。

我的问题是:在使用 UDP 时,在编写可能一次将数据报发送到多个远程端点的应用程序时,就安全性而言,最佳实践是什么?在将数据报发送到不同的远程端点之前,套接字是否应该“关闭”并重新打开?

例如,考虑一个需要解析查询的 DNS 服务器。在递归解析主机名时,DNS 服务器可能需要将数据报发送到许多不同的远程端点——即首先,它必须从某个根服务器发送/接收数据报,然后从 TLD 服务器发送/接收数据报,依此类推。在这种情况下,DNS 服务器是否应该在向所有这些不同的服务器发送/接收数据报时重用相同的套接字/临时端口?还是在发送到其他服务器之前关闭/重新打开套接字更好?这里有什么安全隐患吗?

【问题讨论】:

    标签: sockets security dns udp datagram


    【解决方案1】:

    但是使用 UDP,单个打开的套接字可以向/从任意数量的端点发送/接收数据报。

    正确。

    我的理解是,大多数操作系统(至少是 Linux 和 Windows)会在调用 sendto() 时自动为 UDP 套接字分配一个临时端口。

    仅当套接字尚未绑定时。在 UDP 服务器的情况下,它已经是。

    我的问题是:在使用 UDP 时,在编写可能一次将数据报发送到多个远程端点的应用程序时,就安全性而言,最佳实践是什么?在将数据报发送到不同的远程端点之前,套接字是否应该“关闭”并重新打开?

    它根本不应该关闭和打开。它应该只有一个保持打开的套接字。

    在这种情况下,DNS 服务器在向所有这些不同的服务器发送/接收数据报时是否应该重用相同的套接字/临时端口?

    DNS 服务器没有临时端口。它通过接收请求的同一个套接字和端口发回响应。

    或者在发送到其他服务器之前关闭/重新打开套接字更好?

    对于任何其他 UDP 服务器也是如此。任何 UDP 服务器都不需要使用临时端口。

    您似乎对 UDP 服务器的工作方式有一个完全错误的模型。它不像 TCP,每个连接都有一个套接字。没有连接,并且 UDP 服务器中不需要多个 UDP 套接字。

    【讨论】:

    • 抱歉——也许我在混淆——我提到了一个 DNS 服务器作为例子,但我实际上是在谈论一个 UDP 客户端。毕竟,当 DNS 服务器连接到其他 DNS 服务器以递归解析查询时,它实际上充当 UDP 客户端(而不是服务器)。所以我的问题是,当 UDP 客户端需要将数据报发送到多个端点时,客户端最好在发送到每个不同的端点之前关闭/重新打开套接字? DNS“服务器”只是我想到的一个示例,它可能必须与多个 UDP 端点通信。
    【解决方案2】:

    取决于您所说的“安全”以及您愿意在多大程度上保护您的数据免遭窃听、损坏、攻击、劫持等...每个会话使用不同的套接字端口通常不会受到伤害 - 使调试更容易如果您需要启动wireshark 来弄清楚发生了什么。

    我是这样看的。如果您对所有套接字会话使用相同的端口或使用不同的端口,则没有区别。使用 TCP 还是 UDP 甚至都没有关系。底线是确定黑客可以窃听和/或劫持正在交换的消息,如果他愿意的话。您愿意在多大程度上阻止这些类型的攻击?

    如果您只是想避免在选择以前使用的端口时发生的杂散会话造成偶然的数据损坏,那么不同的端口可能会有所帮助。但是在每条消息中使用事务 id 来标识会话总是更好。根据事务 id 验证传入消息,而不是它来自的地址。

    想要端到端加密、完整性检查和身份验证?那么DTLS 可能是一个很好的起点。

    【讨论】:

      猜你喜欢
      • 2013-03-18
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      相关资源
      最近更新 更多