tcp检查期望在一行中的第二个数据包中有二进制响应

tcp检查期望在一行中的第二个数据包中有二进制响应,tcp,binary,haproxy,health-monitoring,Tcp,Binary,Haproxy,Health Monitoring,我正在尝试使用HAProxy版本1.5.8在我的后端服务器上构建TCP检查 行为应如下所示: 向服务器发送二进制数据 接收ACK作为第一个数据包 在第二个数据包中接收确认数据 所以我需要检查在发送二进制数据之后,我是否收到了ACK,以及在第二个数据包中的其他二进制数据 可以用HAProxy来做吗 我试图在文档中找到它,并尝试创建不同的配置,但没有成功: option tcp-check tcp-check connect tcp-check send-binary 303030303030 tc

我正在尝试使用HAProxy版本1.5.8在我的后端服务器上构建TCP检查

行为应如下所示:

向服务器发送二进制数据 接收ACK作为第一个数据包 在第二个数据包中接收确认数据 所以我需要检查在发送二进制数据之后,我是否收到了ACK,以及在第二个数据包中的其他二进制数据

可以用HAProxy来做吗

我试图在文档中找到它,并尝试创建不同的配置,但没有成功:

option tcp-check
tcp-check connect
tcp-check send-binary 303030303030
tcp-check expect binary 303030303030
每次我收到服务器ACK的回复时,HAProxy都会终止连接,结果是后端服务器停机

编辑:

我将收到下列文件:

发送数据后的第一个数据包

0000   a0 66 10 09 2e 46 9c af ca bb aa 47 08 00 45 00    f...F.¯Ê»ªG..E.
0010   00 28 40 58 40 00 3e 06 d7 04 0a 1e 0b 34 0a 02   .(@X@.>.×....4..
0020   06 20 25 1c d5 80 91 0a f8 87 db 03 25 8f 50 10   . %.Õ...ø.Û.%.P.
0030   01 c9 03 d6 00 00 00 00 00 00 00 00               .É.Ö........
紧接着上面的第二个包

0000   a0 66 10 09 2e 46 9c af ca bb aa 47 08 00 45 00    f...F.¯Ê»ªG..E.
0010   00 39 40 59 40 00 3e 06 d6 f2 0a 1e 0b 34 0a 02   .9@Y@.>.Öò...4..
0020   06 20 25 1c d5 80 91 0a f8 87 db 03 25 8f 50 18   . %.Õ...ø.Û.%.P.
0030   01 c9 2d 2e 00 00 00 0f 30 30 30 30 30 30 42 33   .É-.....000000B3
0040   30 30 43 48 45 43 4b                              00CHECK
第一个没有任何数据,我需要检查第二个是否包含000000

编辑2:

PCAP提供:

在没有HAProxy的情况下,直接从客户端到服务器进行通信时的正常行为:

使用HAProxy作为负载平衡器,连接到同一服务器并使用同一命令检查,未检查:

后端配置:

backend nodes
        mode tcp
        balance roundrobin
        default-server inter 10s fall 3 rise 2
        option tcp-check
        tcp-check connect
        tcp-check send-binary 303030303030423230303035434845434b
        tcp-check expect binary 000f30303030303042333030434845434b
        server server1 10.30.11.52:9500 check
        server server2 10.30.11.52:9501 check
        server server3 10.30.11.52:9502 check
接收ACK作为第一个数据包 HA代理不在原始数据包级别工作,而是在TCP级别工作。在这个级别上,没有像单个数据包那样的ACK。在这个级别甚至没有数据包的概念。相反,只有由接收字节组成的数据流的概念

每次我收到服务器ACK的回复时,HAProxy都会终止连接,结果是后端服务器停机

假设HA proxy一开始并不关心负载为零的数据包,那么作为第一个数据包的ACK可能实际上是一个数据包,它包含一个ACK,就像几乎所有TCP数据包一样,但也包含一些负载,但不是您期望的下一个数据包的负载。由于有效负载与您预期指定的有效负载不匹配,因此检查失败

请注意,这只是基于关于第一个数据包的ACK的不完整信息做出的假设。为了证明这一假设,我们实际上需要看看线路上到底发生了什么,例如通过数据包捕获

EDIT1:OP提供了一些未记录的数据包转储,并计算出这些数据包中的实际IP报头从偏移量14开始的位置,即以第2层以太网报头为前缀,之后很明显,第一个数据包没有有效负载,这意味着它被检查完全忽略。然后,第二个数据包具有以下17字节的有效负载:

0030                     00 0f 30 30 30 30 30 30 42 33         ..000000B3
0040   30 30 43 48 45 43 4b                              00CHECK
假设OP检查二进制303030303030,但实际有效载荷为00 0f 30。。。。给定的tcp检查预期。。。与实际有效负载不匹配,因此检查失败

编辑2: OP提供了不带或带haproxy连接的pcap后,可以看到客户端/haproxy和服务器的行为差异:

没有haproxy:

客户端向服务器发送2个字节\x00\x11,后跟17个字节\x30\x30。。。。 服务器立即以17字节\x00\x0f\x30\x30…进行响应。。。。 使用haproxy:

haproxy发送17字节\x30\x30。。。到服务器。它不会像原始服务器那样发送初始的2字节\x00\x11!!! 服务器不回复,除非确认没有有效负载。6秒不活动后,haproxy关闭与服务器的连接,并可能认为检查失败。
总之:我认为haproxy检查无法向服务器发送正确的请求,即缺少前2个字节。这就是为什么服务器根本不响应,并且在超时后检查将失败的原因。

请参阅我的编辑,这将提供有关接收内容和应检查内容的更多说明。@user1563721:请参阅编辑我的答案。但实际上,连接的整个TCP捕获,而不仅仅是所选数据的十六进制转储会更有用。当我根据您的回答将以下内容放入配置中时:TCP检查expect binary 000f30303030303042333030434845434b检查仍然失败。要检查的二进制数据与第二个数据包的有效载荷完全相同。但是连接在第一个数据包之后由HAProxy终止,因此HAProxy将不会接收到第二个带有有效负载的数据包。这就是问题所在。@user1563721:能否请您提供一个完整连接的数据包捕获,作为pcap文件,而不是十六进制转储,而不仅仅是选定的数据包?@user1563721:感谢pcap的帮助。我认为您没有向服务器发送正确的请求,这导致服务器根本没有应答,并且超时后检查失败-请参阅我的第二次编辑。