СЕРГЕЙ СУПРУНОВ
FreeBSD tips: настройка VLAN
Представьте себе ситуацию: узел СПД в составе маршрутизатора CISCO и коммутатора Catalyst находится на первом этаже, а ваш FreeBSD-сервер – на четвертом. И при этом требуется вывести во внешний мир несколько подсетей, которые проходят через сервер FreeBSD на Catalyst. Можно, конечно, подключить к серверу несколько сетевых адаптеров, занять для внутреннего использования несколько портов на Catalyst и пробросить между этажами километр кабеля 5-й категории. На кабеле можно даже сэкономить, пропустив по одному кабелю сразу два соединения и задействовав тем самым все имеющиеся пары. Однако все равно и затрат, и дополнительных работ по прокладке кабелей получается слишком много. А раз возникает сложность, то наверняка кто-то уже нашел способ ее устранить. И в нашем случае панацеей будет технология VLAN – виртуальные локальные сети.
Данная технология позволяет логически разделять несколько подсетей на одном устройстве (например, коммутаторе) таким образом, что машины, объединенные в одну VLAN, ничего не знают о существовании компьютеров, входящих в другую. И с точки зрения топологии сети мы получаем отдельные коммутаторы для каждой подсети.
На уровне протоколов это достигается добавлением нескольких полей в заголовок пакета сетевого уровня. Одно из добавленных полей содержит идентификатор (номер) сети VLAN, на основе которого и происходит разделение Ethernet-кадров по виртуальным сетям. Кадры, имеющие одинаковый номер VLAN, рассматриваются как принадлежащие одной подсети. Регламентируется это стандартом IEEE 802.1Q.
Развитие технологии VLAN привело к тому, что стало возможным не только назначать отдельные подсети отдельным портам, но и через один порт пропускать несколько VLAN (так называемый multiVLAN). То же относится и к сетевым адаптерам, чем мы и воспользуемся.
Рассмотрим настройку VLAN для FreeBSD на следующем примере: пусть имеется один отрезок кабеля между Catalyst и FreeBSD. На Catalyst свободен один порт, на FreeBSD – одна сетевая карта, обслуживающая внешние соединения. Нужно через это соединение организовать передачу следующих подсетей:
- подсеть реальных адресов для работы в Интернете (111.222.0.0/28);
- корпоративная частная подсеть для доступа к вышестоящим узлам компании (10.0.123.0/24);
- и еще одна сеть для управления оборудованием СПД (10.254.0.0/24).
Прежде всего нужно проверить, поддерживает ли ваша сетевая карта работу по VLAN. Некоторые карты обеспечивают поддержку данной технологии на аппаратном уровне, однако драйвер также должен поддерживать VLAN. Страница справочного руководства (см. man vlan) для FreeBSD 5.2 сообщает, что аппаратное мультиплексирование поддерживается для драйверов bge, em, gx, nge, ti и txp. (Во FreeBSD 5.3 к этому списку добавился еще и драйвер re, обеспечивающий работу сетевых адаптеров на чипсетах RealTek 8139C+/8169/8169S/8110S). Узнать подробную информацию по каждому из драйверов, в том числе список поддерживаемых драйвером моделей сетевых карт, можно на страницах man (например, man 4 em сообщает, что драйвером em поддерживается Intel PRO/1000 Gigabit Ethernet adapter). Если ваш адаптер не входит в этот список, то наверняка он сможет работать с использованием программной эмуляции мультиплексирования. По крайней мере, для большинства современных карт это утверждение справедливо. Нужно заметить, что тот же man vlan гласит, что сетевой адаптер для полноценной эмуляции должен поддерживать «длинные» кадры (oversized frames). В противном случае из-за необходимости размещения дополнительных полей заголовка, содержащих информацию о VLAN, которой принадлежит пакет, приходится снижать максимальный размер передаваемого пакета (MTU) на соответствующем интерфейсе.
Драйвера сетевых адаптеров, поддерживающих длинные кадры, перечислены в man vlan, однако данный список нельзя считать исчерпывающим, поскольку с 2002 года (когда писались страницы руководства) ситуация изменилась в лучшую сторону и перечень совместимых сетевых карт значительно расширился. По крайней мере, D-Link DFE-538TX, работающий на драйвере rl, отсутствующем в списке, никаких нареканий с моей стороны не вызвал. (Замечание: во FreeBSD 5.3 поддержка vlan значительно расширена, и теперь поддержка длинных кадров драйвером rl оформлена официально.)
Пожалуй, хватит теории. Перейдем к практике.
Для работы VLAN в системе должны быть соответствующие псевдоустройства. В случае с FreeBSD 5.2 (думаю, это справедливо и для всей 5-й ветки) устройства vlan создаются динамически. За это отвечает модуль ядра if_vlan.ko. Если вы предпочитаете иметь монолитное ядро, то потребуется пересобрать его со следующей опцией:
device vlan
Для 3-й и 4-й веток FreeBSD может потребоваться пересобрать ядро с такой строчкой:
pseudo-device vlan N
Вместо N нужно подставить количество устройств, которое вам понадобится. После сборки и установки нового ядра в системе должны появиться соответствующие интерфейсы vlan0, vlan1 и т. д., просмотреть которые можно командой:
ifconfig -a
Для FreeBSD 5.2 (в недавно вышедшей 5.3 все настраивается точно так же) для создания vlan-интерфейсов используется «клонирование» (cloning) на этапе загрузки (об этом – чуть ниже) либо программа ifconfig с опцией create. Второй вариант выглядит следующим образом:
# ifconfig vlan0
ifconfig: interface vlan0 does not exist |
# ifconfig vlan0 create 111.222.0.5 netmask 255.255.255.240 vlan 111 vlandev rl0
# ifconfig vlan0
vlan0: flags=8843 mtu 1500
inet 111.222.0.5 netmask 0xfffffff0 broadcast 111.222.0.15
inet6 fe70::204:5cff:fedf:f81f%vlan0 prefixlen 64 scopeid 0xd
ether 00:05:5d:cf:f9:1e
media: Ethernet autoselect (100baseTX )
status: active
vlan: 111 parent interface: rl0
|
Опция vlan задает номер VLAN, присвоенный этой сети. Параметр vlandev указывает физический интерфейс, используемый для организации VLAN. Заметьте, что этот интерфейс (в нашем случае rl0) должен иметь собственный IP-адрес, даже если реально он нигде использоваться не будет:
# ifconfig rl0
rl0: flags=8843 mtu 1500
options=8
inet 10.10.10.10 netmask 0xffffff00 broadcast 10.10.10.255
inet6 fe70::204:5cff:fedf:f81f%rl0 prefixlen 64 scopeid 0x1
ether 00:05:5d:cf:f9:1e
media: Ethernet autoselect (100baseTX )
status: active
|
Обратите внимание, что интерфейсы vlan наследуют MAC-адрес «родительского» интерфейса, но поскольку сети у нас разные, то ни к каким конфликтам это не приведет.
Если со стороны CISCO все настроено должным образом (собственно говоря, основное требование – номер VLAN должен совпадать с тем, который назначен интерфейсу со стороны FreeBSD), то после этой команды все должно работать. Например, конфигурация интерфейса для подсети реальных адресов на CISCO у меня выглядит следующим образом:
interface FastEthernet0/0.111
encapsulation dot1Q 111
ip vrf forwarding Inet
ip address 111.222.0.1 255.255.255.240
no ip route-cache
Аналогично описываются остальные интерфейсы. Идентификатор VLAN задается в параметре encapsulation dot1Q, в данном случае он равен 111.
На Catalyst соответствующий порт нужно перевести в trunk-режим и при желании можно указать список разрешенных номеров VLAN:
interface FastEthernet0/24
switchport trunk allowed vlan 100,111,999
switchport mode trunk
no ip address
С точки зрения остальных служб операционной системы, например ipfw или natd, полученный интерфейс ничем не отличается от физических и может использоваться как обычно. Например, можно подсчитать трафик, проходящий через vlan0:
# ipfw add 1234 count ip from any to any via vlan0
Остался последний штрих – настройка конфигурации для автоматического создания нужного интерфейса при перезагрузке. Для этого в файл /etc/rc.conf добавим следующие строчки:
# Создаем нужные интерфейсы, используя механизм клонирования:
cloned_interfaces="vlan0 vlan1 vlan2"
# И описываем соответствующие интерфейсы VLAN:
ifconfig_vlan0="inet 111.222.0.5 netmask 255.255.255.240 vlan 111 vlandev rl0"
ifconfig_vlan1="inet 10.254.0.5 netmask 255.255.255.0 vlan 100 vlandev rl0"
ifconfig_vlan2="inet 10.0.0.3 netmask 255.255.255.0 vlan 999 vlandev rl0"
Если «пропадание» сервера на пару минут не критично, то рекомендуется его перезагрузить, чтобы лишний раз убедиться в правильности всех настроек. Бежать среди ночи к неудачно загрузившемуся из-за пропущенного пробела серверу – не самое приятное занятие.
Нужно заметить, что технология VLAN позволяет шифровать трафик (например, ряд сетевых карт поддерживают аппаратное шифрование), однако во FreeBSD это не реализовано и поддерживается только разделение пакетов на основе идентификаторов VLAN. Хотя можно ожидать, что поддержка карт с аппаратным шифрованием появится в будущем. Тем не менее имеющихся в данный момент возможностей вполне достаточно, чтобы без особых усилий повысить эффективность использования имеющегося оборудования.