【问题标题】:What would be the disadvantages/risks of using AF_UNSPEC?使用 AF_UNSPEC 的缺点/风险是什么?
【发布时间】:2011-12-30 06:42:53
【问题描述】:

来自Beej's Guide to Network programming

您可以在 ai_family 字段中强制它使用 IPv4 或 IPv6,或者将其保留为 AF_UNSPEC 以使用任何内容。这很酷,因为您的代码可以与 IP 版本无关。

正如标题所说 - 始终使用 AF_UNSPEC 而不是指定 IPv4 或 IPv6 会有什么缺点(或风险,如果有的话)?

或者仅出于一个原因 - 如果指定了版本,这将保证仅支持此版本?


一点背景知识 - 我考虑在客户端-服务器 (C++) 应用程序中添加对 IPv6 的支持,这两个版本都应该支持。所以我想知道使用AF_UNSPEC是否可以,或者最好从字符串中“识别”地址并使用AF_INET6AF_INET,具体取决于地址。

【问题讨论】:

    标签: c++ c sockets unix network-programming


    【解决方案1】:

    使用 AF_UNSPEC 的风险之一是您将客户端暴露给来自恶意 DNS 服务器的较大响应,该服务器可能试图使用 CVE-2015-7547 导致堆栈缓冲区溢出,并导致恶意代码被客户端。事实上,针对 getaddrinfo 中已知缺陷的一种建议解决方法是阻止使用 AF_UNSPEC,如错误报告中的 here 详细说明。大于 2K 的 DNS 响应的溢出缺陷从 2.9 开始影响 glibc,并在 2.23 中修复。这会影响当前安装的大多数 Linux 发行版。

    【讨论】:

      【解决方案2】:

      您必须区分客户端和服务器应用程序。

      在客户端,这很简单:只需致电getaddrinfo() 并按顺序尝试每个答案,直到获得连接。

      在服务器上,事情有点困难:

      • 有些系统的 IPv4 和 v6 协议栈是相互连接的,只听 IPv6 就足够了。也许必须启用套接字才能监听两者。
      • 其他系统(如 Windows XP)具有无法进行此连接的独立堆栈。在那里,您必须同时使用多个套接字。让我集中讨论以下内容。

      即使在服务器上,getaddrinfo() 也可以使用。在那里,您在提示中使用标志 AI_PASSIVE。然后你得到结果。在这些上你必须听,也许启用IPV6_V6ONLY 标志。

      accept() 应该是非阻塞的,或者使用select()poll()(不确定后者是否可行)。

      【讨论】:

      • 谢谢。我将其中一个标签更改为unix。所以,我的问题是关于linux的。我尝试使用AF_UNSPEC,它似乎对两个版本都适用。我只是想知道我是否可以这样使用它,或者最好处理几个套接字。
      • stackoverflow.com/questions/8113805/…。我写了一个关于它的结论......
      • 啊,我现在明白了。我花了很多时间才明白你的意思:D 我对网络编程有点陌生。谢谢,+1 并接受(尽管这实际上并没有回答标题中的问题,但帮助我理清思路:))
      【解决方案3】:

      事情应该是这样的:

      应用程序应该与第 3 层无关。应按名称连接到另一个系统。该名称应该被解析为一个或多个地址,并且应用程序应该连接到它们而不查看正在使用的实际协议。这样,网络配置是网络管理员和系统管理员的责任。如果在网络中引入 IPv6,那么应用程序会继续工作,甚至不会注意到差异。

      一些现实问题:

      有时 IPv6 配置错误,防火墙不知道如何处理 IPv6,IPv6 仅用于本地网络而没有连接到 Internet 等。这应该不是问题,但有时您会遇到糟糕的实现或配置。为了解决这个问题,IETF 正在制定一个名为happy-eyeballs 的草案。它确保用户不会注意到此类问题。看看那个草稿。使用该草案中指定的技术将确保您的应用程序适用于所有用户。

      【讨论】:

        猜你喜欢
        • 2011-11-07
        • 2010-11-19
        • 2011-07-20
        • 2011-03-14
        • 1970-01-01
        • 2010-11-24
        • 2016-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多