如何调试频繁出现的“对端重置连接”

如何调试频繁出现的“对端重置连接”

最近,我在调用外部提供商时开始频繁出现“对等方重置连接”的情况。我的应用程序(客户端)是一个 Go 应用程序,通过 HTTPS 向外部提供商执行一些简单的 POST

一些背景信息:

  • Go 客户端应用程序正在 docker 上运行。
  • “对端重置连接”现象频繁发生,但却不稳定。
  • 提供商表示他们这边没有任何问题。好的,RST 可以来自我们之间的任何地方。

主机实例ifconfig:

docker0   Link encap:Ethernet  HWaddr [REDACTED]
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

eth0      Link encap:Ethernet  HWaddr [REDACTED]
          inet addr:10.208.19.134  Bcast:10.208.19.255  Mask:255.255.255.128
          inet6 addr: fe80::8d:fdff:fe90:f410/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:37685240 errors:0 dropped:0 overruns:0 frame:0
          TX packets:37927624 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:13408927179 (12.4 GiB)  TX bytes:14057395581 (13.0 GiB)

我试过:

  • tcpdump -vv -i eth0 -s 65535 -n dst host [[PROVIDER IP]] -w capture.cap &在主机实例 (EC2) 上运行
  • 使用 Wireshark 打开捕获并查找tcp.flags.reset==1

什么也没找到。我确信在捕获过程中对等方重置了连接(因为我们已设置日志记录)。我只想了解这个RST来自哪里(如果可能的话)。

那么,我有什么选择来寻找所有这些突然错误的根本原因?

答案1

当我尝试通过 VPN 连接到远程主机时,我遇到了同样的问题。我收到一个错误:

OpenSSL SSL_connect: Connection reset by peer in connection <HOST>:<PORT>

就我而言(在 Fedora 36 上),我将 MTU 从 1500(默认)减少到 1400。

sudo ifconfig ppp0 mtu 1400 up

答案2

为了证明数据包来自外部,请尝试将其添加到您的路由器:

iptables -I FORWARD -i eth0 -p tcp --tcp-flags RST RST -j DROP

请注意,正常运行时需要 RST 数据包,这可能会很快占用您的资源,因此,--sport即使是为了测试,也应将其限制为特定的,除非路由器使用频率很低并且只将其留在原处进行本次测试。

如果您在单台机器上进行测试和过滤,请将 FORWARD 替换为 INPUT。将 eth0 替换为您的实际互联网连接。

为了进行基本的确认,您可以发出iptables -nvL | grep spt并查看开始时的数字是如何增加的。

答案3

尝试将 MTU 更改为 1500 而不是 9001。如果流量流向互联网,则会变得碎片化。在该适配器上设置巨型帧毫无意义。

尝试

sudo ifconfig eth0 mtu 1500 启动

相关内容