Нет сети после обновления Ubuntu: как вернуть доступ
Сервер не вернулся в сеть после do-release-upgrade. Как зайти через консоль провайдера, найти новое имя интерфейса и понять, кто переписал netplan.
Нет сети после обновления Ubuntu: что проверять в первую очередь
Нет сети после обновления Ubuntu почти всегда сводится к одной из четырёх причин: интерфейс поднялся под другим именем, cloud-init переписал конфигурацию, сменился рендерер netplan, или в /etc/netplan остался файл от старой системы. Проверить любую из них можно только с самой машины, потому что SSH уже не отвечает. Начните с консоли провайдера, а диагностику отложите до приглашения на вход.
Сразу уберём один ложный след. Речь здесь не про ошибки синтаксиса в YAML. Если netplan generate печатает ошибку разбора файла, это отдельная проблема, и обновление к ней отношения не имеет.
Как зайти на сервер, если SSH не отвечает
Консоль в панели провайдера (VNC или последовательная консоль) подключается к виртуальному монитору и клавиатуре машины. Она работает, даже когда у интерфейса нет адреса, потому что сеть гостя ей не нужна вообще. Последовательная консоль удобнее: в ней есть прокрутка и копирование текста, а вывод netplan status длинный.
Перед этим потратьте полминуты и отличите два разных отказа:
ssh: connect to host ... port 22: Connection refusedозначает, что пакеты дошли и машина ответила отказом. Сеть жива, а вотsshdне запущен.ssh: connect to host ... port 22: Connection timed outозначает, что ответа нет вообще. Вот это похоже на потерю сети.
Разница важна, и она разобрана отдельно: чем connection refused отличается от timed out.
Главная неприятность консоли в том, что она требует локальный пароль. На образах VPS вход обычно только по ключу, у root пароль не задан, и консоль встретит вас приглашением, на которое нечего ответить. Пароль задаётся заранее, до обновления: как сменить пароль root на VPS. Если пользователь вообще не был создан, это отдельная история: cloud-init не создал пользователя, и войти нечем.
Что делать, если консоли не хватает
Консоль бесполезна, когда система не доходит до приглашения входа: обновление прервалось или корневая файловая система не монтируется. Тогда остаётся режим восстановления (rescue mode) в панели провайдера. Он загружает машину с отдельного образа, а ваш диск отдаёт как обычный блочный.
lsblk -f
sudo mount /dev/vda1 /mnt
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
sudo chroot /mnt /bin/bashlsblk -f печатает метки и типы файловых систем, по ним и выбирайте раздел. Имя устройства зависит от гипервизора: на KVM это чаще всего /dev/vda1, но встречается и /dev/sda1. Привязка /dev, /proc и /sys нужна, потому что без них внутри chroot не заработают ни apt, ни systemctl. Внутри chroot можно задать пароль командой passwd, и тогда обычная консоль вас пустит.
Если обновление остановилось на полпути, чинить надо его, а не сеть: как доделать прерванное обновление релиза.
Сначала прочитайте состояние, потом правьте файлы
Дальше идёт самая важная часть. Не правьте /etc/netplan по памяти. Сначала посмотрите, что на машине есть сейчас.
ip -br link
ip -br addr
ip route
ls -l /etc/netplan/ip -br link печатает по строке на интерфейс: имя, состояние (UP или DOWN) и MAC-адрес. Выпишите имена. ip -br addr показывает, кому достался адрес. Пустая колонка адресов у единственного физического интерфейса плюс отсутствие маршрута по умолчанию в ip route это и есть ваша поломка.
Теперь спросите netplan, что думает он:
sudo netplan get
sudo netplan status --all
networkctl list
systemctl is-enabled systemd-networkd NetworkManagernetplan get склеивает все файлы из /etc/netplan и печатает итоговую конфигурацию. Содержимое одного файла ей не равно: файлы читаются в лексическом порядке, и поздний перекрывает ранний по совпадающим ключам. netplan status --all сопоставляет конфигурацию с живым состоянием системы. В netplan 1.x есть ещё sudo netplan status --diff, который печатает только расхождения. Если ваша версия его не знает, она сообщит о неизвестном аргументе, и тогда сравнивайте глазами.
Сравните два списка имён: те, что вернул ip -br link, и те, что вернул netplan get. Если они не совпадают, ответ уже найден.
Почему интерфейс вернулся под другим именем
Имена вроде ens3, enp1s0 или eth0 назначает systemd-udevd по данным о шине и прошивке, а не ядро. Правила выбора зависят от версии systemd, а обновление релиза меняет systemd целиком: в Ubuntu 26.04 LTS это systemd 259. Меняется и виртуальное железо, если провайдер обновил тип машины или порядок устройств PCI. Результат: файл netplan описывает ens3, в системе появился enp1s0, и настраивать оказывается нечего.
Посмотрите, что происходило при загрузке:
sudo dmesg | grep -iE 'renamed|eth[0-9]'
sudo udevadm test-builtin net_id /sys/class/net/enp1s0В журнале ядра переименование выглядит примерно так: virtio_net virtio0 enp1s0: renamed from eth0. Подставьте в команду udevadm то имя, которое реально есть у вас. Она печатает все имена-кандидаты (ID_NET_NAME_PATH, ID_NET_NAME_SLOT и подобные), из которых и выбирается итоговое.
Самое надёжное лечение это привязка к MAC-адресу, потому что MAC переживает и смену шины, и смену systemd:
network:
version: 2
ethernets:
main0:
match:
macaddress: "52:54:00:aa:bb:cc"
set-name: main0
dhcp4: trueMAC возьмите из вывода ip -br link, он там в последней колонке. Быстрый вариант это просто вписать новое имя вместо старого. Он работает, но следующее обновление может повторить тот же фокус.
Есть и третий путь: добавить net.ifnames=0 в параметры ядра и получить eth0. Он отключает предсказуемые имена целиком, поэтому при двух и более интерфейсах порядок eth0 и eth1 становится зависимым от порядка обнаружения устройств. На машине с одним интерфейсом это приемлемо, на машине с приватной сетью уже нет.
Почему cloud-init переписал ваш netplan
На образах VPS сетью почти всегда управляет cloud-init. Он берёт метаданные у провайдера и пишет /etc/netplan/50-cloud-init.yaml сам. Откройте файл: первые строки честно предупреждают, что он сгенерирован из данных источника и правки будут потеряны.
head -3 /etc/netplan/50-cloud-init.yaml
cloud-init status --long
sudo grep -iE 'netplan|network' /var/log/cloud-init.log | tail -40Обновление релиза ставит новую версию cloud-init (в Ubuntu 26.04 LTS это cloud-init 26.1) и заново проходит этапы настройки. Если ваши правки лежали в этом файле, после перезагрузки на их месте будет то, что вернули метаданные. Иногда это рабочая конфигурация с другим именем интерфейса, иногда пустая.
Два честных решения. Первое: не трогать 50-cloud-init.yaml, а положить свои настройки в файл с большим номером, например /etc/netplan/99-static.yaml, который перекроет нужные ключи. Второе: отключить сетевой модуль cloud-init совсем.
printf 'network: {config: disabled}\n' | sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfgОтключение означает, что при пересоздании или переносе машины сеть из метаданных больше не приедет, и адрес придётся прописывать руками. Это осознанный размен, а не улучшение. Что ещё делает cloud-init на свежей машине, разобрано здесь: как cloud-init настраивает новый VPS.
Заодно про права на файлы. Начиная с netplan 0.106 команда предупреждает строкой вида Permissions for /etc/netplan/50-cloud-init.yaml are too open. Netplan configuration should NOT be accessible by others. Это предупреждение, а не причина отказа сети: конфигурация применяется и с открытыми правами. Многие тратят на него время зря. Закрыть его можно одной командой:
sudo chmod 600 /etc/netplan/*.yamlПочему сменился рендерер
netplan ничего не настраивает сам. Он генерирует конфигурацию для бэкенда: systemd-networkd на серверах, NetworkManager на десктопах. Выбор задаётся ключом renderer. Если в файле назван бэкенд, который не установлен или не включён, netplan послушно сгенерирует файлы, и применять их будет некому.
sudo netplan generate
ls -l /run/systemd/network/
systemctl status systemd-networkd
journalctl -u systemd-networkd -b --no-pager | tail -40После netplan generate в /run/systemd/network/ должны появиться файлы вида 10-netplan-enp1s0.network. Пустой каталог при непустом выводе netplan get означает, что рендерер не networkd. Дальше смотрите systemctl status systemd-networkd: строка Active: inactive (dead) или пометка masked объясняет молчание интерфейса лучше любой догадки.
Чужие файлы, которые пережили обновление
do-release-upgrade спрашивает про каждый изменённый конфигурационный файл и по умолчанию оставляет вашу версию, сохраняя новую рядом. За несколько лет таких пар накапливается много.
sudo find /etc -name '*.dpkg-dist' -o -name '*.dpkg-old' -o -name '*.ucf-old'
dpkg -l ifupdown | tail -1
ls /etc/network/interfaces /etc/network/interfaces.d/ 2>/dev/nullnetplan читает только файлы *.yaml, поэтому 50-cloud-init.yaml.dpkg-old он проигнорирует. А вот выживший пакет ifupdown вместе с /etc/network/interfaces это настоящий конфликт: два менеджера поднимают один интерфейс, и кто окажется последним, зависит от порядка юнитов. Если dpkg -l отвечает no packages found matching ifupdown, пакета нет и этот пункт можно закрыть. Если файл есть и описывает только lo, он безвреден. Если в нём описан физический интерфейс, выберите одного управляющего и уберите второго.
Отдельно про Ubuntu 26.04 LTS. В примечаниях к выпуску описана известная проблема: интерфейсы, оставшиеся ненастроенными на этапе установки, считаются DHCP-интерфейсами, и загрузка блокируется на ожидании сети. На консоли это выглядит как строка A start job is running for Wait for Network to be Configured. Лечится пометкой лишнего интерфейса как необязательного:
network:
version: 2
ethernets:
enp2s0:
dhcp4: true
optional: trueoptional: true говорит systemd-networkd-wait-online не ждать этот интерфейс. Загрузка перестаёт висеть, и до sshd дело доходит заметно быстрее.
Как поднять сеть прямо сейчас
Пока вы в консоли, адрес можно назначить руками и вернуть себе SSH, а разбираться уже спокойно.
sudo ip link set enp1s0 up
sudo ip addr add 203.0.113.10/24 dev enp1s0
sudo ip route add default via 203.0.113.1
sudo resolvectl dns enp1s0 1.1.1.1
ping -c 3 203.0.113.1
ping -c 3 1.1.1.1Подставьте своё имя интерфейса, свой адрес и свой шлюз: они есть в панели провайдера. Если первый ping проходит, а второй нет, дело в маршруте по умолчанию или выше по сети, а не в интерфейсе. Всё это живёт до перезагрузки, потому что команды ip ничего не записывают на диск. Это и хорошо: ошибочная команда лечится перезагрузкой.
Как убедиться, что настройка переживёт перезагрузку
sudo netplan generate
sudo netplan apply
ip -br addr
ip routeКогда SSH вернулся, правьте конфигурацию только через sudo netplan try. Команда применяет файл, ждёт подтверждения около двух минут и откатывает всё обратно, если вы не нажали Enter. Оборвавшаяся сессия SSH при этом равна отказу от подтверждения, и сеть вернётся сама.
Последняя проверка это честная перезагрузка с открытой консолью:
sudo rebootСмотрите на консоль во время загрузки. Если машина снова уходит в ожидание сети, вы увидите это своими глазами, а не по молчанию SSH.
Десять минут подготовки перед do-release-upgrade
Всё описанное выше дешевле предотвратить.
- Снимите текущее состояние сети в файл и сохраните его за пределами сервера.
ip -br link,ip -br addrиip routeдают имена, MAC-адреса, адреса и шлюз. - Скопируйте конфигурацию:
sudo cp -a /etc/netplan ~/netplan-backup, затем заберите копию к себе на машину. - Проверьте консоль провайдера заранее и убедитесь, что знаете пароль локального пользователя. Консоль, которую вы открываете впервые в момент аварии, редко радует.
- Сделайте снимок диска, если провайдер это умеет. Откат снимка быстрее любой починки.
- Откройте в брандмауэре порт 1022 до начала обновления.
Про последний пункт. Запущенный по SSH do-release-upgrade предупреждает, что поднимет второй sshd на порту 1022 специально для аварийного входа. Помогает это только тогда, когда порт открыт: sudo ufw allow 1022/tcp, а на многих VPS ещё и в сетевом брандмауэре панели, который живёт отдельно от ufw.
Держите вторую сессию SSH открытой всё время обновления. Открытая сессия переживает перезапуск sshd и остаётся рабочей тогда, когда новые подключения уже не проходят.
Сам порядок обновления и его подводные камни разобраны отдельно: обновление Ubuntu 24.04 до 26.04 по шагам. А если сервер старый и накопил много ручных правок, иногда честнее собрать новый: обновлять или переустанавливать сервер.
FAQ
Почему после обновления Ubuntu пропала сеть, хотя сервер загрузился?
Чаще всего интерфейс получил другое имя, а файл в /etc/netplan описывает старое. netplan настраивает то, что в нём написано, и молча ничего не делает для интерфейса, которого в конфигурации нет. Зайдите через консоль провайдера, выполните ip -br link и sudo netplan get и сравните имена. Реже виноваты переписанный cloud-init файл, невключённый systemd-networkd или оставшийся от старой системы /etc/network/interfaces.
Как попасть на сервер, если SSH не отвечает, а пароля root я не знаю?
Через консоль провайдера войти не выйдет, потому что она требует локальный пароль. Остаётся режим восстановления: загрузите машину с аварийного образа, смонтируйте корневой раздел, сделайте chroot и задайте пароль командой passwd. После этого обычная консоль вас пустит. Правильнее задать пароль заранее, до обновления, и один раз проверить, что вход через консоль работает.
Почему исчезли мои правки в /etc/netplan/50-cloud-init.yaml?
Этот файл принадлежит cloud-init, и его первые строки об этом предупреждают. cloud-init перегенерирует его из метаданных провайдера, а обновление релиза ставит новую версию cloud-init и заново проходит настройку. Кладите свои параметры в отдельный файл с большим номером, например 99-static.yaml, либо отключите сетевой модуль строкой network: {config: disabled} в /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg.
Сервер висит на сообщении Wait for Network to be Configured. Сколько ждать?
Ждать почти бессмысленно: systemd-networkd-wait-online ждёт интерфейс, который не поднимется. Загрузка продолжится по таймауту, но каждая перезагрузка будет стоить минут. Найдите интерфейс, которого нет в системе или который никуда не подключён, и пометьте его optional: true в netplan. В примечаниях к выпуску Ubuntu 26.04 LTS это описано как известная проблема для интерфейсов, не настроенных при установке.