Ipfw обмеження швидкості internet (частина 2)

У першій частині статті 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. Звичайно можна робити більш просунуті конфігурації - виділяти фіксовані канали із заданою швидкістю для пріоритетних завдань, окремих протоколів і т.д.

Якщо вважаєте статтю корисною,
не лінуйтеся ставити лайки і ділитися з друзями.