这实际是一个当应用向外发起连接时,协议栈对源IP地址的选择问题。如果你的应用没有显式绑定一个本地地址,协议栈会选择一个"最佳"的本地地址来使用。
从 Vista 之后这个选择策略发生了变化,不再有主IP地址的概念,而是参照 RFC 3484 来选择本地地址作为源IP地址来向外发起连接。在 Vista 之后要指定源IP地址,可以通过安装下面的补丁程序给netsh命令增加一个参数:
- 975808 用于 Windows Server 2008 SP2 或 Windows Vista SP2
- 2386184 用于 Windows 7 或 Windows Server 2008 R2
- 这个修正在 Windows Server 2008 R2 SP1 中已经包含了。
在安装补丁程序的基础上,使用 netsh 命令的新增参数 "skipassource" 来添加不需要作为向外发起连接的源地址的IP地址。
例: netsh interface ipv4 add address "本地连接" 192.168.0.110 255.255.255.0 skipassource=true
如果要查看IP地址"是否作为源"的状态可以使用 "level=verbose" 参数。
例: netsh interface ipv4 show ipaddresses level=verbose
需要注意的是,已经添加的IP地址需要删除后重新添加。
在向外发起连接时使用哪个IP地址作为源地址,可以使用 pathping 命令来验证。