Переназначение адреса занимает минуту. Следующая неделя — это место, где перенос ломается, и редко там, где подсказывает консоль провайдера. Новый публичный IP упоминается в четырёх местах: сокет, на котором слушает демон, якорь доверия, который проверяют клиенты, каждое правило, называющее старый адрес, и DNS-запись, которая их связывает. Два переноса выглядят с панели управления одинаково, но ведут себя совершенно по-разному: переназначить адрес на машине, которой вы управляете, или поднять второй endpoint и перевести клиентов на него. Проверки ниже ставят дешёвые сбои первыми, и каждый раздел указывает, к какому переносу он относится.

Замена на месте и параллельный переход — разные задачи

Замена на месте сохраняет хост, ключи, таблицу маршрутизации и список пользователей; меняется только адрес. Это делает переназначение плавающего IP, и у нескольких провайдеров гость этого вообще не замечает, потому что трансляция происходит перед инстансом. Пересборка или переназначение провайдером жёстче: гость видит изменение, и всё, что держало старое значение в кеше, узнаёт о нём в тот же момент.

Параллельный endpoint — это второй хост, выполняющий ту же работу. Соберите его, проверьте одним профилем и оставьте старый отвечать, пока новый не докажет себя на реальном пути. Цена — состояние. Без общих записей peer, отзывов и логирования у вас две сети, которые случайно делят имя.

QuestionIn-place swapParallel endpoint
Rollback in one step?Only if you can get the old address backPoint DNS back; old host still up
Blast radiusEvery client at onceOnly the clients you moved
Best whenThe address is yours to reassignThe old address is gone for good

Найдите каждое место, где записан старый адрес

Начните с текстового поиска, потому что конфигурационные файлы — лёгкая половина. Ищите в конфигурации демона, фрагментах брандмауэра, целях мониторинга и любом сгенерированном клиентском пакете на диске. Включите адрес IPv6, если публикуете такой; перенос, следящий только за A-записью, оставляет двухстековых клиентов на старом пути.

OLD=203.0.113.10
grep -RIn -- "$OLD" /etc /root
ss -lunpt | grep -F "$OLD"
nft list ruleset | grep -F "$OLD"
iptables-save | grep -F "$OLD"
wg show all endpoints

Затем пройдитесь по ядру, потому что работающая система держит адрес в местах, о которых не упоминает ни один файл. Статическое правило NAT источника, запись ipset, адрес bind и запись conntrack живут дольше правки конфигурации, которая их удалила, а некоторые переживают и перезагрузку, потому что вернулись из сохранённого набора правил. На уровень выше группы безопасности провайдера, цели балансировщика и проверки мониторинга вообще не на вашей файловой системе.

Запишите инвентаризацию до того, как что-то менять; она же служит скриптом отката.

Клиенты по имени хоста восстанавливаются; клиенты с буквальным IP замолкают

Если клиенты приходят на сервер по имени хоста, переход — в основном проблема DNS, и TTL, заданный вчера, решает, насколько всё будет плохо. Резолверы кешируют, stub-резолверы кешируют ещё раз, и многие клиенты ищут имя только при новом соединении, поэтому установленный туннель сохраняет свой начальный адрес.

Если endpoint — буквальный адрес, ничего не разрешается заново и ничто не пишет жалобу. WireGuard хранит разрешённый адрес сокета: Endpoint = vpn.example.net:51820 становится IP в тот момент, когда запускается wg-quick up, и остаётся этим IP, пока вы его не измените. OpenVPN снисходительнее: он разрешает имя хоста remote при подключении и с resolv-retry infinite снова пробует DNS при переподключении. С буквальным IP оба продолжают набирать машину, которой больше нет.

Людей вводит в заблуждение зеркальная картина. Клиент, уже указывающий на новый адрес, пока старый слушатель ещё отвечает, проходит любую проверку, которую вы делаете со своего рабочего стола. Меня это тоже обмануло: новый endpoint поднялся на телефоне с первой попытки, а клиент со старым профилем обнаружился только когда старый слушатель был выключен намного позже.

Доверие не переезжает вместе с адресом

WireGuard отделяет идентичность от доступности, что делает перенос адреса почти бесплатным. Peer'ы идентифицируются открытым ключом, а endpoint — это лишь то, куда пакеты идут сейчас; хост обновляет endpoint peer'а по адресу источника последнего аутентифицированного пакета. Простаивающему peer'у всё же нужна причина говорить с новым местом, и адрес он узнаёт только когда его сессия стареет, а повторные попытки handshake терпят неудачу в заметном месте. Краткое руководство WireGuard описывает поле endpoint.

Серверы на TLS — обратный случай. Сертификат привязан к имени, и клиент, набирающий адрес, сравнивает набранное с альтернативными именами субъекта. Подключитесь по IP к сертификату, несущему только DNS SAN, и проверка не пройдёт: имени, которое использовал клиент, в сертификате нет. Перевыпуск с IP SAN исправляет это одно соединение и делает следующий перенос хуже. Сохранение имени хоста в профиле и verify-x509-name на месте удерживает проверку строгой, пока адрес под ним меняется.

Затем проверьте, к чему привязан демон; сокет, прикреплённый к старому адресу, тихо отказывает. Сервер OpenVPN, запущенный с local 203.0.113.10, отказывается подниматься, как только адрес исчезает, а слушатель на 0.0.0.0 следует за изменением бесплатно. NAT делится так же: MASQUERADE следует за любым адресом, который машина имеет сейчас, а статический SNAT --to-source 203.0.113.10 продолжает переписывать на адрес, которым вы больше не владеете, поэтому обратный трафик исчезает. Если новый адрес приходит с другим upstream-шлюзом, проверьте rp_filter: фильтрация обратного пути отбрасывает обратный трафик, приходящий на интерфейс, которого ядро не ожидало.

Порядок перехода и доказательства, что он сработал

Снизьте TTL за день, поднимите новый слушатель и докажите его профилем, который есть только у вас. Проверка изнутри той же сети почти ничего не доказывает, поэтому используйте телефон в сотовой сети и проверьте то, что туннель должен переносить, а не ping до endpoint.

Следите за обоими адресами всё окно. wg show all latest-handshakes на новом хосте или файл состояния OpenVPN скажет, сколько peer'ов действительно переехало. Когда у нового endpoint'а есть ожидаемые peer'ы, а у старого только отставшие, выведите старый слушатель из эксплуатации, удалите устаревшее правило NAT и уберите адрес из брандмауэра провайдера. Удаление старого слушателя — это шаг, который пропускают, и он закрывает щель, где устаревший профиль всё ещё доходит до старой сети.

Запишите триггер отката письменно до начала: если после согласованного окна у нового endpoint'а нет handshake ни от одного реального клиента, восстановите старый адрес и прекратите раздачу профилей. Затем повторите поиск и подтвердите, что ни один слушатель не привязан к выведенному адресу. Две вещи переходят в следующий перенос: имя хоста в клиентском профиле, чтобы следующее изменение было правкой DNS, и инвентаризация, хранящаяся рядом с заметками о восстановлении сервера.

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