一、背景

看监控看多了之后,就容易对一些细小的指标感兴趣。这不,以下两张图片展示了一批功能不同的服务器,发生了tcp timeouts。

2024-02-29T01:59:55.png
2024-02-29T02:00:04.png

二、理论依据

  • TCP超时(TCP timeouts):

TCP超时是指在TCP连接建立或数据传输过程中,如果一方在规定的时间内没有收到对方的确认或其他响应,就会触发超时机制。
当TCP超时发生时,通常会重新发送之前未得到确认的数据包,以确保数据的可靠传输。

  • TCP重传(TCP retransmissions):

TCP重传是指在发送端未收到对端确认的情况下,会重新发送之前发送的数据包。
TCP重传通常会在TCP超时后触发,以确保数据的可靠传输。

  • TCP中止(TCP abort):

TCP中止是指在某些情况下终止TCP连接的过程。
TCP中止可能是由于超时次数达到上限、连接出现严重错误、或者用户主动关闭连接等原因引起的。

三、排查过程

3.1 使用tshark抓包

tshark -i eth0 -Y "tcp.analysis.retransmission" -T fields -e ip.src -e tcp.srcport -e ip.dst -e tcp.dstport -e tcp.flags.syn -e tcp.flags.ack -e tcp.seq -e tcp.ack

2024-02-29T02:02:58.png

从上图可以看出,有一些22端口的流量。难道是有人探测?
安装fail2ban保护服务器。后来发现,tcp timeouts还是有。
于是在云主机的外网防火墙,封禁22端口。效果不错。
2024-02-29T02:04:25.png
2024-02-29T02:04:04.png

此时,tshark抓包遇到了另外两个问题。

3.2 问题一 内网调用网外网服务

这个问题是由于内网服务去调用外网服务,而外网服务已经不用了。所以存在有没有删除的代码逻辑还在调用旧接口。
2024-02-29T02:05:14.png

通过使用conntrack命令拿到云主机上哪个ip地址在连接
2024-02-29T02:06:16.png

使用脚本

#!/bin/bash

# Get all running container IDs
container_ids=$(docker ps -q)

for id in $container_ids
do
  # Get container name
  name=$(docker ps --format '{{.Names}}' -f id=$id)

  # Get container image
  image=$(docker ps --format '{{.Image}}' -f id=$id)

  # Get container IP
  ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $id)

  echo "ID: $id"
  echo "Name: $name"
  echo "Image: $image"
  echo "IP: $ip"
  echo "-------------------------"
done

查看信息,最终锁定了容器名称,等待交付研发。

3.3 问题二 长连接服务始终有tcp retrans

这种情况,可能跟业务场景有关系。好多物联网设备,低功耗的,网络延迟会大一些等等造成。也不算啥问题了。
2024-02-29T02:07:29.png

总结

  • tcp的状态监测是评估业务运行状况重要的指标之一。
  • 灵活运行tshark和conntrack可以辅助定位问题。
  • 因为外网ssh 22端口密码探测导致的问题,可以使用开启防火墙拦截。
最后修改:2024 年 05 月 11 日
如果觉得我的文章对你有用,请随意赞赏