当前位置: 首页 > article >正文

【中标麒麟服务器操作系统实例分享】java应用DNS解析异常分析及处理

了解更多银河麒麟操作系统全新产品,请点击访问

麒麟软件产品专区:https://product.kylinos.cn

开发者专区:https://developer.kylinos.cn

文档中心:https://documentkylinos.cn


情况描述

中标麒麟服务器操作系统V7运行在 ARM虚拟机上java业务解析存储域名,出现偶发性失败。

情况分析

业务模型及抓包分析

通过和应用研发人员沟通确认域名解析的接口为java标准库提供的InteAddress.getAllByName()函数,用于获取与一个域名相关的所有IP地址。同时支持IPV4和IPV6地址解析。

dns报文格式如下:

dns请求报文

dns响应报文

DNS的报文格式。其中,事务 ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数这6个字段是DNS的报文首部,共12个字节。整个DNS报文格式主要分为3部分内容,即基础结构部分、问题部分、资源记录部分。

事务ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的。

标志Flags:DNS 报文中的标志字段。

问题计数:DNS 查询请求的数目。

回答资源记录数:DNS 响应的数目。

权威名称服务器计数:权威名称服务器的数目。

附加资源记录数:额外的记录数目(权威名称服务器对应 IP 地址的数目)。

同时根据现有抓包信息:

解析异常时间点,ipv4和ipv6 dns请求报文的事务ID一致,且先回复了ipv6的结果,同时状态为“拒绝”即reply code为5。

所以此处怀疑事务ID冲突是导致解析异常的直接原因,怀疑底层存在事务ID初始化非原子性的情况。

后续验证及代码分析

为排除应用层代码逻辑的影响,编写对应测试程序调用InteAddress.getAllByName()解析存储端域名,经过4天测试复现问题。

对应复现的抓包信息:

关于DNS报文头部的初始化逻辑在底层glibc的reslov相关基础库中。初始化代码如下:

对比glibc-2.17和glibc-2.28版本此处算法及初始化逻辑并无变化。随后追溯2.17及之后相关小版本的补丁,确认Redhat7.9中遇到相关并行DNS请求ID冲突的问题,导致解析超时或失败的情况,详见https://bugzilla.redhat.com/show_bug.cgi?id=2065058。

    该补丁修复并不是针对并行初始化ID时原子锁缺失的场景,而是增加相关逻辑处理ID重复且可能有效的DNS响应报文。

相关补丁代码如下:

分析结论及升级方案

分析结论

并行DNS请求时可能存在事务ID一致的情况,原始glibc相关函数(res_send)只会处理第一个响应报文,忽略第二个报文,可能导致真实的解析结果丢失,最终解析超时或者失败。

高版本glibc-2.17-326通过增加相关逻辑处理同ID的第二个响应报文,修复该问题。

升级方案

中标麒麟操作系统v7.6当前最新版本为glibc-2.17-326.el7.ns7.02,该版本除修复了dns解析相关问题,同时优化解决timezone以及GB18030字符集的问题,所有补丁和红帽7系列对齐,经过严格测试后入库,升级不会影响当前系统稳定性。

具体升级方案:

rpm -Uvh glibc*.rpm nscd*.rpm

升级完成后需重启系统。

以下为测试环境升级结果:


http://www.kler.cn/a/447066.html

相关文章:

  • 中国人工智能学会技术白皮书
  • day11|150,239,347
  • Win10将WindowsTerminal设置默认终端并添加到右键(无法使用微软商店)
  • JavaScript 中常见内置对象的知识点及示例总结
  • 火山引擎发布数据飞轮 2.0,AI 重塑企业数据消费
  • 面试题整理4----lvs,nginx,haproxy区别和使用场景
  • 前端yarn工具打包时网络连接问题排查与解决
  • Hadoop实现WordCount详解
  • HTTP请求的奇幻旅程:从发起至响应的全方位探索
  • 算法 计算大的长方形容器中,存放一排小长形容器,计算出小长形容器中最后一个元素的x坐标的位置的实现方法
  • linux-----进程execl簇函数
  • mysql的事务和存储引擎+备份
  • Audiocraft智能音频和音乐生成工具部署及使用
  • C# OpenCV机器视觉:图像平滑
  • STM32HAL I2C函数
  • STM32裸机系统采用滴答定时器延时
  • Ubuntu安装及删除httpd(Apache)
  • 初识面向对象晨考day09
  • ISP算法之黑电平BLC校正
  • 重拾设计模式--备忘录模式
  • 半连接转内连接 | OceanBase SQL 查询改写
  • Ps:屏幕模式
  • Python3.9的安装和配置
  • C# OpenCV机器视觉:尺寸测量
  • leecode474.一和零
  • 社会工程-交流模型