Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МІТ-лекції-2014.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
8.65 Mб
Скачать

Література

  1. Полное руководство по FreeBSD - попытка создания более читабельного, "книгоподобного" учебника, описывающего операционную систему FreeBSD. Предназначена для тех, кто является новичком как во FreeBSD, так и в UNIX. На данный момент находится в разработке.

Тема 3. Мережева підсистема FreeBsd

Внутрішня структура мережевої підсистеми FreeBSD

Як відомо, для вирішення складних завдань використовується універсальний прийом - декомпозиція, тобто розбиття однієї складної задачі на декілька простих. Наприклад, для опису взаємодії між вузлами в мережі використовується семирівнева модель OSI, яка розбиває весь складний процес обміну даними на більш прості підзадачі. Кожна являє собою окремий рівень виконує певну йому функцію. Тому взаємодія комп'ютера з мережею теж краще представити у вигляді декількох рівнів, а точніше, у вигляді трирівневої мережевої моделі, в якій розрізняють фізичний рівень, рівень протоколів і черги, які об'єднують їх (див. рис. 3.1). Кожен з них має свої характеристики і настройки, і хоча вони відносно незалежні між собою, неправильне налаштування одного з них може призвести до некоректної роботи всієї моделі. Наприклад, неправильна робота фізичної частини призведе до того, що при сильному трафіку система буде "затоплена" перериваннями, або невірно налаштований TCP/IP може стати причиною низької продуктивності протоколу. І хоча при цьому будуть ідеально налаштовані інші 2 рівня, мережева підсистема по раніше не буде працювати на повну силу.

Рисунок 3.1 – Структура мережі

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

Потім слід рівень черг, де відбувається розміщення пакетів в черзі на прийом і відправку. Цей рівень виконують транспортну роль, доставляючи пакети з стека протоколів TCP/IP у фізичну частину і навпаки. І хоча настройка тут тривіальна, проте, при передачі даних на великі відстані доведеться трохи подумати. І останній, найвищий – це рівень протоколів, на якому розташовується стек TCP/IP. Зокрема, IP протокол мережевого рівня, що відповідає за доставку пакета від одного хоста до іншого. Тут відбувається обробка всіх TCP/IP пакетів. У процесі обробки вирішується подальша доля пакета. Якщо вузол виконує роль маршрутизатора і прийшов пакет не призначається йому, то, швидше за все, пакет буде переправлений далі в мережу (або відкинутий, залежно від правил маршрутизації), минаючи протоколи більш високих рівнів (TCP, UDP). Але, якщо вузол є кінцевим одержувачем, то пакет буде переданий вище по стеку на транспортний рівень, де піддасться подальшій обробці. І хоча в стеку TCP/IP транспортну роль виконують 2 протоколи, TCP і UDP, у цій статті описується робота тільки TCP протоколу, так як UDP не потребує якої б то не було налаштуванні. До того ж, він рідко де застосовується для надійної передачі даних на великій швидкості, одним з небагатьох прикладів є файлова система NFS. В основному, всі веб, файл і FTP сервера використовують TCP в якості транспортного протоколу, від правильності роботи якого залежить дуже багато. Зазвичай настройка TCP зводиться до того, щоб задати правильні значення буферів, невірний розмір яких може стати причиною вичерпання ресурсів на вузлі або, що менш критично, низької продуктивності протоколу. До того ж, в TCP присутня безліч різних алгоритмів, які обтяжують його, і часто в їх використанні немає необхідності, так що їх відключення лише врятує пару тисяч тактів на процесорі.

Можна помітити, що налаштування всіх трьох рівнів потрібно далеко не завжди, все залежить від того, якого роду трафік обробляється на вузлі. Умовно, за рівнем взаємодії з вузлом, весь трафік у мережі можна розділити на 2 категорії – власний і маршрутний (рис. 3.2).

Рисунок 3.2 – Модель взаємодії мережевого стека при власному трафіку (а), при маршрутному (б)

Власна трафік належить усім 3-м рівнями мережевої моделі, так як він породжується самим верхнім рівнем, а відправляється самим нижнім (рис. 3.2а). Відбувається це таким чином:

  • додаток генерує деякі дані і відправляє їх в стек TCP/IP;

  • в модулі протоколу TCP/IP дані формуються у пакети, які надходять в чергу на відправлення;

  • з черги на відправку пакети надходять на мережевий інтерфейс, з якого йдуть прямо в мережу.

При прийомі дані рухаються за цією ж схемою, тільки у зворотному напрямку - від мережевого інтерфейсу до додатка.

Для маршрутного трафіку схема (рис. 3.2б) виглядають дещо інакше:

  • після отримання пакету мережевою картою, він надходить в чергу на обробку;

  • потім, пакет потрапляє в модуль IP протоколу, де і визначається його подальший маршрут;

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

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

Ієрархія мережевих інтерфейсів

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

Мережевий протокол в комп'ютерних мережах – заснований на стандартах набір правил, що визначає принципи взаємодії комп'ютерів в мережі. Протокол також задає загальні правила взаємодії різноманітних програм, мережевих вузлів чи систем і створює таким чином єдиний простір передачі. Хости (будь-який вузол мережі що відправляє або приймає дані через мережу називають хостом (host)) взаємодіють між собою. Для того, щоб прийняти і обробити відповідним чином повідомлення, їм необхідно знати як сформовані повідомлення і що вони означають. Прикладами використання різних форматів повідомлень в різних протоколах можуть бути встановлення з'єднання з віддаленою машиною, відправка повідомлень електронною поштою, передача файлів. Зрозуміло, що різні служби використовують різні формати повідомлень.

Протокол описує:

  • Формат повідомлення, якому застосунки зобов'язані слідувати;

Спосіб обміну повідомленнями між комп'ютерами в контексті визначеної дії, як, наприклад, пересилка повідомлення по мережі.

Різні протоколи найчастіше описують лише різні сторони одного типу зв'язку й, узяті разом, утворюють стек протоколів. Назви «протокол» і «стек протоколів» також вказують на програмне забезпечення, яке реалізує протоколи.

Нові протоколи для Інтернету визначаються IETF, інші протоколи – IEEE або ISO. ITU-T займається телекомунікаційними протоколами та форматами.

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

Також дуже важливо розрізняти два схожі за назвою, але діаметрально протилежні за властивостями, терміни - маршрутизований протокол та протокол маршрутизації. Ще більша плутанина виникає з оригінальною назвою - routed&routing protocols.

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

Приклади маршрутизованих протоколів - Інтернет-протокол (IP), протокол міжмережевого пакетного обміну IPX тощо. Легше всього зрозуміти що таке маршрутизовані протоколи, якщо пам'ятати, що це протоколи передачі даних.

  • Протокол маршрутизації - такий протокол, який підтримує маршрутизовані протоколи і надає механізми обміну маршрутною інформацією. Повідомлення протоколу маршрутизації передаються між маршрутизаторами (роутерами). Протокол маршрутизації дозволяє роутерам обмінюватись інформацією між собою для оновлення записів і підтримки таблиці маршрутизації.

Приклади протоколів маршрутизації: RIP, IGRP, EIGRP, OSPF. Легше зрозуміти, що таке протоколи маршрутизації, якщо пам'ятати, що це протоколи обміну маршрутною інформацією.

Для того, щоб протокол був маршрутизованим, він має включати механізми призначення як номера мережі, так і номера вузла для кожного пристрою в мережі. В деяких протоколах, як, наприклад, IPX необхідно визначати лише адресу мережі, оскільки в якості адреси пристрою ця технологія використовує фізичну адресу (MAC-адресу) пристрою. Інші протоколи, як IP-протокол, вимагають явного задання повної адреси і маски підмережі.

Таблиця 3.1 – Деякі мережеві протоколи

Фізичний рівень

ISDN

RS-232

Канальний рівень

Ethernet

Token ring

Fibre Channel

Мережевий рівень

ICMP

IP

IPX

Транспортний рівень

SPX

TCP

UDP

Прикладний рівень

binkp

DHCP

DNS

Finger

FTP

Gnutella

Gopher

HTTP

HTTPS

IMAP

IRC

Jabber

LDAP

NTP

NNTP

POP3

SSH

SMTP

Telnet

SNMP

Сокети, їх типи і особливості роботи

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

Сокети існують в областях зв'язку (доменах). Домен сокета – це абстракція, яка визначає структуру адресації і набір протоколів. Сокети можуть з'єднуватися тільки з сокетами в тому ж самому домені. Всього визначено 23 класу сокетів (див. <sys/socket.h>), з яких зазвичай використовуються тільки UNIX-сокети та Інтернет-сокети. Сокети можуть використовуватися для встановлення зв'язку між процесами на окремій системі, подібно до інших форм IPC.

Клас сокетів UNIX забезпечує адресний простір сокетів для окремої обчислювальної системи. Сокети області UNIX називаються іменами файлів UNIX. Сокети також можна використовувати, щоб організувати зв'язок між процесами на різних системах. Адресний простір сокетів між пов'язаними системами називають доменом Інтернету. Комунікації домену Інтернету використовують стек протоколів TCP/IP.

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

  • потоковий сокет – забезпечує двосторонній, послідовний, надійний, і недубльовані потік даних без певних кордонів. Тип сокета – SOCK_STREAM, в домені Інтернету він використовує протокол TCP.

  • датаграмний сокет – підтримує двосторонній потік повідомлень. Додаток, що використовує такі сокети, може отримувати повідомлення в порядку, відмінному від послідовності, в якій ці повідомлення надсилалися. Тип сокета – SOCK_DGRAM, в домені Інтернету він використовує протокол UDP.

  • сонет послідовних пакетів – забезпечує двосторонній, послідовний, надійний обмін датаграму фіксованою максимальної довжини. Тип сокета – SOCK_SEQPACKET. Для цього типу сокета не існує спеціального протоколу.

  • простий сокет - забезпечує доступ до основних протоколах зв'язку.

Всі сокети зазвичай орієнтовані на застосування датаграмм, але їх точні характеристики залежать від інтерфейсу, забезпечуваного протоколом. Обмін між сокетами відбувається за такою схемою рисунок 3.3.

Рисунок 3.3 – Протокол обміну по сокетам

Розглянуто підходи міжпроцесної взаємодії в UNIX з використанням файлових сокетів та інтерфейсу для їх реалізації. Подано можливості використання парних сокетів як каналів для взаємодії споріднених процесів. Запропоновано можливості програмної реалізації мережевих неблокуючих сокетів для взаємодії між клієнтом і сервером.

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

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

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

Мовою користувача UNIX локальні сокети це пряма заміна loopback адреси 127.0.0.1 і портів, прямим лінком. Тобто наприклад адресу 127.0.0.1:3306 може бути замінена unix:/tmp/mysql.sock. Тобто сокети відображаються у вигляді файлів, що підвищує рівень безпеки і швидкість взаємодії.

Буферизація

Буферизація (від англ. Buffer) – метод організації обміну, зокрема, введення і виведення даних у комп'ютерах та інших обчислювальних пристроях, який передбачає використання буфера для тимчасового зберігання даних. При введенні даних одні пристрою або процеси роблять запис даних в буфер, а інші - читання з нього, при виводі – навпаки. Процес, який виконав запис в буфер, може негайно продовжувати роботу, не чекаючи, поки дані будуть оброблені іншим процесом, якому вони призначені. У свою чергу, процес, який обробив деяку порцію даних, може негайно прочитати з буфера наступну порцію. Таким чином, буферизація дозволяє процесам, яка провадить введення, висновок і обробку даних, виконуватися паралельно, чи не чекаючи, поки інший процес виконає свою частину роботи. Тому буферизація даних широко застосовується в багатозадачних ОС.

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

Терміни «прозора» і «непрозора» буферизація не зовсім вдалі, оскільки можуть дещо збивати з пантелику. У якості більш вдалих можна було б запропонувати терміни, відповідно, «невидима» і «видима буферизація».

В FreeBSD буферизація здійснюється в віртуальну пам’ять ОС, якщо її буде вичерпано то недолік пам’яті компенсується swap розділом жорсткого диску.

Визначення конфігурації мережевих інтерфейсів

Конфігурація інтерфейсів визначається відповідно до параметрів мережі до якої підключається комп’ютер. Якщо це звичайна локальна мережа, треба знати параметри налаштувань відповідно: IP-адресу, маску підмережі, шлюз (якщо необхідно), і адресу DNS серверу (теж якщо необхідно). В деяких локальних мережах є DHCP сервери, які надають автоматичні налаштування мережі, але якщо ця мережа публічна це не дуже безпечний метод, будь-яка динаміка може бути наруку зловмиснику, тому статичні налаштування набагато безпечніші і надають повну автономію мережевому інтерфейсу. Якщо ж інтерфейс підключається до мережі Інтернет, тут вже постає безліч варіантів можливих конфігурацій, які в обов’язковому порядку мають бути надані провайдером мережі. Також глобальна мережа поступово переходить на новий протокол IPv6, який теж можна налаштовувати, якщо є необхідність, але від дуже рідко використовується в локальних мережах, і навіть в глобальних зокрема в Україні його не дуже розповсюджено.

Для локальних (приватних) мереж мають використовуватись строго такі діапазони адрес визначені IANA:

IPv4

10.0.0.0 – 10.255.255.255 (Маска підмережі 255.0.0.0 або для безкласової адресації /8);

172.16.0.0 – 172.31.255.255 (Маска підмережі 255.240.0.0 або для безкласової адресації /12);

192.168.0.0 – 192.168.255.255 (Маска підмережі 255.255.0.0 або для безкласової адресації /16);

IPv6

fc00::/7 – 7-бітний префікс адреси.

У термінології мереж TCP/IP маскою підмережі або маскою мережі називається бітова маска, визначальна, яка частина IP-адреси вузла мережі відноситься до адреси мережі, а яка - до адресою самого вузла в цій мережі. Наприклад, вузол з IP-адресою 12.34.56.78 і маскою підмережі 255.255.255.0 знаходиться в мережі 12.34.56.0/24 з довжиною префікса 24 біта. У разі адресації IPv6 адресу 2001:0 DB8: 1:0:6 C1F: A78A: 3CB5: 1ADD з довжиною префікса 32 біта (/32) знаходиться в мережі 2001:0 DB8 ::/32.

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

Приклад: У якоїсь мережі класу C є 30 комп'ютерів, маска для такої мережі обчислюється таким чином:

.

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

Зміна налаштувань TCP/IP: тимчасова, постійна

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

Утиліта hostname може не тільки повідомляти ім'я машини, але і встановлювати нове:

$ hostname

myhost.example.org

$ hostname-s

myhost

# hostname other.example.org

$ hostname

other.example.org

Утиліта ifconfig дозволяє не тільки переглядати, але і маніпулювати налаштуваннями мережевого інтерфейсу. Причому навіть на фізичному рівні OSI. Тут описані не всі можливості утиліти ifconfig. Існують деякі опції, характерні для даних операційних систем і т.д. Звіряйтеся з довідкою вашої операційної системи. Наприклад, OpenBSD дозволяє об'єднувати інтерфейси в групи, а FreeBSD такою особливістю не володіє.

У загальному випадку, для конфігурування фізичних параметрів інтерфейсу треба попередньо вивчити довідку з відповідного драйверу. Ми наведемо приклади на основі драйвера до поширеного чіпсету RealTek. (Див. man rl). Для цього драйвера можна змінювати швидкість передачі даних (10 або 100 Mbps) і режим передачі (half-duplex – одночасна передача пакетів в обидві сторони не підтримується; або full-duplex – підтримується одночасна передача пакетів в обидві сторони).

$ ifconfig rl0

rl0: flags = 8843 <UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500

options = 8 <VLAN_MTU>

inet6 fe80 :: 250:22 ff: feb0: 7f39% rl0 prefixlen 64 scopeid 0x1

inet 192.168.25.158 netmask 0xffffff00 broadcast 192.168.25.255

ether 00:50:22: b0: 7f: 39

media: Ethernet autoselect (100baseTX <full-duplex>)

status: active

Переведемо інтерфейс вручну на швидкість 10 мегабіт в секунду (Mbps):

# ifconfig rl0 media 10baseT/UTP

$ ifconfig rl0

rl0: flags = 8843 <UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500

options = 8 <VLAN_MTU>

inet6 fe80 :: 250:22 ff: feb0: 7f39% rl0 prefixlen 64 scopeid 0x1

inet 192.168.25.158 netmask 0xffffff00 broadcast 192.168.25.255

ether 00:50:22: b0: 7f: 39

media: Ethernet 10baseT/UTP

status: active

Тут в командному рядку опція media належить команді ifconfig, а значення 10baseT/UTP взято з довідки по драйверу rl. Тепер можна вручну виставити назад 100baseTX , командою ifconfig rl0 media 100baseTX, а можемо включити назад автовизначення.

# ifconfig rl0 media autoselect

$ ifconfig rl0

rl0: flags = 8843 <UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500

options = 8 <VLAN_MTU>

inet6 fe80 :: 250:22 ff: feb0: 7f39% rl0 prefixlen 64 scopeid 0x1

inet 192.168.25.158 netmask 0xffffff00 broadcast 192.168.25.255

ether 00:50:22: b0: 7f: 39

media: Ethernet autoselect (none)

status: no carrier

$ ifconfig rl0

rl0: flags = 8843 <UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500

options = 8 <VLAN_MTU>

inet6 fe80 :: 250:22 ff: feb0: 7f39% rl0 prefixlen 64 scopeid 0x1

inet 192.168.25.158 netmask 0xffffff00 broadcast 192.168.25.255

ether 00:50:22: b0: 7f: 39

media: Ethernet autoselect (100baseTX <full-duplex>)

status: active

Зверніть увагу: після включення автовизначення деякий час інтерфейс був недоступний. При цьому прапор UP був встановлений, тобто додатки мали право його використовувати, але інтерфейс поводився так, як буд-то з нього вийняли провід: status: no carrier. Що зрозуміло, поки інтерфейс не знає на якій швидкості вести передачу, про яку несучої може йти мова? Нарешті, перемикання дуплексу, тут нас чекає деяка недокументована несподіванка:

# ifconfig rl0 media 100baseTX

$ ifconfig rl0

rl0: flags = 8843 <UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500

options = 8 <VLAN_MTU>

inet6 fe80 :: 250:22 ff: feb0: 7f39% rl0 prefixlen 64 scopeid 0x1

inet 192.168.25.158 netmask 0xffffff00 broadcast 192.168.25.255

ether 00:50:22: b0: 7f: 39

media: Ethernet 100baseTX

status: active

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

# ifconfig rl0 mediaopt half-duplex

ifconfig: SIOCSIFMEDIA (mediaopt): Device not configured

Отже, зараз наш інтерфейс перебуває в режимі half-duplex, а для переведення його в full-duplex, ми можемо виконати таку команду:

# ifconfig rl0 mediaopt full-duplex

$ ifconfig rl0

rl0: flags = 8843 <UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500

options = 8 <VLAN_MTU>

inet6 fe80 :: 250:22 ff: feb0: 7f39% rl0 prefixlen 64 scopeid 0x1

inet 192.168.25.158 netmask 0xffffff00 broadcast 192.168.25.255

ether 00:50:22: b0: 7f: 39

media: Ethernet 100baseTX <full-duplex>

status: active

Порівняйте це з першим скриншотом:

...

media: Ethernet autoselect (100baseTX <full-duplex>)

...

Як видно, виставлено все теж саме, тільки відсутній автовизначення. Якщо ми не добиваємося якогось спеціального ефекту, то краще залишити автовизначення. З мого особистого досвіду: одного разу мені довелося вручну знижувати швидкість роботи інтерфейсів, які були з'єднані неякісним проводом. Опір в мідному проводі було вдвічі вище норми. Інтерфейси домовлялися про передачу даних на швидкості 100Mbps в режимі full-duplex, але реально вести передачу на такій швидкості не могли і їх довелося вручну «гальмувати».

Зміна MAC-адреси:

$ ifconfig rl0

rl0: flags = 8843 <UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500

options = 8 <VLAN_MTU>

inet6 fe80 :: 250:22 ff: feb0: 7f39% rl0 prefixlen 64 scopeid 0x1

inet 192.168.25.158 netmask 0xffffff00 broadcast 192.168.25.255

ether 00:50:22: b0: 7f: 39

media: Ethernet 100baseTX <full-duplex>

status: active

# ifconfig rl0 lladdr 40:50:22: b0: 7f: 39

$ ifconfig rl0

rl0: flags = 8843 <UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500

options = 8 <VLAN_MTU>

inet6 fe80 :: 250:22 ff: feb0: 7f39% rl0 prefixlen 64 scopeid 0x1

inet 192.168.25.158 netmask 0xffffff00 broadcast 192.168.25.255

ether 40:50:22: b0: 7f: 39

media: Ethernet 100baseTX <full-duplex>

status: active

Тут для зміни апаратної адреси застосовується ключове слово lladdr, що пояснює, що мова йде про адресу канального рівня (link-layer address = lladdr), тобто про MAC-адресі. Цей аргумент працює в FreeBSD і в OpenBSD. У FreeBSD діють так само синоніми link і ether – зміст той самий. У NetBSD ifconfig не вміє змінити MAC-адресу, але це нас вже не стосується.

При зміні MAC-адреси інтерфейс тимчасово відключається, а потім піднімається заново. Невиключно, що в деяких реалізаціях ifconfig, ці дії треба виконати вручну.

Важливо, щоб в одній мережі не було машин з однаковими MAC-адресами. Консорціум IEEE виділяє виробникам устаткування діапазони MAC-адрес, так звані OUI – це перші три байти MAC-адреси. Інші три байта призначає сам виробник. На сайті IEEE можна дізнатися який OUI виділений якому виробникові: http://standards.ieee.org/regauth/oui/index.shtml. Таким чином, ви можете по перших трьох байтам MAC-адреси дізнатися виробника пристрою.

З цього є два наслідки: 1) ви не повинні міняти MAC-адресу без потреби, 2) якщо ви міняєте MAC-адресу, ви повинні виставити в одиницю другий біт, що означає, що MAC-адресу змінений локально. Таким чином, перший з шести байт MAC-адреси, якщо ви виробляєте зміни, повинен бути в діапазонах від 64 до 127 (у шістнадцятковій запису від 40 до 7F) або від 192 до 255 (у шістнадцятковій запису від С0 до FF).

Можливо недурній ідеєю є не встановлювати перший біт в одиницю (тобто користуватися тільки першим із зазначених діапазонів), з тим, щоб ні у одного пристрою не виникало позиву витлумачити дану адресу як широкомовна. Перейшовши за вказаним посиланням ми можемо дізнатися, що для адрес починаються з 00:50:22 виробником є:

00-50-22 (hex) ZONET TECHNOLOGY, INC.

005022 (base 16) ZONET TECHNOLOGY, INC.

830 ROOM, BLDG. 53, 195, SEC.4

CHUNG HSIUNG RD, CHUTUNG

HSINCHA

TAIWAN, REPUBLIC OF CHINA

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

up/down підняти/опустити інтерфейс. Перемикається прапор UP

promisc/-promisc включити/виключити «нерозбірливий» (promiscuous) режим роботи інтерфейсу. Перемикається прапор PROMISC. Опція є в FreeBSD, але відсутня в OpenBSD і NetBSD.

monitor/-monitor інтерфейс переводиться/виводиться в/з режима моніторингу. У режимі моніторингу пакети не передаються, а всі отримані пакети знищуються після обробки bpf. Перемикається прапор MONITOR. Опція є у FreeBSD, відсутній у NetBSD і OpenBSD.

link[0-2]/-link[0-2] перемикаються прапори LINK0, LINK1 і LINK2. За допомогою них можна включити стиск в інтерфейсі SLIP або перемкнути тип коннектора на деяких Ethernet картах.

arp/-arp включення/вимикання підтримки протоколу ARP на інтерфейсі. Типово ARP включений. Перемикає прапор NOARP.

staticarp/-staticarp перемикає прапор STATICARP. При включеному прапорі інтерфейс використовує тільки статичну таблицю ARP. Присутній в FreeBSD, відсутній у OpenBSD і NetBSD.

debug/-debug включення/вимикання відлагодженого режиму в драйвері пристрою. Зазвичай призводить до додаткових повідомлень в syslog. Перемикає прапор DEBUG.

Приклад:

$ ifconfig rl0

rl0: flags = 8843 <UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500

options = 8 <VLAN_MTU>

inet6 fe80 :: 250:22 ff: feb0: 7f39% rl0 prefixlen 64 scopeid 0x1

inet 192.168.25.158 netmask 0xffffff00 broadcast 192.168.25.255

ether 00:50:22: b0: 7f: 39

media: Ethernet autoselect (100baseTX <full-duplex>)

status: active

# ifconfig rl0 -arp

$ ifconfig rl0

rl0: flags = 88c3 <UP,BROADCAST,RUNNING,NOARP,SIMPLEX,MULTICAST> mtu 1500

options = 8 <VLAN_MTU>

inet6 fe80 :: 250:22 ff: feb0: 7f39% rl0 prefixlen 64 scopeid 0x1

inet 192.168.25.158 netmask 0xffffff00 broadcast 192.168.25.255

ether 00:50:22: b0: 7f: 39

media: Ethernet autoselect (100baseTX <full-duplex>)

status: active

MTU перемикається опцією mtu. Знижуючи mtu ви з одного боку сповільнюєте роботу мережі, з іншого боку підвищуєте ймовірність того, що ваші пакети дійдуть до адресата без фрагментації. (Деякі брандмауери відкидають фрагментовані пакети). Однозначних рекомендацій тут дати неможливо. Навіть теза про те, що зниження MTU призводить до зниження швидкості передачі даних, не зовсім вірний. Безумовно зростають накладні витрати на протокол TCP, збільшується питома вага заголовків і загальний трафік, проте Річард Стівенс [Stevens-2003-ru наводить переконливий приклад того, як фрагментовані пакети швидше передаються в мережі через серію маршрутизаторів, в силу більш рівномірного використання каналів зв'язку (поки другий пакет передається першому шлюзу, перший пакет вже може бути відправлений другого шлюзу, якби обидва пакети були об'єднані, ділянка між першим і другим шлюзом простоював би вдвічі довше).

Обмеження зверху на MTU накладає природа передавальної середовища. У мережах Fast Ethernet MTU не може перевищувати 1500 байт. З приводу IPv6 і MTU доречно процитувати «вікіпедію» [url://wiki-IPv6-ru]: «У IPv6 пакети не можуть фрагментуватися і збиратися маршрутизаторами. Відправник повинен заздалегідь з'ясувати максимальний розмір пакетів (MTU), підтримуваний на всьому шляху до одержувача, і, при необхідності, виконати фрагментацію своїми силами. Обумовлюється, що MTU не може бути менше 576 байт. Зняття з маршрутизаторів функцій фрагментації також сприяє підвищенню ефективності їх роботи, але ускладнює роботу кінцевих систем.

Адреса інтерфейсу і маску підмережі можна задавати в традиційному форматі, в шістнадцятковому, а так само в форматі CIDR (ifconfig OpenBSD не розуміє формат CIDR). Наступні команди еквівалентні:

# ifconfig rl0 172.16.0.0 netmask 255.255.0.0

# ifconfig rl0 172.16.0.0 netmask 0xffff0000

# ifconfig rl0 0xac100000 netmask 0xffff0000

# ifconfig rl0 172.16.0.0/16

У всіх випадках широкомовна адреса обчислюється автоматично (172.16.255.255). Якщо вам чомусь треба вказати якийсь екзотичний широкомовна адресу, ви можете зробити це явно:

# ifconfig 172.16.0.0 netmask 255.255.0.0 broadcast 172.16.255.253

У всіх наведених прикладах неявно мається на увазі перед IP ключове слово inet (за замовчуванням діє воно, а не lladdr , наприклад).

Ключове слово alias (або add) дозволяє додати до мережевого інтерфейсу ще одну адресу, можливо в іншій мережі.

Можна вказувати символьне ім'я машини, якщо відповідний запис є базі /etc/hosts.

Аналогічно додаються адреси в нотації IPv6, з використанням ключового слова inet6.

Команда route служить для управління таблицею маршрутизації. З її допомогою можна:

  • Переглядати маршрут до хосту (команди get і show (останньої немає в FreeBSD)).

  • Слідкувати за змінами в маршрутній таблиці в реальному часі (команда monitor).

  • Додати маршрут (команда add).

  • Видалити маршрут (команда delete).

  • Змінити маршрут (команда change).

  • Повністю очистити таблицю маршрутизації (команда flush). Оскільки таблиць маршрутизації декілька для кожного протоколу (IP, IPv6, AppleTalk та ін.) можна вказати яку саме таблицю треба очистити за допомогою необов'язковою опції -inet , -inet6 , -atalk та ін.

Ключове слово default означає, що додається маршрут за замовчуванням. У виводі команди netstat запису додані командою route мають прапор S, що означає, що вони додані вручну.

Для явного позначення мереж, хостів і інтерфейсів можна використовувати агрумент -host, -net і -interface.

Приклади:

# route add default 192.168.0.1

# route add-net 192.168.0-interface rl0

# route add-net 192.168.1.0-netmask 255.255.255.128-interface rl1

Для збереження всіх налаштувань після перезавантаження не достатньо просто ввести команди, треба ще їх зберігати в конфігураційних файлах, для FreeBSD основним конфігураційним файлом є /etc/rc.conf, як приклад для налаштування мережевого інтерфейсу і зміни параметрів канального і фізичного рівня необхідно задати в цей файл:

ifconfig_em2="inet 192.168.15.210 netmask 255.255.0.0

ifconfig_em2_alias0="lladdr 00:01:23:44:32:10 media 100baseTX mediaopt full-duplex mtu 900

Так само і команди route hostname та інші вище розглянуті.

Налаштування DNS клієнта

Файл /etc/resolv.conf потрібен для налаштування клієнта DNS. Коли ми звертаємося до якоїсь віддаленої машині по імені, перше, що відбувається, це перетворення імені на адресу IP (або IPv6). Зазвичай ситуація влаштована таким чином: спершу система шукає імена в файлі /etc/hosts, де записано які імена мають машини з тим чи іншим IP-адресою, а потім, якщо ім'я в даному файлі отримує запит, здійснюється запит до сервера DNS. У файлі /etc/resolv.conf перераховані DNS сервери, до яких здійснюється запит. Порядок дій (спочатку вивчається /etc/hosts , потім робиться запит до DNS) можна змінити, але не має великого смислу при навчанні виконувати такі складні і непотрібні дії.

Як було сказано вище, типова поведінка системи полягає в тому, що спершу вона намагається вирішити ім'я використовуючи файл /etc/hosts і тільки потім звертається до сервера DNS. У файлі /etc/hosts на кожному рядку є деякий IP (або IPv6) адреса, а потім через прогалини перераховані імена відповідні йому. Коментар починається з решітки (#). Наприклад:

# $ FreeBSD: src /etc/hosts, v 1.16 2003/01/28 21:29:23 dbaker Exp $

#

# Host Database

#

# Цей файл повинен містити адреси і аліаси для локальних машин

# Замініть 'my.domain' нижче вашим доменом.

#

# У присутності DNS або NIS даний файл може невикористані зовсім,

# Для визначення порядку в якому розглядаються бази імен дивіться

# Файл /etc/nsswitch.conf

#

#

:: 1 localhost localhost.my.domain

127.0.0.1 localhost localhost.my.domain

#

# Уявна мережу.

# 10.0.0.2 myname.my.domain myname

# 10.0.0.3 myfriend.my.domain myfriend

#

# Згідно RFC 1918 наступні мережі можна використовувати для приватних

# Мереж. Цих адрес не існує в Інтернет:

#

# 10.0.0.0 - 10.255.255.255

# 172.16.0.0 - 172.31.255.255

# 192.168.0.0 - 192.168.255.255

#

Зверніть увагу: багато сервіси використовують файл /etc/hosts для своєї роботи. Коли ви переносите такі сервіси в середу chroot, ви повинні перенести туди ж копію даного файлу.

Перевірка працездатності ТСР/ІР сервісу

Як тільки ви внесете необхідні зміни в /etc/rc.conf, перезавантажте комп'ютер (хоча можна виконати команду /etc/netif restart, але це не найкращий варіант). Зміни налаштувань інтерфейсів будуть застосовані, крім того буде перевірена правильність налаштувань.

Як тільки система перезавантажиться, перевірте мережеві інтерфейси.

Для перевірки правильності налаштування мережевої карти, спробуйте виконати ping для самого інтерфейсу, а потім для іншої машини в локальній мережі.

Спочатку перевірте локальний інтерфейс:

% ping -c5 192.168.1.3

PING 192.168.1.3 (192.168.1.3): 56 data bytes

64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms

64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms

64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms

64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms

64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms

--- 192.168.1.3 ping statistics ---

5 packets transmitted, 5 packets received, 0% packet loss

round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms

Потім перевірте іншу машину в локальній мережі:

% ping -c5 192.168.1.2

PING 192.168.1.2 (192.168.1.2): 56 data bytes

64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms

64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms

64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms

64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms

64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms

--- 192.168.1.2 ping statistics ---

5 packets transmitted, 5 packets received, 0% packet loss

round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms

Ви можете також використовувати ім'я машини замість 192.168.1.2, якщо налаштований файл /etc/hosts.

Вирішення проблем з апаратним та програмним забезпеченням завжди викликає складності, які можна зменшити, перевіривши спочатку найпростіші варіанти. Чи підключений мережевий кабель? Чи правильно налаштовані мережеві сервіси? Чи правильно налаштований брандмауер? Чи підтримується використовувана карта в FreeBSD? Завжди перевіряйте інформацію про обладнання перед відправленням повідомлення про помилку. Оновлення FreeBSD до останньої версії STABLE. Перегляньте архіви списків розсилки, або пошукайте інформацію в Інтернет.

Якщо карта працює, але продуктивність низька, може допомогти читання сторінки довідника tuning. Перевірте також налаштування мережі, оскільки неправильні налаштування можуть стати причиною низької швидкості з'єднання.

Деякі користувачі зустрічаються з кількома device timeouts, що нормально для деяких мережевих карт. Якщо це триває і набридає, переконайтеся, що пристрій не конфліктує з іншим пристроєм. Уважно перевірте підключення кабелю. Можливо також, що вам просто треба встановити іншу карту.

Час від часу, користувачі бачать декілька помилок watchdog timeout. Перше, що потрібно зробити, це перевірити мережевий кабель. Багато карти вимагають підтримки Bus Mastering слотом PCI. На деяких старих материнських платах, тільки один PCI слот має таку підтримку (зазвичай слот 0). Звіртеся з документацією на мережеву карту і материнську плату, щоб визначити, чи може це бути проблемою.

Повідомлення No route to host з'являються, якщо система не в змозі доставити пакети до хосту призначення. Це може статися, якщо не визначений маршрут за замовчуванням, або кабель не підключений. Перевірте висновок команди netstat -rn і переконайтеся, що до відповідного хосту є працюючий маршрут.

Повідомлення ping: sendto: Permission denied найчастіше з'являються при неправильно налаштованому брандмауері. Якщо ipfw включений в ядрі, але правила не визначені, правило за замовчуванням блокує весь трафік, навіть запити ping.

Іноді швидкість карти недостатня, або нижче середнього. У цих випадках краще за все змінити режим вибору типу підключення з autoselect на правильний тип. Зазвичай це працює для більшості обладнання, але не може вирішити проблему у всіх випадках. Перевірте ще раз налаштування мережі і прочитайте сторінку довідника tuning.

Конфігурування віртуальних мереж VLAN

VLAN (англ. Virtual Local Area Network – віртуальна локальна комп'ютерна мережа) – є групою хостів з загальним набором вимог, що взаємодіють так, ніби вони прикріплені до одного домену, незалежно від їх фізичного розташування. VLAN має ті самі атрибути, як і фізична локальна мережа, але дозволяє кінцевим станціям бути згрупованими разом, навіть якщо вони не перебувають на одному мережевому комутаторі. Реконфігурація мережі може бути зроблена за допомогою програмного забезпечення замість фізичного переміщення пристроїв.

Щоб фізично копіювати функції VLAN, необхідно встановити окремий, паралельний збір мережевих кабелів і перемикачів, які зберігаються окремо від первинної мережі. Однак на відміну від фізичної відділеної мережі, VLAN ділить пропускну здатність; дві окремих одно-гігабітних віртуальних мережі які використовують одно-гігабітний зв'язок мають знижену пропускну здатність. Це віртуалізує поведінку VLAN (настроювання портів комутатора, позначки кадрів при вході в мережу VLAN, пошук MAC таблиці, щоб перейти до магістральних зв'язків і видалення тегів при виході з VLAN).

Іноді потрібно використовуючи 1 кабель – запустити далеко не одну ізольовану логічну мережу. Наприклад ми налаштовуємо маршрутизатор на FreeBSD, з'єднує n-ву кількість логічних мереж і виводимо їх у світ. Звичайно найпростіший спосіб це докупити мережевих карт, але не факт що їх буде куди підключити, та й навіщо витрачати на них гроші, якщо є інший варіант. Для реалізації задуманого використовується технологія, з якою можливо це зробити – vlan. Є різних реалізацій технології VLAN, найпопулярніша "IEEE 802.1q", її ми і спробуємо на FreeBSD.

На freeBSD це робиться досить просто, наприклад є картка Ethernet, нам необхідно засунути 2 різні мережі в неї припустимо що це:

* Світ (Інтернет)

* Локальна мережа

Не розглядаємо які ip на інтерфейсі Ethernet, ім'я карти в FreeBSD em0. Вказуємо для нього лише швидкість порту, дуплекс і він в змозі UP, в /etc/rc.conf це буде ось так:

ifconfig_em0 = "up media 100baseTX mediaopt full-duplex"

Вказуємо для системи vlan'и, вказуємо імена vlan для FreeBSD, не плутайте з номерами vlan які будуть вирушати далі приміром на свіч Cisco. У rc.conf:

cloned_interfaces="vlan0 vlan1"

Налаштовуємо наші vlan'и

ifconfig_vlan0="vlan 1 vlandev em0 <ваш внутрішній ip і його mask> mtu 1500"

ifconfig_vlan1="vlan 2 vlandev em0 <зовнішній ip і його mask> mtu 1500"

Тут ми прописуємо якраз номери, а не імена VLAN мереж.

Також ці номери vlan повинні бути налаштовані на обладнанні до якого підключений інтерфейс em0.

УАГА! Для роботи вищенаведеного підтримка VLAN повинна бути ввімкнена у ядрі.