Сергей Супрунов
Представьте себе ситуацию: узел СПД в составе маршрутизатора CISCO и
коммутатора Catalyst находится на первом этаже, а ваш FreeBSD-сервер – на
четвертом. И при этом требуется вывести во внешний мир несколько подсетей,
которые проходят через сервер FreeBSD на Catalyst. Можно, конечно, подключить к
серверу несколько сетевых адаптеров, занять для внутреннего использования
несколько портов на Catalyst и пробросить между этажами километр кабеля 5-й
категории. На кабеле можно даже сэкономить, пропустив по одному кабелю сразу
два соединения и задействовав тем самым все имеющиеся пары. Однако все равно и
затрат, и дополнительных работ по прокладке кабелей получается слишком много. А
раз возникает сложность, то наверняка кто-то уже нашел способ ее устранить. И в
нашем случае панацеей будет технология VLAN – виртуальные локальные сети.
Данная технология позволяет логически разделять
несколько подсетей на одном устройстве (например, коммутаторе) таким образом,
что машины, объединенные в одну VLAN, ничего не знают о существовании
компьютеров, входящих в другую. И с точки зрения топологии сети мы получаем
отдельные коммутаторы для каждой подсети.
На уровне протоколов это достигается добавлением
нескольких полей в заголовок пакета сетевого уровня. Одно из добавленных полей
содержит идентификатор (номер) сети VLAN, на основе которого и происходит
разделение Ethernet-кадров по виртуальным сетям. Кадры, имеющие одинаковый
номер VLAN, рассматриваются как принадлежащие одной подсети. Регламентируется
это стандартом IEEE 802.1Q.
Развитие технологии VLAN привело к тому, что
стало возможным не только назначать отдельные подсети отдельным портам, но и
через один порт пропускать несколько VLAN (так называемый multiVLAN). То же
относится и к сетевым адаптерам, чем мы и воспользуемся.
Рассмотрим настройку VLAN для FreeBSD
на следующем примере: пусть имеется один отрезок кабеля между Catalyst и FreeBSD.
На Catalyst свободен один порт, на FreeBSD – одна сетевая карта, обслуживающая
внешние соединения. Нужно через это соединение организовать передачу следующих
подсетей:
n подсеть реальных адресов для работы в Интернете
(111.222.0.0/28);
n корпоративная частная подсеть для доступа к
вышестоящим узлам компании (10.0.123.0/24);
n и еще одна сеть для управления оборудованием
СПД (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<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> 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 <full-duplex>)
status: active
vlan: 111 parent
interface: rl0
Опция vlan задает номер VLAN, присвоенный этой
сети. Параметр vlandev указывает физический интерфейс, используемый для
организации VLAN. Заметьте, что этот интерфейс (в нашем случае rl0) должен
иметь собственный IP-адрес, даже если реально он нигде использоваться не будет:
# ifconfig rl0
rl0:
flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=8<VLAN_MTU>
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 <full-duplex>)
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. Хотя можно ожидать, что поддержка карт с
аппаратным шифрованием появится в будущем. Тем не менее имеющихся в данный
момент возможностей вполне достаточно, чтобы без особых усилий повысить
эффективность использования имеющегося оборудования.