#! / Bin / sh
ipfw = "/ sbin / ipfw" # оголосили змінну ipfw, яка містить шлях до виконуваного файлу файрволла.
$ -f flush # очищаємо список всіх старих правил
$ -f queue flush # очищаємо список черг
$ -f pipe flush # очищаємо список каналів
Зберігаємо і робимо файл виконуваним:
#chmod + x /etc/firewall.conf
У нас дві віртуальні машини, які один одного чудово пінг. ОС Windows XP (192.168.0.10) і ОС FreeBSD 8.2, описана в самому початку статті, з файрволлом ipfw.
Що забороняє правило для ipfw (deny)
$ Add 00010 deny icmp from any to me via em1
Отже, починаємо розбір польотів.
Структура правила дуже проста. Спочатку йде використання змінної ipfw. яка у нас на початку скрипта. Можна в тексті скрипта оголосити будь-яку змінну NAME = "VALUE" і використовувати її в скрипті як $. Вельми зручно, якщо потрібно змінити в різних місцях одне і те ж значення.
Отже, add 00010 - це додавання правила з номером 10. Нумерація правил йде з 1 до 65535, причому останнє правило - дозволяє по-замовчуванню (визначається опцією ядра IPFIREWALL_DEFAULT_TO_ACCEPT), або забороняє по-замовчуванню.
Наступним йде дію. В даному випадку - deny (заборонити), можуть бути allow. deny. divert і т.д, ми їх будемо торкатися в міру вивчення.
Наступним йде протокол. Можна заборонити any (все), тільки tcp або ip (відповідною директивою).
В даному прикладі правило:
$ Add 00010 deny icmp from any to me via em1
Треба сказати, що правила застосовуються в порядку нумерації, тобто правила з меншим номером порівнюються раніше, ніж з великим.
Пакет проходить за списком правил до першого збігу. Далі, з пакетом відбувається дія, вказане в правилі.
Застосовуються правила простим викликом цього файлу:
Адже він у нас виконуваний. Легко помітити, що пінг тепер не йдуть.
Зеленим підкреслив до застосування правила файрволла, а червоним - після.
Обмеження швидкості на передачу даних.
Зараз ми будемо займатися обмеженням пропускної здатності мережі. Я приблизно намалював схемку, як працює пайп (pipe).
Ми бачимо два напрямки передачі даних. Коричневе і зелене. Коричневе з вінди в freebsd, зелене - назад. Так ось, ще важливе уточнення, що у кожного напряму є in і out. Тобто Передається з Windows (це out) але в FreeBSD (in), навпаки, для FreeBSD як out буде початок каналу, а для нас він входить, значить in. За малюнком, я думаю, зрозуміло.
Так ось, Pipe - труба - ставиться на будь-який напрямок. І як би "звужує" канал до потрібного значення. Тестувати швидкість мережі ми будемо утилітою Iperf. Я заміряю швидкість спочатку:
Встановлюємо пайп. Для цього в список правил файрволла додаємо:
$ Pipe 1 config bw 2048Kbit / s
Це правило визначає пайп з номером 1, шириною 2048 кбіт / сек. тобто приблизно 2 Мбіт / с. bw - bandwidth - ширина каналу.
Тепер припустимо канал в трубу. Так як для тестування утилітою Iperf FreeBSD у нас буде сервером, а Windows XP - клієнтом, то різати швидкість будемо в місці "in" у FreeBSD, тобто на вхід.
HOST = "192.168.0.10/32"$ Add pipe 1 tcp from $ to me via em1
#ipfw show - покаже список правил і кількість пакетів (байт) пропущених за цими правилами
#ipfw list - покаже тільки список правил
Застосовуємо нові правила: