Шейпинг на ipfw за 2 минуты

Порт ipfw для Linux существует давно. Я даже собрал RPM пакеты для CentOS 5

Рассказываю как быстро порезать входящий/исходящий трафик на машине с NAT.

Пример 1 Режем полосы вх/исх в 1Mbit/s для каждого из ip адресов подсети 10.0.0.0/24


#!/bin/bash

ipfw -f flush

ipfw pipe 1 config bw 1000Kbit/s mask dst-ip 0x000000ff
ipfw pipe 2 config bw 1000Kbit/s mask src-ip 0x000000ff

ipfw add 11 pipe 1 ip from any to 10.0.0.0/24 out
ipfw add 12 pipe 2 ip from 10.0.0.0/24 to any in

Пример 2 Индивидуальные скорости для каждого IP.

Все тоже очень просто:


#!/bin/bash

ipfw -f flush

Создаем пайпы для входящей и исходящей скорости для ip из table 1
ipfw pipe 1 config bw 1000Kbit/s mask dst-ip 0x000000ff
ipfw pipe 2 config bw 1000Kbit/s mask src-ip 0x000000ff
ipfw add 11 pipe 1 ip from any to table\(1\) out
ipfw add 12 pipe 2 ip from table\(1\) to any in

Создаем пайпы для входящей и исходящей скорости для ip из table 2
ipfw pipe 3 config bw 4000Kbit/s mask dst-ip 0x000000ff
ipfw pipe 4 config bw 4000Kbit/s mask src-ip 0x000000ff
ipfw add 13 pipe 3 ip from any to table\(2\) out
ipfw add 14 pipe 4 ip from table\(2\) to any in

и добавляем нужные IP в нужные таблицы

ipfw table 1 add 10.0.0.3
ipfw table 2 add 10.0.0.2

  1. ZYV:

    Вопросы:

    1) Оно ведь не будет работать параллельно с iptables?

    2) А изнутри оно как вообще, просто как ipfw-like интерфейс к netfilter, или отдельная подсистема?

    3) Оно быстрее / медленнее iptables + tc?

    4) Основное преимущество, как я понимаю, простота конфигурации и администрирования?

    2011-03-14, 19:10

  2. Денис:

    1 Будет
    2 Отдельная подсистема с netfilter никак не связан
    3 ИМХО HTB+ хэшфильтры производительней будут
    4 Да

    2011-03-14, 20:53

  3. costas:

    Ещё примеры…
    # mask dst-ip 0×00000000 — одна очередь/скорость трубы на всех
    # mask dst-ip 0xffffffff — на каждого юзера своя очередь/скорость трубы

    Реализация разных скоростей по юзерам (персонально каждому своя труба) на примере двух каналов 1024Kbit/s и 4096Kbit/s:

    Для каждого канала два pipe на входящий и исходящий:
    # входящий
    ipfw pipe 201 config bw 1024Kbit/s mask dst-ip 0xffffffff
    ipfw pipe 202 config bw 4096Kbit/s mask dst-ip 0xffffffff
    # исходящий
    ipfw pipe 211 config bw 1024Kbit/s mask src-ip 0xffffffff
    ipfw pipe 212 config bw 4096Kbit/s mask src-ip 0xffffffff

    # правила для входящего table 1
    ipfw add 101 pipe 201 ip from any to table\(1,1024\) via ${LAN_IFACE}
    ipfw add 102 pipe 202 ip from any to table\(1,4096\) via ${LAN_IFACE}

    # правила для исходящего table 2
    ipfw add 111 pipe 211 ip from table\(2,1024\) to any via ${LAN_IFACE}
    ipfw add 112 pipe 212 ip from table\(2,4096\) to any via ${LAN_IFACE}

    Здесь используется только две таблицы на любое количество pipe, добавление юзера выглядит так:

    — для канала 1024 Kbit/s
    ipfw table 1 add 10.0.0.3 1024 # входящий
    ipfw table 2 add 10.0.0.3 1024 # исходящий

    — для канала 4096 Kbit/s
    ipfw table 1 add 10.0.0.2 4096 # входящий
    ipfw table 2 add 10.0.0.2 4096 # исходящий

    Тоже самое но с маской 0×00000000, будет определять что юзеры занесённые в таблицы и привязаные к определённой скорости будут делить один канал, удобно если вам нужно резать не для всей сетки, а всего лишь для группы юзеров из этой сетки, для каждой группы нужно создавать свою трубу (два pipe вход./исх.)

    2011-03-23, 11:36

  4. INF[SZ]:

    costas огромнейшее спасибо

    2011-03-23, 11:38

  5. costas:

    З.Ы. забыл пояснить к примеру, что если добавлять
    ipfw table 1 add 10.0.0.5 1024 # входящий
    ipfw table 2 add 10.0.0.5 1024 # исходящий

    ipfw table 1 add 10.0.0.6 1024 # входящий
    ipfw table 2 add 10.0.0.6 1024 # исходящий

    ipfw table 1 add 10.0.0.7 1024 # входящий
    ipfw table 2 add 10.0.0.7 1024 # исходящий

    и т.д., у всех пользователей будет персонально 1024kbit/s, то есть на каждого

    2011-03-23, 11:42

  6. ZYV:

    Что-то не вижу чем это выгодно отличается от tc теперь :-) А как ipfw шейпит, оно умеет что-то типа WRR / SFQ и HTB соответственно?

    2011-03-26, 02:41

  7. D:

    I have, a strange problem. After installing ipfw tool and module I make next 2 rules :

    [root@x1~]# ipfw show
    00010 30281 40260690 pipe 1 ip from any to 89.x.x.x
    00020 12349 896627 pipe 2 ip from 89.x.x.x to any
    65535 9101442 5421809363 allow ip from any to any

    [root@x1~]# ipfw pipe show
    00001: 1.000 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 0×0 0 buckets 1 active
    BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
    0 ip 0.0.0.0/0 0.0.0.0/0 39356 51206819 46 63160 29
    00002: 1.000 Mbit/s 0 ms burst 0
    q131074 50 sl. 0 flows (1 buckets) sched 65538 weight 0 lmax 0 pri 0 droptail
    sched 65538 type FIFO flags 0×0 0 buckets 1 active
    0 ip 0.0.0.0/0 0.0.0.0/0 12995 938211 0 0 0

    And on 89.x.x.x machine execute wget :

    [root@u2~]# wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.39-rc1.tar.bz2 -O /dev/null
    —2011-04-02 12:02:29— http://www.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.39-rc1.tar.bz2
    Resolving http://www.kernel.org… 130.239.17.4, 149.20.4.69, 149.20.20.133, …
    Connecting to http://www.kernel.org|130.239.17.4|:80… connected.
    HTTP request sent, awaiting response… 200 OK
    Length: 76121713 (73M) [application/x-bzip2]
    Saving to: `/dev/null’

    0% [ ] 307,748 56.4K/s eta 21m 48s

    So I config pipe 1 Mbit/s but download with 0.5 Mbit/s. When I config pipe to 2 Mbit/s download up to 1Mbit/s i.e. 1/2 from thos i configure.
    Are you have any idea ?

    2011-04-02, 15:05

  8. UkrZilla:

    Must be:
    00010 30281 40260690 pipe 1 ip from any to 89.x.x.x in
    00020 12349 896627 pipe 2 ip from 89.x.x.x to any out

    Источник

Запись опубликована в рубрике *Unix,*Linux. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Я не спамер This plugin created by Alexei91