一、问题场景
这个问题只会出现在云服务器操作系统使用Windows Server 2012的场景,如果使用的是Windows Server 2008 R2则不存在这个问题。
二、https部署场景
1. 阿里云SLB的配置:
要让SLB支持https,需要使用4层负载均衡,也就是添加TCP协议,并添加443端口。
2. Windows Server 2012云服务器中IIS的相应配置:
参考博文:给IIS添加CA证书以支持https
三、遇到的问题
以https通过SLB的VIP无法访问目标站点,而通过云服务器的公网IP可以正常访问,在其他云服务器中通过内网IP也可以正常访问。
telnet可以正常连接SLB的443端口。
四、问题的排查过程
我们向阿里云提交工单之后,阿里云技术工程师在云服务器所在的宿主机上进行了抓包测试,发现云服务器收包之后,没有回包。
我们查看IIS日志,发现日志中没有https请求的踪迹,阿里云技术工程师说这是由于TCP三次握手没完成。
图片来自:简单理解Socket
于是根据阿里云技术工程师的建议,我们在云服务器内部进行了抓包。
我们用的工具是Wireshark,抓包结果如下图:
抓包结果说明云服务器收到了来自SLB的https请求的SYN包,却没有回包。
于是问题就锁定在为什么没有回包?
我们怀疑是底层虚拟机化层面的问题,阿里云怀疑是云服务器内部Windows的问题。
五、问题的解决
阿里云技术工程师另外用Windows Server 2012部署了同样的场景,成功重现了问题,并给我们提供解决方法(解决方法链接),以下是关键步骤:
1. Install the Loopback Adapter
2. Make the Windows Networking Stack Use the Weak Host Model
netsh interface ipv4 set interface <IDX> weakhostreceive=enabled
3. Add the Loopback Adapter to your Site Bindings
但这个解决方案针对的是Windows Server 2003和2008,我们在Windows Server 2012上按照这三个步骤设置之后,问题并没有解决。但问题的原因就在这个地方,我们稍作摸索,就成功解决了问题。
下面是具体的设置步骤:
1. 安装Loopback Adapter(在Windows Server 2012中叫Microsoft KM-TEST Loopback Adapter)
- 打开Device Manager(设置管理器)
- Add legacy hardware
- Install hardware that I manually select from a list(Advanced)
- Network adapters
- Microsoft -> Microsoft KM-TEST Loopback Adapter
2. 启用Weak Host Model
- 在命令行下运行netsh interface ipv4 show interface,得到所有网络接口的Idx
- 为所有网络接口分别设置weakhostsend=enabled, weakhostsend=enabled
netsh interface ipv4 set interface 1 weakhostsend=enabled netsh interface ipv4 set interface 1 weakhostreceive=enabled netsh interface ipv4 set interface 15 weakhostsend=enabled netsh interface ipv4 set interface 15 weakhostreceive=enabled netsh interface ipv4 set interface 17 weakhostsend=enabled netsh interface ipv4 set interface 17 weakhostreceive=enabled netsh interface ipv4 set interface 29 weakhostsend=enabled netsh interface ipv4 set interface 29 weakhostreceive=enabled
3. 在IIS中添加额外的针对Loopback Adapter的https绑定
上图中的169.254.164.223就是添加的Microsoft KM-TEST Loopback Adapter网络接口自动分配的IP地址。
完成这些配置之后,问题就解决了!
六、参考资料
- Barracuda Load Balancer - Deployment in a Microsoft Windows Server 2003 or 2008 Environment
- IIS 8 NLB LoopBack Issues
七、相关链接