2026: TCP keepalive, TCP_USER_TIMEOUT и устойчивость простаивающего SSH к арендованному Mac mini ProxyMac
Операторы, тянущие 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.
Матрица настроек по классу сбоя
| Сигнатура симптома | Первый рычаг | Второй рычаг | Эскалация |
|---|---|---|---|
| Простой > 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
- Зафиксируйте базовый RTT через
ping -c 20; сохраните медиану и p95. - Откройте чистый SSH, простаивайте 12 минут, отметьте, вернулась ли оболочка.
- Включите подробный лог
ssh -vvvна одноразовой сессии; ищите зависания наexpecting SSH2_MSG_KEXINIT. - Параллельный SCP файла на 512 МБ; если пропускная способность рухнула после 90 с, подозревайте MTU, а не keepalive.
- Логируйте состояние VPN, если включён корпоративный split-tunnel — многие по-разному режут простаивающий UDP и TCP до mini.
- На стороне сервера
ClientAliveInterval(если вы управляете sshd) зеркалит политику клиента; согласуйте, чтобы сервер не слал пробы каждые 10 с, пока клиент шлёт каждые 30 с — лишняя нагрузка. - Архивируйте финальный конфиг рядом с заметками по 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