windows 多 IP 时指定流量外访的出口 IP

问题描述:

在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

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

Python-Socket

socket通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过“套接字”向网络发出请求或者应答网络请求 socket既是一种特殊文件...

1987
来自专栏程序猿DD

分布式消息队列 RocketMQ 源码分析 —— Message 拉取与消费(上)

本文主要基于 RocketMQ 4.0.x 正式版 1、概述 2、ConsumeQueue 结构 3、ConsumeQueue 存储 DefaultMessag...

2968
来自专栏Python中文社区

Python云计算框架:Openstack源码分析之RabbitMQ(一)

專 欄 ❈ ZZR,Python中文社区专栏作者,OpenStack工程师,曾经的NLP研究者。主要兴趣方向:OpenStack、Python爬虫、Pytho...

2087
来自专栏CSDN技术头条

使用 Dubbo 搭建一个简单的分布式系统

随着阿里巴巴开源的高性能分布式 RPC 框架 Dubbo 正式进入 Apache 孵化器,Dubbo 又火了一把。本文作为 Dubbo 系列开端,先教大家使用 ...

1072
来自专栏Spark学习技巧

Kafka源码系列之topic创建分区分配及leader选举

一,基本介绍 本文讲解依然是基于kafka源码0.8.2.2。假如阅读过前面的文章应该知道,用户的admin指令都是通过Zookeeper发布给kafka的Co...

4716
来自专栏草根专栏

ASP.NET Core的实时库: SignalR简介及使用

SignalR是一个.NET Core/.NET Framework的开源实时框架. SignalR的可使用Web Socket, Server Sent Ev...

471
来自专栏跟着阿笨一起玩NET

webservice 缓存机制

本文转载:http://blog.csdn.net/zhdd1234/article/details/4555472

551
来自专栏Android 研究

OKHttp源码解析(四)--中阶之拦截器及调用链

那我们书接上文。上篇文章已经说明了OKHttp有两种调用方式,一种是阻塞的同步请求,一种是异步的非阻塞的请求。但是无论同步还是异步都会调用下RealCall的 ...

854
来自专栏Ryan Miao

SpringCloud学习6-如何创建一个服务消费者consumer

1684
来自专栏张善友的专栏

WCF采用 netTcpBinding 发生的Socket errors

最近在项目中采用 Windows service 作为WCF services的宿主, 在服务和客户端的调用上没有发生如何的异常和错误,但是经常发生下述错误: ...

1769

扫码关注云+社区