问题描述:
在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