Розповідається про поділ мережі на підмережі, що дозволяє ефективніше управляти користувачами та серверами. Вона включає опис VLAN (віртуальних локальних мереж) та масок підмереж, які визначають границі цих підмереж. Також обговорюється роль маршрутизаторів у з’єднанні підмереж та важливість поділу для адміністрування мереж та безпеки.
Уявимо, що у нас в мережі є 2 VLAN-а – VLAN 1 для користувачів та VLAN 2 для серверів. Пристрої в одній лані можуть бачити один одного безпосередньо, використовуючи лише свити для з’єднання. Можна навіть без свитчів, просто з’єднавши два комп’ютери патч-кордом. Але мало бачити один одного – треба, щоб і адреси були в одній підмережі – скажімо, 10.0.1.0/24. У користувачів IP адреси знаходяться в підмережі 10.0.1.0 і можуть змінюватись від 10.0.1.1 до 10.0.1.254. У серверів все те саме, але тільки з приставкою 10.0.2. Вважайте, що VLAN – це фізичні межі, а підмережі – логічні. Але чим взагалі зумовлені логічні межі, чому саме від 10.0.1.1 до 10.0.1.254?
Вся справа в масці підмережі, в тому самому /24, який ми вказуємо після адреси. В ipv4 все зводиться до 4 байтів, для IP адреси є 4 байти і для маски є 4 байти. Кожен байт складається з 8 біт яких можна вмістити 256 значень – від 0 до 255. Скажімо, в масці /24 – який інакше буде 255.255.255.0 – повністю забиті перші 3 октета, тобто. перші 3 байти, але останній байт повністю вільний. А отже, він може прийняти 256 значень. Це й каже нам, які адреси можуть бути використані у цій підмережі. Правда адреса 0 виділяється як адреса мережі, а адреса 255 – як адреса броадкаста. Скажімо, якщо надіслати якийсь пакет на адресу 10.0.1.255 – цей пакет прийде всім хостам, у яких адреса в підмережі 10.0.1.0/24.
Наприклад візьмемо іншу маску – /25. У такому разі в останньому октеті забивається перший біт, тому кількість варіацій скорочується вдвічі – залишається лише 128 адрес. В результаті адреси будуть від 0 до 127, при цьому 0 залишиться адресою мережі, а broadcast адресою стане 127. Пристроям можна буде призначити адреси від 1 до 126.
При цьому через те, що ми поділили мережу навпіл, з’являється друга мережа – вона починається від 10.0.1.128 до 10.0.1.255. Ну і IP адреси будуть варіюватися від 129 до 254.
За тією ж логікою /26 – тепер у нас вільними залишаться 64 адреси.
І таким чином з’являться 4 мережі по 64 адреси, та й природно не забувайте про адресу мережі та броадкаст, через що -2 адреси.
Якщо ви орендуєте у провайдера одну публічну адресу, дуже часто провайдер виділяє вам разом з адресою маску /30 – в таку сітку входить 4 адреси. Забираємо -2 – виходить дві адреси. Одна адреса буде адресою вашого роутера, а друга адресою роутера провайдера. Просто провайдер не хоче садити всіх клієнтів в одну мережу, оскільки це не дуже безпечно. Але при цьому не може заради вас одного виділити цілих 254 публічні адреси. Тому й потрібна така сегментація – коли адрес мало, але вам потрібно якось ділити їх.
Якщо у вас у компанії не десятки тисяч пристроїв, то часто можна не морочитися з масками – адрес для локальних мереж величезна кількість, тому на кожну мережу можна вішати маску /24. Хоча іноді доводиться ділити підсіти, тобто. робити з однієї великої підмережі кілька невеликих.
Але зазвичай підрахунки підмереж, масок та адрес це завдання мережного адміністратора, проте системний адміністратор повинен мати про це уявлення. Щоб хоча б розуміти, що виставляючи таку маску, такі хости будуть з ним в одній підмережі, а такі в іншій. Загалом непогано б вміти це робити просто побачивши маску, але це приходить із досвідом. У будь-якому випадку, в інтернеті є величезна кількість калькуляторів підмереж – просто погуглить subnet calculator. Вони дозволять вам зрозуміти, яку маску потрібно виставляти, чи які хости входять у вашу підсіть.
А бачачи хто входить у вашу підмережу, ви розумієте, хто до неї не входить. І хоча ми відокремлюємо, ізолюємо підмережі – ми все ж таки хочемо, щоб хости могли спілкуватися. Відокремлюючи користувачів від серверів, нам все одно потрібно, щоб користувачі могли звертатися до серверів.
І для цього нам потрібний пристрій, який буде одночасно і в першій мережі, і в другій. Якщо кожна підсіти ця кімната, то потрібні двері, які є одночасно в обох кімнатах. І цими дверима виступає маршрутизатор, чи інакше його називають роутер. Основне завдання роутера – перенаправляти пакети з однієї підмережі до іншої. Тобто. роутер мешкає на 3 рівні моделі OSI – мережевому.
Скажімо, alma1 хоче звернутися до alma3. Для цього alma1 повинна розуміти, що шлях alma3 веде через router. А роутер у своїй повинен мати адресу як у мережі 10.0.1.0, і у мережі 10.0.2.0. Тобто. Світчі з’єднують пристрої в рамках однієї підмережі, а роутери з’єднують різні підмережі, формуючи цілу мережу. А з’єднуючи одні роутери з іншими, ми зв’язуємо мережі і в результаті це все формує цілий інтернет.
З домашніми роутерами ви всі знайомі – невелика коробочка, в якій як мінімум 2 порти – один йде до провайдера, а другий до вашої локальної мережі.
Звичайно, в середніх і великих компаніях багато трафіку і такої коробочки недостатньо, тому використовуються роутери серйозніші, які можуть передавати десятки і сотні гігабіт на секунду, при цьому їх можна монтувати в річки.
Можливо, ви запитали себе – а навіщо нам потрібно відокремлювати мережі, якщо в результаті ми їх з’єднуємо через роутери? В чому сенс?
Якби роутер був лише роутером, то сенсу справді було б мало. Не те щоб зовсім не було, як мінімум через роутер не ходить l2 broadcast трафік, і тому він не ходив би від мільярдів пристроїв і не перенавантажував би всі світчи у світі. У сучасному світі сенсу від чистого роутера немає – недостатньо просто пропускати трафік, треба його ще перевіряти. Так, ми хочемо, щоб користувачі могли звертатися до серверів, але не всім і не за будь-яким протоколом. Не кожному користувачеві потрібний доступ на сервер по ssh, зазвичай вистачає доступу по HTTPS. Та й мало кому з користувачів необхідно безпосередньо на сервер з базою даних.
Тому на роутерах майже завжди є мережевий firewall. Він не просто пропускає весь трафік, а й перевіряє – а чи можна комп’ютеру 1 доступ до сервера 1? Якщо ні – цей пакет блокується. Але недостатньо просто перевірити доступ від одного IP до іншого – може ми хочемо дозволити доступ по 80, але блокувати по 22 порту? Значить через файрвол роутер повинен вийти за рамки l3 – і, як мінімум, мислити на 4 рівні – транспортному, який відповідає за порти.
Але для сучасних роутерів цього навіть недостатньо. Так, ми хочемо, щоб користувач міг заходити на сервер по 80 порту, але мало що там користувач робить? А раптом він намагається використати якусь вразливість веб-сервера? Чи, скажімо, ми дозволяємо нашому користувачеві доступ до інтернету, але не хочемо, щоб він заходив на якісь небезпечні сайти? Просто давши йому доступ по 80 і 443 порту, ми ніяк не перевіримо, на який саме сайт він заходить.
Тому прості мережеві файрволи також давно втратили сенс, замість них використовуються так звані UTM – це одночасно і роутер, і мережевий файрвол, і сервер VPN, і антивірус, і у нього є купа інших примочок щодо безпеки. Цей пристрій діє на всіх рівнях мережі для комплексного захисту інфраструктури. Природно, такі рішення коштують набагато дорожче за звичайні роутери. Але якщо вже ми взялися пов’язувати те, що ізолювали – то і цей зв’язок має бути безпечним. Однак які б багатофункціональні не були сучасні рішення, основи маршрутизації залишилися ті самі, все інше це примочки.
Тому спочатку треба розібратися з роутингом. Чимало сучасних роутерів засновані на Linux, та й ми зробимо так само. Нехай alma2 буде нашим роутером.
При цьому для автентичності змінимо його іконку на роутер. Для цього правою кнопкою миші натисніть на alma2 і оберіть «Change symbol».
Розкрийте Classic та в полі Filter напишіть router. Виберіть вказаний символ та натисніть Apply.
Тепер у alma2 символ роутера. Залишилося його зробити.
Але спочатку треба підготувати мережу на хостах. Минулого разу на всіх 3 хостах ми додали всі 3 влана, тому хости будуть бачити один одного прямо:
nmcli con sh
Нам же треба, щоб хост 1 був тільки в першій лані – для цього видаляємо влан 2 з першого хоста:
nmcli con del vlan2
nmcli con sh
На alma3 не все так просто:
nmcli con sh
Ми не можемо просто видалити тимінг інтерфейс, від цього другий лан перестане працювати. Тому треба видалити адресу на тимінг інтерфейсі:
nmcli con mod teams3s8 ipv4.method disabled -ipv4.address 10.0.1.3/24 ipv6.method disabled
При цьому відключивши отримання IP-адреси і на IPv4, і на IPv6, інакше NetworkManager перевантажуватиме інтерфейс. Після чого потрібно застосувати налаштування на інтерфейсі та переконатися, що все спрацювало:
nmcli con up teams3s8
ip a show myteam
Так, тепер alma1 не зможе звернутися до alma3 безпосередньо, оскільки на alma1 немає мережі 10.0.2.0, а alma3 теж зможе відповісти безпосередньо, оскільки вона немає мережі 10.0.1.0. Їм доведеться спілкуватися через роутер.
Для початку переконаємося, що alma2 бачить перший хост по мережі 1.0:
ping 10.0.1.1
та третій по мережі 2.0:
ping 10.0.2.3
Все пінгується, отже мережа готова.
Далі ми маємо на рівні ядра включити маршрутизацію. Це можна зробити тимчасово, але краще відразу збережемо це в налаштуваннях. Для цього потрібно у файлі /etc/sysctl.conf додати рядок net.ipv4.ip_forward=1:
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
Після чого для застосування налаштувань використовуємо sysctl з опцією -p:
sysctl -p
Якщо все нормально – ви побачите параметр із новим значенням. А щоб у будь-який момент перевірити, чи ця опція включена, можна просто вказати її з sysctl:
sysctl net.ipv4.ip_forward
І тепер alma2 перенаправлятиме пакети з одного інтерфейсу на інший.
Але цього не достатньо. Якщо ми спробуємо з alma1 пінганути 10.0.2.3:
ping 10.0.2.3
ми побачимо помилку – network is unreachable. Просто alma1 взагалі без поняття, як достукатися до цієї адреси. Щоб це зрозуміти, подивимося таблицю маршрутизації:
ip ro sh
Як бачите, alma1 знає лише про мережі 10.0.1.0 та 10.0.3.0.
Тобто. ми їй повинні вказати, що шлях до адреси 10.0.2.3 лежить через альму2, причому через ту адресу, яка нам доступна:
ip route add 10.0.2.3 via 10.0.1.2
ip ro sh
Як бачите, у нас з’явився ще один маршрут. Спробуємо пінганути?
ping 10.0.2.3
І нічого немає відповіді. Чи є ідеї, чому так? Спробуємо розібратися.
Для цього стартуємо пінг та йдемо на alma2, де запускаємо tcpdump:
tcpdump
І так, у висновку бачимо, що пакети від alma1 все-таки доходять до alma2. Більше того, вони перенаправляються на alma3. Але ми не бачимо, щоб alma3 надсилала відповідь – усі пакети виходять виключно від alma1. Якщо відповіді немає – значить або alma3 не хоче відповідати, або не знає куди.
Дивимося таблицю маршрутизації на alma3:
ip ro sh
alma3 без поняття, як відповісти alma1. Давайте додамо маршрут, але, цього разу, не на один конкретний хост, а на цілу мережу:
ip ro add 10.0.1.0/24 via 10.0.2.2
ip ro sh
Тепер alma3 на будь-яку з адрес мережі 10.0.1.0 буде направляти пакет через 10.0.2.2.
І тепер при спробі пінгу:
ping 10.0.1.1
все працює.
А у tcpdump видно, що пакети йдуть в обох напрямках.
Але це у нас дві підмережі. А якщо їх 5? 10? 100? Скільки підмереж в інтернеті? Хіба ми можемо прописати кожну підсітку у світі? Ні звичайно! Натомість ми використовуємо спеціальний маршрут, званий шлюзом або gateway, або default gateway. Коли комп’ютеру треба звернутися до мережі, куди він не знає маршруту, все посилає в гейтвей. Ми можемо на хостах замість всіх маршрутів зазначити, що гейтвєєм є alma2. І не потрібно буде вказувати, в які мережі цей гейтвей веде – просто всі невідомі мережі за замовчуванням будуть надсилатися на alma2.
Для цього на першій альмі видалимо маршрут, що веде до третього хосту:
ip ro sh
ip ro del 10.0.2.3 via 10.0.1.2
Після чого додамо дефолтний маршрут:
ip ro add default via 10.0.1.2
ip ro sh
Як бачите, з’явився напис default.
На альмі 3 також видаляємо доданий маршрут:
ip ro sh
ip ro del 10.0.1.0/24 via 10.0.2.2
Після чого додаємо gateway. Гейтвей можна вказувати і у вигляді спеціальної IP-адреси:
ip ro add 0.0.0.0/0 via 10.0.2.2
ip ro sh
Це означає будь-яку адресу в будь-якій підмережі.
Ну і для перевірки запустимо пінг:
ping 10.0.1.1
Як видно все працює.
Маршрутів і роутерів, які ведуть до тих самих хостів може бути кілька. Але пріоритет у тих маршрутів, які точніші. Тобто. умовно, якщо маршрут через роутер 1 до конкретного хосту, через роутер 2 до цілої підмережі, а роутер 3 вкажу як гейтвей, то звертаючись до хоста буде використовуватися маршрут через роутер 2.
Тепер підключимо нашу схему до інтернету. Для цього натисніть GNS на іконку монітора в лівій панелі, виберіть Cloud і перетягніть в центр.
Потім підключіть хмару до роутера за допомогою кабелю. Хмара представляє ваш комп’ютер, і як ми в VirtualBox вибирали адаптер для мережного моста, також і тут потрібно вибрати адаптер комп’ютера, підключений до мережі. З боку alma2 виберіть 3 порти.
У результаті у вас вийде така схема. Тут у нас локальна мережа, що складається із 3 віртуалок. Одна з віртуалок виступає роутером і буде підключена до локальної мережі всередині GNS, так і до домашньої мережі.
Оскільки на alma2 ми підключили провід до третього порту, то підніметься інтерфейс enp0s9:
ip a show enp0s9
Нам у NetworkManager треба буде створити новий профіль:
nmcli con add type ethernet con-name internet ifname enp0s9
nmcli con sh
Типом вибираємо ethernet, тому що це не vlan і не тимінг інтерфейс, а як інтерфейс вказуємо enp0s9. IP адресу вказувати не потрібно, тому що наш домашній роутер по DHCP дасть йому адресу:
ip a show enp0s9
При цьому DHCP ми отримуємо також default gateway:
ip ro sh
Ним виступає наш домашній роутер. Ну і давайте переконаємося, що інтернет доступний, пінганем 1.1.1.1 та ya.ru:
ping 1.1.1.1
ping ya.ru
Все пінгується.
Тепер поправимо маршрути на alma1 і alma3. Ми їх прописували за допомогою команди ip, а отже, ці налаштування злетять. Нам же потрібно вказати gateway у профілі NetworkManager-а:
nmcli con mod teams3s8 ipv4.gateway 10.0.1.2
Після чого знову підняти профіль і перевірити:
nmcli con up teams3s8
ip ro sh
Теж саме проробляємо на alma3, змінюємо профіль:
nmcli con mod vlan2 ipv4.gateway 10.0.2.2
Потім піднімаємо інтерфейс та перевіряємо маршрути:
nmcli con up vlan2
ip ro sh
Все як ми хотіли.
Як вважаєте, інтернет запрацює на цих хостах? Давайте перевіримо:
ping 1.1.1.1
Як бачите, не пінгується. При цьому немає помилки network unreachable – у нас є gateway, а значить ми знаємо, куди звертатися, за ким шукати цю адресу. Але чому тоді не пінгується?
Пам’ятаєте проблему, коли ми спочатку намагалися з alma1 пингати alma3? Давайте запустимо пінг і подивимося tcpdump на alma2:
tcpdump
Помилка нічого не нагадує? Пакет йде від хоста 3 до 1.1.1.1, але відповідей немає. З чим це пов’язано минулого разу? Правильно, інший хост не знав зворотний маршрут, нам потрібно було на alma3 прописати маршрут до alma1.
Але чи можемо ми на сервері 1.1.1.1 прописати маршрут до нашої віртуалки? Звичайно ні, між нашою віртуалкою та цим сервером десяток різних роутерів, які стоять у різних провайдерів. Кожен з цих провайдерів може мати свою мережу з адресою 10.0.2.3, тому що це адреса, виділена для приватного використання. А як тоді наш домашній комп’ютер бачить інтернет? Правильно, наш роутер на вихідні пакети вішає свою адресу, замінюючи адресу нашого комп’ютера. І це називається NAT.
І ми за тим же принципом, повинні alma2 на вихідному інтерфейсі застосувати NAT, тобто. замінювати адреси всіх вихідних пакетів на адресу інтерфейсу enp0s9 alma2.
Зазвичай за NAT відповідає firewall:
firewall-cmd --list-all
Наш інтерфейс enp0s9 зараз знаходиться у зоні public. Нам в ідеалі потрібна окрема зона для зовнішньої мережі, щоб вихідні пакети з цієї зони натиснулися. І така зона є – external:
firewall-cmd --list-all --zone=external
Як бачите, у цій зоні опція masquerade має значення yes, а це саме те, що нам потрібно для NAT-а.
Тому все що нам залишається – змінити зону для інтерфейсу enp0s9:
firewall-cmd --change-interface=enp0s9 --zone=external --permanent
Після чого не забудьте перечитати налаштування файрвола і переконатися, що все застосовувалося:
firewall-cmd --reload
firewall-cmd --list-all --zone=external
Як бачите, тепер enp0s9 знаходиться у зоні external.
Перевіримо ping:
ping 1.1.1.1
Пінги йдуть.
У результаті виходить така схема. Коли alma1 намагається звернутися до сервера 1.1.1.1, спочатку вона посилає пакет на alma2, яка натис пакет і відправляє його на мій домашній роутер. Далі мій домашній роутер натисне пакет і відправляє провайдеру. Якщо моєму роутері внутрішню адресу провайдера, тобто. сірий IP, то провайдер сам у свою чергу натиснутий, але якщо провайдер дає мені публічну адресу – то він просто перенаправляє пакет на наступного провайдера, скажімо, державного. І далі по ланцюжку від одного провайдера до іншого пересилається пакет, доки він не доходить до сервера 1.1.1.1. А далі сервер зможе відповісти, бо знає, куди.
Насправді можно було уникнути подвійного використання NAT, якби на домашньому роутері прописав маршрут до внутрішньої мережі мого GNS через alma2. І тоді мій комп’ютер зміг би бачити всі віртуалки, тому що він посилав би всі пакети на мій домашній роутер, той би перенаправляв їх на alma2, а вона б у свою чергу перенаправляла на alma1 і 3.
Але, щоб наша сітка в GNS залишалася в ізольованому вигляді і єдиним способом потрапити до неї була б одна зовнішня адреса alma2.
Підсумовуючи все, що ми сьогодні пройшли:
Перейменуйте alma1 на user1 і залиште на ній тільки влан1 з адресою 1.101.
Перейменуйте alma2 в router1 і поміняйте IP-адреси всіх 3 вланів на 1. Зазвичай в організаціях гейтвеям дають або першу, або останню адресу підмережі.
Перейменуйте alma3 на server1 і залиште на ній лише 2 та 3 влани. Адреси поміняйте на 2.101 та 3.101 відповідно.
І, природно, переконайтеся, що все працює – що всі один одного пінгують різними мережами, і що з усіх хостів пінгуються 1.1.1.1.
Давайте підіб’ємо підсумки. Сьогодні ми з вами розібрали, що таке підмережі, що таке маска підмережі, для чого потрібна маршрутизація, навіщо потрібен gateway і в чому сенс NAT-а. Це, звичайно, основи маршрутизації, але для системного адміністратора цього вистачає для вирішення більшості завдань.