Вообщем у меня такой вопрос:
Есть шлюз. Есть 2 юзера. У одного юзера 2 компа, у другого 1. IP статические. Есть канал в интернет. Нужно его резать по скорости пополам. Но не просто резать, а динамически. То есть, если идут пакеты от(или к ним) обоих юзеров, то нужно, чтобы канал делился пополам. Если, допустим, в течении 5 минут от одного из юзеров пакеты перестают идти(за исключением аськи), то нужно отдать всю ширину канала другому юзеру. Как только от первого опять пошли пакеты, то вернуть разделение канал.
Посоветуйте что-нибудь, пожалуйста. Осью не ограничен. То есть могу поставить на шлюз как linux, так и freeBSD. В зависимости от того, в какой оси это проще сделать. Заранее спасибо
[Решено] Динамический шэйпинг
Модераторы: SLEDopit, Модераторы разделов
-
tuupic
- Сообщения: 197
- ОС: Gentoo
-
alfss
- Сообщения: 262
Re: [Решено] Динамический шэйпинг
http://www.openbsd.org/faq/pf/queueing.html к примеру
hfsc Hierarchical Fair Service Curve.
man pf.conf
hfsc Hierarchical Fair Service Curve.
man pf.conf
-
10puu
- Сообщения: 20
Re: [Решено] Динамический шэйпинг
Вот те готовое решение
ADSL - eth1 - linux - eth0 - локалка.
Отпишись че получится
Мне просто самому интересно
У меня несколько посложнее была задачка - еще не до конца решил...
мона еще кое какие правила и для eth1 добавить и там раздать приоритеты для игр, почты, icq, web, ftp и тд.
вообщем проверяй
ADSL - eth1 - linux - eth0 - локалка.
Отпишись че получится
Мне просто самому интересно
У меня несколько посложнее была задачка - еще не до конца решил...
Код: Выделить всё
#!/bin/sh
DEV=eth0 # смотрит в локалку
RATE=460 # у меня канал 512 - 10% = 460 - обязательно надо указывать несколько меньше.
BURST="burst $[$RATE*1000/800]"
CIR=$[$RATE/2]
IP1=192.168.0.101
IP2=192.168.0.102
tc qdisc del dev $DEV root 2> /dev/null > /dev/null
#с оздаем очередь
tc qdisc add dev $DEV root handle 1: htb
# пилим на полосы
tc class add dev $DEV parent 1: classid 1:1 htb rate ${RATE}kbit ceil ${RATE}kbit $BURST
tc class add dev $DEV parent 1:1 classid 1:10 htb rate ${CIR}kbit ceil ${RATE}kbit $BURST
tc class add dev $DEV parent 1:1 classid 1:11 htb rate ${CIR}kbit ceil ${RATE}kbit $BURST
# фильтруем
tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip dst $IP1 flowid 1:10
tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip dst $IP2 flowid 1:11
# добавляем очереди
tc qdisc add dev $DEV parent 1:10 handle 20: sfq perturb 10
tc qdisc add dev $DEV parent 1:11 handle 30: sfq perturb 10мона еще кое какие правила и для eth1 добавить и там раздать приоритеты для игр, почты, icq, web, ftp и тд.
вообщем проверяй
-
tuupic
- Сообщения: 197
- ОС: Gentoo
Re: [Решено] Динамический шэйпинг
Спасибо обоим. Сейчас поставил FreeBSD. Обновлю до 7.0 и буду пробовать с pf.
-
alfss
- Сообщения: 262
Re: [Решено] Динамический шэйпинг
на freebsd pf перенесен не в полной мере
учтите это
учтите это
-
tuupic
- Сообщения: 197
- ОС: Gentoo
-
tuupic
- Сообщения: 197
- ОС: Gentoo
Re: [Решено] Динамический шэйпинг
Вот мой конфиг pf.conf Может, поможет кому. ОС FreeBSD 7.0
Для 7-й Фри "NO STATE" обязательны. Иначе в очереди пакеты лезть не будут.
Собственно фильтр всего один потому что сижу я ADSL роутером, в котором открыто всего 2 порта.
Код:
# $FreeBSD: src/etc/pf.conf,v 1.2.2.1 2006/04/04 20:31:20 mlaier Exp $
# $OpenBSD: pf.conf,v 1.21 2003/09/02 20:38:44 david Exp $
#
ext_if="dc0" # replace with actual external interface name i.e., dc0
int_if="vr0" # replace with actual internal interface name i.e., dc1
internal_net="192.168.0.0/24"
set loginterface $ext_if
# Tables: similar to macros, but more flexible for many addresses.
table <lan> { 192.168.0.0/24 }
table <my> { 192.168.0.0/24, 82.146.32.0/19 }
table <me> { 192.168.1.10, 91.185.48.86, 192.168.0.1 }
table <user1_ips> { 192.168.0.2, 192.168.0.5 }
table <user2_ips> { 192.168.0.3 }
# Normalization: reassemble fragments and resolve or reduce traffic ambiguities.
scrub in all
# Queueing: rule-based bandwidth control.
altq on $int_if cbq bandwidth 100Mb queue { inet_in, default_in }
queue inet_in bandwidth 240Kb { user1_in, user2_in }
queue user1_in bandwidth 50% cbq(red, borrow)
queue user2_in bandwidth 50% cbq(red, borrow)
queue default_in bandwidth 99% cbq(default)
altq on $ext_if cbq bandwidth 100Mb queue { inet_out, default_out }
queue inet_out bandwidth 500Kb { user1_out, user2_out }
queue user1_out bandwidth 50% cbq(red, borrow)
queue user2_out bandwidth 50% cbq(red, borrow)
queue default_out bandwidth 99% cbq(default)
#NAT
nat on $ext_if from $internal_net to !<lan> -> ($ext_if)
#filtering
block in quick proto tcp from !<my> to <me> port { 21, 22 }
# assign packets to a queue.
pass out on $int_if from !<lan> to <user1_ips> queue user1_in no state
pass out on $int_if from !<lan> to <user2_ips> queue user2_in no state
pass in on $int_if from <user1_ips> to !<lan> queue user1_out no state
pass in on $int_if from <user2_ips> to !<lan> queue user2_out no state
Для 7-й Фри "NO STATE" обязательны. Иначе в очереди пакеты лезть не будут.
Собственно фильтр всего один потому что сижу я ADSL роутером, в котором открыто всего 2 порта.