База знаний

Новая схема работы IP-адресов проекта

По сравнению с предыдущей реализацией, с 19 сентября 2022 года в проекте CLO изменилась схема использования внешних IP-адресов, подключенных к серверам и балансировщикам.

Предыдущая схема

В ранее существовавшей схеме внешние IP-адреса делились на статичные и плавающие.

  • Статичный IP — это публичный адрес, который подключается непосредственно на сетевой интерфейс сервера
  • Плавающий IP (FIP) — это адрес который работает через SNAT

Новая схема

В новой схеме нет разделения на статичные и плавающие IP-адреса. Теперь любые внешние IP-адреса можно отключать и подключать к серверу и другим услугам. Для сервера каждый IP-адрес теперь работает через отдельный интерфейс. Кроме того, серверу может быть назначен основной IP-адрес.

Основной адрес — это адрес, через который по умолчанию идут все исходящие запросы в интернет по инициативе сервера. Основной адрес работает как IP-адрес сервера для всех приложений и служб, не указывающих сетевой интерфейс или IP-адрес явно.

Все плавающие IP-адреса, подключенные к серверам, после перехода на новую схему помечаются как устаревшие. Выполнять операции с серверами, подключенными к устаревшим адресам, нельзя. Пользователю необходимо сконвертировать плавающий IP-адрес в новый внешний IP-адрес (основной или дополнительный). Для этого достаточно отключить плавающий адрес от сервера. При отключении адрес будет автоматически конвертирован в новую схему.

Внимание! Все старые IP-адреса сервиса CLO будут последовательно сконвертированы в новый формат:

  • Все статичные IP-адреса будут одномоментно автоматически переведены на новую схему. Никакие дополнительные действия не потребуются.
  • Внешние IP-адреса, отключенные от сервера (балансировщика), также будут сконвертированы в новую схему
  • Впоследствии будет выполнен обязательный перевод всех IP-адресов на новую схему

Таблица изменений в схеме использования IP-адресов:

Предыдущая схема
Новая схема
Разные типы внешних адресов — «Статичный IP» и «Плавающий IP»Теперь все внешние IP-адреса работают как плавающие. Внешние IP-адреса также можно переносить.
К серверу можно подключить только два внешних IP-адресаМожно подключить до 10 внешних IP-адресов
Для плавающих адресов работает SNATSNAT более не используется для серверов
Плавающие IP не видны для ОС сервераВсе IP-адреса, подключенные к серверу, являются отдельными сетевыми интерфейсами.

Уже подключенные к серверам плавающие IP-адреса продолжат работать, но при этом будут помечены как устаревшие.

Необходимо конвертировать старые плавающие IP-адреса во внешние IP-адреса новой модели, чтобы эти IP-адреса появились на сервере как отдельные сетевые интерфейсы.

Настройка внешних адресов по новой схеме

Настройка внешних адресов осуществляется с помощью сетевого скрипта-конфигуратора, запускаемого как служба.

Скрипт при необходимости можно запустить на сервере самостоятельно с помощью команды:

systemctl start netconfig

Исполняемый файл конфигуратора находится в одном из следующих каталогов:

Для CentOS 7, AlmaLinux 8
/etc/sysconfig/network-scripts/netconfig*

Для Ubuntu 20, Ubuntu 22, Debian 10, Debian 11
/etc/network/netconfig*

Внимание! Настоятельно не рекомендуется вносить изменения в следующие файлы, так как внесённые изменения будет потеряны при вызове скрипта-конфигуратора:

Для CentOS 7, AlmaLinux 8:

/etc/sysconfig/network-scripts/ifcfg-*
/etc/iproute2/rt_tables
/etc/systemd/system/netconfig.service
/etc/resolve.conf
  • таблицы маршрутизации с индексами, начиная с 10

Для Ubuntu 20, Ubuntu 22 , Debian 10, Debian 11:

/etc/netplan/netconfig.yaml
/etc/iproute2/rt_tables
/etc/systemd/system/netconfig.service
/etc/resolve.conf
  • таблицы маршрутизации с индексами, начиная с 10
  • утилита netplan в качестве менеджера сети
  • утилита systemd-resolved в качестве резолвера

Конфигуратор вызывается при следующих действиях:

  • Перезагрузка сервера
  • Отключение IP-адреса
  • Подключение IP-адреса
  • Смена основного IP-адреса

Внимание! Шлюз по умолчанию всегда переопределяется скриптом-конфигуратором, на его выбор повлиять нельзя. На практике это означает, что при каждом перезапуске сервера или отключении/подключении внешнего IP-адреса пользовательские настройки шлюза по умолчанию будут утеряны и заменены настройками, предоставляемыми скриптом-конфигуратором.

Если пользователю нужно создать свою таблицу маршрутизации, ее можно указать в /etc/iproute2/rt_tables.orig, где под нужды пользователя зарезервированы индексы с 1 по 9.

Взаимодействие с Docker

При использовании режима сети bridge доступ к контейнеру можно получить только через основной IP-адрес. Поэтому для работы с контейнерами рекомендуется использовать один из следующих подходов:

  • использовать режим сети host
  • организовать доступ к контейнерам через прокси-сервер (например, nginx)

Если требуется использовать режим bridge без прокси-сервера, необходимо настроить маркировку пакетов и направить трафик сетевой в таблицу маршрутизации, созданную для конкретного интерфейса. 

Внимание! Данная настройка не совместима с работой скрипта-конфигуратора netconfig. Для её использования необходимо удалить netconfig, поскольку при запуске скрипта таблицы маршрутизации могут быть перезаписаны.

Чтобы настроить маркировку пакетов для каждого сетевого интерфейса, выполните следующие команды:

iptables -t mangle -A PREROUTING -i [название интерфейса] -j MARK --set-mark [маркировка]

iptables -t mangle -A PREROUTING -i [название интерфейса] -j CONNMARK --save-mark

Восстановите маркировку при передаче соединения в bridge докера:

iptables -t mangle -A PREROUTING -i docker0 -j CONNMARK --restore-mark

Добавьте маршрут к сети docker в таблицы маршрутизации:

ip r a 172.17.0.0/16 dev docker0 table [таблица маршрутизации, соответствующая выбранному интерфейсу]

Создайте правила маршрутизации:

ip rule add from all fwmark [маркировка] lookup [таблица маршрутизации, соответствующая выбранному интерфейсу]