Туннели в Linux

Туннель Linux

Обыные туннели Linux, такие как GRE и IPIP, знакомы каждому админу. Но операционная система не ограничивается ими. Малоизвестные опции классических туннелей и более новые протоколы могут существенно облегчить решение задач. В данной инструкции мы рассмотрим несколько не очень распространенных протоколов и научимся управлять ими с помощью iproute2, стандартного инструмента для работы с сетевым стеком Linux.

Сразу предупрежу, что здесь и далее в качестве условных публичных адресов IPv4 я использую сети 192.0.2.0/24, 198.51.100.0/24 и 203.0.113.0/24, которые в RFC 5737 зарезервированы для примеров и документации.

Dual stack GRE

Для передачи IPv4 поверх IPv4 как правило используют IPIP, для передачи IPv6 поверх IPv4 — SIT, а для передачи IPv6 поверх IPv6 есть IP6IP6, хотя, если честно, такие случаи применения мне неизвестны. Недостаток в том, что для сети с dual stack потребовалось бы больше одного туннеля.

РЕКОМЕНДУЕМ:
Выполнение действий при появлении файла в каталоге Linux

GRE может решить одновременно обе задачи. В Linux достаточно добавить на туннельный интерфейс адреса из обоих протоколов.

Все команды iproute2, которые изменяют настройки, необходимо выполнять с правами root. Большинство команд для просмотра настроек особых прав не требуют, но и тут есть исключения.

Создаение туннеля.

Добавление адреса.

Стоить напомнить, что туннели Linux создаются в выключенном (down) состоянии. Не забывайте добавлять в скрипты ip link set dev ... up.

gretap

Классический GRE инкапсулирует пакеты IP. Но протокол не просто так называется generic routing encapsulation. Он вполне способен передавать и кадры протоколов канального уровня.

В заголовках GRE для протокола инкапсулированного пакета есть отдельное поле, куда пишется EtherType нагрузки, и пакет помещается в полезную нагрузку целиком. А сам GRE — отдельный протокол IP с номером 47. Подробности можно узнать из RFC 2784.

Команды для настройки немного отличаются от обычного GRE:

Если просто присвоить туннелю адрес и маршрутизировать через него трафик, особой пользы от того, что он работает на канальном уровне, не увидим. Зато его можно объединить в мост с физическим интерфейсом и отправить весь трафик из сегмента L2 на другую сторону туннеля.

Объединим интерфейсы eth2 и tun0 в мост br0:

Несколько туннелей GRE к одному хосту

Как правило между двумя маршрутизаторами настраивают по одному туннелю. Что, если нужно больше, например для тестов? У GRE есть решение. Вы можете указать «ключ» и создать своего рода кодовое разделение доступа. Если между хостами уже настроен обычный туннель, никаких трудностей не будет.

Несмотря на название, к шифрованию данная функция не имеет никакого отношения — «ключ» передается в открытом виде и используется исключительно для идентификации туннелей.

L2TPv3

Для мультиплексирования туннелей лучше использовать другие протоколы. Например, L2TPv3. Этот протокол почти не имеет нечего общего с широко известным L2TP, который часто применяют для клиентских туннелей VPN. Его цель заключается в другом, и он специально спроектирован для провайдерских туннелей. Протокол довольно гибкий и предоставляет большое количество всевозможных настроек. Почитать о нем в деталях вы можете в RFC 3913. Мы рассмотрим самые основные.

В отличие от L2TPv2, он может как работать прямо поверх IP (протокол 115), так и инкапсулироваться в UDP. Первый вариант лучше по производительности, но второй лучше проходит через NAT. Выбор остается за вами.

РЕКОМЕНДУЕМ:
Гипервизор на Linux KVM и libvirt c поддержкой LVM

L2TPv3 использует необычную терминологию. Туннель в L2TPv3 — чисто виртуальная сущность. С каждым туннелем может быть ассоциирована одна или более сессий. У каждого туннеля есть свой идентификатор, есть он и у каждой сессии. Более того, идентификаторы могут не совпадать на обеих сторонах, поэтому в командах нужно указывать оба.

Создание нашего первого туннеля, поверх IP:

На этом этапе никаких новых сетевых интерфейсов в нашей системе не появится. В наличие туннеля можно убедиться с помощью команды ip l2tp show tunnel:

Теперь создадим сессию и ассоциируем ее с туннелем:

После создания сессии в системе появится новый интерфейс. По умолчанию они именуются l2tpethN. Чтобы изменить имя интерфейса, надо добавить к команде опцию name, например name myl2tpsession.

Просмотреть информацию о созданных сессиях можно с помощью команды ip l2tp show session.

L2TPv3 поверх UDP

Команда для создания туннелей поверх UDP отличается опцией encap udp вместо encap ip. Кроме того, необходимо указать порты источника и назначения — они тоже могут быть разными. Опции называются udp_sport и udp_dport.

Команды для создания сессий не зависят от типа инкапсуляции.

VXLAN

Если L2TPv3 происходит из «дооблачных» времен, то VXLAN был специально спроектирован с расчетом на виртуальные окружения. Он может работать как в режиме точка — точка, так и в режиме многоадресной рассылки.

VXLAN в режиме точка — точка

Чтобы создать туннель Linux VXLAN в режиме точка — точка, нам потребуется указать физический интерфейс для него, идентификатор виртуальной сети (VNI), адреса источника и приемника и порт UDP. Порт по стандарту — 4789, но можно использовать любой.

Значения идентификаторов сетей могут быть в диапазоне от 0 до 16 777 215.

Многоадресный VXLAN

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

Основной режим для него — многоадресный (multicast). Чтобы создать туннель в многоадресном режиме, нужно указать не адрес удаленного хоста, а адрес multicast:

Если хосты расположены в одном сегменте канального уровня, они найдут друг друга по протоколу IGMP. Этот вариант вполне годится для создания независимых виртуальных сетей внутри одного кластера гипервизоров. Если хосты разделены маршрутизируемой сетью, например интернетом, потребуется протокол многоадресной маршрутизации, такой как PIM-SM. Их реализации существуют для Linux, к примеру pimd из пакета FRRouting, но их использование — тема для отдельной статьи.

Нужно отметить, что ряд адресов multicast зарезервирован для вполне конкретных целей и протоколов, например 224.0.0.1 — группа всех маршрутизаторов вообще, а 224.0.0.5 — группа всех маршрутизаторов OSPFv2. Для частного использования выделена сеть 239.0.0.0/8, адреса для своих целей можно смело брать из нее.

QinQ

В строгом смысле 802.1ad QinQ не является туннелем, но преследует сходную цель — мультиплексирование пользовательских VLAN в одном 802.1q VLAN. Этот протокол нередко применяется провайдерами для предоставления клиентам виртуальных выделенных линий вместо MPLS, если задача только в том, чтобы пробросить несколько клиентских VLAN с одной точки сети с другую.

В отличие от всех описанных протоколов, это протокол исключительно канального уровня и требует поддержки со стороны коммутаторов, которая присутствует не во всех моделях и версиях ОС. Также разные коммутаторы могут требовать разного протокола для провайдерских кадров: либо 802.1ad по стандарту (протокол Ethernet 0x88A8), либо 802.1q (протокол 0x8100).

РЕКОМЕНДУЕМ:
Аналоги Bash Unix инструментов в PowerShell Windows

Некоторые коммутаторы поддерживают QinQ странным образом. К примеру, я видел модели Dell PowerEdge, которые при включении QinQ на одном порте отключали обычный 802.1q VLAN на всех остальных, с очевидными последствиями для пользователей. Всегда проверяй настройки на стенде. Но если все нормально поддерживается, протокол прекрасно решает свою задачу.

Чтобы создать виртуальную выделенную линию, нам надо создать один внешний (провайдерский) VLAN и один или более внутренних (клиентских). Терминировать провайдерские туннели вместе с клиентскими на одном маршрутизаторе приходится не так часто, но иногда бывает нужно.

Создаем провайдерский:

Интерфейсы VLAN, так же как и туннели, создаются выключенными, и нужно не забывать их поднимать командой ip link set ... up. Если коммутаторы требуют 802.1q в качестве протокола внешнего VLAN, proto 802.1ad нужно поменять на proto 802.1q.

Теперь создадим клиентские интерфейсы:

Присвоить клиентским VLAN адреса можно как обычно — командой ip address add. Присваивать адрес провайдерскому можно так же, но чаще всего не требуется.

На этом все. Надеюсь, эти знания помогут вам в построении виртуальных сетей и настройки iproute2.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий