- Получить ACK как первый пакет
HA-прокси не работает на уровне необработанных пакетов, но на уровне TCP. На этом уровне нет такого понятия, как ACK как отдельный пакет. На этом уровне нет даже концепции пакета. Вместо этого существует только концепция потока данных, состоящего из принятых байтов.
Каждый раз, когда я получал ответ от ACK сервера, соединение прерывается HAProxy, в результате чего внутренний сервер не работает.
Учитывая, что прокси-сервер HA не заботится о пакетах с нулевой полезной нагрузкой, во-первых, вполне вероятно, что ваш «ACK как первый пакет» на самом деле является пакетом, который содержит ACK (как почти все пакеты TCP), но также содержит некоторые полезная нагрузка, но не та, которую вы ожидаете со «следующим пакетом». Поскольку полезная нагрузка не соответствует полезной нагрузке, которую вы указали, как и ожидалось, проверка не пройдена.
Обратите внимание, что это только предположение, основанное на неполной информации о вашем "ACK как первом пакете". Чтобы доказать это предположение, на самом деле нужно увидеть, что на самом деле происходит в сети, например, с помощью захвата пакета.
EDIT # 1:
после того, как OP предоставил некоторый (недокументированный) дамп пакетов, а некоторые выяснили, где начинается фактический заголовок IP в этих пакетах (смещение 14, то есть с префиксом заголовка Ethernet 2-го уровня), это Понятно, что первый пакет не имеет полезной нагрузки, что означает, что он полностью игнорируется проверкой. Второй пакет тогда имеет следующую полезную нагрузку 17 байтов:
0030 00 0f 30 30 30 30 30 30 42 33 ..000000B3
0040 30 30 43 48 45 43 4b 00CHECK
Учитывая, что OP проверяет binary 303030303030
, но фактическая полезная нагрузка равна 00 0f 30 30 30 30 30 30 ....
, данная tcp-check expect ...
не соответствует фактической полезной нагрузке, и, следовательно, проверка не проходит.
EDIT # 2:
После того, как OP предоставил pcap соединения без и с haproxy, можно увидеть разницу в поведении клиента / haproxy и сервера:
без haproxy:
- клиент отправляет на сервер 2 байта
\x00\x11
, за которыми следуют 17 байтов \x30\x30....
- сервер отвечает сразу 17 байтами
\x00\x0f\x30\x30....
с haproxy:
- haproxy отправляет на сервер 17 байтов
\x30\x30...
.
Он не отправляет первые 2 байта \x00\x11
, как это было сделано исходным сервером !!!
- Сервер не отвечает (кроме ACK без полезной нагрузки). После 6 секунд бездействия haproxy закрывает соединение с сервером и, вероятно, считает проверку неудачной.
В итоге: я думаю, что проверка haproxy не может отправить правильный запрос на сервер, т.е. отсутствуют первые 2 байта. Вот почему сервер не будет отвечать вообще, и через некоторое время проверка не будет выполнена.