FreeBSD як інструмент діагностики: установка, конфігурація та апаратні тести (Частина 1)

05.12.2025 15 хвилин Автор: Lady Liberty

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

Інструмент для діагностики мережі на базі ОС FreeBSD

Викладена в матеріалі ідея створення компактного інструмента для діагностики мережевих проблем може здатися передбачуваною для інженерів старої школи, однак для багатьох молодих фахівців, які звикли до дорогих сертифікованих рішень на кшталт Cisco Systems чи Fluke Networks, вона відкриває потенціал FreeBSD у «чистому» вигляді. Усього лиш потрібно встановити систему на компактний пристрій з двома Ethernet-інтерфейсами та виконати базове налаштування — і повноцінний інструмент для аналізу мережі готовий до роботи.

Концепція «stand-alone» рішення для віддаленої діагностики Ethernet-мереж виникла ще в часи, коли інтернет-провайдери широкомасштабно використовували звичайне ПК-обладнання з FreeBSD для маршрутизації та серверних завдань. У той період операційна система демонструвала стабільність, багатий набір мережевих можливостей «із коробки» та невимогливість до апаратних ресурсів. Навіть сьогодні багато інфраструктур продовжують працювати на подібних конфігураціях без збоїв протягом років.

Потреба повернутися до цієї ідеї зумовлена сучасними викликами. Один із замовників експлуатує великий парк різнорідних IP-домофонів і постійно стикається з проблемами сумісності, які неможливо коректно діагностувати без доступу до мережевого трафіку. Багато моделей бюджетного сегмента не дають можливості переглянути внутрішню логіку роботи, специфічні параметри SIP або механізми NAT traversal, а служби підтримки сторонніх провайдерів не завжди мають змогу оперативно розібратися з проблемою. У таких умовах критично важливо мати можливість коректно перехопити трафік, дослідити його та об’єктивно визначити, на якому етапі виникає помилка.

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

1. Сніффер як спосіб вирішення проблем із мережею

Одним із класичних способів перехопити мережевий трафік є налаштування порту комутатора (або окремого VLAN) у спеціальний режим, за якого всі пакети з потрібного порту дублюються в інший, вільний порт. У термінології Cisco це відомо як SPAN. До такого порту підключається аналізатор — наприклад, Fluke OptiView або комп’ютер із запущеним WireShark.

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

Альтернативний підхід значно простіший — використання звичайного ПК із двома Ethernet-інтерфейсами, між якими створюється прозорий міст (Ethernet Bridging). Для мережевого обладнання такий міст практично невидимий: окрім мінімальної затримки, його складно виявити. Головна перевага — можливість програмно аналізувати, фільтрувати або записувати весь трафік, що проходить між інтерфейсами.

Керування пристроєм здійснюється віддалено, наприклад через SSH поверх L2TP або PPTP-тунелю, який автоматично піднімається під час завантаження системи. У результаті утворюється компактний, автономний та повністю керований дистанційно інструмент моніторингу. Для встановлення достатньо підключити два патчкорди та живлення.

Такий «сніфер», встановлений між двома комутаторами, дозволяє аналізувати увесь трафік між ними — виявляти мережеві шторми, проблеми NAT чи SIP, помилки взаємодії обладнання та навіть потенційні спроби вторгнення. Водночас варто враховувати, що ресурси звичайного ПК можуть бути недостатніми для магістральних каналів, тому це рішення оптимальне для мереж ближче до абонента.

Цей інструмент є доступною альтернативою дорогим професійним аналізаторам. Комерційні пристрої аналогічного класу можуть коштувати від 50 000 до 100 000 грн, тоді як на вторинному ринку подібні рішення трапляються за 4000–5000 грн, що значно вигідніше.

Для реалізації концепції потрібен x86-сумісний ПК із двома Gigabit Ethernet-портами. Довгий час компактні пристрої такого типу були рідкістю, а USB-мережеві адаптери виявилися ненадійними для тривалого моніторингу. Проблеми можуть проявлятися нерегулярно, і тривале очікування з ноутбуком у технічному приміщенні — непрактичне рішення. Тим більше, коли моніторинг може вестися в квартирі чи приватному будинку.

Ситуацію змінила поява компактних комп’ютерів на базі Intel Atom. Один із таких — одноплатний ПК формату nano-ITX на Intel Atom J1190 (2.4 ГГц), оснащений 8 GB DDR4, SSD на 128 GB і чотирма портами 2.5G Ethernet, що пропонується приблизно за 4380 грн. Для своєї ціни він забезпечує функціональність, достатню для ролі мережевого сніфера, і є значно доступнішим за дорогі професійні аналізатори.

Мал.1. Міні-ПК від XCY на базі Intel Celeron J1900 із чотирма портами 2.5GBit Ethernet.

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

Коли ситуація загострилася, пропозицію розглянули знову — і саме тоді в компанії замовника з’явився компетентний фахівець, який швидко побачив практичну користь такого підходу. Проєкт отримав розвиток.

Придбати міні-ПК від XCY не вдалося через обмеження на закупівлі на китайських маркетплейсах, проте новий спеціаліст оперативно підібрав локальний аналог — mini-ПК Horizon N5 сингапурського дизайн-центру, який постачається на ринок під брендом Rambica.

Мал.2. Міні-ПК Horizon N5 DN5122P [PCMI-0105], процесор Intel Celeron N5105 (4 ядра по 2.0 ГГц), 12 ГБ DDR4, 256 ГБ SSD, 2x1GbitEthernet, 3xUSB та 3xHDMI.

Rambica Horizon N5 DN5122P [PCMI-0105] оснащений іншим процесором — Intel Celeron N5105 із чотирма ядрами на 2 ГГц. Пристрій має 12 GB DDR4 оперативної пам’яті та SSD на 256 GB. На відміну від моделі XCY, Horizon N5 комплектується двома 1-Gbit Ethernet портами, чого більш ніж достатньо для побудови сніфера у мережах невеликого масштабу. Додатково він оснащений вбудованим Wi-Fi, трьома HDMI-портами, трьома USB 3.0 та декоративним RGB-підсвічуванням.

Компактні габарити 47×88×88 мм і вартість близько 9 300 грн роблять цей пристрій конкурентним рішенням у порівнянні з популярними одноплатниками на кшталт Raspberry Pi 5, особливо з огляду на продуктивність та набір інтерфейсів.

Після придбання Horizon N5 пристрій був переданий для встановлення та налаштування FreeBSD відповідно до поставлених вимог. Матеріал далі описує процес підготовки, конфігурації та практичного використання цього апаратного рішення як основи для автономного мережевого сніфера.

Отже, можна переходити до технічної частини реалізації задуму.

2. Встановлення ОС FreeBSD та базове налаштування

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

  1. Робочий ПК з ОС Windows/Linux/FreeBSD або будь-якої іншої сучасної ОС з 3 ГБ вільного дискового простору. На цьому ПК має бути засіб, що дозволяє підключатися до інших машин по SSH (ssh, putty.exe).

  2. Накопичувач USB Flash ємністю щонайменше 2 GB.

  3. Монітор/телевізор з інтерфейсом HDMI.

  4. Клавіатура USB 2.0

  5. Два підготовлені UTP патч-корд.

  6. Доступ до мережі WiFi (пароль доступу) з виходом до Інтернету.

2.1. Завантажуємо ISO образ

Насамперед нам потрібно буде завантажити завантажувальний образ системи з інсталятором на борту. На сайті проекту FreeBSD представлено декілька різних версій цієї операційної системи. На момент написання цієї статті є три різні гілки ОС FreeBSD: поточна в розробці 15.0-CURRENT , застаріла, але все ще підтримувана 13.5-RELEASE і стабільна 14.3-RELEASE . Завантажуватимемо стабільну версію 14.3-RELEASE. Для кожної версії ОС запропоновано кілька варіантів образів різного обсягу та призначення. У тому числі:

  • dvd1 — містить завантажувальну систему, призначену для інсталяції з DVD або USB, а також набір вже зібраних бінарних файлів для графічного інтерфейсу. Даний варіант найоб’ємніший і призначений для встановлення як робоче місце на ПК користувача.

  • disc1 — те саме, тільки без зібраних пакетів. Також є варіант для робочого місця.

  • bootonly не містить інсталятора, але може бути завантажена з CD-ROM або USB як тимчасова робоча ОС.

  • memstick – оптимізований для розгортання на USB носій, що містить мінімум достатній для виконання інсталяції.

  • mini-memctick – те саме, що memstick, але без інсталятора. Більше підходить як відновлення після збою.

  • Також на сайті представлені готові образи для віртуальних машин, орендованих у Amazon AWS EC2. Це все нас зараз не цікавить.

А цікавить нас мінімальний образ з інсталятором, тобто memstick . Переходимо на сторінку з образами і бачимо, що ОС FreeBSD доступна для декількох різних платформ, у тому числі для amd64 , arm64 (у кількох варіантах), i386 , PowerPC , PowerPC64 (також у кількох варіантах) та RISCV64 . Для кожної з підтримуваних платформ образ представлений у звичайному ( .img ) і упакованому ( .img.xz ) форматі.

В даному випадку нас цікавить платформа amd64 , а значить качаємо файл FreeBSD-14.3-RELEASE-amd64-memstick.img.xz який займає приблизно 800 МБ.

2.2. Налаштування опцій BIOS

Поки завантажувальний образ скачується, ми повинні підключити до нашого Mini-ПК USB клавіатуру, HDMI монітор, подати живлення, натиснути кнопку Power та увійти до BIOS, щоб змінити ряд настоянок. Відразу хочу зауважити, що з невідомої причини провідні клавіатури стандарту USB 1.0 з BIOS-ом даного міні-ПК не працюють, а ось з бездротовою Logitech USB 2.0 все вийшло.

Діяти, як завжди, потрібно оперативно – відразу після включення живлення (що індикується веселою ілюмінацією RGB підсвічування), необхідно багаторазово натискати клавішу DEL ще до появи зображення на екрані монітора. Якщо згаяти момент, пристрій завантажить раніше встановлену на SSD накопичувачі ОС невідомого походження з дуже дивним і незрозумілим інтерфейсом користувача. 😉

Якщо ж Ви були досить оперативні, то перед Вами відкриється текстове меню звичного AMI BIOS.

У меню BIOS необхідно змінити такі настройки:

  1. Встановити послідовність завантаження: першим із USB: Boot → Hard Disk Drives: USB .

  2. Встановити режим, у який переходить пристрій після збою (зникнення та відновлення) живлення. Необхідно встановити режим S0 , щоб пристрій завжди вмикався і завантажувався відразу після подачі живлення, не чекаючи натискання клавіші Power: Boot → State After G3: S0 State .

Після зміни налаштувань необхідно вийти з меню BIOS зі збереженням внесених змін, тобто вибрати Save Settings and Exit .

2.3. Розгортання зображення на USB Flash

Після завантаження образу його необхідно розпакувати командою xz . Для запису образа Вам знадобиться близько 2 ГБ вільного дискового простору.

# xz -d FreeBSD-14.3-RELEASE-amd64-memstick.img.xz

На сторінці сайту FreeBSD із завантаженнями наводиться наступна команда dd із параметрами для запису образу на USB носій:

# dd if=FreeBSD-14.3-RELEASE-amd64-memstick.img of=/dev/da0 bs=1m conv=sync status=progress

Записати образ можна і не розпаковуючи, щоб даремно не витрачати дисковий простір наступною командою:

# zx -d -c FreeBSD-14.3-RELEASE-amd64-memstick.img.xz | dd of=/dev/da0 bs=1m conv=sync status=progress

Ці команди необхідно виконувати від користувача root (або скористатися утилітою sudo ). Команди однаково добре працюють як у ОС Linux, так і в ОС FreeBSD. Єдине, що необхідно зробити при роботі в Linux – поміняти ім’я файлу-пристрою USB носія на /dev/sdb (або як воно у Вас визначилося, див в dmesg ).

Однак, команди dd немає в Windows. В останній доведеться заздалегідь скачати та встановити утиліту Rufus або USBImager та дотримуватися відповідних інструкцій. До речі, розпакувати образ під ОС Windows можна утилітою winrar.exe , вона підтримує формат xz .

2.4. Завантаження з USB Flash та встановлення системи на SSD

Вставте носій USB у будь-який з роз’ємів USB, вимкніть і увімкніть пристрій. Якщо попередні операції пройшли вдало (BIOS налаштований на завантаження з USB і образ успішно записаний на USB Flash носій), то протягом декількох секунд Вам представиться завантажувач від ОС FreeBSD, який запропонує кілька варіантів дій:

Мал.3. FreeBSD bootloader з образу memstick.img

У цей момент можна просто нічого не робити, а почекати 10 сік і активне (перше) меню Boot Installer буде вибрано автоматично. Або натиснути Enter, щоб прискорити вибір. Система продовжить завантаження, по екрану побіжать рядки тексту від ядра ОС, що інформують про виявлені пристрої, завантажені драйвери та їх параметри. Зрештою Вам представиться запрошення від FreeBSD Installer на блакитному тлі:

Мал.4. Запрошення від FreeBSD Intaller.

Інсталлер пропонує три різні варіанти дій, вибираємо [Install]. Усі детальні кроки встановлення FreeBSD та скріншоти інсталяції описані в багатьох статтях і відеоматеріалах, доступних у відкритому доступі. Тому в цьому матеріалі наведено лише послідовність основних дій та окремі важливі моменти, які варто врахувати під час налаштування:

1. Спочатку Інсталлер запропонує вибрати розкладку клавіатури. У термінах FreeBSD це називається “Keymap”.

2. Далі Інсталлер попросить вказати ім’я машини. У Unix прийнято давати машинам (хостам) романтичні імена. У нашому випадку пропоную обізвати хост словом, що відображає його майбутню мерзенну і мерзенну роботу: sniffer .

3. Наступним кроком Інсталлер попросить вибрати набір дистрибутивів (набір стандартних пакетів). Відключаємо все, що стосується налагодження ( *-dbg ), включаємо lib32 і рухаємося далі.

4. Далі Інсталер запропонує розбивку диска на розділи. Вибираємо Auto (UFS) та продовжуємо. У жодному разі не вибираємо ZFS — це зовсім не те, що потрібно для нашого завдання!

5. Інсталер відобразить список доступних дисків, серед яких буде /dev/ada0 – це наш SSD накопичувач, і запропонує варіант розбиття на окремі файлові системи. Нічого не міняємо, погоджуємось і рухаємось далі.

6. Інсталер запропонує вибрати тип таблиці розділів (BSD, GPT, MBR та інші). Вибираємо GPT . Це популярний і зручний спосіб, що дозволяє звертатися до томів диска за унікальними ідентифікаторами. Ця абревіатура не має жодного відношення до нейромереж!

7. Після цього Інсталлер почне установку: розмітить диск, створить таблицю розділів та розпакує необхідні системні пакети з ядром, утилітами та бібліотеками. Весь процес займає від 30 до 60 секунд.

Тут треба зауважити. Якщо на SSD знаходиться раніше встановлена ​​інша операційна система, Інсталлер попросити підтвердити факт того, що ця ОС буде знищена в процесі установки. Погоджуємося не дивлячись і натискаємо та натискаємо <Commit> .

8. Після завершення інсталер покаже чорне термінальне вікно і попросить задати пароль для користувача root . Вводимо кілька разів 1234 , якийсь серйозний і супер-складний пароль тут не потрібно. Ми готуємо собі інструмент для роботи, а не супер-сек’юрний фаєрвол.

Мал.5. Встановлення пароля для користувача root.

9. Інсталер повернеться до блакитного екрана та попросить налаштувати мережеві інтерфейси. Налаштувати інтерфейси Ethernet не слід, ми виконаємо цю процедуру пізніше при налаштуванні Ethernet Bridging-а. Але що слід зробити, так це налаштувати WiFi – це потрібно нам для віддаленого керування пристроєм та встановлення додаткового програмного забезпечення.

Необхідно вибрати інтерфейс wlan0 та відповісти на додаткові запитання Інсталера: вказати ім’я (SSID) бездротової мережі, тип авторизації, пароль, вказати на використання IPv4 та включити DHCP для автоматичного отримання IP адреси та інших налаштувань мережі.

10. Інсталер запропонує налаштувати IPv6. Робити цього не слід, якщо, звичайно, Ви не є фахівцем у цьому питанні. Вибираємо No і рухаємось далі.

11. Далі Інсталлер попросить вказати ім’я домену, до якого належить ця машина та ім’я DNS сервера. Залишаємо все так: localdomain і IP адресу DNS сервера отриманого по DHCP. Якщо з’єднання з мережею на момент інсталяції відсутнє, слід вказати адресу DNS сервера вручну.

12. Наступним етапом Інсталлер попросить вибрати регіон та країну для того, щоб правильно встановити тимчасову зону. Вибираємо Asia , потім Russia . Далі вибираємо відповідну тимчасову зону (у моєму випадку це MSK+2 ).

13. Далі система запропонує встановити поточну дату та час. Можна пропустити цей пункт (вибрати Skip ), тому що далі ми встановимо демона ntpd, що відповідає за синхронізацію системного часу.

14. Наступним етапом Інсталлер запропонує провести низку системних налаштувань. Необхідно відзначити послуги: sshd (віддалений доступ до системи), ntpd (синхронізація часу) та powerd (управління електроживленням).

15. Далі Інсталлер запропонує посилити безпеку шляхом «загвинчування гайок» (System Hardening). Тут нічого вмикати та вимикати не потрібно, в системі і так все досить безпечно за умовчанням. До того ж частина опцій може додати несподіваних проблем.

16. Наступним кроком Інсталлер запропонує додати нового користувача. Ось це потрібно зробити обов’язково! У чорному екрані вкажіть ім’я нового користувача, наприклад sniffer . Встановіть пароль, наприклад, reffins . Користувача обов’язково слід додати до груп wheel і network , і навіть встановити тип оболонки tcsh . Скріншот на рис. 6.

Додавання користувача до групи wheelзробить цього користувача адміністратором, а додавання до групи network дозволить використовувати мережеві утиліти без підвищення рівня привілеїв (без sudo).

Мал.6. Додавання нового користувача до системи з правами адміністратора.

17. Після додавання нового користувача Істалятор повернеться до блакитного екрана і запропонує виконати ще ряд операцій налаштування системи. На цьому етапі можна закінчити встановлення системи та перезавантажити машину. Для цього потрібно вийняти USB Flash носій із порту та вибрати меню Exit.

Інсталятор запропонує запустити оболонку (shell), щоб надати Вам ще одну можливість доналаштувати систему. Тут потрібно вибрати No, після чого інсталятор відобразить меню з опцією Reboot. Вибираємо її і чекаємо, поки система перезавантажиться.

Пройшовши через завантажувач і текст діагностичних повідомлень від ядра ОС, що швидко пролітає, врешті-решт користувачеві надасть запрошення для входу в систему:

Tue Jul  8 01:59:11 +05 2025

FreeBSD/amd64 (sniffer) (ttyv0)

login: sniffer
Password: reffins

Вказуємо користувача sniffer , пароль reffins і потрапляємо в оболонку tcsh попередньо і дуже коротко ознайомившись з Message of the Day (motd) наступного виду:

Welcome to FreeBSD! 

Release Notes, Errata: https://www.FreeBSD.org/releases/ 
Security Advisories:   https://www.FreeBSD.org/security/ 
FreeBSD Handbook:      https://www.FreeBSD.org/handbook/ 
FreeBSD FAQ:           https://www.FreeBSD.org/faq/ 
Questions List:        https://www.FreeBSD.org/lists/questions/ 
FreeBSD Forums:        https://forums.FreeBSD.org/ 

Documents installed with the system are in the /usr/local/share/doc/freebsd/ 
directory, or can be installed later with:  pkg install en-freebsd-doc 
For other languages, replace "en" with a language code like de or fr. 

Show the version of FreeBSD installed:  freebsd-version ; uname -a 
Please include that output and any error messages when posting questions. 
Introduction to manual pages:  man man 
FreeBSD directory layout:      man hier 

To change this login announcement, see motd(5). 

sniffer@sniffer:~ %

Останній рядок sniffer@sniffer:~ % це і є запрошення від оболонки tcsh . Вона означає, що Ви є звичайним користувачем (про це говорить символ % ) з ім’ям sniffer на машині з ім’ям sniffer . На цьому етапі нам потрібно продовжити доустановку різних корисних пакетів програм та утиліт.

2.5. Встановлення корисних пакетів програм та утиліт

Перед тим як почати інсталяцію пакетів, необхідно по-перше, отримати привілеї адміністратора, а по-друге з’ясувати налаштовано і чи піднято мережне з’єднання через WiFi. Завантаження всіх програм будемо виконувати саме таким чином. Звичайно ж це можна зробити і через провідний Ethernet, але в даному випадку буде зручніше, якщо провідні мережеві інтерфейс re0 і re1 ми залишимо незайманими для подальшого налаштування моста. Але це все умовності, і Ви можете діяти інакше. 🙂

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

sniffer@sniffer:~ % su 
Password: 1234

#

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

Промпт із символом # створюється оболонкою sh, яка використовується для користувача root за замовчуванням. Ця оболонка є базовою та не надто зручною, тому зазвичай її замінюють на більш функціональну tcsh.

Замінити оболонку можна наступною командою:

# chsh -s tcsh 
chsh: user information updated

Утиліта chsh повідомила, що оболонка замінена. Тепер вийдемо зі старої оболонки командою еxit і ще раз виконаємо команду su :

# exit

sniffer@sniffer:~ % su

Password: 1234
root@sniffer:/home/sniffer #

Ми знову отримали права адміністратора, але зараз у промпті ми бачимо під яким користувачем ( root ) і на якій машині ( sniffer ) ми працюємо, а також у якому каталозі дерева файлової системи ( /home/sniffer ) ми зараз знаходимося. Це не єдина зручність, що надається оболонкою tcsh , натискаючи стрілки вгору/вниз, тепер можна переміщатися по історії раніше виконаних команд. При цьому можна задавати частину імені команди і натискати стрілки і tcsh знайде близьку по рядку команду.

Перевірити наявність з’єднання з WiFi можна командою ifconfig . Вводимо команду:

root@sniffer:/home/sniffer # ifconfig wlan0

і отримуємо відповідь виду:

wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 
        options=0 
        ether b0:ac:82:7c:c2:5b 
        inet 192.168.168.140 netmask 0xffffff00 broadcast 192.168.168.255 
        groups: wlan 
        ssid SOME_NETWORK channel 149 (5745 MHz 11a) bssid 50:ff:20:78:f8:23 
        regdomain FCC country US authmode WPA1+WPA2/802.11i privacy ON 
        deftxkey UNDEF AES-CCM 3:128-bit txpower 23 bmiss 7 mcastrate 6 
        mgmtrate 6 scanvalid 60 wme roaming MANUAL 
        parent interface: rtw880 
        media: IEEE 802.11 Wireless Ethernet OFDM/36Mbps mode 11a 
        status: associated 
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

У виведенні команди ifconfig інтерес представляють виділені рядки:

  • status: associated – означає, що з’єднання з WiFi точкою доступу встановлено;

  • ssid SOME_NETWORK – містить ім’я точки доступу (тут для прикладу: SOME_NETWORK);

  • inet 192.168.168.140 — показує, яка IP адреса видана мережею (DHCP сервером) для даної машини.

Якщо у Вас вийшов подібний результат, значить з’єднання з мережею встановлено, можна виконати ping якогось хоста в глобальній мережі та перевірити чи є доступ до Інтернету:

root@sniffer:/home/sniffer # ping www.google.com 

PING www.google.com (173.194.220.147): 56 data bytes 
64 bytes from 173.194.220.147: icmp_seq=0 ttl=107 time=106.200 ms 
64 bytes from 173.194.220.147: icmp_seq=1 ttl=107 time=107.547 ms 
64 bytes from 173.194.220.147: icmp_seq=2 ttl=107 time=106.863 ms 
^C 
--- www.google.com ping statistics --- 
3 packets transmitted, 3 packets received, 0.0% packet loss 
round-trip min/avg/max/stddev = 106.200/106.870/107.547/0.550 ms

Вихід із команди ping , як і з будь-якої іншої, в Unix-подібних системах здійснюється за натисканням Ctrl-C. Це ініціює посилку процесу сигналу SIGINT, що завершує його виконання та управління передається назад в оболонку tcsh .

Якщо з підключенням до мережі не вдалося, то доведеться зануритися в налаштування WiFi. За роботу WiFi в операційній системі FreeBSD відповідає демон wpa_supplicant , його конфігураційний файл знаходиться в /etc/wpa_supplicant.conf . Спробуйте перевірити, чи правильно вказано пароль та ім’я точки доступу. Для цього відкрийте цей файл у редакторі ee або vi :

root@sniffer:/home/sniffer # ee /etc/wpa_supplicant.conf

Після внесення виправлень у конфігураційний файл слід зберегти. У редакторі ee це робиться натисканням послідовності ESC , Enter та ще раз Enter . Збережений конфіг буде сприйнятий демоном wpa_supplicant лише після рестарту мережного (wlan0) інтерфейсу. Для цього вводимо наступну команду:

root@sniffer:/home/sniffer # service netif restart wlan0 
Stopping wpa_supplicant. 
Waiting for PIDS: 46902. 
Stopping Network: wlan0. 
Destroyed wlan(4) interfaces: wlan0. 
Created wlan(4) interfaces: wlan0. 
Starting wpa_supplicant. 
Starting Network: wlan0.

Через кілька секунд слід знову перевірити наявність з’єднання командою ifconfig wlan0 .

Припускатимемо, що в системі з’явився доступ до Інтернету і ми можемо перейти до встановлення пакетів. Встановлення, видалення та апгрейд зібраних (заздалегідь скомпільованих) пакетів програм в ОС FreeBSD здійснюється командою (утилітою) pkg . Ця утиліта має кілька розширень:

  • pkg search – здійснює пошук пакета, по заданому рядку символів, в централізованому репозиторії, розташованому на сайті проекту FreeBSD.

  • pkg install – здійснює установку пакета за його точним ім’ям.

  • pkg remove – видаляє раніше встановлений пакет.

  • pkg info – видає докладну інформацію про встановлений пакет.

Подивимося, як це працює. Наприклад, виконаємо пошук пакету за рядком «WireShark»:

root@sniffer:/home/sniffer # pkg search WireShark 
wireshark-4.4.7                Powerful network analyzer/capture tool 
wireshark-nox11-4.4.7          Powerful network analyzer/capture tool (without GUI)

pkg search видає знайдені пакети та їх короткий опис, по одному на рядок. У цьому прикладі бачимо, що у репозиторії перебувають два варіанти пакета wireshark — з графічним інтерфейсом і без такого ( nox11 ).

Для завдання мережевого сніфера нам необхідно встановити такі пакети програм та утиліт:

  • sudo – для отримання привілеїв адміністратора;

  • screen — для керування віртуальними терміналами та одночасного запуску кількох програм з віддаленим керуванням;

  • wireshark-nox11 – для захоплення та аналізу мережевого трафіку;

  • trafshow – для аналізу поточного завантаження мережі;

  • snort3 – для аналізу та виявлення потенційних проблем безпеки та вторгнення.

  • mpd5 — демон для створення тунельного з’єднання з сервером L2TP або PPTP для організації віддаленого каналу управління сніффером.

  • gcc , cmake , gmake, git — компілятор з мови Сі та набір утиліт для збирання інших програм із вихідних кодів.

  • cpu-x – утиліта для збирання та відображення інформації про апаратуру обчислювальної системи.

Ну що ж, давайте встановимо їх усі разом. Для цього введемо наступну дуже довгу команду:

root@sniffer:/home/sniffer # pkg install sudo screen wireshark-nox11 trafshow snort3 mpd5 gcc cmake gmake git cpu-x

Updating FreeBSD repository catalogue... 
FreeBSD repository is up to date. 
Updating FreeBSD-kmods repository catalogue... 
FreeBSD-kmods repository is up to date. 
All repositories are up to date. 
The following XXX package(s) will be affected (of 0 checked): 

New packages to be INSTALLED: 
        e2fsprogs-libuuid: 1.47.2 [FreeBSD] 
        hwdata: 0.393,1 [FreeBSD] 
        hwloc2: 2.11.2 [FreeBSD] 
    ...
        screen: 4.9.1_5 [FreeBSD] 
        snort3: 3.7.1.0,1 [FreeBSD] 
        spdlog: 1.15.2 [FreeBSD] 

Number of packages to be installed: 14 

The process will require YYY MiB more space. 
ZZZ MiB to be downloaded. 

Proceed with this action? [y/N]: y

Утиліта pkg проаналізує свою базу даних з пакетами, виявить усі залежності (інші бібліотеки та додатки, які потрібні для роботи тих, що ми просимо встановити) та відобразить довгий список пакетів для встановлення. Наприкінці вона повідомить обсяг необхідного дискового простору та обсяг даних для завантаження з глобального репозиторію. Тиснемо y , потім Enter. Утиліта pkg викачає пакети, розпакує їх та встановить у систему. У ході процесу з’являтиметься повідомлення виду:

[1/144] Fetching snort3-3.7.1.0,1.pkg: 100%    2 MiB   1.2MB/s    00:02     
[2/144] Fetching luajit-devel-2.1.0.20250311.pkg: 100%  480 KiB 491.3kB/s    00:01     
[3/144] Fetching hwloc2-2.11.2.pkg: 100%    3 MiB   1.5MB/s    00:02     
[4/144] Fetching screen-4.9.1_5.pkg: 100%  568 KiB 581.8kB/s    00:01     
...
[1/144] Installing screen-4.9.1_5... 
[1/144] Extracting screen-4.9.1_5: 100% 
[2/144] Installing snort3-3.7.1.0,1... 
[2/144] Extracting snort3-3.7.1.0,1: 100% 
[3/144] Installing e2fsprogs-libuuid-1.47.2... 
[3/144] Extracting e2fsprogs-libuuid-1.47.2: 100% 
[4/144] Installing hwloc2-2.11.2... 
[4/144] Extracting hwloc2-2.11.2: 100% 
...

root@sniffer:/home/sniffer #

Також можуть з’являтись різні попереджувальні повідомлення від конкретних пакетів, їх можна сміливо ігнорувати.

Якщо в процесі установки виникнуть якісь проблеми, тобто повідомлення про помилки, і pkg зупиниться на півдорозі, то варто спробувати встановити кожен пакет окремо, вводячи команду pkg install имя_пакета . Таким чином, можна з’ясувати ім’я проблемного пакета і далі спробувати розібратися з ним індивідуально. Часто буває, що імена пакетів змінюються і потрібно просто з’ясувати правильну назву за допомогою pkg search .

Наприкінці ми знову побачимо знайомий промпт. Це означає, що все готове!

2.6. Підключення через SSH

Проводити подальше налаштування систему через консоль (консоллю традиційно називається клавіатура і монітор підключені до системи безпосередньо) вкрай незручно, так як консоль не дозволяє копіювати шматки тексту або команди. Для того, щоб спростити роботу, слід підключитися до системи через мережу, через WiFi, використовуючи протокол віддаленого доступу до оболонки – SSH (Secure Shell). Для цього необхідно мати клієнт SSH на робочому комп’ютері. Якщо Ви є користувачем Unix системи (Linux, *BSD), то проблем не виникне – утиліта ssh напевно присутня у Вашій системі. Для користувачів Windows необхідно встановити SSH клієнт, який називається putty.exe (завантажити його можна за посиланням ), ну або подібний.

Перш ніж виконувати віддалене підключення через SSH, необхідно визначити IP-адресу сніфера у Wi-Fi мережі. Зробити це нескладно: команда ifconfig wlan0 виводить повну інформацію про мережевий інтерфейс, включно з призначеною IP-адресою.

Наприклад, якщо інтерфейсу присвоєно адресу 192.168.168.140, то для підключення до сніфера з робочої машини через SSH потрібно використати відповідну команду з цією адресою:

% ssh [email protected]

Для користувачів putty.exe все трохи складніше – потрібно створити новий сеанс, вказати ім’я користувача та IP-адресу хоста, зберегти цей сеанс і тільки потім натиснути Connect . Докладніше про використання цієї утиліти можна почитати на сайті проекту PuTTY .

У процесі підключення, при першому з’єднанні, SSH клієнт попросить підтвердити наміри встановити з’єднання із зазначеним хостом і лише після цього попросить ввести пароль. Вводимо reffins і якщо все пройшло вдало, спостерігаємо те ж саме запрошення (motd) від системи, після якого слідує той самий промпт:

sniffer@sniffer:~ %

Заради інтересу запитаємо у системи, хто ми є і звідки, введемо команду who :

sniffer@sniffer:~ % who 
sniffer          pts/0        Jul 10 07:01 (192.168.171.1) 
sniffer@sniffer:~ %

Отримаємо привілеї адміністратора, для цього ведемо:

sniffer@sniffer:~ % su 
Password: 1234
root@sniffer:/home/sniffer #

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

2.7. Налаштування `sudo’

Щоб постійно не перебувати в оболонці з правами адміністратора (root-а), що може бути небезпечним через можливість випадково знищити систему невірно введеною командою, в Unix системах прийнято використовувати утиліту sudo (або аналог doas ). Утиліта sudo дозволяє тимчасово для однієї команди, яка передається їй як параметри, підняти привілеї до адміністратора і скинути їх після завершення.

Ми тільки-но встановили утиліту sudo разом з рядом інших пакетів, але цього ще недостатньо для того, щоб користувач sniffer міг їй скористатися. Нам потрібно розкоментувати один рядок у конфігураційному файлі /usr/local/etc/sudo.conf , але редагувати його ми будемо через допоміжну утиліту visudo (вона є частиною пакету sudo ).

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

root@sniffer:/home/sniffer # setenv EDITOR /usr/bin/ee

Тепер викликаємо visudo для редагування конфігураційного файлу:

root@sniffer:/home/sniffer # visudo

Утиліта visudo запустить редактор ee і завантажить поточний вміст конфігураційного файлу. Тут треба бути гранично обережним, щоб випадково не змінити нічого зайвого! Знаходимо у тексті рядок виду:

## Uncomment to allow members of group wheel to execute any command 
# %wheel ALL=(ALL:ALL) ALL

І перед символами %wheel забираємо символ # . Це означає, що цей рядок почне діяти. Її дія зводиться до того, що утиліта sudo дозволить будь-якому користувачеві, що входить до групи wheel , виконувати будь-яку команду від імені root-а. Нагадаю, що коли ми створювали в системі користувача sniffer , ми додавали його до груп wheel і network . В результаті редагування рядок має виглядати так:

%wheel ALL=(ALL:ALL) ALL

Натискаємо ESC , Ener та ще раз Enter щоб зберегти зміни у файл і вийти з ee . З цього моменту sudo дозволить користувачеві sniffer виконувати команди від імені користувача root , тобто з правами адміністратора.

Щоб з’ясувати, до яких груп входить користувач sniffer , можна скористатися командою id наступним чином:

root@sniffer:/home/sniffer # id sniffer 
uid=1002(sniffer) gid=1002(sniffer) groups=1002(sniffer),0(wheel),69(network)

Команда id показує всі системні ідентифікатори вказаного користувача. Тут ми бачимо, що користувач sniffer входить аж до трьох груп: sniffer , wheel і network . Зверніть увагу, що група wheel має ідентифікатор 0 – це група адміністраторів.

Якщо раптом Ви забули додати користувача sniffer до потрібної групи, зробити це можна будь-якої миті командою pw usermod :

root@sniffer:/home/sniffer # pw usermod sniffer -G wheel,network

Ця команда встановлює (заміщає) список груп користувача sniffer .

Перевіримо як працює sudo . Для цього спочатку вийдемо з адміністраторської оболонки, ввівши команду exit , тобто повернемося в оболонку без привілеїв:

root@sniffer:/home/sniffer # exit 
exit 
sniffer@sniffer:~ %

Далі, виконаємо команду id від імені адміністратора:

sniffer@sniffer:~ % sudo id 

We trust you have received the usual lecture from the local System 
Administrator. It usually boils down to these three things: 

    #1) Respect the privacy of others. 
    #2) Think before you type. 
    #3) With great power comes great responsibility. 

For security reasons, the password you type will not be visible.
Password: reffins 
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)

Спочатку sudo попередить про те, що ви намагаєтеся отримати привілеї адміністратора, що несе за собою певну відповідальність і вам слід діяти обережно. Дане попередження з’явиться лише один раз під час першого використання. Далі sudo запросить у Вас пароль від користувача sniffer . Якщо введений пароль вірний, команда id виконується з правами користувача root . Це видно за ідентифікаторами uid=0(root) gid=0(wheel), що відображаються цією командою.

Якщо раптом sudo видасть повідомлення:

sniffer is not in the sudoers file. 
This incident has been reported to the administrator.

Це означає, що користувач sniffer не входить до групи wheel , або в конфігураційному файлі є помилка. Варто ще раз запустити visudo та перевірити наявність рядка %wheel .

Далі ми будемо працювати в оболонці від користувача sniffer без привілеїв, промпт має виглядати так: sniffer@sniffer:~ % . А коли знадобиться виконати команду, яка вимагає привілеїв адміністратора, то будемо використовувати sudo .

3. Досліджуємо апаратну частину

3.1. Отримуємо відомості про апаратуру

Перед тим як перейти до мережевих налаштувань, слід трохи вивчити «залізо», що є у нас. Як зазначалося вище, одноплатний міні-ПК Horizon N5 оснащений мікропроцесором Intel Celeron N5105. Побачимо, що наша система знає про нього. Для цього скористаємося чудовою утилітою cpu-x . Ця утиліта має два режими роботи: інтерактивний і командний.

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

Щоб отримати всю інформацію відразу, можна вказати ключ -D . В обох випадках запускати утиліту cpu-x слід з привілеями адміністратора, наприклад:

sniffer@sniffer:~ % sudo cpu-x
Password: reffins

Після цього з’явиться вікно з текстовим меню як на Мал. 7.

Мал.7. Інформаційне вікно утиліти cpu-x на міні-ПК Rombic Horizon N5.

Або в командному режимі, щоб отримати повний листинг із описом апаратури. Введемо команду:

sniffer@sniffer:~ % sudo cpu-x -D

І отримаємо:

>>>>>>>>>> CPU <<<<<<<<<< 

        ***** Processor ***** 
          Vendor: Intel 
       Code Name: Jasper Lake (Celeron) 
         Package: U3E1 
      Technology: 10 nm 
         Voltage: 1.110 V 
   Specification: Intel(R) Celeron(R) N5095 @ 2.00GHz 
          Family: 0x6 
    Disp. Family: 0x6 
           Model: 0xC 
     Disp. Model: 0x9C 
           Temp.: 48°C 
        Stepping: 0 
    Instructions: MMX, SSE(1, 2, 3, 3S, 4.1, 4.2), AES, CLMUL, RdRand, SHA, VT-x, x86-64 

        ***** Clocks ***** 
      Core Speed: 1996 MHz 
      Multiplier: x20.0 (8-29) 
       Bus Speed: 99.80 MHz 
           Usage:   0.39 % 

        ***** Cache ***** 
         L1 Data: 4 x 32 kB, 8-way 
        L1 Inst.: 4 x 32 kB, 8-way 
         Level 2: 1 x 1536 kB, 12-way 
         Level 3: 4 MB, 16-way 

        ***** * ***** 
           Cores: 4 
         Threads: 4 


  >>>>>>>>>> Caches <<<<<<<<<< 

        ***** L1 Cache ***** 
            Size: 4 x 32 kB, 8-way associative, 64-bytes line size 
           Speed: 83410.70 MB/s 

        ***** L2 Cache ***** 
            Size: 1 x 1536 kB, 12-way associative, 64-bytes line size 
           Speed: 35808.30 MB/s 

        ***** L3 Cache ***** 
            Size: 4 MB, 16-way associative, 64-bytes line size 
           Speed: 24022.30 MB/s 


  >>>>>>>>>> Motherboard <<<<<<<<<< 

        ***** Motherboard ***** 
    Manufacturer: Rombica 
           Model: Default string 
        Revision: Default string 

        ***** BIOS ***** 
           Brand: American Megatrends International, LLC. 
         Version: T9PRO001 
            Date: 10/23/2024 
        ROM Size: 64 kB / 5 MB 

        ***** Chipset ***** 
          Vendor: Intel Corporation 
           Model: Jasper Lake eSPI Controller 


  >>>>>>>>>> Memory <<<<<<<<<< 

        ***** Bank 0 ***** 
       Reference: Samsung                   , 6 GB @ 3733 MT/s (Row Of Chips LPDDR4) 
 
        ***** Bank 1 ***** 
       Reference: Samsung                   , 6 GB @ 3733 MT/s (Row Of Chips LPDDR4) 


  >>>>>>>>>> System <<<<<<<<<< 

        ***** Operating System ***** 
          Kernel: 14.3-RELEASE 
    Distribution: FreeBSD 
        Hostname: sniffer 
          Uptime: 0 days, 1 hours, 54 minutes, 50 seconds 
        Compiler: FreeBSD clang version 19.1.7 (https://github.com/llvm/llvm-project.git llvmorg 

        ***** Memory ***** 
            Used: 0.90 GiB / 11.46 GiB 
         Buffers: 0.00 GiB / 11.46 GiB 
          Cached: 0.00 GiB / 11.46 GiB 
            Free: 10.55 GiB / 11.46 GiB 
            Swap: 0.00 GiB / 4.00 GiB 


  >>>>>>>>>> Graphics <<<<<<<<<< 

        ***** Card 0 ***** 
          Vendor: Intel 
          Driver: 
     UMD Version: 
           Model: JasperLake [UHD Graphics] 
    Compute Unit: 
        DeviceID: 0x4E55:0x01 
   VBIOS Version: 
       Interface: 
     Temperature: 
           Usage: 
    Core Voltage: 
       Power Avg: 
       GPU clock: 
    Memory clock: 
     Memory Used: 
   Resizable BAR: 
       Vulkan RT: 
  OpenGL Version: 
  Vulkan Version: 
  OpenCL Version:

3.2. Проводимо тест Coremark для обчислювального ядра

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

Отримати вихідні коди тесту можна з репозиторію з Github-а наступною командою:

sniffer@sniffer:~ % git clone https://github.com/eembc/coremark.git 
Cloning into 'coremark'... 
remote: Enumerating objects: 412, done. 
remote: Counting objects: 100% (175/175), done. 
remote: Compressing objects: 100% (70/70), done. 
remote: Total 412 (delta 136), reused 115 (delta 105), pack-reused 237 (from 2) 
Receiving objects: 100% (412/412), 542.69 KiB | 1.51 MiB/s, done. 
Resolving deltas: 100% (234/234), done.

Привілеї адміністратора при цьому не потрібні. Складання та запуск тесту виконується відразу однією командою:

sniffer@sniffer:~ % cd coremark && gmake

При цьому буде виконано два прогони тесту з дещо різними параметрами. Результати тестів будуть поміщені у файли ./run1.log та ./run2.log . Нас цікавить перший прогін (performance). Щоб відобразити результат скористаємося командою cat :

sniffer@sniffer:~/coremark % cat run1.log 

2K performance run parameters for coremark. 
CoreMark Size    : 666 
Total ticks      : 16601 
Total time (secs): 16.601000 
Iterations/Sec   : 18071.200530 
Iterations       : 300000 
Compiler version : FreeBSD Clang 19.1.7 (https://github.com/llvm/llvm-project.git llvmorg-19.1.7-0-gcd708029e0b2) 
Compiler flags   : -O2 -DPERFORMANCE_RUN=1  -lrt 
Memory location  : Please put data memory location here 
                        (e.g. code in flash, data on heap etc) 
seedcrc          : 0xe9f5 
[0]crclist       : 0xe714 
[0]crcmatrix     : 0x1fd7 
[0]crcstate      : 0x8e3a 
[0]crcfinal      : 0xcc42 
Correct operation validated. See README.md for run and reporting rules. 
CoreMark 1.0 : 18071.200530 / FreeBSD Clang 19.1.7 (https://github.com/llvm/llvm-project.git llvmorg-19.1.7-0-gcd708029e0b2) -O2 -DPERFORMANCE_RUN=1  -lrt / Heap

Цифра, що цікавить нас, виділена жирним і становить 18071 одиниць. Часто цей показник переводять у нормовані одиниці на 1 МГц. У нашому випадку це число слід розділити на тактову частоту 1999. Отримаємо 9.0 одиниць Coremark/MHZ .

Важливо, що за умовчанням програма тестує лише одне обчислювальне ядро. Щоб перевірити сумарну продуктивність всіх ядер, необхідно розпаралелити тест на кількість ядер мікропроцесора. Як повідомляє утиліта cpu-x , мікропроцесор Intel Celeron N5095 має 4 паралельні нитки виконання програм. Виконаємо тест на всіх чотирьох нитках:

sniffer@sniffer:~/coremark % gmake clean 
rm -f ./coremark.exe ./core_list_join.o ./core_main.o ./core_matrix.o ./core_state.o ./core_util.o ./*.log *.info ./index.html 

sniffer@sniffer:~/coremark % gmake XCFLAGS="-DMULTITHREAD=4 -DUSE_FORK" 

sniffer@sniffer:~/coremark % cat run1.log 
2K performance run parameters for coremark. 
CoreMark Size    : 666 
Total ticks      : 16682 
Total time (secs): 16.682000 
Iterations/Sec   : 71933.820885 
Iterations       : 1200000 
Compiler version : FreeBSD Clang 19.1.7 (https://github.com/llvm/llvm-project.git llvmorg-19.1.7-0-gcd708029e0b2) 
Compiler flags   : -O2 -DMULTITHREAD=4 -DUSE_FORK -DPERFORMANCE_RUN=1  -lrt 
Parallel Fork : 4 
Memory location  : Please put data memory location here 
                        (e.g. code in flash, data on heap etc) 
seedcrc          : 0xe9f5 
[0]crclist       : 0xe714 
[1]crclist       : 0xe714 
[2]crclist       : 0xe714 
[3]crclist       : 0xe714 
[0]crcmatrix     : 0x1fd7 
[1]crcmatrix     : 0x1fd7 
[2]crcmatrix     : 0x1fd7 
[3]crcmatrix     : 0x1fd7 
[0]crcstate      : 0x8e3a 
[1]crcstate      : 0x8e3a 
[2]crcstate      : 0x8e3a 
[3]crcstate      : 0x8e3a 
[0]crcfinal      : 0xcc42 
[1]crcfinal      : 0xcc42 
[2]crcfinal      : 0xcc42 
[3]crcfinal      : 0xcc42 
Correct operation validated. See README.md for run and reporting rules. 
CoreMark 1.0 : 71933.820885 / FreeBSD Clang 19.1.7 (https://github.com/llvm/llvm-project.git llvmorg-19.1.7-0-gcd708029e0b2) -O2 -DMULTITHREAD=4 -DUSE_FORK -DPERFORMANCE_RUN=1  -lrt / Heap / 4:Fork

В результаті отримуємо 71933 Coremark на всі чотири ядра.

Щоб зрозуміти, багато це чи мало, можна порівняти з аналогічними вимірами, виконаними для відомих систем. Готові вимірювання можна переглянути на сайті EEMBC. Для порівняння, RaspberryPI 5 з тактовою частотою 2.5 МГц видає 72 059 одиниць, а мій ноутбук Lenovo з процесором AMD Ryzen5 і частотою 3.3 ГГц видає 303 116 одиниць Coremark. Очевидно, що міні-ПК, що є в нашому розпорядженні, не поступається популярному одноплатному ПК RaspberryPI 5, але майже на порядок відстає від серйозних десктопних систем.

3.3. Проводимо тест STREAM для оперативної пам’яті

Давно відомо, що вузьким місцем у сучасних обчислювальних системах є пам’ять, її недостатня швидкість може радикально знизити продуктивність всієї системи. Тест STREAM складається з чотирьох операцій: вимірювання продуктивності операції копіювання (copy), масштабування (scale), складання вмісту осередків (add) та комплексних операцій: масштабування + додавання + пересилання (triad). Як і тест Coremark, тест STREAM є усталеним промисловим стандартом, детальніше прочитати про нього можна за посиланням: https://documentation.sigma2.no/jobs/arm-perf/stream.html

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

sniffer@sniffer:~ % git clone https://github.com/jeffhammond/STREAM.git 

Cloning into 'STREAM'... 
remote: Enumerating objects: 89, done. 
remote: Counting objects: 100% (38/38), done. 
remote: Compressing objects: 100% (14/14), done. 
remote: Total 89 (delta 31), reused 24 (delta 24), pack-reused 51 (from 2) 
Receiving objects: 100% (89/89), 32.88 KiB | 320.00 KiB/s, done. 
Resolving deltas: 100% (50/50), done.

Перейдемо в підкаталог з вихідним кодом і виконаємо складання:

sniffer@sniffer:~ % cd STREAM && gmake

В результаті складання у нас утворюється файл, що виконується, з ім’ям stream_c.exe. Запустимо його:

sniffer@sniffer:~/STREAM % ./stream_c.exe 

------------------------------------------------------------- 
STREAM version $Revision: 5.10 $ 
------------------------------------------------------------- 
This system uses 8 bytes per array element. 
------------------------------------------------------------- 
Array size = 10000000 (elements), Offset = 0 (elements) 
Memory per array = 76.3 MiB (= 0.1 GiB). 
Total memory required = 228.9 MiB (= 0.2 GiB). 
Each kernel will be executed 10 times. 
 The *best* time for each kernel (excluding the first iteration) 
 will be used to compute the reported bandwidth. 
------------------------------------------------------------- 
Number of Threads requested = 4 
Number of Threads counted = 4 
------------------------------------------------------------- 
Your clock granularity/precision appears to be 1 microseconds. 
Each test below will take on the order of 7411 microseconds. 
   (= 7411 clock ticks) 
Increase the size of the arrays if this shows that 
you are not getting at least 20 clock ticks per test. 
------------------------------------------------------------- 
WARNING -- The above is only a rough guideline. 
For best results, please be sure you know the 
precision of your system timer. 
------------------------------------------------------------- 
Function    Best Rate MB/s  Avg time     Min time     Max time 
Copy:           14527.0     0.011080     0.011014     0.011218 
Scale:          13139.5     0.012274     0.012177     0.012343 
Add:            12786.4     0.018830     0.018770     0.018882 
Triad:          12819.8     0.018799     0.018721     0.018890 
------------------------------------------------------------- 
Solution Validates: avg error less than 1.000000e-13 on all three arrays 
-------------------------------------------------------------

У результаті бачимо, що операції копіювання виконуються зі швидкістю близько 14 ГБ/сек . Для порівняння, на моєму ноутбуці Lenovo цей показник досягає 18 ГБ/сек , але треба відзначити, що в Horizon N5 використовується високошвидкісна пам’ять LPDDR4, така ж як і в моєму ноуті, тому результати дуже близькі. На серйозних серверних платформах тест STREAM може показувати 120 ГБ/сек (і більше) для операцій копіювання.

Ще один цікавий момент та побічний результат вимірювання продуктивності за допомогою STREAM – це коефіцієнт помилок, який показує надійність усієї підсистеми оперативної пам’яті. У наведеному прикладі тест показує, що коефіцієнт помилок становить менше 1.000000e-13 тобто їх взагалі не зафіксовано. Гарна ознака!

З апаратною частиною розібралися та зробили відповідні висновки. Обчислювальних ресурсів системи цілком достатньо, щоб проводити нескладні виміри трафіку і навіть аналізувати його «на льоту».

4. Настойка каналу для віддаленого доступу до пристрою (mpd5)

На наступному етапі налаштування сніфера важливо визначити спосіб віддаленого доступу до пристрою. Існують різні підходи, однак у більшості випадків для керування Unix-системами використовується протокол SSH, який є стандартом де-факто та забезпечує безпечний канал зв’язку.

Користувачам Windows зазвичай більш звичний RDP, і таку опцію також можна реалізувати, проте для задач даного проєкту основний фокус робиться саме на SSH.

У Unix системах підключення по SSH здійснюється однойменною командою ssh, що входить у пакет OpenSSH. Цей пакет є частиною багатьох операційних систем і вже встановлений у процесі інсталяції. Команда ssh приймає на вхід обов’язковий параметр виду username@hostname або username@xxxx , де xxxx — IP адреса машини. З username все зрозуміло, це ім’я користувача в системі, в нашому випадку це користувач sniffer . А ось з IP адресою (і тим більше з ім’ям хоста, яке можна перетворити на IP адресу) є низка проблем. Як нам дізнатися яку IP адресу у машини сніфера коли вона встановлена, наприклад, у абонента в квартирі? Понад те, навіть ми дізнаємося цей IP, то користі від цього знання немає ніякого, оскільки у домашній мережі абонента завжди використовуються «фейкові», тобто. публічно не маршрутизовані IP адреси, а сам абонент знаходиться за одним і більше транслятором адрес ( NAT – Network Adress Translation). Все це НЕ дозволяє встановити з’єднання з хостом сніфера розташованого всередині домашньої мережі абонента, перебуваючи за її межами. Але що ж робити?

Рішень кілька. Можна скористатися засобами самого ssh для організації зворотного тунелю (SSH Reverse Tunneling) за допомогою опції -R до відомого та публічно доступного хосту Unix, до якого у Вас є доступ. Це рішення не просте в тому плані, що вимагає навичок у використанні Unix систем та розуміння процесу, що відбувається, тому розглядати тут його не будемо. Бажаючі можуть ознайомитися з інструкцією з настроювання зворотного тунелю в Інтернеті.

На місце цього розглянемо більш традиційний спосіб – організація тунелю до відомого публічного хосту за протоколами PPTP (або L2TP) відомих широкому загалу як Virtual Private Network (VPN). Ця технологія дозволяє об’єднувати розкидані глобальною мережею хости компанії в єдину мережу. Гідність VPN технології полягає в тому, що Вам не потрібно організовувати свій PPTP/L2TP сервер, достатньо звернутися до найближчого провайдера послуг Інтернет з проханням організувати для Ваших службових потреб обліковий запис з фіксованою публічною IP адресою. Така послуга буде не безкоштовною, зате знімає масу проблем. Зрозуміло, Ви також можете орендувати в Інтернет провайдера віртуальний сервер з ОС Linux і організувати на ньому свій службовий VPN сервер, але це тема окремої розмови.

Коротше, будемо вважати, що проблема отримання облікового запису до сервера VPN якимось чудовим чином вирішена і у Вас є чотири рядки тексту: IP адреса PPTP сервера, нехай це буде 1.2.3.4 , ім’я користувача: pptp_username та пароль: pptp_password . Також ми знаємо, що після підняття з’єднання з сервером на стороні клієнта завжди буде встановлена ​​та сама публічна IP адреса 4.3.2.1 .

Наше завдання на даному етапі полягає в тому, щоб налаштувати PPTP або L2TP клієнта на машині сніффера. Треба зауважити, що організацією тунелів за протоколами PPTP та L2TP в операційній системі FreeBSD займається демон (фонова утиліта) mpd5, установку якої вже виконали раніше. Насправді всю роботу з інкапсуляції трафіку виконує підсистема netgraph (введіть команду man 4 netgraph для більш детального ознайомлення), а mpd5 це лише надводна частина цього айсберга виконує авторизацію та конфігурування мережного інтерфейсу.

Всі налаштування демона mpd5 знаходяться в каталозі /usr/local/etc/mpd5/ , зазвичай там розташовуються всього три файли: mpd.conf , mpd.script і mpd.secret . Нам потрібно внести зміни до файлу mpd.conf — додати секцію з описом з’єднання, і створити два нові файли-скрипти. Один скрипт (назвемо його ifup.sh ) для додавання специфічних маршрутів до таблиці маршрутизації при встановленні з’єднання, а інший ( ifdown.sh ) для видалення їх при роз’єднанні. А ще нам потрібно внести зміни до системного файлу конфігурації операційної системи /etc/rc.conf , щоб виконувати авто-запуск mpd5 при завантаженні ОС.

Використовуючи редактор ee від імені root-а відкриваємо файл /usr/local/etc/mpd5/mpd.conf командою :

sniffer@sniffer:~ % sudo ee /usr/local/etc/mpd5/mpd.conf

Копіюємо в буфер обміну і вставляємо на початок файлу наступний текст:

startup: 
        log +ALL +EVENTS -FRAME -ECHO 

default: 
        load PPTP 

L2TP: 
        create bundle static B1 

        set iface up-script /usr/local/etc/mpd5/ifup.sh 
        set iface down-script /usr/local/etc/mpd5/ifdown.sh 

        set iface enable tcpmssfix 
        set ipcp yes vjcomp 

        set ccp yes mppc 
        set mppc yes e128 
        set mppc yes stateless 

        create link static L1 l2tp 
        set link action bundle B1 
        set link max-redial 0 
        set link mtu 1460 
        set link keep-alive 20 75 
        set link accept chap-msv2 

        set l2tp peer 1.2.3.4 
        set auth authname "l2tp_username" 
        set auth password "l2tp_password" 

        open 

PPTP: 

        create bundle static B1 
        set bundle enable compression 
        set ccp yes mppc 
        set mppc no e40 
        set mppc yes e128 
        set mppc yes stateless 

        set iface up-script /usr/local/etc/mpd5/ifup.sh 
        set iface down-script /usr/local/etc/mpd5/ifdown.sh 
         
        create link static L1 pptp 
        set link action bundle B1 
        set link max-redial 0 
        set link mtu 1460 
        set link keep-alive 20 75 
        set pptp disable windowing 

        set pptp peer 1.2.3.4
        set auth authname "pptp_username" 
        set auth password "pptp_password" 

        open

Перед збереженням необхідно підмінити IP-адресу сервера, ім’я користувача та пароль, а також вибрати яку з двох протоколів буде використовуватися. Знаходимо наступні рядки:

set l2tp peer 1.2.3.4 
       set auth authname "l2tp_username" 
       set auth password "l2tp_password" 

       set pptp peer 1.2.3.4
       set auth authname "pptp_username" 
       set auth password "pptp_password"

Та замінює значення параметрів на дійсні, отримані від Інтернет-провайдера.

Для вибору протоколу на початку шукаємо рядки:

default: 
        load PPTP

І замінюємо load PPTP на load L2PT , якщо потрібно використовувати протокол L2PT. Інакше залишаємо як є. Виходимо з редактора ee , як завжди, послідовним натисканням: ESC , Enter , Enter .

Наступним кроком створюємо файли cкриптів для підняття мережного інтерфейсу. Відкриваємо в редакторі ee спочатку файл ifup.sh :

sniffer@sniffer:~ % sudo ee /usr/local/etc/mpd5/ifup.sh

Копіюємо та вставляємо в нього наступний текст:

#!/bin/sh 
echo $* > /tmp/.mpd5.$1 
wanip=`/sbin/route -n get default | sed -rn 's/gateway: (.*)/\1/p'` 
echo $wanip > /tmp/.defaultgateway 
localip=$3 
remoteip=$4 
serverip=$8 
echo localip=$3 remoteip=$4 serverip=$8 >> /tmp/.mpd5.$1 
/sbin/route delete $serverip 
/sbin/route add $serverip $wanip 
/sbin/route delete default 
/sbin/route add default $remoteip

Зберігаємо файл (ESC, Enter, Enter) і потім відкриваємо інший файл ifdown.sh :

sniffer@sniffer:~ % sudo ee /usr/local/etc/mpd5/ifdown.sh

Копіюємо та вставляємо в нього наступний текст:

#!/bin/sh 
wanip=`cat /tmp/.defaultgateway` 
/sbin/route delete $4 
/sbin/route delete default 
/sbin/route add default $wanip 
rm /tmp/.defaultgateway

І також зберігаємо.

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

В ОС FreeBSD процес авто-запуску програм, та й багато інших аспектів завантаження системи, контролюються набором скриптів, які прийнято називати rc – на ім’я головного скрипта. Налаштування автозапуску розміщуються у файлі /etc/rc.conf . Цей файл можна редагувати звичайним текстовим редактором ( ee ), але так робити не прийнято з цілком зрозумілої причини – непомітна помилка в цьому файлі загрожує виведенням системи з обороту. Для того, щоб вносити зміни в файл конфігурації безпечним способом служить окрема утиліта sysrc .

Скористайтеся утилітою sysrc для додавання mpd5 в /etc/rc.conf , виконаємо наступні команди:

sniffer@sniffer:~ % sudo sysrc mpd_enable="YES" 
Password: 
mpd_enable:  -> YES 

sniffer@sniffer:~ % sudo sysrc mpd_flags="-b" 
mpd_flags:  -> -b

Остання команда додає /etc/rc.conf прапор -b який буде переданий утиліті mpd5 при старті і сигналізує їй про необхідність працювати у фоновому режимі (тобто демоном).

Тепер можемо запустити mpd5 та подивитися що у нас вийшло. Запуск системних демонів, тобто тих, що керуються через rc , в ОС FreeBSD здійснюється утилітою service . Виконаємо запуск mpd5 наступною командою:

sniffer@sniffer:~ % sudo service mpd5 start 
Starting mpd5.

Якщо це пройшло гладко, тобто. у конфігах немає друкарських помилок, а всі налаштування (IP адреса сервера, ім’я користувача та пароль) коректні, то в системі повинен з’явиться ще один мережевий інтерфейс з ім’ям ng0 . Переглянути його параметри можна командою ifconfig ng0 (для перегляду права root-а не потрібні):

sniffer@sniffer:~ % ifconfig ng0 
ng0: flags=10088d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1456 
        options=0 
        inet 192.168.176.135 --> 192.168.176.1 netmask 0xffffffff 
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

Тут бачимо, що сервер видав мені IP адресу 192.168.176.135. У Вашому випадку тут має висвічуватися фіксована публічна IP адреса, яка видана Вам провайдером, тобто 4.3.2.1 .

Якщо щось пішло не так, і замість IP адреси на інтерфейс нічого немає, тобто якось так:

sniffer@sniffer:~ % ifconfig ng0 
ifconfig: interface ng0 does not exist

Це означає, що mpd5 не запущено або навіть не встановлено.

Або ось так:

sniffer@sniffer:~ % ifconfig ng0 
ng0: flags=8890<POINTOPOINT,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1500 
        options=0 
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

Це означає, що mpd5 запустився, але встановити з’єднання PPTP або L2TP у нього не вийшло. Щоб з’ясувати причину необхідно заглянути в лог файл /var/log/daemon.log , у нього утиліта mpd5 видає величезну кількість діагностичної інформації. За допомогою утиліти grep виберемо інформацію з цього файлу щодо встановлення з’єднання:

Наприклад:

sniffer@sniffer:~ % grep mpd /var/log/daemon.log

...
Jul 10 09:04:48 sniffer mpd[2986]: [L1] CHAP: Using authname "Sniffer" 
Jul 10 09:04:48 sniffer mpd[2986]: [L1] CHAP: sending RESPONSE #1 len: 61 
Jul 10 09:04:48 sniffer mpd[2986]: [L1] CHAP: rec'd FAILURE #1 len: 31 
Jul 10 09:04:48 sniffer mpd[2986]: [L1]   MESG: E=691 R=0 M=Login incorrect 
Jul 10 09:04:48 sniffer mpd[2986]: [L1] LCP: authorization failed 
Jul 10 09:04:48 sniffer mpd[2986]: [L1] LCP: parameter negotiation failed 
Jul 10 09:04:48 sniffer mpd[2986]: [L1] LCP: state change Opened --> Stopping 
Jul 10 09:04:48 sniffer mpd[2986]: [L1] LCP: phase shift AUTHENTICATE --> TERMINATE 
Jul 10 09:04:48 sniffer mpd[2986]: [L1] AUTH: Cleanup 
...

З цього лога видно, що була зроблена спроба використовувати ім’я користувача Sniffer , що призвело до повідомлення « Loging incorrect» через друкарську помилку в першому символі. Необхідно відкрити файл /usr/local/etc/mpd5/mpd.conf у редакторі ee та виправити помилку, після чого виконати команду перезапуску mpd5 :

sniffer@sniffer:~ % sudo service mpd5 restart 
Stopping mpd5. 
Waiting for PIDS: 2986. 
Starting mpd5.

і відразу перевірити:

sniffer@sniffer:~ % ifconfig ng0 
ng0: flags=10088d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1456 
        options=0 
        inet 192.168.176.135 --> 192.168.176.1 netmask 0xffffffff 
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

Якщо все ок, IP адреса на інтерфейсі ng0 присутня, то можна підключатися до сніфер на цю IP адресу наступною командою зі свого робочого ПК:

$ ssh [email protected]

Де 4.3.2.1 — IP адреса на тунельному інтерфейсі, він призначений Вашим провайдером. У моєму випадку це адреса 192.168.176.135 , вона є локальною для моєї мережі і використана тільки для демонстрації.

З цього моменту у Вас з’являється можливість віддаленого підключення до сніфер через глобальну мережу Інтернет, а пароль користувача sniffer слід поміняти на щось більш безпечне або зробити авторизацію по несиметричним ключам.

Висновок

У першій частині ми пройшли весь фундаментальний шлях — від появи самої ідеї автономного мережевого сніфера до повноцінної підготовки системного середовища на базі FreeBSD. На практиці було показано, яке обладнання підходить для створення компактного інструмента діагностики, як встановити операційну систему, виконати початкове налаштування, підключитися через SSH та підготувати необхідні пакети для подальшої роботи. Ми розглянули апаратні можливості міні-ПК, провели базові тести продуктивності й переконалися, що навіть компактні пристрої здатні забезпечити достатній ресурс для аналізу мережевого трафіку.

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

Підписатися
Сповістити про
0 Коментарі
Найстаріші
Найновіше Найбільше голосів
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.