У першій частині статті IPFW: обмеження швидкості Internet я описав основи побудови каналів і потоків в мережі DUMMYNET. Прийшла пора розглянути конкретний приклад діючу пенсійну систему невеликої мережі, де всі користувачі в рівній мірі ділять один єдиний канал зв'язку.
Маємо DSL-з'єднання, тому канал асинхронний, швидкість закачування - 5 Mbit / s, швидкість віддачі - 512 Kbit / s.
Насамперед нам знадобиться додати підтримку DUMMYNET в ядро системи, заодно включимо ядерний NAT і файрвол (вважаю, що на шлюзі ці опції використовуються в іншому випадку що це за шлюз такий виходить):
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT = 100
options IPFIREWALL_FORWARD
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_NAT
options DUMMYNET
options HZ = 1000
Детально розписувати як збирати ядро я не буду - в блозі про це вже писалося, та й в мережі не проблема знайти. Перейдемо до налаштування. У конфігурацію вашого Фаєрвол /etc/rc.firewall додаємо наші правила:
$ Pipe 1 config bw 5Mbit / s
$ Pipe 11 config bw 512Kbit / s
$ Queue 1 config pipe 1 mask dst-ip 0xffffffff
$ Queue 2 config pipe 11 mask src-ip 0xffffffff
$ Add queue 1 ip from any to 192.168.1.0/24
$ Add queue 2 ip from 192.168.1.0/24 to any
Розберемося, що тут написано. Створюються два каналу pipe 1 - 5 Mbit / s і pipe 11 - 512Kbit / s:
$ Pipe 1 config bw 5Mbit / s
$ Pipe 11 config bw 512Kbit / s
Слід зазначити один важливий і принциповий момент при вказівці швидкості pipe. Вона повинна відповідати реальної пропускної здатності каналу, тому що від цього безпосередньо залежить коректна робота всієї системи поділу трафіку.
Наприклад, провайдером заявлена швидкість 6 Mbit / s, проте для правильної роботи pipe я встановив 5 Mbit / s, тому що це більше відповідає реальному значенню швидкості в каналі. При більшому значенні швидкості, ніж може забезпечити канал, вся система поділу перестає працювати.
Для кожного pipe створюються черги queue:
$ Queue 1 config pipe 1 mask dst-ip 0xffffffff
$ Queue 2 config pipe 11 mask src-ip 0xffffffff
Так як стоїть завдання рівномірного розподілу каналу Internet між усіма користувачами, необхідно створити черги, які відповідають кількості цих самих користувачів, як для вхідного, так і для вихідного трафіку. Зрозуміло, що робити це вручну, м'яко кажучи, втомлює. Тому ми створюємо всього по одній черзі з маскою для кожного каналу, спростивши тим самим собі задачу.
mask (маска) - це значення по якому розділяються черзі (queue):
Залишилося запустити в ці черги наш трафік:
$ Add queue 1 ip from any to 192.168.1.0/24
$ Add queue 2 ip from 192.168.1.0/24 to any
# Ipfw pipe show 00001: 5000 Mbit / s 0 ms burst 0
q131073 50 sl. 0 flows (1 buckets) sched 65537 weight 0 lmax 0 pri 0 droptail
sched 65537 type FIFO flags 0x0 0 buckets 0 active
00011: 512.000 Kbit / s 0 ms burst 0
q131083 50 sl. 0 flows (1 buckets) sched 65547 weight 0 lmax 0 pri 0 droptail
sched 65547 type FIFO flags 0x0 0 buckets 0 active
Ця команда може сильно допомогти при налагодженні ваших правил. При тестуванні і додаванні нових правил IPFW не погано проводити очищення старих правил:
# Ipfw -f flush # ipfw -f pipe flush # ipfw -f queue flush
При використанні firewall (якщо він не відкритий), необхідно присвоїти змінної sysctl - net.inet.ip.fw.one_pass значення 0 (по дефолту "1"). Це потрібно для того, щоб пакети не "випадали" на pipe з файрволла (як на дозвільному правилі).
Щоб зміни не губилися при перезавантаженні пропишіть змінну net.inet.ip.fw.one_pass в файлі /etc/sysctl.conf.
P.S. Я навів лише один приклад налаштування DUMMYNET для розподілу швидкості Internet. Звичайно можна робити більш просунуті конфігурації - виділяти фіксовані канали із заданою швидкістю для пріоритетних завдань, окремих протоколів і т.д.
Якщо вважаєте статтю корисною,
не лінуйтеся ставити лайки і ділитися з друзями.