Большасць парад пра захаванне SSH-злучэння спыняецца на «дадайце ServerAliveInterval 30» і пакідае карысныя дэталі за бортам. Гэтае ключавое слова — таймер на баку кліента, які спрацоўвае толькі тады, калі канал маўчыць, ён лічыць спробы без адказу, а не секунды, і жыве ў файле, дзе перамагае першае супадаючае значэнне. Памыліцеся ў гэтых трох уласцівасцях — і здаровая VPN-сесія ўсё роўна абарвецца, а мёртвая будзе вісець.

Два кірункі належаць розным дэманам

ServerAliveInterval чытае ваш кліент ssh. ClientAliveInterval чытае sshd на далёкім баку і правярае ў адваротным кірунку, ад сервера да кліента. Яны не сінонімы і не ўзаемадзейнічаюць, таму наладка аднаго не ўплывае на паводзіны іншага боку. Блытаніна паміж імі — звычайная прычына таго, што выпраўленне быццам працуе на адным хосце і не працуе на наступным.

Абодва прымаюць нуль. Пры нулі кліент не дасылае нічога зусім, а на баку сервера ClientAliveCountMax роўны нулю адключае разрыў, які інакш рушыў бы ўслед за спробамі без адказу.

Што даказвае спроба, а што не

Пасля таго як наладжаны інтэрвал міне без даных ад сервера, кліент дасылае невялікі запыт праз існуючы шыфраваны канал і чакае адказу. ServerAliveCountMax вызначае, колькі з іх могуць застацца без адказу, перш чым сесія будзе разарваная. Пры інтэрвале 60 і колькасці 3 кліент здаецца прыкладна пасля трох хвілін маўчання, і гэтая лічба — уласцівасць вашай канфігурацыі, а не сеткавы стандарт. Пакіньце інтэрвал на значэнні па змаўчанні 0 — і спроба не будзе дасланая ніколі, менавіта таму стандартны кліент можа бясконца сядзець на мёртвым злучэнні.

Паколькі абмен ідзе ўнутры транспарту SSH, адказ даказвае, што працэс SSH на тым баку ўсё яшчэ чытае і піша. Ён нічога не кажа пра праграму, якую вы запусцілі ўнутры гэтай сесіі: кліент базы даных, перанакіраваны порт або доўгая праграма могуць завіснуць, пакуль транспарт спакойна адказвае на спробы.

TCPKeepAlive — асобны механізм на ўзровень ніжэй. Ім займаецца ядро, ён не шыфруецца, і бок, чый дэман SSH завіс, усё ж можа яго задаволіць. Таму спроба на ўзроўні SSH — больш значны сігнал, калі вам важная сесія, а не сокет.

Парадак вырашае, якое значэнне застанецца

OpenSSH ужывае першае атрыманае значэнне для кожнага параметра, таму канкрэтны блок Host мусіць ісці перад любым шырэйшым блокам, які таксама падышоў бы. Змяшчайце шаблонныя значэнні па змаўчанні ўнізе файла, а не ўверсе, і памятайце, што блок Match ніжэй не можа перакрыць ужо зададзенае значэнне. Даведнік па канфігурацыі кліента OpenSSH прама фармулюе правіла першага значэння, і яго варта прачытаць аднойчы перад пераўпарадкаваннем агульнай канфігурацыі.

Параметры каманднага радка перамагаюць файл, што робіць часовы эксперымент танным:

ssh -o ServerAliveInterval=15 -o ServerAliveCountMax=4 office-shell

Каб убачыць, што кліент насамрэч вырашыў, а не тое, што вы думаеце, што напісалі, папрасіце яго вывесці дзейную канфігурацыю. Вывад змяшчае аб'яднаныя значэнні для гэтага імя хоста і з'яўляецца самым хуткім спосабам злавіць памылковы папярэдні блок:

ssh -G office-shell | grep -i alive

Што робяць захавальнікі злучэння праз тунель

Перыядычны трафік не дае скончыцца тэрміну адлюстравання NAT ці файрвола са станам, што ёсць сапраўдная карысць на VPN, чый шлюз скідае прастойныя патокі праз некалькі хвілін. Спробы, што прыходзяць кожныя 60 секунд, абнаўляюць гэтае адлюстраванне, не несучы ніякіх прыкладных даных.

Яны не могуць аднавіць шлях, які знік. Калі інтэрфейс тунеля знікае, спробы церпяць няўдачу, як і ўсё астатняе, і сесія скончваецца, як толькі скончыцца лік. Выяўленне жывое і аднаўленне шляху — розныя задачы, і толькі першая наладжваецца ў ssh_config. Што інтэрвал і лік насамрэч даюць — гэта хуткасць, з якой кліент заўважыць, і менавіта гэта карыстальнік адчувае як завісанне.

Мультыплексаваныя злучэнні дадаюць складанасць. Калі задзейнічаны ControlMaster, спробы належаць галоўнаму злучэнню, і новая сесія праз існуючы галоўны працэс успадкоўвае тое, пра што той дамовіўся. Калі галоўны mux завіс, адкрыццё новага акна не праверыць шлях зноў.

Праверка налады ад пачатку да канца

На серверы выведзіце дзейную канфігурацыю дэмана, а не чытайце файл і здагадвайцеся, які ўключаны файл перамог:

sshd -T | grep -i clientalive

Затым паназірайце за рэальнай сесіяй з уключаным адладкавым вывадам. Кліент друкуе радок тайм-аўту, калі лік скончыцца, а часовыя меткі вакол яго паказваюць, ці маўчанне было бесперапынным, ці спробы не дасылаліся зусім. Сесія, якая гіне без трафіку спроб, звычайна мае ключавое слова ў блоку, які ніколі не супаў.

Варта дадаць дзве праверкі для любога хоста, да якога вы дабіраецеся толькі праз тунель: пераканайцеся, што вызначаны інтэрвал — менавіта той, які вы мелі на ўвазе, і што гэты інтэрвал, памножаны на лік, карацейшы за тайм-аўт прастою на шлюзе VPN. Калі другое лік большае, шлюз спачатку моўчкі скідвае паток, і спроба SSH не атрымлівае шанцу нічога паведаміць.

Падобныя артыкулы