Пытаясь открыть TCP-порт для хоста B из A, я обнаружил проблему в трехстороннем TCP-рукопожатии между двумя хостами.
Клиент / хост A отправляет SYN хосту B, хост B отправляет SYN / ACK, затем хост A отправляет пакет RST.
Я проанализировал пакеты в wirehark и обнаружил, что пакет SYN / ACK не имеет той же контрольной суммы TCP после того, как он был отправлен A и получен B. В остальном это тот же самый пакет. Wireshark помечает пакет как «ACKed невидимый сегмент».
У меня нет прыжков между двумя машинами. Эти два хоста - это виртуальные машины в хостах VMware ESXi. Виртуальные машины находятся на разных хостах. Они напрямую подключены к одной и той же VLAN в ESXi. Клиентские виртуальные машины находятся на ESXi v4.1.0. Я открыл весь брандмауэр для своих тестов. И, наконец, я полностью отключил разгрузку контрольной суммы TCP. Я провел такой же тест с виртуальной машиной, которая находится на том же хосте, и результат тот же. Клиентская виртуальная машина работает под управлением debian Jessie 8.8, а другие виртуальные машины - debian wheezy.
Я подозреваю, что ESXi изменяет контрольную сумму между двумя машинами.
Поскольку у меня нет большого опыта работы с VMware ESXi и ее отладки, я хотел бы знать, как «отключить» контрольную сумму TCP? На данный момент это будет обходной путь и проверка того, что проблема действительно связана с контрольной суммой.
Я попытался добавить такое правило исключения iptables на хосте A:
iptables -t mangle -A PREROUTING -s #IP_HOST_B# -o eth0 -j CHECKSUM --checksum-fill
Но ничего не меняет.