VPN на Go засыпает вместе со смартфоном: дебажим таймеры, Android и CLOCK_BOOTTIME
Вы подняли свой прокси-сервер, настроили навороченный sing-box на Android, всё летает, 4K видео грузится мгновенно. Но стоит положить телефон в карман на пять минут и магия исчезает. Соединение залипает, SSH-сессии рвутся, а WhatsApp-звонки превращаются в тишину Как только вы включаете экран сеть оживает. Казалось бы, типичный агрессивный энергосберегатор Android, но всё гораздо глубже. Я обнаружил там проблему на стыке рантайма Go, логики ядра Linux Улика №1: conntrack и чистка сети Первое, что бросается в глаза при анализе логов это странное поведение системы при событиях Pause и Wake. В Android-клиенте sing-box при выключении экрана срабатывает механизм приостановки DEBUG inbound/hysteria2[hy2-in]: connection failed: timeout: no recent network activity panic: runtime error: index out of range [0] with length 0 goroutine 615 [running]: github.com/sagernet/sing/common/bufio.(*SyscallVectorisedWriter).WriteVectorised(...) В современных сборках sing-box включен флаг with_conntrack. Когда Android сообщает приложению, что пора уходить в спячку (Pause), срабатывает метод ResetNetwork(). Внутри он вызывает conntrack.Close() Разработчики хотели как лучше: очистить таблицу состояний, чтобы при смене сети (например, переход с Wi-Fi на LTE) не оставалось мертвых записей. К чему это приводит? На мобилке это буквально рубит все активные TCP-сессии при каждом засыпании экрана. Если ваше приложение не умеет мгновенно переподнимать сессию, вы получаете обрыв Улика №2: Проблема замершего времени Почему WireGuard в официальном приложении работает стабильно, а в Go-клиентах (вроде sing-box или других форков) постоянно отваливается? Всё дело в том, как Go считает время. По умолчанию рантайм Go для всех таймеров и time.Sleep использует системные часы CLOCK_MONOTONIC В режиме глубокого сна на Android часы CLOCK_MONOTONIC останавливаются Если вы настроили WireGuard на отправку keepalive каждые 20 секунд:
https://habr.com/ru/articles/986776/
#VPN #WireGuard #singbox #Go #Android #Networking #TCP