Категорії
FreeBSD Misc, staff, other

[ipfw] Шейпим трафик

Вот список правил необходимых для удачного шейпинга (шейпинг установлен на уровне 1Мбит/с, отдельно на исход и отдельно на вход):

ipfw add 1101 pipe 1 all from 1.1.1.1 to any
ipfw add 1102 pipe 1 all from any to 1.1.1.1
ipfw pipe 1 config bw 1Mbit/s

Ещё нужно установить значение переменной net.inet.ip.fw.one_pass=0 в sysctl (по дефолту стоит в 1). Это нужно для того, что бы после прохождения шейпинга применялись и последующие правила (в противном случае будет считаться, что после правила шейпа идёт правило ipfw add allow from any to any)

Так же, немаловажным фактором будет добавление в начало файла с правилами сброс всех pip’ов:

ipfw -f pipe flush
ipfw -f queue flush

Вроде бы достаточно только первого правила (начиная с FreeBSD 7.0), но пишу оба 🙂

Если нужно поставить ограничения для каждого IP в локалке и писать пару 10-ков или сотен правил не хочется, то можно использовать такую конструкцию:

ipfw pipe 1 config bw 64Kbit/s mask src-ip 0xffffffff
ipfw pipe 2 config bw 64Kbit/s mask dst-ip 0xffffffff

ipfw add pipe 1 all from 10.5.0.0/24 to any
ipfw add pipe 2 all from any to 10.5.0.0/24

Примечание

Приведу значения масок для разных ситуаций:

– 0×00000000 – одна очередь/скорость трубы на всех
– 0xffffffff – на каждого юзера своя очередь/скорость трубы

Дополнение

Труба (pipe) и очередь (queue) это разные объекты. Труба используется для ограничения скорости, а очередь для установки приоритета внетри трубы.

Пример1:

ipfw pipe 1 config bw 7000Kbit/s
ipfw queue 1 config pipe 1 weight 75 mask dst-ip 0x00000000
ipfw queue 2 config pipe 1 weight 50 mask dst-ip 0x00000000
ipfw queue 3 config pipe 1 weight 50 mask dst-ip 0x00000000
ipfw queue 4 config pipe 1 weight 50 mask dst-ip 0x00000000
ipfw add queue 1 ip from any to 192.168.0.0/24
ipfw add queue 2 ip from any to 192.168.1.0/24
ipfw add queue 3 ip from any to 192.168.2.0/24
ipfw add queue 4 ip from any to 192.168.3.0/24

Итого имеем: одну толстую трубу на 7К и 4 очереди в нее. У первой приоритет 75% канала. У остальных – по 50%

Пример2:

ipfw add pipe 1 ip from 192.168.2.0/24 to any out
ipfw add pipe 2 ip from any to 192.168.2.0/24 in
ipfw pipe 1 config mask src-ip 0x000000ff bw 200Kbit/s queue
20Kbytes

Канал 200кбит, поделенный между активными юзерами.

Примечание2 (заимствовано отсюда).

Если начали появляться сообщения:

kernel: Bump flowset buckets to 64 (was 0)

(в новой версии ipfw) при создании очередей в конфиге необходимо явно указывать значение для параметра buckets:

ipfw queue 2 config pipe 1 weight 10 buckets 128 mask src-ip 0xffffffff

Если этот параметр не указать, то при создании очереди ipfw использует для этого параметра значение из системной переменной net.inet.ip.dummynet.hash_size, о чем и сообщает в консоли, что значение не указали явно, а надо-бы.

Примечание3 (заимствовано из pf@freebsd.org)
С версии 14 (пока только CURRENT) поддержку dummynet добавили и в pf:

# dnctl pipe 1 config bw 300KByte/s

В /etc/pf.conf:
pass in quick inet from X.X.X.X to any dnpipe 1

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff