【问题标题】:rsyslogd client not closing the TCP connection when server rsyslogd goes down当服务器 rsyslogd 关闭时,rsyslogd 客户端未关闭 TCP 连接
【发布时间】:2020-08-26 20:57:35
【问题描述】:

我已经在远程服务器上配置了 rsyslogd,以使用 TCP 协议从带有 rsyslogd 的客户端机器发送日志。在客户端和服务器上配置并重新启动 rsyslogd 守护程序后,我能够将数据包发送到服务器并且一切正常。但是后来当我在服务器上重新启动 rsyslogd 时,客户端仍在将数据包发送到旧的 TCP 连接。因此,客户端重试了 16 次,但未能发送数据包。重试发送下一个数据包后,客户端正在创建一个新连接,并且通信工作正常。

当我使用 tcpdump 在服务器上重新启动 rsyslogd 时,我捕获了数据包,我们可以看到服务器向客户端发送了 flag[F],并且客户端也确认了它。但是当我们发送下一个数据包时,它并没有创建一个新的连接。

在服务器上重新启动 rsyslog: 服务器端 tcpdump:

*09:54:50.012933 IP x.x.x.101.514 > y.y.y.167.37141:标志 [F.],seq 1,ack 31,win 229,长度 0

09:54:50.013050 IP y.y.y.167.37141 > x.x.x.101.514: 标志 [.], ack 2, 赢得 115,长度 0*

对于从客户端发送的下一个数据包,服务器发送标志 [R] 但客户端不断重试 16 次:

来自服务器的 tcpdump:

*03:55:11.811611 IP y.y.y.167.37141 > x.x.x.101.514:标志 [P.],seq 31:61,ack 2,win 115,长度 30

03:55:11.811647 IP x.x.x.101.514 > y.y.y.167.37141:标志 [R],seq 1863584583,赢0,长度0

03:55:12.014158 IP y.y.y.167.37141 > x.x.x.101.514:标志 [P.],seq 31:61,ack 2,赢 115,长度 30

03:55:12.014189 IP x.x.x.101.514 > y.y.y.167.37141:标志 [R],seq 1863584583,赢0,长度0*

同时在客户端我们看不到来自服务器的响应:

09:55:11.811077 IP y.y.y.167.37141 > x.x.x.101.514:标志 [P.],seq 31:61,ack 2,赢 115,长度 30

09:55:12.013639 IP y.y.y.167.37141 > x.x.x.101.514:标志 [P.],seq 31:61,ack 2,赢 115,长度 30

09:55:12.421627 IP y.y.y.167.37141 > x.x.x.101.514:标志 [P.],seq 31:61,ack 2,赢 115,长度 30

现在,在 16 次重试之后(大约需要 13 分钟),如果我们发送一个新数据包,它就会正确发送。 在这里,我们看到正在创建一个新会话:

*10:16:43.873325 IP y.y.y.167.39859 > x.x.x.101.514: 标志 [S], seq 1000783963, win 14600, options [mss 1460,nop,wscale 7], 长度 0

10:16:43.873658 IP x.x.x.101.514 > y.y.y.167.39859:标志 [S.], seq 231452091, ack 1000783964, win 29200, 选项 [mss 1460,nop,wscale 7],长度为0

10:16:43.873740 IP y.y.y.167.39859 > x.x.x.101.514: 标志 [.], ack 1, 赢得 115,长度 0

10:16:43.873904 IP y.y.y.167.39859 > x.x.x.101.514:标志 [P.],seq 1:31,ack 1,赢 115,长度 30

10:16:43.874084 IP x.x.x.101.514 > y.y.y.167.39859: 标志 [.], ack 31, 赢 229,长度 0*

有人遇到过这样的问题吗?任何人都可以告诉为什么客户端发送标志[F]时服务器没有关闭连接。 rsyslogd 中是否有任何配置参数可以在服务器发送 flag[F] 时创建新会话?

【问题讨论】:

    标签: sockets networking tcp tcpdump rsyslog


    【解决方案1】:

    为什么客户端收到FINACKed后还在发送数据?
    TCP 连接终止是一个4 way handshake,这意味着一旦客户端从服务器接收到FIN,它就会确认它并将所有剩余数据发送到服务器,然后再发送另一个FIN 到服务器并等待它ACK 完成握手并完全关闭连接。

    您提供的日志显示,当服务器重新启动时连接为half-open在连接完全关闭之前它不应该这样做)。这就是客户端在完成握手之前发送剩余数据的原因。

    突然终止的正确方法是什么?
    当端点即将突然终止连接,而已经有一些数据在传输时,它应该发送RST 数据包而不是FIN

    为什么客户端没有收到服务器重启后发送的RST包?
    它必须已被丢弃,因为连接已经半打开,FIN 数据包之前收到,或者它必须被客户端防火墙丢弃,因为潜在的TCP Reset attack

    【讨论】:

    • 感谢您的回复。在这种情况下,TCP 连接由 rsyslogd 开源处理。我正在寻找如何处理这个问题。有没有我可以设置的配置参数来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多