为Windows配置优先使用手动设置的IPv6地址

本来Win7下貌似没这个问题的, 当然老早之前一通操作IPv6设置已经和默认有了很大不同。辞旧迎新(指7换10)之际, 发现Win10手动设置的IPv6地址优先级不如SLAAC加随机EUI64得到的地址高。查了一些文档找到了一个workaround, 并不优雅。


Win10下手动设置的地址优先级比一般SLAAC得到的地址低, 为此手动修改Windows的前缀匹配策略, 将/128的完整地址当作前缀, 使其作为源地址的优先级最高。

注意Label的问题。根据Label的定义, 当两前缀Label相同时优先使用对该前缀具有最佳匹配的源地址发起连接, 即使该源地址根据默认前缀匹配得到的优先度较低。在下面的例子中, 当手动设置的IPv6地址Label设置为6时, 如果遇到双栈域名, 根据优先度匹配的顺序为(::6666, 172.x.x.x), 但因为::FFFF:0:0/64为IPv4兼容地址, Label=4, 但::6666的Label=6, 因此在根据Label的第二次匹配中172.x.x.x优先度反而会居上, 所以会优先用v4去请求双栈域名。故将Label设为1, 优先用手动设置的IPv6地址去请求双栈域名。这里各人可以根据自己的情况取舍。

其他主要是注意set/add的区别即可, 先add, 后续修改用add。如果想立即生效, store先赋active, 然后再赋persistent, 否则要重启网卡后生效(?)

| > netsh interface ipv6 add prefixpolicy prefix=2001:db8::6666/128 precedence=45 label=1 store=persistent

Ref:

  1. RFC 3843: https://tools.ietf.org/html/rfc3484#page-18
  2. Using SIO_ADDRESS_LIST_SORT: https://docs.microsoft.com/zh-cn/windows/win32/winsock/using-sio-address-list-sort