Гайд SSH / VNC 23 апреля 2026 г.

2026: TCP keepalive, TCP_USER_TIMEOUT и устойчивость простаивающего SSH к арендованному Mac mini ProxyMac

Инженерная команда ProxyMac 23 апреля 2026 г. ~12 мин чтения

Операторы, тянущие SSH из Европы или восточного побережья США к Mac mini ProxyMac в Гонконге, Токио, Сеуле, Сингапуре или США, часто видят сессии, которые переживают активный ввод, но исчезают после 7–25 минут простоя Cursor или tail -f. Редко виновато «сломанный SSH на Apple Silicon» — почти всегда это тихий таймер middlebox в сочетании с сокетами по умолчанию, которые перестают доказывать «живость». Здесь — двухслойная модель (keepalive OpenSSH плюс поведение TCP ядра), матрица решений по наблюдаемым симптомам, готовый блок ~/.ssh/config с числами по умолчанию (пробы приложения каждые 30 с, четыре пропуска до обрыва клиентом), семишаговый плейбук с опорой на счётчики (например, 120-секундные таймеры простоя во многих гостевых Wi‑Fi) и ссылки на гайды по autossh, Mosh и keepalive, настройке клиента на длинном RTT и чёрным дырам MTU, чтобы не гоняться за TCP, когда виноват IPQoS.

Добавьте в закладки онбординг справочного центра и сравните регионы на странице тарифов, когда путь сокета уже стабилен — иначе каждый новый сотрудник повторяет одни и те же байки про потери пакетов.

Когда простаивающий SSH «умирает тихо» на длинных путях

Симптомы делятся на три корзины: (A) терминал замирает без баннера и без Broken pipe, пока не нажмёте клавишу; (B) клиент печатает client_loop: send disconnect: Broken pipe ровно через 120–900 секунд после последнего пакета; (C) интерактивные оболочки живы, а scp или rsync зависают на 0% бесконечно. Корзина A обычно означает, что истёк NAT-биндинг без RST — типично для отельного Wi‑Fi, где приоритизация голоса по UDP голодает простаивающий TCP. B часто соответствует stateful firewall с лимитом «тихого» потока. C пересекается с чёрными дырами PMTUD; сверьтесь со статьёй про MTU, прежде чем тратить выходные на математику keepalive.

  • Общий экран через SSH-туннель усиливает простои: кадры видео замирают, а нажатия клавиш — нет.
  • Jump-хосты умножают таймеры — на каждом прыжке может быть своя политика простоя 300 с.
  • git pull из LaunchAgent выглядит для оператора связи простаивающим, хотя работа идёт на стороне сервера.

TCP keepalive ядра против ServerAliveInterval в OpenSSH

Стек TCP ядра может слать keepalive после задержек, заданных net.inet.tcp.keepidle в macOS, но middlebox на удалённой стороне sysctl-ом не поправишь. ServerAliveInterval в OpenSSH вместо этого вставляет сообщения протокола SSH, сбрасывающие таймеры верхнего уровня без ожидания ОС-дефолтов, которые могут тянуться более двух часов. Считайте их дополняющими: keepalive SSH доказывает, что соединение SSH живо; TCP keepalive доказывает, что четвёрка всё ещё честна end-to-end.

Цифры для тикетов: стартуйте с проб приложения каждые 30 с, 4 последовательных пропуска до разрыва и зафиксируйте, что средний RTT до mini укладывается в 280 мс, чтобы финансы понимали: вы не маскируете ошибку выбора региона.

Матрица настроек по классу сбоя

Сигнатура симптомаПервый рычагВторой рычагЭскалация
Простой > 15 мин, мгновенное оживление по нажатию клавишиServerAliveInterval 30Сократить число прыжковСнять BSSID Wi‑Fi и сравнить с гайдом по гостевому Wi‑Fi
Broken pipe на кратных 300 сTCPKeepAlive yes на клиентеВключить сокеты ControlPersist по гайду ControlMasterЗапросить у ISP документированный idle-таймер
SCP зависает посреди файла без простояПроверить зажим MSSПрогнать тесты PMTUDСменить регион по матрице задержек
Падают только ночные сборкиNightly curl cron с miniЛогировать WAN DHCP renewalsПеренести job на pull, инициированный с mini

Рецепт ~/.ssh/config для строф ProxyMac на клиенте

Именуйте каждый регион явно, чтобы новые коллеги наследовали те же числа. Ниже — строфа под HK, но копируется на алиасы JP/KR/SG/US. Меняйте IPQoS только после гайда по длинному RTT — неправильное смешение классов throughput и lowdelay может голодать keepalive во время массового копирования.

Host proxymac-hk-dev HostName your-node.proxymac.com User youruser ServerAliveInterval 30 ServerAliveCountMax 4 TCPKeepAlive yes IPQoS throughput ControlMaster auto ControlPath ~/.ssh/cm-%r@%h:%p ControlPersist 10m

Семишаговый плейбук проверок, который SRE вставит в Confluence

  1. Зафиксируйте базовый RTT через ping -c 20; сохраните медиану и p95.
  2. Откройте чистый SSH, простаивайте 12 минут, отметьте, вернулась ли оболочка.
  3. Включите подробный лог ssh -vvv на одноразовой сессии; ищите зависания на expecting SSH2_MSG_KEXINIT.
  4. Параллельный SCP файла на 512 МБ; если пропускная способность рухнула после 90 с, подозревайте MTU, а не keepalive.
  5. Логируйте состояние VPN, если включён корпоративный split-tunnel — многие по-разному режут простаивающий UDP и TCP до mini.
  6. На стороне сервера ClientAliveInterval (если вы управляете sshd) зеркалит политику клиента; согласуйте, чтобы сервер не слал пробы каждые 10 с, пока клиент шлёт каждые 30 с — лишняя нагрузка.
  7. Архивируйте финальный конфиг рядом с заметками по systemd/launchd шлюза OpenClaw, чтобы автоматизация и люди делили одну правду.

Вместе с autossh, Mosh и настройкой длинного RTT — без двойного счёта исправлений

Гайд по autossh и Mosh уже покрывает супервизию процессов и устойчивость на UDP. Добавляйте эту TCP-статью, когда нужен именно OpenSSH поверх TCP — например git+ssh remotes, ssh -L к локальным шлюзам OpenClaw или rsync --partial по SSH, где Mosh не заменит. Если меняются шифры или сжатие, делайте это после доказательства keepalive: AEAD на M4 взаимодействует с нагрузкой CPU при больших копиях, как в статье про IPQoS и шифры.

Предупреждение: агрессивный ServerAliveInterval 5 может «штормить» некоторые DDoS-апплаенсы на периметре — поднимайте интервал аккуратно, если корпоративные edge после всплесков проб шлют TCP RST.

FAQ

Стоит ли опускать sysctl tcp keepidle на mini? Обычно нет для управляемых пользователем ноутбуков; чините клиент первым. Датацентровые соседние mini редко инициируют «шаткий» участок.

Ухудшает ли ControlMaster idle-таймеры? Может мультиплексировать много сессий на один TCP-поток — хорошо для стоимости рукопожатий, плохо, если этот поток упирается в 60-секундный таймер голодного Wi‑Fi; следите за числом потоков на путь.

А если uplink только IPv6? Happy Eyeballs может скрывать IPv4-чёрные дыры; задокументируйте, какое семейство адресов у цели SSH, прежде чем настраивать разные таймеры для стеков.

Почему выделенный Mac mini ProxyMac делает TCP-гигиену измеримой

Apple Silicon M4 на арендованной mini даёт стационарную точку в HK / JP / KR / SG / US с предсказуемым пирингом — в отличие от ноутбука разработчика, прыгающего между NAT кафе. Можно крутить непрерывные базы sysctl и nettop, подцепить автоматизацию OpenClaw к тому же хосту, где лежат CI-секреты, и при необходимости открыть общий экран, когда всплывают GUI-доверие. Сочетайте сетевую дисциплину с прозрачными тарифами по регионам, чтобы финансы видели, зачем вторая mini только под APAC-таймеры вместо одного туннеля, который рушится каждую пятницу.

Арендуйте регион под ваши таймеры

Mac mini в HK / JP / KR / SG / US с готовым SSH