Перезагрузите сервер, пока никто не вошёл, затем подключитесь из сети, которую вы не контролируете. Этот единственный тест отвечает, настоящее ли восстановление, потому что туннель, который работает только после того, как кто-то вручную выполнит команду, — это не восстановление, а ремонт. Большинство проверок останавливаются слишком рано: служба выглядит активной, интерфейс поднимается, а страница всё равно не загружается. Разрыв почти всегда в устойчивости частей вокруг туннеля, а не в самой команде туннеля.

Четыре владельца, четыре разных теста

Перед перезагрузкой назовите то, что должно вернуть туннель. Тест, который вы запускаете, и исправление, которое применяете, оба зависят от этого ответа, и есть четыре обычных владельца: unit systemd для службы VPN, unit экземпляра wg-quick для интерфейса WireGuard, runtime контейнеров или профиль менеджера сети. Если вы не можете назвать владельца, остановитесь и найдите его, потому что тест перезагрузки без ожидаемого пути запуска только говорит, что что-то произошло.

Каждый владелец хранит свою конфигурацию в другом месте. Сервер OpenVPN под управлением systemd читает конфигурацию при запуске, поэтому выполняется то, что находится в файле на момент загрузки. Интерфейс wg-quick берёт адреса, маршруты и DNS из того же файла, а значит, интерфейс, поднятый вручную из оболочки и так и не включённый как unit, не вернётся. Контейнер возвращает свою точку входа, но не изменения firewall хоста, если только они не живут вне контейнера.

Сначала базовое состояние, иначе результат ничего не значит

Зафиксируйте рабочее состояние, пока оно работает: адреса на туннеле, маршруты для клиентской подсети, правила NAT или пересылки, слушающий сокет и sysctl пересылки. ip addr show wg0, ip route, nft list ruleset или iptables-save, ss -lunp и sysctl net.ipv4.ip_forward достаточны на большинстве хостов.

Запишите, как служба настроена на запуск, а не только то, что она работает. systemctl is-enabled wg-quick@wg0 и systemctl is-active wg-quick@wg0 отвечают на разные вопросы, и при загрузке важно именно включённое состояние, как описано в systemctl(1). Для OpenVPN проверьте, какой шаблон использует хост, поскольку openvpn@server и openvpn-server@server — разные unit с разными значениями по умолчанию.

Выполните перезагрузку и прочитайте первый сбой

Перезагрузите намеренно, в выбранное вами окно, с открытой консолью или внешним путём. Наблюдайте за порядком событий, а не за конечным состоянием: хост доступен, unit активирован, интерфейс присутствует, маршруты установлены, правила firewall присутствуют, слушатель привязан, клиент принят. Первый шаг, который не произошёл, и есть находка; всё после него — шум.

Служба может быть активной, пока туннель непригоден, и это самый частый ложный успех. Запуск может завершиться до того, как сеть окажется онлайн, если unit ждёт только network.target вместо network-online.target. Файлы, на которые есть ссылки, например сертификаты, ключи или CRL, могут быть нечитаемы в этот момент, потому что монтирование или путь к секретам ещё не готовы. Ни одна из двух проблем не видна в systemctl status, пока вы не прочитаете журнал unit.

Тестируйте снаружи хоста. Клиент в той же LAN может добиться успеха через маршрут, который ни один удалённый клиент никогда не использовал бы, а SSH-сессия к машине ничего не доказывает о туннеле. Подключитесь, разрешите внутреннее имя, дойдите до приватного ресурса, затем подключитесь ещё раз, чтобы убедиться, что состояние отзыва и ключи всё ещё действуют.

Три условия, которые определяют ваше исправление

Если туннель возвращается, но клиенты ничего не достигают, сбой в маршрутизации или устойчивости NAT. Если клиенты даже не могут завершить рукопожатие, сбой в интерфейсе или в материале аутентификации. Если служба никогда не запускается, сбой в файле unit или его зависимостях. Эти три ветви ведут к разным исправлениям, поэтому слепая перезагрузка без базового состояния стоит больше времени, чем экономит.

Вносите исправление там, где настройка является собственностью. Поместите пересылку в sysctl drop-in, поместите правила NAT в набор правил, который загружается при загрузке, включите unit вместо его запуска и храните секреты на пути, который существует до запуска unit. Добавление паузы в unit скрывает зависимость вместо того, чтобы её объявить.

Запишите результат в runbook

Запишите, что вернулось само, что вам пришлось запустить и как долго длился разрыв. Включите точные команды, которыми вы проверяли, чтобы следующий человек повторил тест, а не изобретал новый. Если какой-то шаг требовал ручной команды, эта команда относится к конфигурации, а не к runbook как постоянный шаг.

Затем запланируйте следующий тест после следующего изменения сетевого стека хоста, а не на календарную дату через шесть месяцев. Режим отказа, от которого вы защищаетесь, — это временная команда, которая ощущалась постоянной, и они появляются именно тогда, когда кто-то редактирует правила firewall или переносит службу в новый unit.

Похожие статьи