Статьи

Як працюють мережі: що таке свитч, роутер, DNS, DHCP, NAT, VPN і ще з десяток необхідних речей

  1. Мережева модель OSI
  2. Фізичний рівень (physical layer)
  3. Канальний рівень (data link layer)
  4. Мережевий рівень (network layer)
  5. ARP
  6. DHCP
  7. А де зберігаються настройки сполук?
  8. DNS
  9. виртуалки
  10. NAT
  11. tcpdump
  12. VPN
  13. Для самостійного вивчення
  14. Що далі?
  15. додаткове читання

Тема мереж, на жаль, досить нудна для більшості наших колег. Всіма основними задіяним технологіям, протоколам і кращим практикам вже кілька десятків років, вони давно оточують нас і забезпечують взаємодію мільярдів пристроїв навколо. Навіть програмісти найчастіше сприймають мережу як даність і не замислюються про те, як же вона працює.

Часто буває у наших колег: начебто слова IP і DNS використовують кожен день, а розуміння як це все працює немає, і як це все помацати наживо теж незрозуміло. Таке ставлення не тільки некоректно, але і шкідливо для кар'єри будь-якого поважаючого себе інженера з IT. Скільки б JS-фреймворків ти не вивчив, не повідомляючи основ мереж тебе ніхто всерйоз не сприйматиме. Жодна частина інфраструктури не повинна залишатися чорної коробкою ні для розробників, ні для адміністраторів, ні вже тим більше для тебе, майбутнього DevOps інженера.

Метою цієї статті не є дати вичерпне керівництво по мережах. Усередині самої статті і в її кінці я приведу безліч посилань на ресурси, які допоможуть тобі поглибити отримані знання. Не лінуйся і клацай по всіх посиланнях і читай їх все.

У цьому ж тексті ми сфокусуємось на структурі мережі, основних її компонентах і розглянемо як вони використовуються на практиці за допомогою вже освоєних нами в предущей статті віртуальних машин і libvirt / KVM зокрема.

Мережева модель OSI

В першу чергу нам потрібно познайомитися з мережевий моделлю OSI . Ця модель стандартизує взаємодія мережевих протоколів.

OSI ділить комунікацію на 7 шарів, на кожному шарі є свої протоколи. Ти часто почуєш речі в дусі "це відбувається Layer 3". Ось ці шари:

  1. Фізичний рівень (physical layer)
  2. Канальний уровень (data link layer)
  3. Мережевий рівень (network layer)
  4. Транспортний рівень (transport layer)
  5. Сеансовий рівень (session layer)
  6. Представницький рівень або рівень представлення (presentation layer)
  7. Прикладний рівень (application layer)
Фізичний рівень (physical layer)

Протоколи цього рівня відповідають за зв'язок між залозками на найнижчому рівні. Безпосередня передача даних по дротах (і без проводів) описується як раз на фізичному рівні. Приклади протоколів: Wi-Fi, Bluetooth, DSL.

Канальний рівень (data link layer)

Канальний рівень відповідає за передачу даних між пристроями однієї мережі. Дані передаються у вигляді кадрів (frames), в кадрі вказано фізичну адресу одержувача і відправника. Ця електронна адреса називається MAC-адресу.

Хто ж виступає в ролі я відправника і одержувача?

По-перше, у кожної машини (включаючи твій ноут) є NIC - Network Interface Controller. Це залізяка (або віртуальна залізяка), яка відповідає за передачу і прийом кадрів . У NIC є MAC-адреса - унікальна адреса, який зазвичай прошитий в залізці, або ж генерується системою віртуалізації.

Само собою, у машини може бути кілька NIC. Побачимо інтерфейси за допомогою команди ip:

[Root @ localhost ~] $ ip link show 1: lo: <LOOPBACK, UP, LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT link / loopback 00: 00: 00: 00: 00: 00 brd 00:00:00: 00:00:00 2: eth0: <BROADCAST, MULTICAST, UP, LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link / ether 52: 54: 00: 05: 36: e6 brd ff: ff: ff: ff : ff: ff

В даному випадку, інтерфейс, що використовується для зв'язку із зовнішнім світом по мережі, - це eth0, що володіє MAC-адресою 52: 54: 00: 05: 36: e6. Але що таке lo?

lo - це loopback device, спеціальний віртуальний інтерфейс, який система використовує, щоб спілкуватися самої з собою. Завдяки lo навіть без підключення до мережі локальні додатки можуть взаємодіяти один з одним.

Ти вже помітив, що з твого комп'ютера не вилазять мільярди проводів, безпосередньо підключені до всіх інших комп'ютерів світу. Для організації мережі потрібні додаткові пристрої.

Наприклад, свитч (switch).

Свитч - це такий пристрій, який формує мережу, і в який підключаються наші машинки через порти. Завдання світча L2 (є ще більш просунуті, що відносяться до L3 і навіть до L7) - перенаправляти кадри від MAC відправника до MAC одержувача. Безліч машин, підключених до одного свитчу формують локальну мережу (LAN) .

Безліч машин, підключених до одного свитчу формують   локальну мережу (LAN)

Звичайно, пачка серверів підключених до одного свитчу - це вельми тривіальний спосіб створити мережу. А що якщо ми хочемо об'єднати в одну мережу сервера, що знаходяться в різних фізичних локаціях? Або, наприклад, хочемо логічно розділити сервера підключені до одного свитчу в одній локації в різні мережі?

Для таких випадків створюють VLAN (віртуальну локальну мережу), яку можна реалізувати, наприклад, за допомогою світча. Працює це досить просто: до кадрів додається додатковий заголовок з VLAN-тегом, за яким і визначається до якої мережі належить кадр.

Інший пристрій - міст (bridge). Міст L2 використовують щоб об'єднати дві мережі, сформовані за допомогою світчей, приблизно таким чином:

І свитчи і мости (а ще хаби (hub), про які почитай сам) допомагають об'єднати кілька машин в одну мережу. А є ще маршрутизатори (або роутери, routers), які з'єднують мережі між собою і працюють вже на L3. Наприклад, твій Wi-Fi роутер з'єднує твою локальну мережу (в якій знаходяться твій ноутбук, телефон і планшет) з Інтернетом.

Крім LAN поділяють ще кілька типів мереж. наприклад, WAN . Інтернет можна вважати за WAN, за тим винятком, що Інтернет повністю стирає географічні кордони мережі.

Як я вже згадав, є ще свитчи L3, які можуть не просто перенаправляти кадри від одного пристрою до іншого, а й мають більш просунутими фішками, типу маршрутизації. Чим же відрізняється роутер від світча L3, запитаєш ти? Тут все складно (і нудно), але якщо тобі цікаво, то прочитай статтю Layer 3 Switches compared to Routers

Мережевий рівень (network layer)

На третьому, мережевому рівні використовуються не MAC, а IP адреси. Подивимося IP адресу нашої машини при допомогою тієї ж самої команди ip:

[Root @ localhost ~] $ ip addr show 1: lo: <LOOPBACK, UP, LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link / loopback 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 :: 1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST, MULTICAST, UP, LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link / ether 52: 54: 00: 05: 36: e6 brd ff: ff: ff: ff: ff: ff inet 192.168.122.212/24 brd 192.168.122.255 scope global dynamic eth0 valid_lft 2930sec preferred_lft 2930sec inet6 fe80 :: 5054: ff : fe05: 36e6 / 64 scope link valid_lft forever preferred_lft forever

Інтерфейсу eth0 присвоєно адресу 192.168.122.212/24.

Але що таке / 24? І чому у loopback інтерфейсу варто / 8? Ти вже, напевно, чув, що всього існує 4 294 967 296 IPv4 адрес. Інтернет - це не одна велика мережа, а багато мереж поменше. При цьому для окремих типів мереж (наприклад, приватних, недоступних ззовні мереж) виділені окремі блоки IP адрес .

IPv6 адрес значно більше. Але повний перехід IPv6 ще не стався :-)

CIDR - це метод виділення блоків адрес окремих мережах. А CIDR-нотація - це спосіб описати цей блок у вигляді 192.168.122.212/24, де число / 24, зване маскою, як раз і дозволяє зрозуміти, скільки адрес входить в цей блок.

IPv4 - це просте число довжиною 32 біта, яке можна уявити в двійковому вигляді. У двійковій формі IP адреси йдуть від 00000000000000000000000000000000 до 11111111111111111111111111111111. Для зручності розіб'ємо це число на 4 частини по 8 цифр: 11111111.11111111.11111111.11111111. У звичній нам десятеричной системі ця адреса виглядає так: 255.255.255.255.

Маска / 24 може бути представлена ​​як 255.255.255.0, або, в двійковій системі, 11111111.11111111.11111111.00000000. Щоб знайти перший і останній адреси сіті ми можемо використовувати одну з адрес і маску мережі, застосувавши логічне побітовое І на їх двійковому поданні:

11000000.10101000.01111010.11010100 & 11111111.11111111.11111111.00000000 = 11000000.10101000.01111010.00000000

І переведемо результат в людино-читану форму: 192.168.122.0 - початковий адресу нашої мережі. Щоб підрахувати число доступних адрес, потрібно порахувати число нулів в масці. У нашому випадку нулів, або розрядів, 8. Кожен може приймати значення 1 або 0, тому в сумі отримуємо 2 ^ 8 ступеня, або 256 адрес. Значить, остання адреса мережі буде дорівнює 192.168.122.255.

Вручну все вважати необов'язково, можна скористатися калькулятором .

ARP

Ми вже знаємо, що на L2 використовуються MAC-адреси, а на L3 - IP адреси. Повинен існувати якийсь механізм, який асоціює MAC-адресу сервера з його IP адресою. Цей механу називається ARP (Address Resolution Protocol) .

В Лінуксі є однойменна команда arp, яка дозволить подивитися табличку відомих машині MAC-адрес і відповідних їм IP адрес:

[Root @ localhost] # arp -n Address HWtype HWaddress Flags Mask Iface 192.168.178.1 ether 5c: 49: 79: 99: f3: 23 C wlp3s0

В даному випадку 192.168.178.1 - цей IP адреса мого Wi-Fi роутеру, до якої ноутбук підключений через інтерфейс wlp3s0.

Команда arp вважається deprecated і замість неї рекомендується використовувати ip neigh.

Один з видів кібер-атак пов'язаний з ARP і називається ARP spoofing . Мета такої атаки - підмінити MAC-адресу, асоційований з певним IP, на адресу машини хакера. Як страшно жити, так?

DHCP

Але як саме у мережевого інтерфейсу з'являється IP адресу? Один з варіантів - поставити його вручну. Недолік: ручна робота. Якщо руки криві, то можна налаштувати дублюються адреси та отримати конфлікт :)

Інший варіант: Dynamic Host Configuration Protocol ( DHCP ), Протокол, що використовується для автоматичного виставлення різної конфігурації, в тому числі IP-адрес.

За детальним вивченням DHCP звернися до документації в RFC: https://www.ietf.org/rfc/rfc2131.txt

Для роботи DHCP потрібен DHCP-сервер, що роздає IP-адреси і DHCP-клієнт на твоїй машині, який буде запитувати адресу для цієї машини. У домашніх умовах найчастіше DHCP-сервер знаходиться на роутері.

Щоб зрозуміти як саме працює DHCP, нам потрібно відволіктися на поняття "Broadcasting" . Це процес, в якому наш сервер відправляє повідомлення на всі сервери в мережі, так як він не знає де саме знаходиться та інформація, яка йому потрібна. Найближче таке broadcast спілкування до радіо мовлення.

Як це відбувається у випадку з DHCP:

  1. DHCP-клієнт надсилає broadcast повідомлення з питанням "Хочу IP адресу"
  2. DHCP-сервер його ловить і у відповідь відправляє так само broadcast повідомлення "У мене є адреса xxxx, хочеш його?"
  3. DHCP-клієнт отримує це повідомлення і відправляє ще одне: "Так, я хочу адреса xxxx"
  4. DHCP-сервер відповідає "Добре, тоді xxxx належить тобі"

Ось у цьому відео трохи більше наочно показаний весь процес: https://www.youtube.com/watch?v=RUZohsAxPxQ

А де зберігаються настройки сполук?

Налаштування підключення до мережі зберігаються в / etc / sysconfig / network-scripts. Там ти можеш відредагувати такі речі, як спосіб отримання IP адреси (автоматичний або статичний), стартувати чи з'єднання автоматично при завантаженні системи і т.п. Наприклад, ось так виглядає мій конфіг для Wi-Fi-з'єднання:

[Root @ localhost network-scripts] # ​​cat ifcfg-FRITZ-Box_7490 HWADDR = 4C: 34: 88: 54: C1: 2B ESSID = "FRITZ! Box 7490" MODE = Managed KEY_MGMT = WPA-PSK TYPE = Wireless BOOTPROTO = dhcp DEFROUTE = yes IPV4_FAILURE_FATAL = no IPV6INIT = yes IPV6_AUTOCONF = yes IPV6_DEFROUTE = yes IPV6_FAILURE_FATAL = no NAME = "FRITZ! Box 7490" UUID = 55ba9218-1d2f-407d-af13-51502d542edb ONBOOT = yes SECURITYMODE = open PEERDNS = yes PEERROUTES = yes IPV6_PEERDNS = yes IPV6_PEERROUTES = yes

Зверни увагу на BOOTPROTO = dhcp - ця опція означає, що буде використаний DHCP-сервер, в тому числі для отримання IP адреси. Для порівняння, конфиг з'єднання для loopback пристрої:

[Root @ localhost network-scripts] # ​​cat ifcfg-lo DEVICE = lo IPADDR = 127.0.0.1 NETMASK = 255.0.0.0 NETWORK = 127.0.0.0 # If you're having problems with gated making 127.0.0.0/8 a martian, # you can change this to something else (255.255.255.255, for example) BROADCAST = 127.255.255.255 ONBOOT = yes NAME = loopback

Тут прописаний статичний адреса: IPADDR = 127.0.0.1. У домашнаніх умовах замість редагування конфігов вручну можна використовувати утиліту nmcli, або встановити пакетик NetworkManager-tui, який надасть зручний текстовий інтерфейс прямо в консолі. У бойових умовах на серверах краще так не робити, а використовувати систему конфігурації (Puppet, Chef, Salt).

Ще одна важлива частина конфігурації: роутинг. Як зрозуміти, куди саме побіжить трафік? Все просто: досить подивитися локальну таблицю роутінга за допомогою команди ip r. На момент написання цих рядків я сиджу в кав'ярні з ноутбука, який використовує телефон як роутер. Ось що мені видає ip r:

default via 172.20.10.1 dev wlp3s0 proto static metric 600 172.20.10.0/28 dev wlp3s0 proto kernel scope link src 172.20.10.3 metric 600 192.168.100.0/24 dev virbr2 proto kernel scope link src 192.168.100.1 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1

Як бачиш, весь трафік йде по-замовчуванню на машинку з адресою 172.20.10.1. А якщо виконати ip addr show, то можна побачити, що у мережевого інтерфейсу в ноутбуці так само є IP адреса цієї мережі:

4: wlp3s0: <BROADCAST, MULTICAST, UP, LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link / ether 4c: 34: 88: 54: c1: 2b brd ff: ff: ff: ff: ff: ff inet 172.20.10.3/28 brd 172.20.10.15 scope global dynamic wlp3s0 valid_lft 83892sec preferred_lft 83892sec inet6 fe80 :: 4e34: 88ff: fe54: c12b / 64 scope link valid_lft forever preferred_lft forever

Командою ip r add можна додавати нові шляхи, а командою ip r del - видаляти.

DNS

Про DNS ти напевно чуєш не в перший раз. Проста ідея: звертатися до сервера не по IP адресою (важко запам'ятати для людей), а по нормальному імені.

Найстаріший і популярний DNS-сервер (той, що зберігає інформацію про адреси і відповідає на запити) - це BIND. Альтернатив теж багато, але тобі в першу чергу рекомендується розгорнути локально саме BIND.

Обов'язковий до прочитання матеріал від Cisco DNS Best Practices, Network Protections, and Attack Identification - там дізнаєшся не тільки всі основи DNS, але і купу важливих рекомендацій щодо створення безпечного і сталого DNS-сервери.

Є можливість оновлювати записи в DNS-сервері динамічно. Для цього почитай про nsupdate . Нижче знайдеш посилання на відмінне керівництво по налаштуванню, включаючи безпечне оновлення записів. Одне з цікавих застосувань - service discovery. Пошукай в Інтернеті, про що це, або дочекайся відповідної статті на mkdev ;-)

До появи DNS все, що у нас було - це файлик / etc / hosts. Він і зараз часто використовується.

Рубрика "Віруси для чайників"! Відкриваємо / etc / hosts на комп'ютера одного і додаємо туди рядок 52.28.20.212 vk.com. Досить одного сидіти вконтакте, хай вчиться розробці!

Ще дуже цікавий файлик /etc/nsswitch.conf. У ньому визначається в якому порядку і де шукати різну інформацію, в тому числі де шукати хости. За замовчуванням, спочатку вони шукаються в / etc / hosts, а вже потім відправляється запит в DNS-сервер.

Використовуваний для дозволу DNS-імен сервер, до речі, вказано в /etc/resolv.conf.

Дебажіть DNS проблеми найзручніше командою dig і nslookup. Наприклад, для запросити інформацію про mkdev.me у nameserver 8.8.8.8 можна зробити так:

# Dig mkdev.me @ 8.8.8.8; << >> DiG 9.10.3-P4-RedHat-9.10.3-12.P4.fc23 << >> mkdev.me @ 8.8.8.8 ;; global options: + cmd ;; Got answer: ;; - >> HEADER << - opcode: QUERY, status: NOERROR, id: 3320 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION:; EDNS: version: 0, flags :; udp: 512 ;; QUESTION SECTION:; mkdev.me. IN A ;; ANSWER SECTION: mkdev.me. 299 IN A 52.28.20.212 ;; Query time: 355 msec ;; SERVER: 8.8.8.8 # 53 (8.8.8.8) ;; WHEN: Fri May 27 12:51:04 CEST 2016 ;; MSG SIZE rcvd: 53

виртуалки

До цього моменту всі приклади виконувалися на локальній машині. Це, звичайно, корисне для сприйняття, але не так цікаво. Тому далі ми зміцнимо тільки що прочитане при допомогою віртуальних машин і libvirt, а заодно познайомимося з ще парою термінів.

В першу чергу, створимо виртуалку за допомогою virt-install :

sudo virt-install --name mkdev-networking-basics-1 \ --location ~ / Downloads / CentOS-7-x86_64-Minimal-1511.iso \ --initrd-inject /path/to/ks.cfg \ - extra-args ks = file: /ks.cfg \ --memory = 1024 --vcpus = 1 --disk size = 8

За замовчуванням libvirt створює одну мережу:

[Root @ localhost] # virsh net-list Name State Autostart Persistent ------------------------------------ ---------------------- default active yes yes

Блок 192.168.0.0/16 виділений для приватних мереж. libvirt виділив для своєї мережі блок 192.168.122.212/24, тобто всі адреси від 192.168.122.0 до 192.168.122.255.

Щоб подивитися детальну інформацію про конкретну мережі можна використовувати або virsh net-info, або virsh net-dumpxml. Друга команда поверне набагато більше деталей, тому використовуємо її:

[Root @ CentOS-72-64-minimal ~] # virsh net-dumpxml default <network connections = '1'> <name> default </ name> <uuid> f2ee9249-6bed-451f-a248-9cd223a80702 </ uuid> <forward mode = 'nat'> <nat> <port start = '+1024 «end =' 65535 '/> </ nat> </ forward> <bridge name =' virbr0 'stp =' on 'delay =' 0 ' /> <mac address = '52: 54: 00: 83: b4: 74 '/> <ip address =' ​​192.168.122.1 'netmask =' 255.255.255.0 '> <dhcp> <range start =' 192.168.122.2 ' end = '192.168.122.254' /> </ dhcp> </ ip> </ network>

connections показує кількість машинок, підключених до цієї мережі. Детальний опис всіх можливих опцій цього XML-файла можна прочитати в документації libvirt . Нас же зараз цікавлять два слова: bridge і dhcp.

bridge, або пристрій virbr0, або virtual network switch - це спеціальний пристрій, в який приєднуються все виртуалки цієї мережі. Всі запити від однієї виртуалки до іншої в межах однієї мережі йдуть через цей віртуальний світч. Для кожної мережі libvirt створює по одному віртуальному свитчу і кожен свитч розпізнається як окремий пристрій на хост інструменті:

[Root @ localhost] # ip link show 8: virbr1: <BROADCAST, MULTICAST, UP, LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT link / ether 52: 54: 00: a8: 02: f2 brd ff: ff: ff : ff: ff: ff

Створення мережі в libvirt за замовчуванням прирівнюється до створення віртуального світча, до якого чіпляються всі виртуалки, тим самим утворюють локальну мережу, LAN.

Реалізовано свитч virbr0 за допомогою Linux Bridge - технології, спочатку призначеної якраз для створення віртуальних локальних мереж. Виконавши команду brctl show на хост-машині можна побачити список всіх світчей.

Linux Bridge "злегка" відрізняється від типового залізного світча L2. За роки його існування до нього приліпили безліч додаткових фіч, наприклад, фільтрацію трафіку і файрвол . Коректніше за все назвати його світче L3, але тут ваш покірний слуга не впевнений до кінця.

Тепер звернемо увагу на наступну секцію:

<Ip address = '192.168.122.1' netmask = '255.255.255.0'> <dhcp> <range start = '192.168.122.2' end = '192.168.122.254' /> </ dhcp> </ ip>

Тут вказано блок адрес, що використовуються для віртуальних машин в цій мережі. 192.168.122.1 - IP-адреса хост-машини в межах цієї віртуальної мережі.

Виконавши ip r в виртуалке побачимо:

[Vagrant @ localhost ~] $ ip r default via 192.168.122.1 dev eth0 proto static metric 100 192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.209 metric 100

За замовчуванням трафік з виртуалки у зовнішній світ йде через хост-машину. В як забави можеш налаштувати, щоб трафік до однієї виртуалке йшов через іншу.

Що ми вже знаємо, за призначення IP адрес відповідає служба DHCP. Libvirt використовує dnsmaq для DHCP і DNS і запускає по екземпляру dnsmasq для кожної мережі.

`[Root @ CentOS-72-64-minimal ~] # ps aux | grep dns nobody 10600 0.0 0.0 15548 856? S Apr01 0:02 / sbin / dnsmasq --conf-file = / var / lib / libvirt / dnsmasq / default.conf --leasefile-ro --dhcp-script = / usr / libexec / libvirt_leaseshelper root 10601 0.0 0.0 15520 312 ? S Apr01 0:00 / sbin / dnsmasq --conf-file = / var / lib / libvirt / dnsmasq / default.conf --leasefile-ro --dhcp-script = / usr / libexec / libvirt_leaseshelper

Ми можемо подивитися табличку DHCP, яка покаже нам видані адреси:

[Root @ loclahost] # virsh net-dhcp-leases default Expiry Time MAC address Protocol IP address Hostname Client ID or DUID ------------------------- -------------------------------------------------- ---------------------------------------- 2016-04-29 16:31:19 52: 54: 00: 05: 36: e6 ipv4 192.168.122.212/24 - -

Зверни увагу, що 52: 54: 00: 05: 36: e6 це MAC-адресу інтерфейсу eth0 нашої виртуалки.

NAT

Читаючи раніше про CIDR тебе могло дещо насторожують: навіть якщо ми розділимо мережу на багато блоків, то загальна кількість IP адрес не збільшиться. На насправді, завжди використовується комбінація з приватних і публічних адрес. Зазвичай за одним публічним адресою ховається безліч машин, у кожній з яких є свій приватний адресу.

Це так само і вірно для наших віртуалок. У кожної є приватний IP-адреса з блоку 192.168.122.0/24, і всі вони ховаються за публічним адресою хост-машини.

Хост-машина, якщо ми продовжуємо використовувати для неї свій особистий ноутбук у себе вдома, ховається на Wi-Fi роутером і так само не володіє власним публічним адресою.

На перший погляд, те, що виртуалки мають доступ до інтернету, здається само собою зрозумілим. Але ж у виртуалки є тільки приватну адресу, недоступний поза хост машини. Публічного сервера, до якого виртуалка звертається, потрібно кудись відправляти відповіді і приватний IP адреса виртуалки він просто-напросто не зможе знайти (на те він і приватний).

Цю проблему вирішує NAT (Network Address Translation) - механізм перетворення IP адрес в мережевих пакетах. Зазвичай в пакеті вказано IP, звідки пакет відправлений і IP, куди пакет йде. NAT дозволяє динамічно змінювати ці адреси і зберігати таблицю підмінений адрес.

Існує SNAT (source NAT), котрий і використовується для наших віртуалок для доступу в Інтернет. Коли пакет вирушає, то його вихідний адресу замінюється на адресу хост машини. Коли відповідь від сервера призначення йде назад, то адреса змінюється з адреси хост машини на адресу виртуалки. Змінює адресу роутер.

DNAT (destination NAT) займається приблизно тим же самим, але навпаки: це коли ти звертаєшся до якогось суспільного адресою, за яким ховаються приватні, локальні адреси.

NAT - спосіб за замовчуванням для спілкування віртуалок із зовнішнім світом. Але libvirt штука гнучка. Можна, наприклад, чіпляти виртуалки безпосередньо до фізичного інтерфейсу хоста, замість віртуального світча. Варіантів створення мережі, насправді, багато .

Щоб NAT libvirt використовує iptables. Якщо коротко, то це інструмент, який відповідає за фільтрацію мережевих пакетів. iptables налаштовуються через спеціальні правила (rules), які комбінуються в ланцюжки (chains). Ось шляхом додавання таких правил libvirt та додає нашим віртуалкою доступу в Інтернет, використовуючи NAT. Ми повернемося до iptables коли будемо говорити про безпеку в цілому.

Ще для того щоб на хості працювало перенаправлення пакетів в налаштуваннях ядра повинна бути включена опція ip forward. Включається вона просто: `echo 1> / proc / sys / net / ipv4 / ip forward`

tcpdump

Мабуть, самий незамінний інструмент для дебаггінга мережевих проблем, а, конкретніше, трафіка, який проходить через нашу машину - це tcpdump. Вміти ним користуватися обов'язково. Подивимося, наприклад, що відбувається на нашому virbr0 при перезапуску виртуалки.

Відкриваємо консоль на хост-машині і робимо tcpdump -i virbr0.

Відкриваємо окреме віконце і робимо virsh reboot # {номер_віртуалкі}.

Дивимося результат в першому віконці і мабуть звідки які запити прийшли:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on virbr0, link-type EN10MB (Ethernet), capture size 262144 bytes 12: 57: 31.339135 IP6 ::> ff02 :: 16: HBH ICMP6, multicast listener report v2, 1 group record (s), length 28 12: 57: 31.397937 IP 0.0.0.0.bootpc> 255.255.255.255.bootps: BOOTP / DHCP, Request from 52: 54: 00: e0: 06: 54 (oui Unknown), length 300 12: 57: 31.398182 IP linux.fritz.box.bootps> 192.168.122.209.bootpc: BOOTP / DHCP, Reply, length 301 12: 57: 31.590332 ARP, Request who-has linux.fritz.box tell 192.168.122.209, length 28 12: 57: 31.590373 ARP, Reply linux.fritz.box is-at 52: 54: 00: 7e: 33: 23 (oui Unknown), length 28 12: 57: 31.590409 IP 192.168.122.209. 38438> linux.fritz.box.domain: 61342+ A? 0.centos.pool.ntp.org. (39) 12: 57: 31.590458 IP 192.168.122.209.38438> linux.fritz.box.domain: 25671+ AAAA? 0.centos.pool.ntp.org. (39) 12: 57: 31.590618 IP linux.fritz.box.domain> 192.168.122.209.38438: 25671 0/0/0 (39) ### І так далі

Ось, наприклад, broadcast від виртуалки: 12: 57: 31.397937 IP 0.0.0.0.bootpc> 255.255.255.255.bootps: BOOTP / DHCP, Request from 52: 54: 00: e0: 06: 54 (oui Unknown), length 300 .

Ну і заодно глянемо ARP табличку:

Address HWtype HWaddress Flags Mask Iface # ... 192.168.122.209 ether 52: 54: 00: e0: 06: 54 C virbr0 # ...

VPN

Іноді (насправді, дуже часто) необхідно зробити так, як ніби і клієнт і сервер знаходяться в одній приватній мережі. Наприклад, коли всі сервіси компанії знаходяться в закритій мережі, доступної тільки в офісі, і потрібно дати співробітникам віддалений доступ. Або коли у компанії кілька офісів або дата центрів, які потрібно з'єднати один з одним так, щоб раніше не відкривати всю мережу всьому інтернету.

По суті VPN - це вкладення одного tcp / ip пакета в інший і шифрування вмісту. Виходить віртуальна мережа працює всередині реальної мережі. Для віртуальних мереж створюються віртуальні мережеві пристрої (tun / tap) з віртуальними ж IP адресами, видимими тільки всередині нашої віртуальної зашифрованою мережі.

Я залишу настройку VPN за межами цієї статті. На совісті читача залишиться спробувати це зробити самостійно за допомогою OpenVPN або strongSwan .

Ми ще повернемося до тебе безпеки, але ти вже можеш почитати про IPsec - цей протокол використовує strongSwan.

Для самостійного вивчення

Ми тільки що пробіглися по самим основам мереж, але, звичайно ж, є ще з десяток технологій, які варто подивитися. Погуглити самостійно VXLAN, вивчи TCP і UDP (і розберися коли якийсь використовувати), глянь що таке ICMP. Ти постійно будеш стикатися з новими термінами, але, як і завжди, головне - засвоїти основи.

Ми не піднялися до вищих рівнів моделі OSI, чи не подивилися різні протоколи, з якими працюють веб-додатки: HTTP (S), FTP, SSH, NTP та багато інших.

Не забувай заглядати в RFC . Це перша зупинка в пошуку потрібної тобі інформації по мережах.

Ми, швидше за все, повернемося до цих тем в наступних статтях. Для мене особисто найскладніше було раніше зрозуміти саме те, як все працює на рівнях нижче рівня програми: всі ці мережі, підмережі, незрозумілі проблеми з доступом від одного сервера до іншого і т.п.

Сподіваюся, ти тепер трохи більше знаєш про самих основних компонентах, задіяних в мережевої комунікації і в майбутньому зможеш швидше розбиратися у виникаючих проблемах - так як заздалегідь знатимеш, де і що може піти не так.

Що далі?

Я знаю, що дорогий читачу чекає-недождётся, коли я почну розповідати про Chef, Puppet, Ansible та інші модні штуки. Але рано, поки ще рано. Нас чекає ще як мінімум одна стаття подібного роду, в якій ми розглянемо всі можливі способи аутенфіціровать і авторізовиваться користувачів і сервера, тим самим сильно копнувши в сторону теми безпеки в цілому.

додаткове читання

Як я вже говорив, тема мереж складна, глибока і задіє безліч різних частин. Ти напевно відчуваєш легку кашу в голові. Нічого страшного! Посилання нижче допоможуть тобі ще глибше засвоїти все, що тобі потрібно знати про мережах.

Хто ж виступає в ролі я відправника і одержувача?
А що якщо ми хочемо об'єднати в одну мережу сервера, що знаходяться в різних фізичних локаціях?
Або, наприклад, хочемо логічно розділити сервера підключені до одного свитчу в одній локації в різні мережі?
Чим же відрізняється роутер від світча L3, запитаєш ти?
І чому у loopback інтерфейсу варто / 8?
Як страшно жити, так?
Com/watch?
Як зрозуміти, куди саме побіжить трафік?
Domain: 61342+ A?
Domain: 25671+ AAAA?

Новости