Создаем виртуальную локальную сеть
Денис Колисниченко (dhsilabs@mail.ru, www.dkws.org.ua)
Сегодня уж очень все вокруг виртуальное: виртуальная реальность, виртуальные машины, виртуальные частные сети… Стоп. А почему бы нам не организовать виртуальную *локальную* сеть? Тем более что аппаратные решения от Cisco, HP, D-Link и соответствующим образом настроенные виртуальные сетевые интерфейсы Linux, xBSD, Windows это позволяют.
Содержание:
- Зачем нужны виртуальные сети?
- Метим трафик
- Порты и VLAN
- Практика
- Другие производители оборудования
- Настройка VLAN в Linux
- VLAN в Windows: миф или реальность?
- Вместо заключения
- Врезка: Что такое «Double VLAN»?
- Мини-статья: Протоколы автоконфигурирования
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 – 0×8100. Размер этого поля равен 16 битам.
- Priority – задает приоритет передаваемого трафика. Используется стандартом IEEE 802.1p. Размер – 3 бита.
- CFI (Canonical Format Indicator) – индикатор канонического формата. Проще говоря, задает формат MAC-адреса: 1 – канонический, 0 – не канонический. Размер поля – всего 1 бит.
- VID (VLAN Identifier) – задает индикатор виртуальной сети. Указывает, к какой виртуальной сети принадлежит кадр. Размер – 12 бит.
Маркер вставляется перед полем Тип протокола, после этого пересчитывается контрольная сумма, поскольку кадр уже изменился.
Сейчас мы поговорим о портах коммутатора и виртуальных сетях. Порты коммутатора, которые поддерживают виртуальную сеть, можно разделить на две группы: маркированные порты (в терминологии 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 2s
Первая команда выбирает интерфейс, вторая задает режим порта – 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:
!
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
!
switch1(config)# interface fa0/24
switch1(config-if)# switchport encapsulation dot1q
switch1(config-if)# switchport mode trunk
Настройки для коммутатора switch2 выполняются аналогичным способом.
Теперь представим, что в нашей сети появился маршрутизатор, он же роутер. Топология сети будет немного изменена, как показано на рис. 3.
Первым делом нам нужно включить маршрутизацию на коммутаторе 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 поддерживает виртуальные локальные сети. Подробнее об этом можно прочитать на страничке , о настройке VLAN на коммутаторах D-Link — на страничке или в руководстве пользователя.
А теперь поговорим о настройке виртуальных сетей в ОС 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, но, надеюсь, общее впечатление у тебя сформировалось. Дополнительную информацию можно получить по следующим ссылкам:
- – общая информация о VLAN
- – стандарт 802.1Q
- – о настройке VLAN в FreeBSD (FreeBSD VLAN mini HowTo)
- — ссылка посвящена двойной инкапсуляции Q-in-Q, позволяющей создавать дважды маркированный трафик.
Врезка: Что такое «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 в зависимости от аутентификационной информации пользователя (см. ); и протокол VQP, совместно с сервером VMPS обеспечивающий динамическое включение в ту или иную VLAN портов коммутатора на основе MAC-адресов, подключенных к ним компьютеров (). Из более простых решений можно отметить протокол GVRP (описанный в стандарте IEEE 802.1P), поддержка которого позволяет коммутаторам распознавать VLAN и автоматически конфигурировать транковые порты (). В системах Cisco аналогичную задачу обычно решает их собственный протокол — .
Сергей Супрунов, системный администратор, автор многих статей по системному и сетевому администрированию.
Статья опубликована в январском номере журнала «Xakep» за 2009 год.




