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