На сайте клиента сетевая команда добавила межсетевой экран между клиентом и сервером. Это приводит к отключению простаивающих соединений после примерно 40 минут простоя. Люди в сети говорят, что у брандмауэра нет тайм-аута для бездействующего соединения, но факт заключается в том, что неактивные соединения разрываются.
Чтобы обойти это, мы сначала сконфигурировали сервер (компьютер с Linux) с включенными TCP-сообщениями поддержки активности с tcp_keepalive_time = 300, tcp_keepalive_intvl = 300 и tcp_keepalive_probes = 30000. Это работает, и соединения остаются жизнеспособными в течение нескольких дней или более. Однако нам также хотелось бы, чтобы сервер обнаруживал мертвые клиенты и прерывал соединение, поэтому мы изменили настройки на время = 300, intvl = 180, зонды = 10, полагая, что если клиент действительно жив, сервер будет проверять каждые 300 с. (5 минут), и клиент будет отвечать ACK, и это не позволит брандмауэру рассматривать это как простое соединение и уничтожать его. Если клиент был мертв, после 10 проверок сервер прервал соединение. К нашему удивлению, бездействующие, но живые соединения уничтожаются примерно через 40 минут, как и раньше.
Wireshark, запущенный на стороне клиента, не показывает никаких сообщений активности между сервером и клиентом, даже если на сервере разрешены сообщения активности.
Что здесь может происходить?
Если настройки активности активности на сервере: время = 300, intvl = 180, пробники = 10, я ожидаю, что если клиент жив, но бездействует, сервер будет отправлять пробные проверки активности каждые 300 секунд и оставлять соединение в покое, а если клиент мёртв, он отправит один через 300 секунд, затем еще 9 проб каждые 180 секунд, прежде чем разорвать соединение. Я прав?
Одна из возможностей заключается в том, что брандмауэр каким-то образом перехватывает запросы проверки активности с сервера и не передает их клиенту, а тот факт, что он получил проверку, заставляет его думать, что соединение активно. Это обычное поведение для брандмауэра? Мы не знаем, что это за брандмауэр.
Сервер является узлом Teradata, и соединение происходит от клиентской утилиты Teradata к серверу базы данных, порт 1025 на стороне сервера, но мы видели ту же проблему с SSH-соединением, поэтому мы думаем, что это влияет на все TCP-соединения.