在 IPv6 网络中,IPV6_V6ONLY 标志用于确保套接字仅使用 IPv6,特别是 IPv4 到 IPv6 的映射不会用于该套接字。在许多操作系统上,默认情况下未设置 IPV6_V6ONLY,但在某些操作系统上(例如Windows 7),默认设置。

我的问题是:引入这面旗帜的动机是什么?IPv4 到 IPv6 映射是否存在某些问题,因此人们需要一种方法来禁用它?在我看来,如果有人不想使用 IPv4 到 IPv6 映射,他们可以简单地不指定 IPv4 映射的 IPv6 地址。我在这里缺少什么?

有帮助吗?

解决方案

我不知道为什么会默认;但是,无论默认是什么,这都是我始终将其提出明确的标志。

关于为什么首先存在它,我想它可以让您保留现有的仅IPV4服务器,并且仅在同一端口上运行新的服务器,而仅用于IPv6连接。或者,新服务器可以简单地将客户端委托给旧服务,从而使IPv6功能变得容易且无痛地添加到旧服务中。

其他提示

并非所有IPv6能力的平台都支持DualStack插座,因此问题变成了需要如何最大化IPv6兼容性的应用程序,或者在不知道DualStack的情况下知道DualStack或分开绑定?唯一的通用答案是ipv6_v6only。

当IPv6 DualStack套接字与IPV4防止IPV4套接字绑定时,在DualStack Acts存在的DualStack IP堆栈之前忽略IPV6_V6ONLY或编写的应用程序可能会在DualStack环境中分离绑定。由于协议或应用程序级别解决问题或IP访问控件,该应用程序也可能不会预期IPv4超过IPv6。

这种或类似的情况很可能会促使女士等人默认为1,即使是RFC3493甚至宣布0为默认值。 1理论上最大化向后兼容性。特别是Windows XP/2003不支持DualStack插座。

不足的应用程序也不缺乏,不幸的是,需要传递较低层的信息才能正确操作,因此此选项对于计划IPv4/ipv6兼容性策略非常有用,该策略最适合需求和现有代码库。

最常提到的原因是服务器具有某种形式的ACL(访问控制列表)。例如,想象一个具有类似规则的服务器:

Allow 192.0.2.4
Deny all

它在IPv4上运行。现在,有人在具有IPv6的计算机上运行它,根据某些参数,IPv4请求在IPv6插座上接受,映射为:: 192.0.2.4,然后不再与第一个ACL匹配。突然,访问将被拒绝。

在您的应用程序中(使用IPv6_V6ONLY)在您的应用程序中进行明确说明将解决问题,无论操作系统默认情况如何。

对于Linux,在编写在IPv4和IPv6插座上倾听的服务时 相同的 服务端口,例如端口2001,您必须调用setSockopt(s,sol_ipv6,ipv6_v6only和一个,sizeof(一个));在IPv6插座上。如果不这样做,则IPv4套接字的bind()操作将失败,而“已使用的地址已经使用”。

有一些看似合理的方法可以使用(命名不佳的)“IPv4 映射”地址来规避配置不当的系统或错误的堆栈,甚至在配置良好的系统中也可能只需要大量的防错工作。开发人员可能希望通过不使用 API 的这一部分来使用此标志来提高应用程序的安全性。

看: http://ipv6samurais.com/ipv6samurais/openbsd-audit/draft-cmetz-v6ops-v4mapped-api-harmful-01.txt

想象一下在对话中包含网络地址的协议,例如FTP的数据渠道。使用IPv6时,您将发送IPv6地址,如果收件人恰好是IPv4映射地址,它将无法连接到该地址。

有一个非常普遍的例子,行为的二元性是一个问题。标准 getaddrinfo() 打电话 AI_PASSIVE 国旗提供了通过 nodename 参数并返回要聆听的地址列表。接受无效字符串形式的特殊值 nodename 并意味着在通配符地址聆听。

在某些系统上 0.0.0.0:: 按照此顺序返回。当默认启用双堆栈插座并且不设置套接字时 IPV6_V6ONLY, ,服务器连接到 0.0.0.0 然后未能连接到双堆 :: 因此(1)仅在IPv4和(2)报告错误上起作用。

我会考虑错误的订单,因为预计IPv6是首选的。但是即使您首次尝试双堆 :: 然后仅IPv4 0.0.0.0, ,服务器仍然报告第二个呼叫的错误。

我个人认为双堆栈插座的整个想法是错误的。在我的项目中,我宁愿总是明确设置 IPV6_V6ONLY 避免这种情况。有些人显然将其视为一个好主意,但在这种情况下,我可能会明确不设置 IPV6_V6ONLY 并翻译 NULL 直接到 0.0.0.0 绕过 getaddrinfo() 机制。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top