Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #121, ЯНВАРЬ 2009 г.

Шаманство над виланами. Создаем виртуальную локальную сеть

Денис Колисниченко (dhsilabs@mail.ru, www.dkws.org.ua)




Уж очень все вокруг виртуальное: виртуальная реальность, виртуальные машины, виртуальные частные сети… Стоп. А почему бы нам не организовать виртуальную локальную сеть? Тем более, аппаратные решения от Cisco, HP, Dlink и соответствующим образом настроенные виртуальные сетевые интерфейсы Linux, xBSD, Windows вполне это позволяют.

Зачем нужны виртуальные сети?

VLAN (Virtual Local Area Network, Виртуальная Локальная Сеть) – группа устройств, взаимодействующая напрямую на канальном уровне, хотя на физическом уровне все эти устройства подключены к разным коммутаторам. Устройства, находящиеся в разных виртуальных сетях, невидимы друг для друга на канальном уровне, даже если они подключены к одному и тому же коммутатору. А взаимодействие между устройствами осуществляется только на сетевом или других, более высоких уровнях. Виртуальные локальные сети используются для создания логической топологии сети, которая никак не зависит от физической топологии. По сравнению с реализацией на раздельных коммутаторах, VLAN уменьшает количество оборудования и сетевого кабеля, но требует обязательного использования более дорогих управляемых коммутаторов.

Все виртуальное, оказывается, находит вполне реальное применение. Виртуальная локальная сеть – это не какой-нибудь эмулятор или игрушка для админа, а инструмент построения современной сети. Во-первых, VLAN позволяет гибко разделять устройства на группы. Например, можно с легкостью объединить устройства, находящиеся в разных местах, в одну сеть, или же разделить устройства одной сети на разные виртуальные подсети. Во-вторых, виртуальная локальная сеть поможет уменьшить количество широковещательного трафика. С помощью VLAN можно разбить коммутатор на несколько широковещательных доменов и отправить широковещательное сообщение только одной группе устройств (одной виртуальной сети). В-третьих, VLAN позволяет повысить безопасность и управляемость сети. VLAN активно используется для борьбы с ARP-спуфингом и существенно упрощает применение политик и правил безопасности. Кроме того, с помощью виртуальных сетей можно применять правила к целым подсетям, а не к каждому устройству отдельно.

В последнее время VLAN активно применяется крупными провайдерами домашних сетей. Поскольку число клиентов и сервисов (например, данные, VoIP, IPTV) постоянно растет, провайдеры выбирают коммутаторы, которые поддерживают более 1024 статических VLAN (стандарт 802.1Q). Для соединения сетей офисов через сеть провайдера используется механизм Double VLAN (смотри врезку), что позволяет эффективнее использовать идентификаторы виртуальных сетей (VLAN ID) в крупных сетях.

Метим трафик

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

Что делать, если на порт приходит трафик разных VLAN? Как его различить? Для этого используется маркировка кадров. Она позволяет идентифицировать трафик, то есть установить, к какой виртуальной сети он принадлежит.

Существуют различные варианты маркировки кадров. Иногда производители оборудования, в частности Cisco, разрабатывают собственные протоколы маркировки кадров. Но чаще используется стандарт IEEE 802.1Q. В этом случае внутрь кадра помещается специальная метка – тег, которая передает информацию о принадлежности трафика к определенной VLAN. Размер этой метки – всего 4 байта. Состоит она из следующих полей:

  • TPID (Tag Protocol Identifier) – идентификатор протокола маркировки. Определяет протокол, использующийся для маркировки кадра. Идентификатор протокола 802.1Q – 0x8100. Размер этого поля равен 16 битам.
  • Priority – задает приоритет передаваемого трафика. Используется стандартом IEEE 802.1p. Размер – 3 бита.
  • CFI (Canonical Format Indicator) – индикатор канонического формата. Проще говоря, задает формат MAC-адреса: 1 – канонический, 0 – не канонический. Размер поля – всего 1 бит.
  • VID (VLAN Identifier) – задает индикатор виртуальной сети. Указывает, к какой виртуальной сети принадлежит кадр. Размер – 12 бит.

Маркер вставляется перед полем «Тип протокола». После этого пересчитывается контрольная сумма, поскольку кадр уже изменился.

Порты и VLAN

Поговорим о портах коммутатора и виртуальных сетях. Порты коммутатора, которые поддерживают виртуальную сеть, можно разделить на две группы: маркированные порты (в терминологии Cisco - это транковые порты, англ. trunk ports) и немаркированные порты (порты доступа, access ports).
Маркированные порты нужны для того, чтобы через один порт можно было передавать и получать трафик от нескольких виртуальных сетей. При этом виртуальных сетей может быть несколько, а порт всего один. Как уже было сказано, информация о принадлежности трафика той или иной виртуальной сети указывается в специальном поле кадра. Без него коммутатор не сможет различить трафик от разных сетей.

Порты доступа используются для передачи немаркированного трафика. Порт доступа может принадлежать только одной VLAN, однако он может быть маркированным в нескольких VLAN и одновременно являться портом доступа для какой-то другой виртуальной сети (в таком случае сеть называется родной для этого порта, native VLAN). О «родном» режиме передачи трафика скажу ниже.

Когда на порт доступа приходит маркированный трафик, то он обычно должен удаляться. Но это происходит не всегда – зависит от настроек коммутатора. По умолчанию все порты коммутатора считаются портами доступа для сети VLAN 1. В процессе настройки администратор может изменить тип порта на маркированный и определить принадлежность портов к разным VLAN.

Порты коммутатора могут привязываться к определенной виртуальной сети статически или динамически. В первом случае администратор вручную определяет, какой порт будет принадлежать к какой VLAN. При динамическом назначении узлов принадлежность порта к той или иной виртуальной сети определяется коммутатором. Процедура назначения портом описана в стандарте 802.1X. Он предусматривает аутентификацию пользователя на RADIUS-сервере для получения доступа к порту.

Практика

А теперь поговорим о настройке VLAN на коммутаторах Cisco. Думаю, уже всем ясно, что VLAN – штука полезная, и хочется все настроить на практике. Чтобы не изобретать колесо, будем использовать топологию сети – примерно такую, как описано в документации Cisco, но с небольшими усовершенствованиями.
Итак, у нас есть два коммутатора: switch1 и switch2. К каждому из них подключено по две виртуальных сети. Для подключения к коммутаторам компьютеры виртуальной локальной сети используют порты доступа (fa0/N), а для связи между ними применяется транковый порт.

Ранние версии коммутаторов Cisco поддерживали проприетарный протокол ISL (Inter Switch Link). Сейчас этот протокол упразднен и вместо него используется 802.1Q.
Приступим к настройке коммутатора.

Как уже было отмечено, по умолчанию все его порты принадлежат к vlan 1. Чтобы создать вторую виртуальную сеть (vlan 2) и присвоить ей имя, используются следующие команды Cisco:

switch1(config)# vlan 2
switch1(config-vlan)# name myvlan

Далее нужно назначить порты к той или иной сети. Назначим порты fa0/3 и fa0/4 к виртуальной сети vlan 2:

switch1(config)# interface fa0/3
switch1(config-if)# switchport mode access
switch1(config-if)# switchport access vlan 2

switch1(config)# interface fa0/4
switch1(config-if)# switchport mode access
switch1(config-if)# switchport access vlan 2

Первая команда выбирает интерфейс, вторая задает режим порта – access. Третья назначает порт виртуальной сети vlan 2.
Понятно, что если портов много, то по одному прописывать их неудобно. Гораздо проще указать диапазон портов. Например, следующие команды добавляют порты с fa0/5 по fa0/9 в vlan2:

switch1(config)# interface range fa0/5 - 9
switch1(config-if-range)# switchport mode access
switch1(config-if-range)# switchport access vlan 2

Просмотреть информацию о назначенных портах и созданных виртуальных сетях можно с помощью команды:

switch1(config)# show vlan brief

VLAN Name Status Ports
---- --------- --------- -------------------------------
1 default active Fa0/1, Fa0/2, Fa0/10, Fa0/11,
Fa0/12, Fa0/13, Fa0/14, Fa0/15,
Fa0/16, Fa0/17, Fa0/18, Fa0/19,
Fa0/20, Fa0/21, Fa0/22, Fa0/23,
Fa0/24

2 mylan active Fa0/3, Fa0/4, Fa0/5, Fa0/6,
Fa0/7, Fa0/8, Fa0/9

Теперь настало время создать транковый порт. Делается это командами:

switch1(config)# interface fa0/24
switch1(config-if)# switchport encapsulation dot1q
switch1(config-if)# switchport mode trunk

Можно задать «родной» режим, – то есть трафик сети vlan 2, передающийся через транковый порт, будет немаркированным. А весь немаркированный трафик, попавший на транковый интерфейс, будет промаркирован как принадлежащий vlan 2 (по умолчанию он воспринимается как трафик vlan 1)

switch1(config-if)# switchport trunk native vlan 2

Просмотреть информацию о транковом порте можно с помощью одной из двух команд:

switch1# show interface fa0/24 trunk
switch1# show interface fa0/24 switchport

Вот конфигурация для нашего первого коммутатора switch 1:

!
interface fa0/3
switchport mode access
switch1(config-if)# switchport access vlan 2

!
switch1(config)# interface fa0/4
switch1(config-if)# switchport mode access
switch1(config-if)# switchport access vlan 2

!
switch1(config)# interface fa0/24
switch1(config-if)# switchport encapsulation dot1q
switch1(config-if)# switchport mode trunk

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

Первым делом нам нужно включить маршрутизацию на коммутаторе switch1:

switch1(config)#ip routing

После этого указать IP-адрес маршрутизатора (192.168.1.1). Этот адрес будет шлюзом по умолчанию для компьютеров первой виртуальной сети (vlan1 или default):

switch1(config)#interface default
switch1(config-if)#ip address 192.168.1.1 255.255.255.0
switch1(config-if)#no shutdown

Аналогично можно задать:

switch1(config)#interface vlan2
switch1(config-if)#ip address 192.168.1.1 255.255.255.0
switch1(config-if)#no shutdown

Теперь настроим интерфейс fa0/20, который соединен с маршрутизатором. Трафик, не предназначенный нашим виртуальным сетям, должен перенаправляться на маршрутизатор, а он уже сам пусть разбирается, что с ним делать. Вот необходимые команды конфигурации:

switch1(config)#interface fa0/20
switch1(config-if)#no switchport
switch1(config-if)#ip address 192.168.1.1 255.255.255.0
switch1(config-if)#no shutdown

Осталось прописать сам маршрут:

switch1(config-if)#ip route 0.0.0.0 0.0.0.0 192.168.1.1

Другие производители

Cisco – далеко не единственный производитель сетевого оборудования. Учитывая, что оборудование от Cisco стоит немало, желающие сэкономить наверняка будут искать более дешевые аналоги, например, оборудование от D-Link. Простенько, иногда зависает (ничего личного, говорю, как есть), – но зато ощутимо дешевле.
Обрати внимание, что далеко не все оборудование от D-Link поддерживает виртуальные локальные сети. Подробнее об этом можно прочитать на страничке www.dlink.ru/technology/vlan.php. О настройке VLAN на коммутаторах D-Link - на страничке xgu.ru/wiki/VLAN_в_D-LINK или в руководстве пользователя.

Настройка VLAN в Linux

А теперь поговорим о настройке виртуальных сетей в ОС Linux. Этот раздел статьи понадобится, если ты надумал построить программный маршрутизатор между двумя VLAN на базе Linux или если нужно обеспечить присутствие одного и того же сервера в нескольких VLAN – такой себе «Фигаро здесь и Фигаро там».
Первым делом подгрузим модуль 802.1q, обеспечивающий маркировку кадров:

# modprobe 8021q

Модуль не найден? Тогда нужно перекомпилировать ядро, включив поддержку этого модуля в разделе Network options / 802.1Q VLAN Support.
Затем выключим сетевой интерфейс и поднимем его, но уже без IP-адреса:

# ifconfig eth0 down
# ifconfig eth0 0.0.0.0 up

Теперь укажем, к какому интерфейсу подключена какая виртуальная сеть. Для этого используется команда vconfig (пакет vlan или vconfig – название пакета, содержащего программу vconfig, зависит от дистрибутива). Формат вызова команды такой:

# vconfig add интерфейс VLAN_ID

Например:

# vconfig add eth0 1
# vconfig add eth0 2

В данном случае мы связали vlan1 и vlan2 с одним сетевым интерфейсом – eth0. Далее нужно указать IP-адрес и сетевую маску для каждого интерфейса:

# ifconfig eth0.1 192.168.1.10 netmask 255.255.255.0 up
# ifconfig eth0.2 192.168.2.25 netmask 255.255.255.0 up

Можно задать маршрут по умолчанию (если необходимо):

# route add default gw 192.168.1.254

Получить исчерпывающую информацию о виртуальных интерфейсах можно через псевдофайловую систему /proc:

# cat /proc/net/vlan/eth0.1

Это еще не все. VLAN мы вроде бы настроили, но при перезагрузке настройки потеряются. Чтобы этого не случилось, нужно прописать модуль 802.1q в файле /etc/modules.conf, а настройки VLAN – в файле /etc/network/interfaces, например, так:

auto myvlan
iface myvlan inet static
address 192.168.1.1
netmask 255.255.255.0
vlan_raw_device eth0

Также можно создать сценарий и добавить его вызов в файлы автозапуска системы – это уже кому как больше нравится.

VLAN в Windows: миф или реальность?

Windows не обладает встроенной поддержкой VLAN, однако ее можно добавить, установив специальные драйверы. Вот они: Intel Advanced Networking Suite (iANS), 3com DynamicAccess, Broadcom Advanced Server Program (BASP). Все эти драйверы ты без проблем найдешь в интернете, как и документацию, в которой будет описано, что с ними делать. Но вряд ли тебе придется настраивать VLAN в Windows, поскольку правильнее и проще использовать или готовые устройства с поддержкой VLAN, или же отдельный Linux-сервер.

Вместо заключения

Понятно, что эта статья полностью не охватывает все секреты настройки VLAN, но, надеюсь, общее впечатление у тебя сформировалось. Дополнительную информацию можно получить по следующим ссылкам:

Что такое «Double VLAN»?

Это функция, поддерживающая инкапсуляцию тегов IEEE 802.1Q VLAN в теги второго уровня 802.1Q tag на провайдерских граничных коммутаторах Provider Edge (PE). При помощи Double VLAN сервис-провайдер может использовать уникальные VLAN (Service-provider VLAN ID, или SP-VLAN ID) для предоставления услуг клиентам, которые имеют несколько VLAN в своих сетях. VLAN клиента, или Customer VLAN IDs (CVLAN IDs), в этом случае сохраняются, и трафик от различных клиентов сегментируется, даже если он передается в одном и том же VLAN.

Протоколы автоконфигурирования

Сергей Супрунов, системный администратор, автор многих статей по системному и сетевому администрированию

Технология VLAN при всей своей полезности имеет и ряд недостатков, с которыми приходится считаться. Раньше наиболее частой была проблема совместимости оборудования: не все коммутаторы и хабы умели безболезненно пропускать тегированные кадры, и не все сетевые адаптеры поддерживали увеличенный размер кадра (oversized frames). Сейчас с этим ты вряд ли столкнешься. Поэтому на первый план выходит необходимость вручную настраивать каждый порт каждого коммутатора. Для больших разветвленных сетей это может превратиться в ту еще в головную боль.

Проблему пытаются решить по-разному. Тут и протокол 802.1X, позволяющий совместно с RADIUS-сервером конфигурировать VLAN в зависимости от аутентификационной информации пользователя (смотри xgu.ru/wiki/802.1X_и_RADIUS); и протокол VQP, совместно с сервером VMPS обеспечивающий динамическое включение в ту или иную VLAN портов коммутатора на основе MAC-адресов, подключенных к ним компьютеров (en.wikipedia.org/wiki/VQP). Из более простых решений можно отметить протокол GVRP (описанный в стандарте IEEE 802.1P). Его поддержка позволяет коммутаторам распознавать VLAN и автоматически конфигурировать транковые порты (www.javvin.com/protocolGVRP.html). В системах Cisco аналогичную задачу обычно решает их собственный протокол - VTP (en.wikipedia.org/wiki/VTP).

Содержание