Как зарегистрировать большое количество 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.