From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <439072FA.4010608@parkheights.dyndns.org> Date: Fri, 02 Dec 2005 11:14:50 -0500 From: Sergey Ivanov User-Agent: Mozilla Thunderbird 1.0.6 (X11/20051109) X-Accept-Language: en-us, en MIME-Version: 1.0 To: ALT Linux Community Subject: Re: [Comm] =?KOI8-R?Q?=F3=CE=CF=D7=C1_=D0=D2=CF_htb?= References: In-Reply-To: Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 8bit X-Virus-Scanned: amavisd-new at parkheights.dyndns.org X-BeenThere: community@lists.altlinux.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: ALT Linux Community List-Id: ALT Linux Community List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Dec 2005 16:15:29 -0000 Archived-At: List-Archive: List-Post: Владимир Гусев wrote: > Здравствуйте! > > Кому-нибудь удалось разобраться с htb? Кто-нибудь из участников > рассылки уже применяет htb для управления исходящим траффиком на ADSL > ? Поделитесь опытом и конфигами-образцами.. Никак не могу въехать, > хотя теорию вопроса в принципе понял.. > Попробую описать, как обстоит дело с htb в Сизифе. Основной инструмент для конфигурации - пакет etcnet. 1. Я советую, поставив этот пакет, сначала спрятать куда-нибудь все директроии интерфейсов из /etc/net/ifaces ( кроме lo, default и unknown) и запустить /etc/net/scripts/initconf. Его выдачу сохранить и на основании этой выдачи организовать файл /etc/net/iftab, который определит логические имена интерфейсов. Например, одну сетевую карту можно из eth0 переименовать в соответствии с её макадресом в wan, другую - в lan. Я для себя использовал вместо wan имя провайдера (comcast), а вместо lan - придуманное самим имя локального домена своей сети 192.168.10.0/24 (menlo). Ну и дальше буду их использовать, чтобы не ошибиться где-нибудь заменяя их на более нейтральные типа wan и lan. Далее создайте директории с именами определёнными в таблице /etc/net/iftab, внутри /etc/ifaces. Я создал /etc/net/ifaces/comcast и /etc/net/ifaces/comcast. И положил туда нужные мне файлы options. Для внешней сети comcast достаточно определить TYPE и BOOTPROTO, я добавил строчку MODULE как того рекомендовал initconf: --- # cat </etc/net/ifaces/comcast/options TYPE=eth BOOTPROTO=dhcp MODULE=tulip EOF --- Для интерфейса локальной сети menlo адрес задан статически, так что там кроме файла options ещё нужен файл ipv4address: --- # cat </etc/net/ifaces/menlo/options TYPE=eth BOOTPROTO=static MODULE=natsemi EOF # echo "192.168.10.1/24" >/etc/net/ifaces/menlo/ipv4address --- 2. Дальше настраиваете ip-forwarding и nat masquarading. За первый отвечает строчка net.ipv4.ip_forward = 1 в файле /etc/net/sysctl.conf, в то время как другое делается добавлением строки "masquerade out-iface comcast" в файл /etc/net/ifaces/default/fw/iptables/nat/POSTROUTING: --- echo "masquerade out-iface comcast" >>/etc/net/ifaces/default/fw/iptables/nat/POSTROUTING --- После этого ваш раутер после # service network restart уже должен начать выполнять свою функцию разделения доступа в интернет. 3. Далее я настраивал распознавание и маркирование пакетов, кторым надо было обеспечить гарантированную ширину пропускания канала. Для меня это были два телефонных адаптера, которые не искажают звук только если им предоставлены 10 килобит в секунду. Эти адаптеры стоят в локальной сети и dhcp сервер по их макадресам даёт им статические адреса. Эти адреса я и использовал в качестве критерия для маркировки. Маркировка обеспечивается следующим образом: --- #cat </etc/net/ifaces/default/fw/iptables/mangle/PREROUTING mark 21 if from 192.168.10.21 from-iface menlo mark 22 if from 192.168.10.5 from-iface menlo EOF --- Мысль для себя на будущее: наверно можно было маркировать по мак-адресу, и тем самым избежать необходимости настраивать статические адреса выдаваемые dhcpd. 4. Ну а теперь остаётся самое настроить qos htb для идущего наружу интерфейса comcast. --- ## создаём дисциплину 1 # mkdir -p /etc/net/ifaces/comcast/qos/1 ## определяем что эта дисциплина - htb ## и её дефолтный класс для неклассифицированного траффика 77. # echo "htb default 77" /etc/net/ifaces/comcast/qos/1/qdisc ## создаём корневой класс 1 (1:1) # mkdir /etc/net/ifaces/comcast/qos/1/1 ## определяем ширину пропускания интерфейса (upload) # echo "htb rate 360kbps" /etc/net/ifaces/comcast/qos/1/1/class ## создаём класс для первого телефонного адаптера # mkdir /etc/net/ifaces/comcast/qos/1/1/21/ ## определяем для него ширину пропускания 80 килобит/сек. # echo "htb rate 80kbps" >/etc/net/ifaces/comcast/qos/1/1/21/class ## задаём фильтр этого класса, отбирающий для него пакеты с маркой "21" # echo "protocol ip prio 1 handle 21 fw" >/etc/net/ifaces/comcast/qos/1/1/21/filter ## создаём класс для второго телефонного адаптера # mkdir /etc/net/ifaces/comcast/qos/1/1/22/ ## определяем для него ширину пропускания 80 килобит/сек. # echo "htb rate 80kbps" >/etc/net/ifaces/comcast/qos/1/1/22/class ## задаём фильтр этого класса, отбирающий для него пакеты с маркой "22" # echo "protocol ip prio 1 handle 22 fw" >/etc/net/ifaces/comcast/qos/1/1/22/filter ## создаём класс для дефолтного траффика: # mkdir /etc/net/ifaces/comcast/qos/1/1/77/ ## определяем для него ширину пропускания 200 (= 360 - (80 + 80)) килобит/сек. ## с возможностью заимствования неиспользуемого в данный момент траффика других классов ## вплоть до 360kbps, то есть полной ширины исходящего канала # echo "htb rate 200kbps ceil 360kbps" >/etc/net/ifaces/comcast/qos/1/1/77/class --- И, если бы etcnet поддерживал htb, то больше ничего не надо бы делать. Однако увы, приходится портить его скрипты, так как они не обращают внимания на то, что фильтры должны прикрепляться к корню, то есть к дисциплине 1:, то есть к директории /etc/net/ifaces/comcast/qos/1, хотя и иметь в качестве направления фильтрации именно тот класс в директории которого созданы. Так что берём и заменяем строчку --- $TC filter add dev $NAME $PARENTNODE `head -1 $NODEDIR/extra.filter 2>/dev/null` $FILTEREXPR flowid $NODEID --- в файле /etc/net/scripts/config-qos на строчку: --- $TC filter add dev $NAME parent 1\:0 `head -1 $NODEDIR/extra.filter 2>/dev/null` $FILTEREXPR flowid $NODEID --- Строчка "parent 1\:0" согласована с тем, что корневую дисциплину этого интерфейса я назвал дисциплиной "1". Теперь телефонам будет предоставляться 80 килобит в секунду как только они того потребуют, а если они недоиспользуют эти 80kbps, всё оставшееся будет предоставляться другим соединениям. Других дисциплин, кроме htb, не пробовал. Возможно, что для них правильно именно так, как устроено изначально в файле /etc/net/scripts/config-qos -- С уважением, Сергей Иванов.