Двойная маршрутизация на основе IP-источника на сервере

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

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

Мы используем Ubuntu с Netplan, ниже представлен пример конфигурации Netplan. Все работает как ожидалось, кроме трафика внутри локального VLAN для нового VLAN (20 в этом примере).

Маршрутизация между VLANами осуществляется на коммутаторе ядра, оба интерфейса сервера находятся на коммутаторе Cisco. Трафик между VLANами также маршрутизируется через межсетевой экран, но правила между ними – любой:любой.

Дополнительное тестирование:

С помощью tcpdump и ping, оказывается входящий трафик из VLAN 10 (используя IP интерфейса VLAN 20) выходит на VLAN 20 и теряется. По сути, трафик не возвращается на исходный интерфейс, когда он поступает из VLAN 20 в интерфейс VLAN 10 со стороны корпоративной сети.

Я не уверен, как это исправить. Как в этом случае обеспечить истинную маршрутизацию на основе источника, возможно ли это вообще?

Конфигурация Netplan:

# VLAN 10 (eno2np1) (10.86.152.0/22)
# VLAN 20 (eno4) (10.126.110.1/26)
# Трафик теряется внутри VLAN 20. tcpdump видит пакеты на локальных и удаленных системах, неопределено, что именно вызывает отсутствие связи.

network:
  ethernets:

# Основной адрес сервера / адаптер.
# VLAN 10
    eno2np1:
      dhcp4: false
      addresses: [10.86.152.220/22]
      routes:
      - to: default
        via: 10.86.152.1
      routing-policy:
      - from: 10.86.152.220
      nameservers:
        addresses: [10.56.56.56,10.56.56.156]

# Новый VLAN, к которому мы переходим.
# VLAN 20
    eno4:
      dhcp4: false
      addresses: [10.126.110.20/26]
      nameservers:
        addresses: [10.56.56.56,10.56.56.156]
      routes:
      - to: default
        via: 10.126.110.1
        table: 100
      routing-policy:
      - from: 10.126.110.20
        table: 100

  version: 2

/etc/iproute2/rt_tables:

#
# зарезервированные значения
#
255     local
254     main
253     default
0       unspec
#
# местный
#
#1      inr.ruhep
#
100     ipten

Результаты инструмента ip:
Результаты инструмента ip

То, что вы описали, является маршрутизацией на основе источника, только этот термин на самом деле означает маршрутизация на основе адреса источника. Если вы отправляете пакеты с адреса Y, вы используете таблицу маршрутизации Y, и так далее.

То, что вы ищете, я думаю, может называться маршрутизацией на основе потока. Для реализации этого используйте правила iptables, чтобы установить connmark для всех входящих пакетов, восстановить этот connmark на уровень маркировки пакета для исходящих пакетов и изменить ваши правила маршрутизации политики, чтобы они соответствовали fwmark, а не адресу источника.

.

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

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

Теория

Маршрутизация на основе источника — это процесс, при котором маршрутизатор принимает решение о маршрутизации пакета на основе его исходного IP-адреса. Это так называемая Source-Based Routing (SBR). Однако данная задача усложняется, когда вы работаете с несколькими интерфейсами или VLAN. В стандартной конфигурации, когда сервер имеет несколько сетевых интерфейсов, пакеты могут выходить на любом из доступных интерфейсов, если явно не указаны правила для их маршрутизации.

Другой важный аспект — это наличие так называемой Statefull-логики, которая позволяет отслеживать соединения между двумя узлами и гарантировать, что ответные пакеты маршрутизируются так же, как и исходящие. Таким образом, мы переходим к понятию Flow-Based Routing. Flow-Based Routing предполагает установку и использование специальных меток на соединениях, которые помогают определить, через какой интерфейс был отправлен исходный пакет.

Пример

В предложенной конфигурации Netplan описана ситуация, в которой сервер использует два сетевых интерфейса: один для VLAN 10 с адресом 10.86.152.220/22 и другой для VLAN 20 с адресом 10.126.110.20/26. Проблема, с которой вы сталкиваетесь, заключается в том, что трафик внутри локальной сети VLAN 20 пропадает — он не возвращается через правильный интерфейс, несмотря на маршрутизацию, заданную по умолчанию.

Прежде чем двигаться дальше, важно отметить, что ваш сервер маршрутизирует трафик через два разных пути, и без надлежащих правил это может привести к тому, что ответы на запросы отправляются через другой VLAN, что ведет к потере пакетов. Ваша задача — использовать iptables для маркировки пакетов и обеспечить их правильное возвращение.

Применение

Для реализации описанной выше теории предлагаем следующий подход с использованием iptables и iproute2. Потребуется применять connmark для входящих пакетов и затем использовать fwmark для правила маршрутизации выходящего трафика. Это позволит системе отслеживать соединение и направлять ответный трафик через соответствующий интерфейс.

  1. Установка connmark для входящих пакетов:

Начните с установки connmark для всех входящих соединений. Это делается для отслеживания соединения, что позволит направлять выходной трафик через тот же самый интерфейс. Используйте команду:

iptables -t mangle -A PREROUTING -i eno2np1 -j CONNMARK --set-mark 10
iptables -t mangle -A PREROUTING -i eno4 -j CONNMARK --set-mark 20
  1. Восстановление connmark для исходящих пакетов:

Для того чтобы connmark применялся ко всем пакетам, выходящим из системы, добавьте следующие правила:

iptables -t mangle -A OUTPUT -m connmark --mark 10 -j MARK --set-mark 10
iptables -t mangle -A OUTPUT -m connmark --mark 20 -j MARK --set-mark 20
  1. Конфигурация маршрутизации с использованием fwmark:

Обновите ваши маршрутизационные политики, чтобы они учитывали разметку пакетов:

ip rule add fwmark 10 table 100
ip rule add fwmark 20 table main

Эти команды позволяют системе маршрутизировать пакеты в зависимости от метки, присвоенной соединению.

  1. Обновление конфигурации Netplan:

Убедитесь, что ваша конфигурация Netplan правильно указывает маршрутизацию для таблиц, как указано выше.

После внедрения этих изменений перепроверьте тропу пакетов с помощью tcpdump, чтобы удостовериться в нахождении пакетов на правильном интерфейсе. Эффективное взаимодействие между VLAN позволит вашей сети работать гладко и без неожиданностей, что имеет ключевое значение в корпоративной среде.

Таким образом, при правильной настройке Source-Based и Flow-Based Routing система должна корректно обрабатывать входящие и исходящие соединения, обеспечивая стабильную работу серверов при смене сетей. Настройка маршрутизации такого типа требует внимания к деталям и тщательной проверки на этапе внедрения, однако она позволяет добиться высокой гибкости и надежности корпоративной сети.

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

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