问题描述:

在window环境下(windows server2008/vista及以上版本)中,绑定了辅助IP后,主动外访时有可能不再走主IP。

导致后果:往往表现为主机绑了辅助IP后主动外访不通,但外网IP被访问时是通的。

因为外网IP经常是绑在主内网IP上,如果当对外发送流量不再选择走主内网IP,而是选择没有绑外网IP的辅助IP的时候,网络当然不通。

这与我们的期望不符,我们往往认为网络流量会默认从主IP出去。

示例案例:

primary IP:10.10.20.163 -> 绑定了外网IP:123.206.21.201

secondary IP:10.10.20.30 (后来绑上去的)

gateway:10.10.20.1

问题原因

微软官方镜像的IP选择策略发生了变化:windows server08/Vista之前的版本,会默认从第一个add到网卡的IP出去。

而windows server2008/Vista 及其之后的版本(包括windows server2008、windows server2012、windows server2016、windows 7等),会遵循以下方式:

  • Rule 1: Prefer same address (applies)
  • Rule 2: Prefer appropriate scope (applies)
  • Rule 3: Avoid deprecated addresses (applies)
  • Rule 4: Prefer home addresses - does not apply to IP v4
  • Rule 5: Prefer outgoing Interfaces (applies)
  • Rule 6: Prefer matching label - does not apply to IP v4
  • Rule 7: Prefer public addresses - does not apply to IP v4
  • Rule 8: Use longest matching prefix with the next hop IP address.

根据规则8,如果主IP与下一跳IP的 matching prefix(前缀匹配) 短于辅助IP与下一跳的 matching prefix ,那辅助IP的优先级会高于主IP,packet 就会由辅助IP发送。

本示例案例中,辅助IP(10.10.20.30)与下一条(即网关10.10.20.1)的 matching prefix 更长,因此流量不再走主IP。

规避方法

使用标志位skipAsSource:用 netsh 命令添加IP时,把skipAsSource标为true。

设置方法

server 2008:

netsh int ipv4 add address < Interface Name > < ip address > < subnet mask > skipassource=true

server 2012:

netsh int ipv4 add address < Interface Name > < ip address > skipassource=true

本示例案例中,对应的命令为:

netsh int ipv4 add address "以太网" 10.10.20.30/24 skipassource=true

文章来源于腾讯云开发者社区,点击查看原文