Как восстановить VPN-сервер, не дублируя идентичности
Восстановленный VPN-сервер возвращает файлы, а не текущий доступ. Согласуйте отзывы, ключи пиров и конечные точки, прежде чем вторая копия ответит на рукопожатие.
Вы восстановили резервную копию, служба запустилась, и клиент подключился с первой попытки. Этот успех и есть ловушка. Восстановление возвращает файлы, которые были у сервера на момент снимка, а не состояние доступа, изменившееся с тех пор, и если старая конечная точка всё ещё доступна, теперь у вас две машины, отвечающие на одну идентичность. Решение не в лучшей резервной копии; решение в том, чтобы решить, чем восстановленный хост может быть, прежде чем он ответит хотя бы на одно рукопожатие.
Резервная копия возвращает файлы, а не полномочия
Снимок содержит конфигурацию сервера, приватные ключи, удостоверяющий центр, список пиров и правила брандмауэра такими, какими они были при запуске копии. Он не может содержать то, что изменилось позже: устройство, которое вы отозвали, ключ, который вы переиздали, пира, которого удалили при продаже ноутбука, подсеть, которую перенесли. Восстановление откатывает файлы к тому моменту. Оно не откатывает решения, которые люди приняли после.
Ущерб происходит именно из этого зазора. Украденный ноутбук, отозванный через две недели после копии, предъявляет сертификат, который всё ещё проходит проверку по старому CRL в восстановленном дереве, и сервер принимает устройство, которое вы вывели из эксплуатации. WireGuard прямолинейнее: пир авторизуется самим фактом наличия в списке, поэтому пир, удалённый после снимка, просто снова присутствует. Никто не одобрял этот доступ заново. Это сделал старый файл.
Идентичность сервера и идентичность клиента отказывают по-разному
В WireGuard идентичность сервера — это приватный ключ в wg0.conf, поэтому копирование этого файла на второй доступный хост создаёт два сервера с одной идентичностью, ничего не знающих друг о друге. Каждый держит свой список пиров. Удалите пира на новом хосте, и старый всё ещё его принимает; проверьте wg show на одном и увидите половину правды. Клиенты тоже не переключаются сами: профиль несёт один Endpoint, поэтому устройство продолжает говорить с адресом, на который было настроено, а это может быть хост, который вы хотели вывести из эксплуатации.
OpenVPN дублируется на том же уровне сертификатом сервера, его приватным ключом и статическим ключом tls-auth или tls-crypt. Скопируйте все три, и клиент не отличит экземпляры; если оба доступны, переподключение может попасть на любой, и каждый журнал рассказывает лишь часть истории. Удостоверяющий центр — более глубокая копия. Восстановленное дерево easy-rsa — второй источник истины, который может выдать действительный сертификат на любое имя, которое вы ему дадите.
Клиенты тоже дублируются, обычно во время самой миграции. Копирование профиля на запасное устройство «просто чтобы проверить» создаёт второе устройство с тем же ключом и общим именем. С duplicate-cn обе сессии могут оставаться активными одновременно, а статическое назначение адреса в ccd или ifconfig-pool-persist может конфликтовать с исходным устройством. Это две машины с одной идентичностью, и ничто в конфигурации сервера их не различает.
Выберите одно из трёх состояний для старой конечной точки
Восстановление безопасно только когда судьба старой конечной точки решена. Выведите её из эксплуатации: старая служба должна перестать принимать порт VPN до запуска нового хоста, а если до машины не добраться, заблокируйте этот порт на границе сети для всего, кроме вашего административного источника. Отремонтируйте тот же хост: повторное использование идентичности допустимо, потому что её держит одна машина, но затем уничтожьте дисковую копию или снимок виртуальной машины старого ключа, чтобы он не мог вернуться. Постройте пару доступности: двум хостам нужны отдельные идентичности хостов плюс одна общая конечная точка, например плавающий адрес, балансировщик нагрузки или DNS, который вы можете переместить. Копирование приватного ключа — не проект отказоустойчивости; это два сервера, претендующих на одно имя.
Прежде чем трогать клиентов, подтвердите, в каком состоянии вы на самом деле находитесь. Старый хост, отвечающий на порту VPN, — это тот, кто примет отозванное устройство, даже если DNS переехал. Проверьте слушателей и открытый ключ:
ss -lunp | grep -E ':51820|:1194'
wg show wg0
wg pubkey < /etc/wireguard/server.key
Сначала согласуйте пиров, отзывы и адреса
Перечислите, что утверждает восстановление, против того, что сейчас авторизовано. В WireGuard wg show wg0 даёт ключ, конечную точку, последнее рукопожатие и счётчики передачи каждого пира, чего достаточно, чтобы заметить устройство, которым вы больше не владеете. Удалите его на лету командой wg set wg0 peer <key> remove, затем отредактируйте и конфигурацию, иначе пир вернётся при следующем запуске. wg show wg0 allowed-ips вскрывает вторую проблему: два пира на одном адресе или адрес, который вы уже переназначили.
В OpenVPN список отзыва — файл с датой, и восстановление может вернуть старый. Проверьте его до подключения клиентов:
openssl crl -in /etc/openvpn/crl.pem -noout -lastupdate -nextupdate
grep -E 'crl-verify|reneg-sec' /etc/openvpn/server.conf
Если последнее обновление предшествует отзыву, сервер всё ещё чтит сертификат, который вы отозвали. OpenVPN 2.4 и новее перечитывают файл CRL при каждом новом соединении, поэтому замена файла останавливает новые сессии, но установленные туннели живут до пересогласования; значение reneg-sec по умолчанию — 3600 секунд, и именно его снижение или перезапуск службы даёт вам изменение сразу. Старые сборки могут читать файл не так надёжно, поэтому перезапускайте, когда не можете подтвердить поведение версии. Руководство wg(8) описывает удаление пира и синтаксис allowed-ips, использованные выше.
Очистите и статические назначения для устройств, которых больше нет. Повторное использование адреса выведенного устройства для нового, пока старый профиль всё ещё установлен, создаёт ровно тот дубликат, которого вы пытаетесь избежать.
Проверьте с клиентом, который вы отозвали
Выполните проверки по порядку, из сети вне туннеля. Сначала авторизованное устройство подключается, разрешает DNS через протолкнутый резолвер и достигает приватного ресурса. Затем отозванное устройство должно отказать, используя свой существующий профиль, а не новый. Потом попробуйте старую конечную точку снаружи: если порт VPN всё ещё завершает рукопожатие, старый хост жив, и дублирование реально, а не теоретично.
Перезагрузите восстановленный хост и повторите проверки авторизованного и отозванного, потому что именно тогда файл конфигурации побеждает то, что вы изменили во время работы. Сравните открытый ключ или отпечаток сертификата хоста с тем, который использовала выведенная машина. Совпадающие отпечатки на двух живых машинах означают, что восстановление клонировало идентичность; совпадающие отпечатки на одной машине — это нормально. Запишите восстановленные версии, отпечатки ключей и отозванный серийный номер или ключ пира, затем сделайте следующую резервную копию после этой сверки, чтобы она отражала службу такой, какая она сейчас. Работающая проверка — не то, что клиент подключается. А то, что удалённый клиент остаётся снаружи, пока старая конечная точка остаётся закрытой.