Как вывести VPN-сервер из эксплуатации, не оставив лазейки
Идите от клиентского приложения наружу: отзовите ключи и учётные записи, закройте порт прослушивания, затем докажите, что ни один профиль, DNS-запись или резервная копия больше не могут до него достучаться.
Ваш клиент всё ещё подключается в день, когда открывается заявка на вывод из эксплуатации. Профиль лежит в приложении, он согласовывает соединение, и туннель поднимается так, будто ничего не изменилось. Именно в этот момент нужно действовать в обратном направлении по сравнению с тем, как вы строили сервис: начните со списка клиентов, идите наружу к слушающему порту, затем к межсетевому экрану и закончите учётными данными, которые переживут всё это. Выключение виртуальной машины — последний шаг, а не первый. Это руководство предполагает, что у вас есть доступ к консоли хоста и полномочия редактировать записи клиентов и DNS.
Сначала пройдите по списку клиентов
Откройте всё, что раздаёт ваши профили, и прочитайте список, прежде чем трогать сервер. Каждая запись — это устройство, которое считает, что у него есть доступ: телефоны, ноутбуки, маршрутизатор филиала, контейнер, который синхронизируется каждую ночь. Выгрузите этот список в заявку, потому что, когда хост исчезнет, не будет wg show, который скажет, кто был подключён.
Разложите каждое устройство по категориям: заменяющая точка подключения, больше не нужно или неизвестно. Важна именно категория неизвестных, потому что это те профили, которые кто-то найдёт в ящике через несколько месяцев и попробует. Отправьте уведомление по тому же каналу, который вы используете для заявок на доступ, и впишите в него дату, когда старый адрес перестанет отвечать.
Отзывайте учётные данные, а не только файл
Два разных действия называют одним словом «отзыв». В WireGuard пир авторизуется только тем, что его публичный ключ появляется в секции peer с записью AllowedIPs, поэтому удаление конфигурационного файла с ноутбука ничего не меняет на сервере. Удалите блок пира и повторно примените файл, не теряя тех пиров, которых вы сохраняете, какwg(8) описывает:
wg show
wg set wg0 peer <CLIENT_PUBLIC_KEY> remove
wg syncconf wg0 <(wg-quick strip wg0)wg syncconf — это та часть, которая экономит вам окно обслуживания. Он пересобирает интерфейс из файла на месте, так что удаление одного пира не рвёт туннель, которым пользуются все остальные. Если вы выводите из эксплуатации весь хост, а не один пир, порядок всё равно важен, потому что эти ключи могут быть доверенными где-то ещё.
При схеме X.509 отзывать нужно сертификат, а не файл: openssl ca -revoke client.crt, а затем openssl ca -gencrl -out crl.pem. Это действует только там, где проверяющая сторона это читает, а значитOpenVPN сервер с настроенным crl-verify и перезагруженный после этого. Если этот шлюз — единственный потребитель того CA, CRL перестаёт иметь значение в день, когда он умирает; если тот же CA подписывает для второго шлюза, сертификат, который вы никогда не отзывали, там продолжает работать.
Учётные записи — это третий случай и самый часто пропускаемый. Когда шлюз аутентифицировал через RADIUS, LDAP или внешнего поставщика идентификации, учётная запись живёт вне VPN. Отключите её в каталоге. Удаление пользовательской секции на сервере оставляет действующий мандат, который запасная точка подключения примет в тот момент, когда укажет на тот же каталог.
Закройте слушающие порты и пути к ним
Остановите службу так, чтобы это пережило перезагрузку, а затем подтвердите это списком сокетов, а не состоянием unit-а. systemctl disable --now wg-quick@wg0 останавливает интерфейс и удаляет маршруты и правила, добавленные wg-quick; systemctl disable --now openvpn-server@server делает то же для шаблонного экземпляра OpenVPN. После любого из них выполните ss -lunp и ss -ltnp. Пустой результат для старого порта — единственное доказательство, которое считается.
Что добавил wg-quick, то wg-quick и удаляет. Что вы добавили руками, остаётся: постоянное правило NAT, разрешение в межсетевом экране, проброс порта на маршрутизаторе, правило ingress в облачной группе безопасности, слушатель балансировщика. Всё это требует явного удаления, как и запись DNS, то есть A, AAAA и любой CNAME, указывающий на это имя. Имя, которое разрешается в мёртвый хост, отказывает иначе, чем имя, которое не разрешается вовсе, и эта разница стоит кому-то полдня.
Копия, которую вы забыли, — это клон. Снимок или виртуальная машина, восстановленная из резервной копии, всё ещё хранит ключи хоста и старый список пиров, и если что-то вернёт её на тот же адрес, клиенты снова подключатся к сервису, который вы считаете выведенным. Помечайте набор резервных копий как принадлежащий выведенному сервису и держите его вне путей автоматического восстановления.
Найдите то, что всё ещё указывает на старый адрес
Кэшированные профили переживают DNS. Сохранённая конфигурация с числовым адресом продолжает дозваниваться после того, как запись исчезла, а постоянно включённый клиент повторяет попытку при каждом изменении сети. Это шум, а не доступ, потому что слушающий порт закрыт, но понимание того, что именно вы видите, определяет, как вы ответите на заявку.
Затем прошерстите зависимости, которые никто не относит к VPN: проверки uptime, ощупывающие порт, задачи резервного копирования, тянувшие конфиги с хоста, учётные данные автоматизации, которыми заливали записи пиров, учётные записи восстановления, созданные только для этого адреса. Каждая из них — путь доступа со своим сроком жизни и своим владельцем, поэтому каждая получает решение вместо тихого удаления.
Проверьте, а затем запишите
Вывод завершён, когда проверка снаружи отказывает так, как вы и ожидаете. Из сети, которую вы не контролируете, подключитесь к старому адресу и порту. Отфильтрованный или отклонённый результат — это успех. В клиентском приложении убедитесь, что профиль удалён, а не выключен, и что никакой управляющий профиль тихо его не добавляет обратно.
Затем запишите, что вы сделали: адрес, дату, отозванные ключи и сертификаты, отключённые учётные записи, где лежат резервные копии. Тот, кто следующим найдёт старую конфигурацию, должен ответить, отозвана она или просто удалена, без догадок, и короткая таблица в заявке это обеспечивает.
Перед закрытием заявки:
- профили клиентов удалены или заменены, неизвестные устройства разобраны
- пиры удалены и конфигурация применена повторно, либо сертификаты отозваны и CRL опубликован
- учётные записи в каталоге отключены, а не только локальные файлы удалены
- служба отключена, на старом порту не осталось слушателя
- межсетевой экран, проброс порта, группа безопасности и записи DNS удалены
- резервные копии помечены, снимок исключён из путей восстановления
- учётные данные мониторинга и автоматизации выведены
Проверьте замену отдельно, с клиента, у которого никогда не было старого профиля. Одна эта проверка скажет, вы вывели сервис или только переименовали проблему.