B1. Міст і VLAN руками
Модуль 4 каже, що комутатор вчиться: бачить адресу
відправника кадру й запам’ятовує, з якого порту той прийшов. Модуль 5
додає, що одну фізичну коробку можна розрізати на кілька окремих
широкомовних доменів. У цій роботі ви побудуєте такий комутатор зі
звичайних шматків Linux: міст (bridge), пар veth і простору імен на кожен
хост. Потім спостерігатимете все те, про що говорить теорія: запит ARP, який
долітає лише до «своїх», і таблицю MAC, що наповнюється на очах.
Після цієї роботи ви зможете:
- зібрати міст із кількома портами в окремому просторі імен і під’єднати
до нього хости парами
veth; - увімкнути VLAN-фільтрацію на мосту й налаштувати порти доступу
(
bridge vlan add ... pvid untagged); - показати в
tcpdump, що широкомовний ARP-запит доходить лише до хостів своєї VLAN; - прочитати таблицю MAC (
bridge fdb show) і пояснити, чому в ній один MAC з’являється з номером VLAN; - довести, що хост однієї VLAN не дістає хоста іншої навіть тоді, коли підмережа в нього «правильна».
Так перевіряють мережу, коли «принтер в іншому відділі не бачить сервера»: спершу з’ясовують, в одній вони широкомовній області чи в різних, і вже потім шукають проблему вище.
Завдання
Section titled “Завдання”Результат роботи — п’ять просторів імен і міст у одному з них, за схемою:
| Простір імен | Роль | Адреса | VLAN |
|---|---|---|---|
sw |
комутатор (міст, без IP-адреси) | немає | |
h1 |
хост | 10.0.10.1/24 |
10 |
h2 |
хост | 10.0.10.2/24 |
10 |
h3 |
хост | 10.0.20.1/24 |
20 |
h4 |
хост | 10.0.20.2/24 |
20 |
Назви просторів імен і адреси зафіксовані, їх перевіряє check.sh.
Назви мосту, портів і інтерфейсів у хостах оберіть самі.
Що зробити:
- Створити простори імен і з’єднати кожен хост із
swпароюveth: один кінець у хості, другий уswі підключений до мосту. - Увімкнути на мосту VLAN-фільтрацію й розкласти порти:
h1,h2у VLAN 10,h3,h4у VLAN 20, як порти доступу (кадри хоста без тега потрапляють у свою VLAN і виходять до хоста без тега). - Переконатися, що хости всередині VLAN бачать одне одного.
- Показати в
tcpdumpширокомовний ARP-запит і те, куди він дійшов, а куди ні. - Прочитати таблицю MAC моста й зіставити записи з MAC-адресами хостів.
- Довести, що VLAN не сполучаються: зробити так, щоб для
h1хостh3був «на тому самому дроті», і переконатися, що міст його не пропускає.
Чого робити не треба. Маршрутизація між VLAN (міжVLANний маршрутизатор)
у цю роботу не входить, вона з’явиться в B2.
Тегований транк між комутаторами, STP і агрегація каналів теж не потрібні.
Адреси на самому мості не призначайте: нехай sw буде чистим комутатором.
Обмеження. Тільки ip і bridge з пакета iproute2: без brctl,
без Open vSwitch і без підінтерфейсів ip link add ... type vlan. Суть роботи
в тому, щоб VLAN робив сам міст.
Готово, коли sudo ./check.sh не показує жодного «НІ», а в нотатках
у вас є відповіді на питання з етапів 4, 5 і 6.
Перед початком
Section titled “Перед початком”- Прочитайте в модулі 4 розділ про таблицю комутації й у модулі 5 розділи про VLAN і ARP.
- Встановіть інструменти:
sudo bash setup/provision.sh(потрібніiproute2,tcpdump,python3). - Потрібні права root. Підходить віртуальна машина з
setup/Vagrantfile. У контейнері VLAN-фільтрація на мосту часто вимкнена в ядрі господаря: перевіртеsudo bash setup/probe-net-env.sh, рядок про міст і VLAN. Якщо вона недоступна, для цієї роботи потрібна віртуальна машина. - Працюйте в каталозі
labs/b1-bridge-vlan. Заготовок немає: топологію ви будуєте самі,check.shлише перевіряє.
-
Простори імен і міст.
Terminal window sudo ip netns add swfor h in h1 h2 h3 h4; do sudo ip netns add $h; donesudo ip netns exec sw ip link add br0 type bridgesudo ip netns exec sw ip link set br0 upМіст поки що звичайний: без VLAN-фільтрації він пересилає кадри між усіма портами за таблицею MAC, тобто працює як один великий комутатор.
Перевірте:
sudo ip netns exec sw ip -d link show br0показуєvlan_filtering 0. -
Хости й дроти.
Для кожного хоста потрібна пара
veth. Її можна створити разом з розкладанням кінців по просторах імен:Terminal window sudo ip link add sw-h1 netns sw type veth peer name eth0 netns h1sudo ip netns exec sw ip link set sw-h1 master br0sudo ip netns exec sw ip link set sw-h1 upsudo ip netns exec h1 ip link set lo upsudo ip netns exec h1 ip addr add 10.0.10.1/24 dev eth0sudo ip netns exec h1 ip link set eth0 upПовторіть для
h2,h3іh4зі своїми адресами з таблиці.Перевірте: поки VLAN-фільтрації немає, усі чотири хости бачать одне одного.
sudo ip netns exec h1 ping -c1 10.0.10.2проходить, а от доh3потрібна ще спільна підмережа: додайте наh1тимчасово адресу10.0.20.99/24і пропінгуйте10.0.20.1. Це буде вашою контрольною точкою «до»: міст без VLAN не розрізняє нікого. Тимчасову адресу потім приберіть:ip addr del 10.0.20.99/24 dev eth0. -
VLAN-фільтрація.
Terminal window sudo ip netns exec sw ip link set br0 type bridge vlan_filtering 1sudo ip netns exec sw bridge vlan showТепер кожен порт за замовчуванням належить до VLAN 1 (вона ж
pvidіuntagged). Замініть її на потрібну для кожного порту:Terminal window sudo ip netns exec sw bridge vlan del dev sw-h1 vid 1sudo ip netns exec sw bridge vlan add dev sw-h1 vid 10 pvid untaggedpvidозначає, що кадр без тега, який вхопив порт, отримає цей номер VLAN.untaggedозначає, що на виході з порту тег знімається, тож хосту не доводиться нічого знати про VLAN. Так поводиться порт доступу на справжньому комутаторі.Перевірте:
bridge vlan showуswпоказує портиh1іh2у VLAN 10, аh3іh4у VLAN 20, і жоден порт не сидить у двох. -
ARP і широкомовлення в
tcpdump.Очистіть ARP-таблицю
h1і запустіть захоплення наh2,h3таh4(у трьох вікнах термінала або у фоні):Terminal window sudo ip netns exec h2 tcpdump -ni any -e arpsudo ip netns exec h3 tcpdump -ni any -e arpsudo ip netns exec h4 tcpdump -ni any -e arpПотім з
h1:Terminal window sudo ip netns exec h1 ip neigh flush allsudo ip netns exec h1 ping -c1 10.0.10.2На
h2ви побачите запитwho-has 10.0.10.2 tell 10.0.10.1на адресуff:ff:ff:ff:ff:ffі відповідь на нього. Наh3іh4нічого. Це і є межа широкомовного домену.Запишіть: чому запит ішов широкомовно, а відповідь одноадресно? Звідки
h2знає MAC-адресуh1, щоб відповісти саме їй? -
Таблиця MAC.
Terminal window sudo ip netns exec sw bridge fdb showСеред рядків знайдіть записи з MAC-адресами хостів.
ip -o linkу кожному хості покаже його адресу. Запис виглядає приблизно так:9e:3a:b5:e0:d1:1c dev sw-h1 vlan 10 master br0Звіртеся: у кожного з чотирьох хостів є запис із його VLAN. Виміряйте, як швидко запис зникає:
cat /sys/class/net/br0/bridge/ageing_timeуswпоказує час життя в сотих частках секунди.Запишіть: чому до першого пакета таблиця порожня і що міст робить з кадром, адреси одержувача якого він ще не знає?
-
Ізоляція.
У різних підмережах
h1іh3не пінгуються й без VLAN, бо в них немає маршруту. Тож щоб перевірити саме канальний рівень, зробіть так, щоб вони були в одній підмережі. Тимчасово додайтеh1адресу з підмережі VLAN 20:Terminal window sudo ip netns exec h1 ip addr add 10.0.20.99/24 dev eth0sudo ip netns exec h1 ping -c2 -W1 10.0.20.1Пінг не проходить, а
tcpdumpнаh3не бачить навіть запиту ARP: кадр застряг у VLAN 10. Порівняйте з етапом 2, коли той самий експеримент проходив. Приберіть адресу.Запишіть: чому роздати різні підмережі недостатньо для ізоляції і чим VLAN відрізняється від просто двох підмереж на одному мосту?
Перевірка
Section titled “Перевірка”sudo ./check.shСкрипт нічого не будує. Він знаходить хост за адресою, а міст за типом, тож назви інтерфейсів і мосту можуть бути будь-якими. Перевіряється:
- адреси на чотирьох хостах;
- що в
swє міст із щонайменше чотирма портами, на ньому ввімкнено VLAN-фільтрацію, а вbridge vlan showє по два порти у VLAN 10 і 20; - що хости в межах VLAN пінгують одне одного;
- що ізоляція працює на канальному рівні: скрипт на кілька секунд
додає
h1адресу з підмережі VLAN 20 (і навпакиh3), перевіряє, що ARP не проходить, і забирає адреси назад; - що широкомовний ARP-запит
h1доходить доh2, але не доh3іh4(черезtcpdump); - що в таблиці MAC є всі чотири хости, кожен зі своїм номером VLAN.
Приклад розбору: якщо ви забули прибрати VLAN 1 з портів, але pvid виставили
правильно, перевірка пройде. Кадри без тега однаково потраплять у VLAN 10
або 20, а VLAN 1 лишиться порожньою. Якщо ж VLAN-фільтрацію не ввімкнули,
впадуть саме перевірки ізоляції й широкомовлення: міст перешле ARP усім.
Часті помилки
Section titled “Часті помилки”vlan_filtering не ввімкнено. bridge vlan add у такому разі може
виконатися без помилок, але міст ігнорує номери VLAN і працює як
звичайний. Перевірте ip -d link show <міст>.
Порт залишився у VLAN 1. Порт, який ви додали у VLAN 10 без pvid,
не прийматиме кадрів від хоста без тега: вони потраплять у pvid, а це
досі VLAN 1. Симптом: хост пінгує «в нікуди». pvid untagged потрібні обидва.
Інтерфейс хоста не піднято. Створений veth у стані DOWN, і в
хості, і в мосту. Піднімайте обидва кінці, включно з lo.
Перевірка ізоляції нібито проходить. Якщо ви пінгуєте h3 з h1
без спільної підмережі, пінг не проходить з іншої причини: немає
маршруту. Перевіряти треба саме канальний рівень, як в етапі 6.
Старий ARP-кеш. Хост пам’ятає відповідь хвилину-дві. Якщо після
переналаштування поведінка не змінилась, зробіть ip neigh flush all
у хості.
Далі, якщо цікаво
Section titled “Далі, якщо цікаво”Додайте тегований порт (bridge vlan add dev <порт> vid 10 без
pvid untagged) і підключіть до нього п’ятий хост з інтерфейсом
ip link add link eth0 name eth0.10 type vlan id 10: так виглядає
транк між комутаторами. Спробуйте також вимкнути навчання MAC на порту
(bridge link set dev <порт> learning off) і подивіться, як комутатор
перетворюється на концентратор для одержувачів, яких не знає.