一次网络问题排查
💡
原文中文,约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 访问问题。
➡️