sockets - UDP 连接和安全

标签 sockets security dns udp datagram

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

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

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

最佳答案

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

我是这样看的。如果您对所有套接字 session 使用相同的端口或使用不同的端口,则没有什么区别。使用 TCP 还是 UDP 甚至都没有关系。最重要的是,如果有决心的黑客愿意的话,他可以窃听和/或劫持正在交换的消息。您愿意采取何种措施来防止此类攻击?

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

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

关于sockets - UDP 连接和安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29113671/

相关文章:

java - 如何通过同一个套接字发送不同类型的数据

c - select() 返回时没有传入连接

c - C 中的堆栈溢出代码用于编写漏洞利用程序

security - 关于 p2p 社交网络的注意事项

security - 黑客是否可以使用 HTTPS 克隆网站?

powershell - Powershell 出现奇怪的 DNS 记录重复?

python - 将消息发送到多个服务器pyzmq

sockets - 套接字协议(protocol)基础

php - 有人可以解释 SSL 如何在电子商务网站上帮助我吗?

dns - 使用 CNAME DNS 条目调用 AWS Lambda 函数