0.废话很多,先上结论:
当双栈环境的Nginx使用域名访问公网,需要规避IPv6出访时,可以选择:
1.故障现象:
微信api服务不可用,Nginx大量抛错
proxy_connect: upstream connect failed (111: Connection refused)…“CONNECT api.weixin.qq.com:443 HTTP/1.1”
connect() to [2402:4e00…1622:5363]:443 failed (101:Network is unreachable)
顾名思义,nginx请求api.weixin.qq.com:443出现问题,且第二条抛错已经明确指出ipv6地址不可达
尝试在LC上使用公网地址,直接对api.weixin.qq.com进行ping测试发现,ping6不可达
这里就基本断定nginx访问api.weixin.qq.com的ipv6地址,有问题了。但此时,并不能确定故障出在整条链路的哪一个点上。
后续在进行ping6测试发现,该域名获取到的v6地址,时通时不通,则进一步确定,故障点应该出现在公网。
2.业务访问链路介绍:
1.内部应用通过正向代理Nginx进行访问api.weixin.qq.com:443请求
2.Nginx通过resolver配置的DNS服务器,解析获取到域名对应的公网地址(这里v4和v6地址均会获得)
3.接下去Nginx服务器使用v6地址进行请求(这里根据操作系统v6优先原则),若v6不可达到,fallback机制使用v4地址进行请求)
4.拿到api.weixin.qq.com的返回后,再转给内部应用,完成正向代理。
3.处理手段
3.1 Nginx只获得v4/v6的解析:
3.2 操作系统修改v6/v4的优先级:
3.3 禁用操作系统的IPv6(不建议):
3.4 中间设备主动RST掉v6的请求,加速fallback:
4.引申
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。