VLAN
VLAN — це абревіатура від Virtual Local Area Network (віртуальна локальна мережа). Це віртуальний поділ фізичних мережевих комутаторів на другому рівні моделі OSI.
Це спосіб ізолювати клієнтів мережі один від одного, навіть якщо вони використовують одну фізичну мережу, без необхідності створення окремої підмережі та маршрутизатора. VLAN працює шляхом додавання мітки (VLAN ID) до мережевого трафіку та використання цієї мітки для маршрутизації трафіку між ізольованими клієнтами.
Для використання VLAN необхідно мати щонайменше два пристрої з підтримкою VLAN (оскільки будь-який маршрут потребує щонайменше двох точок). Це можуть бути маршрутизатори з відповідними можливостями, будь-який пристрій з OpenWrt, а також повноцінний ПК або одноплатний комп’ютер (Windows, macOS, Linux і BSD підтримують VLAN).
OpenWrt підтримує стандарти VLAN: IEEE 802.1Q і IEEE 802.1ad.
Багато пристроїв з декількома портами містять комутатор з підтримкою VLAN (наприклад, усі маршрутизатори з WAN-портом). Пристрої з одним портом або ті, де для кожного порту використовується окремий Ethernet-контролер (наприклад, плати PCEngines або більшість звичайного комп’ютерного обладнання), керують VLAN через драйвери ОС.
Комутатор з підтримкою VLAN — це вбудована версія окремого пристрою під назвою “керований комутатор” (“managed switch”). Він підключений до внутрішнього інтерфейсу “ethernet” пристрою і працює переважно незалежно від основного процесора.
Він може призначати порти до однієї VLAN (і тоді порти зможуть взаємодіяти між собою), просто встановивши відповідні VLAN ID на портах (з правильним налаштуванням, описаним нижче), і це працює незалежно від того, чи трафік доступається процесора маршрутизатора. Але щоб сам маршрутизатор був у мережі, принаймні одна VLAN має мвти доступ до CPU.
Пристрій із програмною підтримкою VLAN — це просто пристрій із багатьма ethernet-контролерами. Щоб помістити два інтерфейси в одну VLAN і забезпечити між ними маршрутизацію, їх потрібно об’єднати в міст (bridge), тобто помістити в один інтерфейс, наприклад lan, wan тощо.
Якщо у вас є запитання, ви можете обговорити цю інструкцію на форумі OpenWrt: https://forum.openwrt.org/t/vlan-assigning
VLAN пояснено на прикладі типової конфігурації OpenWrt
Дуже поширене типове налаштування VLAN на багатьох комерційних маршрутизаторах — це розділення LAN↔WAN.
Типова конфігурація OpenWrt на таких пристроях зазвичай відображає заводські налаштування. Більшість таких маршрутизаторів має лише один мережевий інтерфейс (eth0), підключений до 5-портового комутатора з підтримкою VLAN, який віртуально поділяється на мережі LAN і WAN за допомогою VLAN:
VLAN ID |
Вгору: |
Вниз: |
||||
Local | LAN 1 | LAN 2 | LAN 3 | LAN 4 | WAN | |
1 | true | untagged | untagged | untagged | untagged | off |
2 | true | off | off | off | off | untagged |
У цьому прикладі VLAN ID портів LAN — це 1, а VLAN ID порту WAN — це 2.
Зверніть увагу, що терміни “вхідний”, “вихідний” та подібні стосуються трафіку, який надходить до фізичних портів комутатора (або внутрішнього порту CPU), а не трафіку, який вже обробляється комутатором.
- Tagged на “CPU (eth0)” означає, що обидва VLAN ID (1 і 2) надсилаються до процесора маршрутизатора як “теговані дані”. Пам’ятайте: лише VLAN-сумісні пристрої можуть обробляти тегований трафік.
- Untagged означає, що на цих портах комутатор приймає лише трафік без тегів VLAN (звичайний Ethernet-трафік). Комутатор видалятиме VLAN-теги на виході. Кожен порт може бути untagged лише для одного VLAN ID.
- Off означає, що порт не бере участі у цій VLAN і не пропускає трафік до/з неї.
Tagged-порти використовуються для передачі трафіку кількох VLAN, untagged — лише для однієї. Зазвичай tagged-порти з'єднують комутатори, а untagged — з кінцевими пристроями.
CPU маршрутизатора використовує VLAN-теги, щоб визначити, чи трафік прийшов із VLAN 1 (LAN) або VLAN 2 (WAN), і діє відповідно. У типовій конфігурації CPU працює лише з “тегованим” трафіком, бо це єдиний спосіб відрізнити VLAN. VLAN обробляється драйвером інтерфейсу CPU, оскільки це пристрій з одним портом.
Зверніть увагу, що VLAN ID для WAN і LAN не перетинаються в зовнішніх портах. Щоб трафік пройшов між WAN і LAN, він має пройти через CPU на eth0 (де маршрутизатор і брандмауер можуть його фільтрувати). Але, як зазначено вище, можна створити VLAN, які повністю оминають CPU.
Чи є у вашому пристрої апаратний комутатор із підтримкою VLAN?
Щоб з’ясувати, чи порти пристрою OpenWrt — це окремі мережеві інтерфейси, чи це один інтерфейс, підключений до комутатора:
- Перевірте технічну сторінку OpenWrt для вашого маршрутизатора.
- Запустіть цю команду через SSH:
ls -l /sys/class/net
.
Новіші пристрої з вбудованими комутаторами (наприклад, Netgear R7800) використовують драйвер DSA, який створює окремий мережевий інтерфейс для кожного порту комутатора, ніби комутатора не існує взагалі.
Більшість пристроїв, підтримуваних OpenWrt, можуть використовувати драйвер DSA, але ще не всі були перенесені на нього, оскільки це суттєво змінює конфігурацію і може зламати користувацькі налаштування.
Приклад: ALIX.2D13 має 3 реальних мережевих інтерфейси: eth0, eth1 та eth2. Кожен з них підключений до окремого фізичного порту. Для VLAN необхідно використовувати налаштування через ОС:
# ls -l /sys/class/net ... lrwxrwxrwx 1 root root 0 Jul 25 14:10 eth0 -> ../../devices/pci0000:00/0000:00:09.0/net/eth0 lrwxrwxrwx 1 root root 0 Jul 25 14:10 eth1 -> ../../devices/pci0000:00/0000:00:0a.0/net/eth1 lrwxrwxrwx 1 root root 0 Jul 25 14:10 eth2 -> ../../devices/pci0000:00/0000:00:0b.0/net/eth2
Приклад: TP-Link TL-WDR3600 має лише один реальний інтерфейс: eth0. Його 5 фізичних портів підключені до VLAN-комутатора. У цьому прикладі є два віртуальні інтерфейси: eth0.1 і eth0.2, які керуються апаратним комутатором:
# ls -l /sys/class/net ... lrwxrwxrwx 1 root root 0 Jan 1 1970 eth0 -> ../../devices/platform/ag71xx.0/net/eth0 lrwxrwxrwx 1 root root 0 Jul 21 22:13 eth0.1 -> ../../devices/virtual/net/eth0.1 lrwxrwxrwx 1 root root 0 Jul 21 22:13 eth0.2 -> ../../devices/virtual/net/eth0.2
Призначення VLAN ID на обладнанні з підтримкою VLAN-комутатора
Розділ switch
у файлі /etc/config/network
відповідає за поділ вбудованого комутатора на кілька VLAN, які з’являються в системі як окремі інтерфейси, хоча фізично використовують один і той самий комутатор.
Цей розділ може бути відсутнім на деяких платформах (залежить від підтримки конкретного обладнання). Також деякі комутатори підтримують лише 4-бітові VLAN.
Нижче показано типовий приклад конфігурації:
config 'switch' 'eth0' option 'reset' '1' option 'enable_vlan' '1' config 'switch_vlan' 'eth0_1' option 'device' 'eth0' option 'vlan' '1' option 'ports' '0 1 3t 5t' config 'switch_vlan' 'eth0_2' option 'device' 'eth0' option 'vlan' '2' option 'ports' '2 4t 5t' config 'switch_vlan' 'eth0_3' option 'device' 'eth0' option 'vlan' '3' option 'ports' '3t 4t' config 'switch_port' option 'device' 'eth0' option 'port' '3' option 'pvid' '3'
Загальні властивості визначаються в секції switch
; властивості для конкретних VLAN задаються в окремих секціях switch_vlan
, пов’язаних із switch
через опцію device
; специфічні властивості pvid задаються в секціях switch_port
, також пов’язаних через device
.
Порти можуть бути tagged або untagged:
- Tagged порт (до номера додається
t
) — це порт, який додає VLAN ID до пакету при виході та очікує наявність VLAN ID у вхідному пакеті. Такі порти використовуються для підключення до інших пристроїв з підтримкою VLAN. - Untagged порт — видаляє тег VLAN при виході, тобто використовується для звичайних пристроїв, які не підтримують VLAN. Вхідні пакети на такий порт автоматично позначаються значенням
pvid
(портового VLAN ID), яке задається в секціїswitch_port
.
Порт CPU (у нашому прикладі — номер 5
) може бути як tagged, так і untagged, або взагалі не вказаний. Він працює як звичайний порт і може мати тег або ні. Коли комутатор направляє пакет до порту CPU, він потрапляє на відповідний інтерфейс (наприклад, eth0.1
у разі tagged порту), що дозволяє програмну маршрутизацію (наприклад, у WiFi).
У нашому прикладі пакет, що надійшов untagged на порт 0, позначається VLAN ID 1, а потім передається до порту 1 (untagged, тег VLAN видаляється), порту 3 (tagged) та до CPU (tagged) — таким чином, він з’являється на інтерфейсі eth0.1
. Пакет, що надходить на порт 2 із тегом VLAN ID 2, буде переданий до порту 4 (tagged) і CPU (tagged) — він з’явиться на eth0.2
. Коли програма надсилає пакет до eth0.2
, тег VLAN ID 2 додається автоматично, і далі пакет направляється до порту 2 (untagged) і порту 4 (tagged).
Untagged-порт може належати лише до ОДНІЄЇ VLAN
Створення VLAN на рівні драйвера
VLAN на рівні драйвера можна створити в секції interface
, додавши крапку та відповідний VLAN ID після імені інтерфейсу в опції ifname
, наприклад, eth1.2
для VLAN ID 2 на eth1
.
Коли програмна маршрутизація надсилає пакет до такого VLAN, він залишає базовий інтерфейс (eth1
у прикладі) з тегом VLAN і значенням, яке відповідає номеру в назві (2
для eth1.2
).
Якщо вхідний пакет приходить на інтерфейс з підтримкою VLAN (наприклад, eth1
) і має тег VLAN ID, він потрапляє на відповідний VLAN-інтерфейс (наприклад, eth1.2
), якщо такий налаштований. Інакше пакет буде відкинутий. Нетеговані пакети обробляються через основний інтерфейс (eth1
).
Якщо ви об’єднуєте інтерфейси VLAN і non-VLAN (через міст), система сама додає тег VLAN при передачі з non-VLAN до VLAN, і видаляє його у зворотному напрямку.
Інтерфейси VLAN на рівні драйвера можуть налаштовуватися вручну. Якщо цього не зробити, вони створюються автоматично службою netifd. Ручне створення дає більше гнучкості.
Підтримуються такі параметри:
Назва | Тип | Обов'язково | За замовчуванням | Опис |
---|---|---|---|---|
type | Тип VLAN | ні | 802.1q | Тип VLAN: 8021q або 8021ad |
name | Назва інтерфейсу | так | (немає) | Назва інтерфейсу, наприклад, eth0.5 або vlan5 |
ifname | Базовий інтерфейс | так | (немає) | Назва фізичного інтерфейсу, наприклад, eth0 |
vid | VLAN ID | так | (немає) | Ідентифікатор VLAN |
macaddr | MAC-адреса | ні | (немає) | MAC-адреса нового інтерфейсу |
Розглянемо приклад для TP-Link CPE210. Цей пристрій має лише один мережевий інтерфейс, як і більшість зовнішніх пристроїв, але легко розширюється до кількох віртуальних інтерфейсів.
У наведеному прикладі eth0
ділиться на два VLAN-інтерфейси з VLAN ID 106 і 204, з явним ручним налаштуванням:
config device option type '8021q' option ifname 'eth0' option vid '106' option name 'vlan1' config device option type '8021q' option ifname 'eth0' option vid '204' option name 'vlan2' config interface 'lan' option type 'bridge' option ifname 'vlan1' option proto 'static' option ipaddr '192.168.1.1' option netmask '255.255.255.0' config interface 'wan' option ifname 'vlan2' option proto 'dhcp'
Аналогічна конфігурація з використанням скороченого (неявного) синтаксису наведена нижче.
Зверніть увагу: розділи device
відсутні, а VLAN ID і базовий інтерфейс визначаються із значення ifname
:
config interface 'lan' option type 'bridge' option ifname 'eth0.106' option proto 'static' option ipaddr '192.168.1.1' option netmask '255.255.255.0' config interface 'wan' option ifname 'eth0.204' option proto 'dhcp'
Призначення VLAN ID з використанням DSA на пристроях з одним фізичним портом
Еквівалентна конфігурація VLAN з використанням Distributed Switch Architecture (DSA) на простому пристрої з одним фізичним портом (тобто без комутатора).
Щоб бездротові мережі (WLAN) працювали, потрібно об’єднати (bridge) бездротові інтерфейси з відповідними VLAN-інтерфейсами (наприклад, для VLAN 2 — використовується міст із iot
з wlan iot
та інтерфейсом lan.2
).
Повністю робочий приклад файлу /etc/config/network
:
config interface 'loopback' option ifname 'lo' option proto 'static' option ipaddr '127.0.0.1' option netmask '255.0.0.0' config globals 'globals' option packet_steering '1' option ula_prefix 'fdfe:bdca:64ed::/48' config device option name 'br-lan' option type 'bridge' list ports 'lan' config interface 'lan' option device 'br-lan' option proto 'dhcp' config device option name 'br-iot' option type 'bridge' list ports 'lan.2' config interface 'iot' option device 'br-iot' option proto 'none' config device option name 'br-guest' option type 'bridge' list ports 'lan.3' config interface 'guest' option device 'br-guest' option proto 'none'
Вивід команди ``brctl show``:
bridge name bridge id STP enabled interfaces br-lan 7fff.74acb915ff33 no lan wlan0 wlan1 br-guest 7fff.74acb915ff33 no lan.3 br-iot 7fff.74acb915ff33 no wlan0-1 lan.2 wlan1-1
Примітка: Перед зміною конфігурації мережі був встановлений пакет ip-full. Втім, немає впевненості, що він обов'язково потрібен — можливо, достатньо ip-tiny.
PS/2: Ця конфігурація передбачає, що інший пристрій у мережі забезпечує DHCP-сервери для кожного сегменту мережі (untagged LAN, а також VLAN 2 та 3 по тому ж фізичному лінку). Конфігурація протестована на Unifi nanoHD.