Я боролся с тайм-аутом пары систем после X минут бездействия и не знаю, как это исправить.
У меня в офисе стоит CentOS. Подключитесь к SSH, не могу прикоснуться к нему в течение 2 часов, и он все еще работает, когда я что-то запускаю.
Однако подключитесь к тому же самому ящику дома, и иногда он отключается через пару секунд, иногда через пару минут.
Я бы подумал, что это мое подключение к Интернету, однако, если я активно использую бокс, он останется подключенным.
Однако, если я перестану вводить что-то в Google, появится сообщение об отключении, и мне придется подключиться заново.
Я могу что-нибудь проверить, чтобы узнать, что происходит?
Первое, на что вы должны обратить внимание, - это установить ServerAliveInterval. Это должно быть установлено на вашей рабочей станции.
На клиентах Linux или OSX вы можете создать файл конфигурации для своего пользователя в ~ / .ssh / config на вашей рабочей станции. Добавьте следующую директиву. В моем случае я хочу, чтобы это повлияло на все хосты, поэтому я помещаю его в Host *.
Host *
ServerAliveInterval 60
Это будет отправлять команду noop каждые 60 секунд, чтобы соединение оставалось открытым. Вы можете настроить значение в соответствии со своими потребностями.
На стороне сервера убедитесь, что для TCPKeepAlive установлено значение yes.
grep TCPKeepAlive /etc/ssh/sshd_config
TCPKeepAlive yes
Если вы используете Windows, вам нужно будет обратиться к документации для вашего клиента.
Linux не выполняет тайм-аут простоя SSH-соединений. Вы можете оставить соединение SSH открытым на неопределенный срок, и до тех пор, пока ни одна конечная точка не была перезагружена или не получила новый IP-адрес, соединение по-прежнему будет работать, если вы получите к нему доступ после длительного простоя.
Однако, если есть какие-либо промежуточные ящики с отслеживанием состояния (NAT, брандмауэр и т. Д.), Они, вероятно, прервут время ожидания незанятых соединений. Результатом этого является то, что даже если соединение активно на обоих концах, две конечные точки больше не могут связываться, потому что промежуточный ящик отказывается пересылать любые пакеты, пока клиент SSH не откроет новое соединение.
Если вы знаете тайм-аут промежуточного ящика, вы можете обойти проблему, настроив ClientAliveInterval
в /etc/ssh/sshd_config
на сервере или ServerAliveInterval
в ~/.ssh/config
на клиенте. Для оптимального обнаружения разорванных соединений рекомендуется включить обе настройки. Это также обнаружит разорванные соединения, когда конечная точка была перезагружена или получила новый IP-адрес.
Поскольку вы указываете, что время ожидания иногда составляет всего несколько секунд, этого может быть недостаточно для решения вашей проблемы. Очень малое кажущееся время ожидания может быть вызвано перегрузкой или неправильной настройкой CGN. Вам необходимо проверять трафик в различных точках пути связи, чтобы выяснить, несет ли CGN ответственность за сбои.
Если выясняется, что сбои вызваны тем, что ваш интернет-провайдер делает что-то глупое, например, балансировку нагрузки соединений по нескольким CGN, которые не разделяют состояние соединения, вы не сможете решить проблему самостоятельно, просто настроив конфигурацию SSH.
Если вам случится застрять с интернет-провайдером с ненадежным CGN, который они отказываются исправлять, единственные оставшиеся варианты, о которых я знаю, - это либо обновить клиент и сервер до версий ядра с поддержкой MPTCP, либо использовать туннельное решение, предназначенное для выдерживания спонтанных изменения в сопоставлении портов на NAT.