截至撰写本文时(1903),我正在运行Windows 10的最新版本,并且我有一个有效的双堆栈连接。如果我从命令行ping双堆栈设备的主机名,则Windows将首选IPv4地址。如果我关闭IPv4,它将使用IPv6地址。根据众多消息来源(包括此答案),Windows应该更喜欢IPv6。
正如描述的这个答案,我按照这些步骤来获得网络堆栈的跟踪:
netsh trace start provider=Microsoft-Windows-TCPIP level=5 keywords=ut:TcpipRoute
ping -n 1 www.google.com
netsh trace stop
netsh trace convert %TEMP%\NetTraces\NetTrace.etl
生成的文本文件包含以下行:
[2]0910.3710::2019-08-10 01:27:15.198580000 [Microsoft-Windows-TCPIP]IP: Address pair (::ffff:10.0.12.67, ::ffff:172.217.7.132) is preferred over (fd85:741f:6df1:212:50df:dc26:f469:4d4c, 2607:f8b0:4004:800::2004) by SortOptions: 0, Reason: Prefer Matching Label (Rule D 5.0).
关键是
Reason: Prefer Matching Label
RFC 3484第5节“源地址选择”中对此进行了描述。前缀基本上可以具有“标签”,并且源/目标地址对中源标签和目标标签匹配的优先于不匹配的对。
我可以通过运行在计算机上查看前缀/标签映射
netsh interface ipv6 show prefixpolicies
我懂了
Precedence Label Prefix
---------- ----- --------------------------------
50 0 ::1/128
40 1 ::/0
35 4 ::ffff:0:0/96
30 2 2002::/16
5 5 2001::/32
3 13 fc00::/7
1 12 3ffe::/16
1 11 fec0::/10
1 3 ::/96
由于我的源IPv6地址fd85:741f:6df1:212:50df:dc26:f469:4d4c是ULA地址(我使用NPt允许在两个不同的WAN连接之间进行故障转移),因此它属于fc00 :: / 7并得到13的标签。我的目标地址在:: / 0内,并且得到1的标签。那些不匹配,因此首选IPv4,它们都在:: ffff:0:0/96内并且得到的标签4,
为了解决这个问题,我只需要添加一个前缀策略即可将源地址的标签设置为1。我可以通过在管理命令提示符下运行以下命令来做到这一点:
netsh interface ipv6 add prefixpolicy fd00::/8 3 1
这将为fd00 :: / 8(整个ULA前缀)添加一个策略,该策略的优先级为3,标签为1。这是更新的前缀策略表:
Precedence Label Prefix
---------- ----- --------------------------------
50 0 ::1/128
40 1 ::/0
35 4 ::ffff:0:0/96
30 2 2002::/16
5 5 2001::/32
3 13 fc00::/7
3 1 fd00::/8
1 12 3ffe::/16
1 11 fec0::/10
1 3 ::/96
现在,当我对双栈主机名执行ping操作时,它会首选IPv6地址。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句