Находясь в облаке Azure, я обнаружил, что брандмауэры довольно часто разрывают соединения между веб-сервером и базой данных. В основном, когда было какое-то бездействие, я думаю, что-то от 5 до 10 минут. Итак, я провел небольшое исследование и обнаружил, что это обычная проблема.
Проблема кажется в основном решаемой, если установить некоторые keep alive. (1) (2) (3)
Таким образом, все сводится к тому, как межсетевые экраны обрабатывают TCP-соединения:
Когда вы находитесь за NAT-прокси или брандмауэром, это очень распространенная проблема - отключение без причины. Такое поведение вызвано процедурами отслеживания соединений, реализованными в прокси-серверах и брандмауэрах, которые отслеживают все соединения, которые проходят через них. Из-за физических ограничений этих машин они могут хранить в своей памяти только конечное число соединений. Наиболее распространенная и логичная политика - сохранять новейшие соединения и сначала отбрасывать старые и неактивные соединения.
(из TCP Keepalive HOWTO)
Означает ли это, что брандмауэр / NAT может разрывать TCP-соединения, когда захочет? Как после 2 секунд бездействия? Или есть что-то, что мешает нам опасаться, что никакое соединение не защищено от брандмауэра?
Теоретически да, любой маршрутизатор или брандмауэр может решить разорвать ваше соединение. Это, конечно, очевидно, потому что вы не можете заставить какое-либо оборудование делать именно то, что вы хотите, отправляя правильные TCP-пакеты. Как с этим бороться - решать роутеру.
На практике это именно то, что вы цитировали. Чтобы предотвратить это, вы должны убедиться, что на линии есть активность. Например, когда у меня есть сеансы SSH, я запускаю в них сеанс tmux с часами, поэтому каждую минуту происходит какая-то активность.
Кроме того, я предпочитаю использовать ПК с Linux в качестве маршрутизаторов и брандмауэров, так как у них обычно достаточно памяти, чтобы никогда не прерывать неактивное соединение. В основном это проблема с оборудованием потребительского уровня.