Вопрос или проблема
Я испытывал трудности в корпоративной среде с изменениями 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
То, что вы описали, является маршрутизацией на основе источника, только этот термин на самом деле означает маршрутизация на основе адреса источника. Если вы отправляете пакеты с адреса 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 для правила маршрутизации выходящего трафика. Это позволит системе отслеживать соединение и направлять ответный трафик через соответствующий интерфейс.
- Установка 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
- Восстановление 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
- Конфигурация маршрутизации с использованием fwmark:
Обновите ваши маршрутизационные политики, чтобы они учитывали разметку пакетов:
ip rule add fwmark 10 table 100
ip rule add fwmark 20 table main
Эти команды позволяют системе маршрутизировать пакеты в зависимости от метки, присвоенной соединению.
- Обновление конфигурации Netplan:
Убедитесь, что ваша конфигурация Netplan правильно указывает маршрутизацию для таблиц, как указано выше.
После внедрения этих изменений перепроверьте тропу пакетов с помощью tcpdump
, чтобы удостовериться в нахождении пакетов на правильном интерфейсе. Эффективное взаимодействие между VLAN позволит вашей сети работать гладко и без неожиданностей, что имеет ключевое значение в корпоративной среде.
Таким образом, при правильной настройке Source-Based и Flow-Based Routing система должна корректно обрабатывать входящие и исходящие соединения, обеспечивая стабильную работу серверов при смене сетей. Настройка маршрутизации такого типа требует внимания к деталям и тщательной проверки на этапе внедрения, однако она позволяет добиться высокой гибкости и надежности корпоративной сети.