用 LD_PRELOAD 写魔法程序

💡 原文中文,约6600字,阅读约需16分钟。
📝

内容提要

作者利用 MTR 工具排查网络问题,开发了一个平台查询 IP 对应设备。通过 LD_PRELOAD 技术自定义 getnameinfo 函数,使 MTR 直接显示设备名称。尽管遇到日志打印和 Golang 程序死锁等问题,最终成功实现功能并发布。

🎯

关键要点

  • 作者使用 MTR 工具排查网络问题,开发了一个平台查询 IP 对应设备。
  • 通过 LD_PRELOAD 技术自定义 getnameinfo 函数,使 MTR 直接显示设备名称。
  • MTR 支持 DNS PTR 反查,但内网 DNS 没有支持 PTR 记录。
  • 使用 LD_PRELOAD 技术可以自定义 getnameinfo 函数的行为。
  • 编写了简单的 C 语言程序验证 LD_PRELOAD 的可行性。
  • 使用 Go 语言实现逻辑,但遇到日志打印和程序死锁等问题。
  • 解决日志打印问题的方法是将日志输出到 stderr。
  • Golang 程序在 fork 后出现死锁问题,最终用 C 语言实现逻辑解决了问题。
  • 将程序打包成 deb 包发布到内网中,推荐使用 nfpm 工具。
➡️

继续阅读