Как зарегистрировать большое количество IP-адресов в Debian/Ubuntu
Одному серверу часто требуется более одного IP-адреса. В этом руководстве описаны два способа назначения нескольких адресов IPv4 одному сетевому интерфейсу в Debian и Ubuntu:
- автоматически, с помощью shell-скрипта и службы systemd — рекомендуется для больших диапазонов;
- напрямую в netplan — рекомендуется, если адреса должны сохраняться как при перенастройке сети, так и при перезагрузке.
Оба способа делают конфигурацию устойчивой к перезагрузкам. Прочитайте примечание в конце описания каждого способа, чтобы выбрать подходящий именно для вашего случая.
Когда нужно несколько IP-адресов
Несколько распространённых сценариев на одном сервере требуют более одного публичного адреса:
- Почтовые серверы, использующие отдельные адреса и PTR-записи для изоляции репутации отправки разных доменов.
- Веб-серверы, которым нужны выделенные адреса для устаревших приложений, изоляции клиентов или специфических политик файрвола.
- Прокси- и VPN-инфраструктура, где каждый экземпляр прокси или конечная точка VPN привязаны к собственному публичному адресу.
- Контейнеры или виртуальные машины, использующие маршрутизируемые IP-адреса.
Тарифы VPS INTROSERV по умолчанию включают два адреса IPv4 и подсеть IPv6 /112. Дополнительные адреса IPv4 доступны во многих локациях. Проверьте доступность для выбранного региона в конфигураторе заказа.
Перед началом работы
Вам понадобится root-доступ и имя интерфейса, который будет обслуживать дополнительные адреса. Современные версии Debian и Ubuntu больше не используют старое имя eth0, поэтому не полагайтесь на него по умолчанию. Выведите список интерфейсов вместе с их текущими адресами и определите тот, который уже содержит ваш основной адрес:
ip -br addr show
В выводе отображаются записи вроде ens3, enp1s0 или eth0 рядом с уже настроенными на них адресами. Интерфейс, на котором уже настроен ваш основной IP, — это тот, который нужно использовать в шагах ниже. В примерах здесь используется ens3.
Эти шаги изменяют сетевую конфигурацию на сервере, к которому вы, скорее всего, подключаетесь по SSH. Ошибка может лишить вас собственного доступа. Держите наготове запасной способ доступа, если он у вас есть, например консоль провайдера или IP-KVM, и отдавайте предпочтение безопасным вариантам применения изменений, показанным ниже.
Создание скрипта адресов
Небольшой скрипт добавляет диапазон адресов за один проход. Создайте его в /usr/local/sbin:
nano /usr/local/sbin/extra-ips.sh
Вставьте следующий скрипт. Замените имя интерфейса, префикс и диапазон на блок, выделенный вам. Приведённые ниже адреса используют документационный диапазон из RFC 5737 и являются лишь заглушками:
#!/bin/bash set -euo pipefail # Interface that will carry the additional addresses. IFACE="ens3" # Common prefix and the first and last value of the host octet. # Replace these with the block assigned to you. PREFIX="203.0.113" FIRST=10 LAST=60 # Stop early with a clear message if the interface name is wrong. if ! ip link show "$IFACE" >/dev/null 2>&1; then echo "Interface $IFACE not found. Check the name with: ip -br addr show" >&2 exit 1 fi for HOST in $(seq "$FIRST" "$LAST"); do ip addr replace "${PREFIX}.${HOST}/32" dev "$IFACE" done
Адреса намеренно используют префикс /32. Основной интерфейс уже владеет маршрутом для своей подсети, поэтому каждому дополнительному адресу нужен только локальный маршрут узла. Префикс /32 не позволяет ядру добавить дублирующий маршрут подсети и сохраняет таблицу маршрутизации чистой. Скрипт использует ip addr replace, а не ip addr add, чтобы его можно было безопасно запускать повторно, не получая ошибок на уже существующих адресах.
Сделайте скрипт исполняемым. Обратите внимание на полный путь — именно эта часть отсутствовала в предыдущей версии данного руководства:
chmod +x /usr/local/sbin/extra-ips.sh
Обеспечение постоянства адресов с помощью службы systemd
Ручной запуск скрипта добавляет адреса только до следующей перезагрузки. Чтобы применять их автоматически при загрузке, создайте службу systemd, которая будет запускать скрипт во время загрузки. Этот способ работает одинаково независимо от того, использует ли система netplan, systemd-networkd или более старый стек ifupdown.
Создайте юнит-файл:
nano /etc/systemd/system/extra-ips.service
Добавьте следующее содержимое:
[Unit] Description=Assign additional IP addresses After=network-online.target Wants=network-online.target [Service] Type=oneshot ExecStart=/usr/local/sbin/extra-ips.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target
Перезагрузите systemd и включите службу, чтобы она запустилась сейчас и при каждой загрузке:
systemctl daemon-reload systemctl enable --now extra-ips.service
Убедитесь, что служба запустилась корректно:
systemctl status --no-pager extra-ips.service
Адреса, добавленные этим скриптом, не являются частью конфигурации netplan или systemd-networkd. Последующий netplan apply, networkctl reconfigure или любой перезапуск сети может их удалить. Они возвращаются при следующей перезагрузке или сразу же, если выполнить systemctl restart extra-ips.service. Если адреса должны сохраняться и при перенастройке сети, используйте вместо этого метод с netplan, описанный ниже.
Альтернатива: определение адресов в netplan
В Ubuntu, где netplan используется по умолчанию, адреса можно объявить прямо в netplan. Сетевой стек тогда рассматривает их как управляемые адреса, поэтому они сохраняются при перенастройке. Это подходит для небольшого фиксированного списка. Для большого диапазона описанная выше служба systemd масштабируется лучше, поскольку netplan требует по одной строке на каждый адрес.
Когда несколько файлов netplan определяют один и тот же интерфейс, их настройки могут переопределяться или объединяться непредсказуемым образом, что может удалить ваш основной адрес и лишить вас доступа. Редактирование существующего файла конфигурации обычно безопаснее, чем создание ещё одного файла для того же интерфейса. Откройте файл, который уже настраивает ваш интерфейс, обычно /etc/netplan/50-cloud-init.yaml или /etc/netplan/00-installer-config.yaml:
ls /etc/netplan/ nano /etc/netplan/50-cloud-init.yaml
Сохраните все существующие настройки интерфейса, такие как dhcp4, основной адрес, шлюз и серверы имён. Добавьте дополнительные адреса в списке addresses для того же интерфейса. В примере ниже DHCP сохранён для основного адреса и добавлены три дополнительных адреса:
network: version: 2 ethernets: ens3: dhcp4: true addresses: - 203.0.113.10/32 - 203.0.113.11/32 - 203.0.113.12/32
Последние версии netplan выводят предупреждение, если файл доступен для чтения другим пользователям. Ограничьте права доступа, чтобы убрать это предупреждение:
chmod 600 /etc/netplan/50-cloud-init.yaml
Проверьте изменения с помощью netplan try. Эта команда применяет конфигурацию и автоматически откатывает её через 120 секунд, если вы не подтвердите изменения, что защищает вас от потери удалённого доступа:
netplan try
Если соединение остаётся активным и всё выглядит корректно, подтвердите изменения по запросу, а затем примените конфигурацию окончательно:
netplan apply
Проверка результата
Выведите список адресов, привязанных в данный момент к интерфейсу, и убедитесь, что новые адреса присутствуют:
ip -br addr show ens3
Дополнительные адреса теперь должны появиться в выводе и будут автоматически восстанавливаться после каждой перезагрузки.
Удаление адресов
Чтобы удалить один адрес, удалите его с интерфейса:
ip addr del 203.0.113.10/32 dev ens3
Если вы использовали скрипт и службу, прекратите назначение всего диапазона при загрузке, отключив и удалив службу:
systemctl disable --now extra-ips.service rm /etc/systemd/system/extra-ips.service systemctl daemon-reload
Если вы использовали netplan, удалите дополнительные строки из списка addresses в файле netplan, а затем выполните netplan apply.
Устранение неполадок
Если служба не запускается, проверьте её состояние и логи:
systemctl status --no-pager extra-ips.service journalctl -u extra-ips.service
Убедитесь в следующем:
- имя интерфейса в скрипте совпадает с реальным именем, полученным через
ip -br addr show; - адреса относятся к блоку, выделенному вам;
- скрипт является исполняемым.
Если вы по ошибке использовали префикс /24 вместо /32, в таблице маршрутизации это проявляется как несколько дублирующихся маршрутов подсети. Проверьте это командой:
ip route
Это руководство посвящено IPv4. Как и в случае с IPv4, дополнительные адреса IPv6 обычно добавляются как адреса узла с префиксом /128 с помощью той же команды ip addr replace, например ip addr replace 2001:db8::10/128 dev ens3.