Перевести Pi с Wi-Fi на кабель кажется пятиминутной задачей, и она остаётся такой только если рассматривать переезд как четыре отдельных настройки, а не одну. Имя конечной точки, к которой подключаются клиенты, может остаться точно таким же, пока адрес под ним меняется. Ломается на самом деле слушатель, привязанный к старому адресу, проброс порта, всё ещё нацеленный на беспроводную аренду, или обратный маршрут, который уходит через интерфейс, который вы считали выведенным из эксплуатации. Это руководство держит путь восстановления открытым на каждом шаге, так что неудачное переключение стоит только перезагрузки.

Запишите четырёх ответственных, прежде чем что-либо отключать

Четыре настройки решают, переживёт ли переключение: адрес Pi, адрес привязки OpenVPN, цель перенаправления на маршрутизаторе и путь, которым идут ответы. Запишите все четыре, прежде чем трогать кабель, потому что когда беспроводная аренда исчезнет, старые значения вы с машины уже не прочитаете. Проводной интерфейс не наследует беспроводной профиль, и в Bookworm адрес живёт в NetworkManager, тогда как Bullseye хранит его в dhcpcd.conf. Резервация, привязанная к беспроводному MAC-адресу, ничего не говорит о eth0. Относитесь к новому адресу как к новому назначению, которому нужно собственное доказательство.

Old wireless lease:   10.42.7.24/24 on wlan0
New wired address:    10.42.7.31/24 on eth0
Client endpoint:      vpn.lab.example:1194/udp

Слушатель — второй ответственный. Если служба запускалась с конкретным адресом привязки, сокет умирает вместе со старым интерфейсом; если он слушает все адреса, сокет выживает, и правило маршрутизатора становится единственным, что осталось починить.

Цель перенаправления и обратный путь — те ответственные, которых люди пропускают. Проброс, всё ещё указывающий на 10.42.7.24, отправляет входящие рукопожатия на адрес, которого у Pi больше нет, поэтому клиенты уходят в таймаут без единой строки лога на сервере. Обратный путь важен, когда оба канала ненадолго активны, потому что Pi отвечает через тот интерфейс, который предпочитает таблица маршрутизации, а это не всегда тот, на который пришёл пакет. Поиск маршрута ниже показывает, какой источник выбирает ядро.

Прочитайте реальный сокет, прежде чем доверять новому адресу

Файлы конфигурации описывают намерение, а сокет описывает реальность. Спросите работающую службу, к чему она привязана, вместо того чтобы верить конфигурации, которую помните. Руководство OpenVPN 2.6 определяет --local как привязку к одному адресу и отмечает, что его отсутствие привязывает каждый интерфейс.

sudo systemctl cat openvpn-server@server | grep -n -- '--local'
sudo ss -lunp '( sport = :1194 )'

Читайте столбец локального адреса, а не столбец состояния. Строка, показывающая 10.42.7.24:1194 означает, что сокет привязан к адресу, который вы вот-вот удалите, тогда как 0.0.0.0:1194 или *:1194 означает, что демон сам последует за сменой интерфейса. Если адрес привязан, отредактируйте профиль и перезапустите юнит вместо ручной перезаписи живого сокета, а затем убедитесь, что служба по-прежнему доходит до своих файлов сертификата и ключа.

Пройдите переезд в порядке, который оставляет вас на связи

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

ip -br addr show eth0
ip route get 203.0.113.10
nmcli -g ipv4.method,ipv4.addresses con show "Wired connection 1"

Первая команда отвечает, получил ли eth0 адрес, который вы задумали, а вторая печатает адрес источника, который ядро использовало бы для внешнего назначения, поэтому запускайте её до и после изменения. Если этот источник всё ещё беспроводной адрес, проводной канал пока не предпочтителен, и проверка снаружи провалится по причине, не имеющей отношения к OpenVPN. Исправьте предпочтение маршрутизации, прежде чем трогать проброс.

Когда оба канала активны, Pi может предпочитать беспроводной маршрут по умолчанию, потому что он был настроен первым или потому что у проводного канала выше метрика. В Bookworm поддерживаемая настройка — ipv4.route-metric на соединении, а в Bullseye эквивалент — интерфейсная строка metric в файле dhcpcd.conf. Понизьте приоритет беспроводного канала, а не отключайте его, чтобы путь отката оставался на расстоянии одной команды.

Докажите туннель снаружи, а не из LAN

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

Затем читайте лог в том порядке, в котором приходят пакеты. Совсем ничего означает, что рукопожатие никогда не дошло до Pi, значит, неверна цель перенаправления или брандмауэр хоста. Рукопожатие, которое начинается и застревает, указывает на ключи, сертификаты или MTU. Сессия, которая завершается и обрывается, обычно означает обратный путь или второй маршрут по умолчанию, а строка лога клиента Initialization Sequence Completed говорит вам, что сам туннель поднялся.

sudo journalctl -u openvpn-server@server -n 40 --no-pager
sudo tcpdump -ni any udp port 1194 -c 20

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

Сохраните откат в один шаг и выведите беспроводной профиль из эксплуатации

Оставьте беспроводной профиль установленным, пока проводная схема не переживёт перезагрузку. nmcli con show перечисляет имена профилей, которые вам понадобятся, а удалённый профиль придётся восстанавливать по памяти в самый неподходящий момент. Запишите имя интерфейса, метод адресации и метрику рядом с другими четырьмя значениями. Откат, который можно набрать из заметки, ценнее того, который приходится реконструировать.

Вывод беспроводной зависимости из эксплуатации — это изменение свойства, а не удаление. Установка connection.autoconnect no сохраняет учётные данные и историю адресов нетронутыми, одновременно не давая Pi снова подключиться к сети, от которой вы ушли.

nmcli con show
sudo nmcli con up "Wired connection 1"
sudo nmcli con mod "previously-used-wifi" connection.autoconnect no

Прежде чем объявить работу законченной, подтвердите четыре вещи: цель перенаправления совпадает с проводным адресом, слушатель пережил перезапуск, внешний клиент завершает рукопожатие, и Pi всё ещё отвечает на проводном адресе после перезагрузки. Перезагрузка — самый дешёвый способ поймать назначение, существовавшее только в работающем ядре. Если что-то из четырёх не сработает, поднимите беспроводной профиль обратно с помощью sudo nmcli con up и сравните записанные значения с текущими.

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