最近,我在调用外部提供商时开始频繁出现“对等方重置连接”的情况。我的应用程序(客户端)是一个 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 启动