一次网络问题排查

💡 原文中文,约2700字,阅读约需7分钟。
📝

内容提要

文章讲述了在搭建Jenkins时遇到的问题,通过收集信息和抓包分析发现是由于MTU太大导致的丢包问题。解决办法是通过iptables修改TCP握手包中的MSS值,从而解决了在Docker容器中访问HTTPS服务的问题。

🎯

关键要点

  • 在新的环境中搭建 Jenkins,使用 Docker 运行。
  • Jenkins 报错为 java.net.SocketTimeoutException: Read timed out。
  • 通过 tcpdump 分析发现访问的 IP 443 端口卡住,但可以 ping 通。
  • 确认问题出在应用层,抓包 DNS 协议找到对应的域名为 accounts.google.com。
  • 容器内可以 ping 和 curl HTTP,但 curl HTTPS 超时,宿主机访问正常。
  • 推测问题与 MTU 太大导致的丢包有关,HTTP 和 HTTPS 的数据包大小不同。
  • Docker 内的 MTU 默认设置为 1500,而宿主机设置为 1450,导致 MSS 协商问题。
  • 解决办法是通过 iptables 修改 TCP 握手包中的 MSS 值为 1410,解决 HTTPS 访问问题。
➡️

继续阅读