Як зареєструвати велику кількість 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.