Как настроить несколько сетевых интерфейсов в Ubuntu 20.04
В ситуациях, когда на сервере Ubuntu 20.04 присутствует 2 и более сетевых интерфейса с публичными IP адресами необходимо произведение дополнительных настроек для обеспечения доступности сервера по этим дополнительным адресам. Виной всему применяемая по умолчанию политика маршрутизации, отправляющая все сетевые пакеты через 1 интерфейс, у которого прописан маршрут по умолчанию. При этом не важно через какой интерфейс пакет попал на сервер. Поэтому, даже при правильных настройках Netplan сервер не будет отвечать по дополнительным адресам без дополнительных настроек. Рассмотрим как же настроить несколько сетевых интерфейсов в Ubuntu 20.04.
Как настроить несколько сетевых интерфейсов с публичным IP на Ubuntu 20.04:
Автоматическая настройка Netplan
Linux серверы Serverspace призваны упрощать жизнь пользователей. В них присутствует функция настройки сетевых интерфейсов в автоматическом режиме при их добавлении в панели управления или во время создания сервера. Но для обеспечения работы маршрутизации на основе политик и как результат доступности сервера сразу по нескольким сетевым интерфейсам нам необходимо внести изменения в настройки Netplan. Чтобы наши настройки не перезаписались во время перезагрузки, необходимо отключить автоматическую настройку сети. После того, как Вы убедитесь, что необходимое количество интерфейсов добавлено на сервер, создайте на нём файл:
nano /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
И добавьте в него параметр:
network: {config: disabled}
Теперь последующие изменения в Netplan не будут перезаписываться в автоматическом режиме при перезагрузке.
Настройка маршрутов на основе политик
В основе маршрутизации на основе политик лежат таблицы. Для каждой таблицы настраиваются свои маршруты и политики. Проверим наличие в системе пакета iproute2. Если его нет, произведите его установку.
apt install iproute2
Откройте файл с таблицами маршрутизации
nano /etc/iproute2/rt_tables
И добавьте в его конец количество таблиц, соответствующее количеству настраиваемых интерфейсов:
700 700
701 701
Формат записи: приоритет (число) пробел название таблицы (число).
Теперь откройте файл Netplan с настройками сетевых интерфейсов. Он расположен по пути /etc/netplan/ и имеет расширение .yaml. В моём случае путь такой:
nano /etc/netplan/50-cloud-init.yaml
Каждый интерфейс имеет в данном файле блок настроек. В конец данного блока мы и будем добавлять настройки политик и правил маршрутизации для интерфейса. В данном файле важно соблюсти количество пробелов перед каждым параметром и значением, а также не использовать табуляции вместо пробелов. Ориентируйтесь на отступы в уже имеющихся записях и добавляйте по аналогии.
Для каждого сетевого интерфейса добавляем блоки routes и routing-policy. Итоговая запись для 1 интерфейса будет выглядеть так:
network:
version: 2
ethernets:
enp0s5:
addresses:
- 78.89.90.12/24
gateway4: 78.89.90.1
match:
macaddress: 54:43:32:21:10:09
mtu: 1500
nameservers:
addresses:
- 8.8.8.8
- 1.1.1.1
- 8.8.4.4
search: []
set-name: enp0s5
routes:
- to: 0.0.0.0/0
via: 78.89.90.1
table: 700
routing-policy:
- from: 78.89.90.12
table: 700
priority: 300
Для других интерфейсов запись будет аналогична, начиная с имени интерфейса (enp0s5), но у других должен отсутствовать параметр gateway4, т.к. шлюз по умолчанию должен быть один. Настройки routes и routing-policy:
- to - адрес назначения пакета. Для наших целей - любой (0.0.0.0/0)
- via - адрес шлюза для данного интерфейса
- table - имя таблицы маршрутизации. Должны быть указаны одинаковые значения в routes и routing-policy для одного интерфейса, но быть различными от интерфейса к интерфейсу. Данные таблицы мы создали в файле rt_tables
- from - адрес источника пакета. Для целей данного руководства - это IP адрес интерфейса
- priority - обязательное числовое значение
После внесения настроек и сохранения файла проверим конфигурацию на ошибки:
netplan generate
Подобный вывод укажет на ошибку при их наличии (в данном случае пропущен пробел):
/etc/netplan/50-cloud-init.yaml:23:12: Invalid YAML: inconsistent indentation:
routes:
^
Если конфиг составлен верно, то вывод будет отсутствовать. Это значит, что пора применить изменения:
netplan apply
После применения изменений настроенные таким образом сетевые интерфейсы станут доступны извне по своим публичным IP адресам.