Разные шлюзы для разных (виртуальных) интерфейсов.

Вопрос или проблема

Я создал виртуальный интерфейс и хотел бы использовать другой шлюз по умолчанию для пакетов, покидающих мои машины через этот виртуальный интерфейс. Есть идеи, как я могу этого добиться? Я даже не знаю, могу ли я это сделать с помощью netplan, route или мне нужно использовать iptables

Пример для пакетов, покидающих мою машину с:

eth0   (192.168.1.129) -> шлюз 192.168.1.1
eth0:0 (192.168.1.130) -> шлюз 192.168.1.2

Мой /etc/netplan/50-cloud-init.yaml в настоящее время выглядит так:

network:
    version: 2
    ethernets:
        eth0:
          addresses:
            - 192.168.1.129/24
            - 192.168.1.130/24:
               label: eth0:0
          nameservers:
            addresses: [8.8.8.8, 8.8.4.4]
          routes:
           - to: default
             via: 192.168.1.1

Я уже пытался добавить новый маршрут, но получаю ошибку RTNETLINK answers: File exists:

sudo ip route add 0.0.0.0/0 via 192.168.1.160 dev eth0:0

Однако в данный момент такой маршрут не существует:

$ sudo route -n
Таблица маршрутизации ядра IP
Направление      Шлюз          Маска           Флаги Метрика Ссылается Использование Интерфейс
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
10.0.20.0       0.0.0.0         255.255.255.0   U     0      0        0 tap0
10.0.51.0       0.0.0.0         255.255.255.0   U     0      0        0 tap1
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

Ответ или решение

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

Теоретические основы

Сетевые интерфейсы в Linux можно настраивать с использованием таких инструментов, как netplan, iproute2 и iptables. К основным концепциям, которые Вам понадобятся, относятся:

  1. Таблицы маршрутизации: это наборы маршрутов, которые ваш сетевой стек использует для принятия решений о том, куда отправить пакеты. Обычно используется одна таблица маршрутизации (таблица main), но в Linux можно создавать и использовать дополнительные таблицы.

  2. Политическая маршрутизация (Policy Routing): позволяет выбрать таблицу маршрутизации на основе определенных критериев, например, исходного адреса, порта, или типа нагрузки.

  3. Инструмент iproute2: предоставляет более гибкие средства для управления сетевыми интерфейсами и маршрутизацией по сравнению с устаревшей командой route.

Пример решения

Особенностью применения различных шлюзов для одного физического интерфейса с несколькими IP-адресами является использование отдельных таблиц маршрутизации. Для реализации этого шага вам следует использовать ip инструмент для настройки. Вот подробный план действий:

1. Создание дополнительных таблиц маршрутизации

Сначала, добавьте дополнительную таблицу маршрутизации в файл /etc/iproute2/rt_tables. Это делается, добавлением две новые строки:

1  eth0_main
2  eth0_second

2. Настройка правил политической маршрутизации

Используйте команду ip rule, чтобы направить трафик из исходного IP через отдельные таблицы маршрутизации:

sudo ip rule add from 192.168.1.129 lookup eth0_main
sudo ip rule add from 192.168.1.130 lookup eth0_second

3. Настройка таблиц маршрутизации

Теперь настройте маршруты в этих таблицах:

sudo ip route add default via 192.168.1.1 dev eth0 table eth0_main
sudo ip route add default via 192.168.1.2 dev eth0 table eth0_second

Применение изменений

Чтобы изменения сохранились после перезагрузки, вы можете добавить их в соответствующие конфигурационные файлы системы или в сценарии запуска. Однако большинство современных дистрибутивов используют netplan или NetworkManager для таких задач.

Применение на практике

  1. Управление конфигурацией через netplan

netplan, как ваш текущий инструмент, может не поддерживать необходимые функции политической маршрутизации во всех версиях. В таком случае, исользуйте netplan для базовой конфигурации интерфейсов, а затем вы можете использовать системные параметры (например, rc.local) для применения специфической маршрутизации через iproute2.

Пример:

network:
    version: 2
    ethernets:
        eth0:
          addresses:
            - 192.168.1.129/24
            - 192.168.1.130/24
          gateway4: 192.168.1.1   # базовый шлюз, так как netplan не распознает политическую маршрутизацию
  1. Скрипты и автоматизация

Создайте скрипт для применения конфигурации после каждого перезапуска сети:

Создайте файл /etc/network/if-up.d/routing и добавьте в него следующее:

#!/bin/bash
ip rule add from 192.168.1.129 lookup eth0_main
ip rule add from 192.168.1.130 lookup eth0_second
ip route add default via 192.168.1.1 dev eth0 table eth0_main
ip route add default via 192.168.1.2 dev eth0 table eth0_second

Не забудьте сделать скрипт исполняемым:

sudo chmod +x /etc/network/if-up.d/routing

Итог

Ваша цель – конфигурирование разных шлюзов для разных IP-адресов на одном интерфейсе – достижима путем настройки политической маршрутизации, для чего используется инструментарий iproute2, как показано выше. Этот метод позволяет эффективно распределять маршруты на основе метаданных, которые удовлетворяют вашим требованиям, и обеспечивать надежную работу сети с необходимыми параметрами.

В случае сложностей всегда полезно проверять команды и их влияние через такие утилиты, как ip rule show и ip route show table <table_name>, чтобы убедиться в корректности заданной конфигурации.

Оцените материал
Добавить комментарий

Капча загружается...