Страница 1 из 1

как поделить канал

Добавлено: 2008-02-02 0:55:53
Гость
Подскажите чем можна делить канал динамически т. е. есть канал PPPoE 512 кбит/с 4 машины и шлюз на фре смысл чтобы если 2 машины в сети было по 256 каждому, если 4 по 128, если одна весь канал не зависимо от вида трафика (ftp особенно интерисует), или такое реализовать нельзя?

Re: как поделить канал

Добавлено: 2008-02-02 2:30:43
freeman
Такое реализовать можно, а вот чем.
PF это будет сложно сделать, а вот ipfw + DUMMYNET или как там его ... на раз. Или уже ищи по этим ключевым словам или жди от юзающих такую связку советов :)

Re: как поделить канал

Добавлено: 2008-02-02 11:35:50
terminus
IPFW + DUMMYNET + Pipe + Queue для каждой машины
Здесь на форуме неоднократно обсуждалось.

Re: как поделить канал

Добавлено: 2008-02-02 13:30:25
freeman
Ктстати в комментах статьи как я понял рассказывают что такая именно задача может решатся уже только с помощью самого IPFW2 ?

Re: как поделить канал

Добавлено: 2008-02-02 13:43:43
terminus
там в коментах уточнили, что не обязательно для каждого отдельный пайп делать через скрипт - это может создавать сам IPFW - динамически. Для этого в нем есть параметр mask у обьектов pipe и queue.
Начиная с какой версии фри эта возможность появилась - я не знаю. В 6ке есть.

Re: как поделить канал

Добавлено: 2008-02-02 19:27:18
squid
pf+altq

Re: как поделить канал

Добавлено: 2008-02-02 21:05:17
freeman
Гость писал(а):.....делить канал динамически ..... не зависимо от вида трафика (ftp особенно интерисует)......
squid писал(а):pf+altq
А ну ка расскажи как это сделать altq(pf) без геморроя ? :lol: :wink:

Re: как поделить канал

Добавлено: 2008-02-02 23:01:14
squid
еще не знаю
просто читал что возможно, хочу попробовать на днях
у меня настроено на ipfw pipe weight проблем вроде нет, пока кто то не поставит немеряную тучу закачек
потом начинает заметно тормозить инет и у тех у кого приоритет наибольший

Re: как поделить канал

Добавлено: 2008-02-02 23:24:03
squid
freeman писал(а):
squid писал(а):pf+altq
А ну ка расскажи как это сделать altq(pf) без геморроя ? :lol: :wink:
так что и не стоит заморачиваться ?

Re: как поделить канал

Добавлено: 2008-02-03 1:04:18
maradona

Код: Выделить всё

IPFW + DUMMYNET + Pipe + Queue
Пытаюсь разобратся - пока туго... :D да и чото я не пойму в статтье пишется про ограничение, а как скорость будет возрастать обратно если пакет с конкретного адреса находится в " трубе", и тут из 4 юзеров 3- е отключились?
И еще вопрос если простой NAT через PF зделать то связь будет типа - кто успел тот имеет скорость?, встроенная какаято регулировка ж должна быть сколько читал есть такие статтьи типа "для выхода в нет делаем NAT и типа все тип-топ" просветите если не трудно

Re: как поделить канал

Добавлено: 2008-02-03 1:22:15
freeman
maradona писал(а):И еще вопрос если простой NAT через PF зделать то связь будет типа - кто успел тот имеет скорость?, встроенная какаято регулировка ж должна быть
А вот для регулировки используется ALTQ.
Я например "нарезаю" канал на 1/5 линии гарантированно + если есть "свободная ширина", то разрешаю им добирать из пустующих, т.е. процесс как раз обратный ограничениям - гарантирование такой то сткорости + елси возможно, то дать больше =)

Re: как поделить канал

Добавлено: 2008-02-03 11:16:27
terminus
maradona писал(а): Пытаюсь разобратся - пока туго... :D да и чото я не пойму в статтье пишется про ограничение, а как скорость будет возрастать обратно если пакет с конкретного адреса находится в " трубе", и тут из 4 юзеров 3- е отключились?
http://forum.lissyara.su/viewtopic.php?f=8&t=6567
http://forum.lissyara.su/viewtopic.php?f=8&t=5203
http://forum.lissyara.su/viewtopic.php? ... ipe#p38305

Re: как поделить канал

Добавлено: 2008-02-03 17:29:47
helloworld
freeman писал(а): PF это будет сложно сделать
Глупость. Лень читать инструкцию по PF на официальном сайте OpenBSD ?
С pf динамика решается намного проще чем с ipfw.

Re: как поделить канал

Добавлено: 2008-02-03 17:46:22
freeman
Гость писал(а): делить канал динамически т. е. есть канал PPPoE 512 кбит/с 4 машины и шлюз на фре смысл чтобы если 2 машины в сети было по 256 каждому, если 4 по 128, если одна весь канал не зависимо от вида трафика (ftp особенно интерисует)
Прошу тыкнуть носом в пример подобного или инструменты, которыми это легче, много людей будут благодарны.
год назад на встроенным в 6ку FreeBSD делал шейпера altq очередями cbq pri с red ecn, вроде бы читал внимательно :)

Если правда речь пойдёт не о утрированных 4х/10 компах, а о подсети где заранее не известно на сколько в данную секунду IP/потоков нужно равномерно поделить канал.
Проблема в том, что для того чтобы обеспечить динамику, необходимо заранее (статически) описать все очереди, т.е. заранее знать см. выше что о подсети, это раз.
Проблема два - это ftp . Не знаю как в ipfw, но в винде и её последовательнице linux есть "трафик инспекторы", "хелперы", которые сами занимаются проблемами активного ftp, а в pf их нет и надо использовать ftp-proxy, что влечёт за собой дополнительный геморрой в дополнительных правил фильтрации, которыми в очереди то посылать надо, для этого самого ftp при наличии nat, т.к. нельзя (выборочно вообще, и без патченья для всех + и это не рекомендуется, не подерживается) фильтровать до nat и фильтр видит уже занатенные пакеты, ... короче там мудрить пришлось изрядно :)

Если же ТС имел в виду именно реальный "домашний" случай (не представляю себе корпоративную сеть на 4 компа), то действительно пишем:
1. Вкл. на сетевой карте такой то, cbq шириной канала ххх кб/с
2. создать 4 дочерних очереди cbq с шириной канала 25% от родительской и разрешить при возможности занимать свободную полосу родительской.
3. фильтрацией направить трафик с таких то IP в такие то очереди.

P.S. Из за необходимости таких вот описаний и не любят ISP PF, т.к. заранее на все 2к IP например долго расписывать + есть конфликт в том что при ограничительном подходе ipwf можно задать максимальную скорость канала клиентам, а там что получится, хоть по 100 раз продать каналы на 1Мб при 20ти внешних :) ALTQ же не позволяет автоматически создавать очереди и сумме дочерних очередей превышать родительскую ...
P.P.S. PF рулез - потому как я не ISP :D

Re: как поделить канал

Добавлено: 2008-02-04 9:06:00
Adekamer
ДЛя тех кто захочет аналогичное решение под Linux изпользуйте cbq входящий в iproute2

Re: как поделить канал

Добавлено: 2008-02-07 15:41:14
maradona
для freeman
Да я имел ввиду чистый "домашний случай"

Код: Выделить всё

1. Вкл. на сетевой карте такой то, cbq шириной канала ххх кб/с
2. создать 4 дочерних очереди cbq с шириной канала 25% от родительской и разрешить при возможности занимать свободную полосу родительской.
3. фильтрацией направить трафик с таких то IP в такие то очереди.
1. т.е. имеется ввиду карта что смотрит в локалку?
2. напиши пож. строчку котарая делает вот это:

Код: Выделить всё

и разрешить при возможности занимать свободную полосу родительской.
3.т.е. IP тех 4- компов что работают NATом через шлюз FreeBSD?

Re: как поделить канал

Добавлено: 2008-02-11 15:07:43
freeman
maradona писал(а): 2. напиши пож. строчку котарая делает вот это:

Код: Выделить всё

и разрешить при возможности занимать свободную полосу родительской.
borrow в дочерней очереди.

Re: как поделить канал

Добавлено: 2008-02-11 20:50:30
maradona
Обясните еще такую вещь прочитал что ALTQ работает только с исходящим трафиком, это значит - если есть 2 интерфейса tun0 и rl0 на них я организовываю очереди, потом весь трафик заворачиваю правилами в эти очереди (это я уже понял) какое действие in или out писать в фильтрующих правилах, я мыслю писать на внешнем tun0 действие out а на внутреннем действие in (ну типа направление движения пакетов из локалки в нет и обратно) я правильно думаю или нет? просто этого не могу понять а так почти разобрался, просто вот пример где особенность работы ALTQ с исходящим трафиком нихера не видно там и там действие in

Код: Выделить всё

http://admin.alfalinks.lv/?q=ru/node/19
или что-то я не так понял? испытывал вот этот конфиг

Код: Выделить всё

#MACRO_BEGIN#
ext_if="rl0"
int_if="xl0"

client1="192.168.1.2"
client2="192.168.1.34" 
client3="192.168.1.40"
client4="192.168.1.5"
client5=192.168.1.45
client6=192.168.150  
int_net = "{" $client1 $client2 $client3 $client4 $client5 $client6 "}"

icmp_types      ="echoreq"
isp_dns        = "{хххххххх хххххххх}"
www_ports="{20, 21, 25, 80, 110, 443, 3128, 8080}"
dns_port="{53}"
admin_ports="{22, 23}"
net_im_ports="{5190}"
#MACRO_END#

#Settings begin#
set loginterface $ext_if
set optimization normal
set block-policy drop
set require-order yes
set fingerprints "/etc/pf.os"
scrub all random-id min-ttl 128 reassemble tcp
#Settings end#

#ALTQ Begin#
altq on $int_if cbq  bandwidth 330Kb queue{client1_in, client2_in, client3_in, client4_in, client5_in, client6_
queue client1_in cbq(default, borrow, red)  bandwidth 16%{ssh1_in, icq1_in, def1_in, dns1_in}
queue ssh1_in bandwidth 15% priority 4 cbq(borrow, red)
queue icq1_in bandwidth 15% priority 3 cbq(borrow, red)
queue def1_in bandwidth 55% priority 2 cbq(borrow, red)
queue dns1_in bandwidth 15% priority 5 cbq(borrow, red)

queue client2_in cbq(borrow, red)  bandwidth 16%{icq2_in, def2_in, dns2_in}
queue icq2_in bandwidth 15% priority 3 cbq(borrow, red)
queue def2_in bandwidth 70% priority 2 cbq(borrow, red)
queue dns2_in bandwidth 15% priority 5 cbq(borrow, red)

queue client3_in cbq(borrow, red)  bandwidth 16%{def3_in, dns3_in}
queue def3_in bandwidth 80% priority 2 cbq(borrow, red)
queue dns3_in bandwidth 20% priority 5 cbq(borrow, red)

queue client4_in cbq(borrow, red)  bandwidth 16%{def4_in, dns4_in}
queue def4_in bandwidth 80% priority 2 cbq(borrow, red)
queue dns4_in bandwidth 20% priority 5 cbq(borrow, red)

queue client5_in cbq(borrow, red)  bandwidth 16%{ssh5_in, icq5_in, def5_in, dns5_in}
queue ssh5_in bandwidth 15% priority 4 cbq(borrow, red)
queue icq5_in bandwidth 15% priority 3 cbq(borrow, red)
queue def5_in bandwidth 55% priority 2 cbq(borrow, red)
queue dns5_in bandwidth 15% priority 5 cbq(borrow, red)
queue client6_in cbq(borrow, red)  bandwidth 16%{def6_in, dns6_in}
queue def6_in bandwidth 55% priority 2 cbq(borrow, red)
queue dns6_in bandwidth 15% priority 5 cbq(borrow, red)

queue test_in cbq(red)  bandwidth 3%{icmp_in}
queue icmp_in bandwidth 100% cbq(red)


altq on $ext_if cbq  bandwidth 330Kb queue{client1_out, dns_out }

queue dns_out cbq(borrow, red)  bandwidth 10%{imena_out}
queue  imena_out bandwidth 100% cbq(borrow, red)

queue client1_out cbq(default, borrow, red)  bandwidth 90%{ssh1_out, icq1_out, def1_out, dns1_out}
queue ssh1_out bandwidth 15% priority 4 cbq(borrow, red)
queue icq1_out bandwidth 15% priority 3 cbq(borrow, red)
queue def1_out bandwidth 55% priority 2 cbq(borrow, red)
queue dns1_out bandwidth 15% priority 5 cbq(borrow, red)


#ALTQ End#

#RDR RULES_BEGIN#
rdr on $int_if inet proto tcp from $int_net to any port www -> 192.168.10.1 port 3128
#RDR RULES_END#

#NAT Rules_BEGIN#
nat on $ext_if from $int_net to any -> ($ext_if)
#NAT_Rules_end#

#Blocking_rules begin#
block all
block return
#Blocking_rules end#

#lo rules begin#
pass quick on lo0 all
pass quick inet proto gre
antispoof for lo0 inet
#lo rules end#

#EXT_IF ALL RULES BEGIN#
pass out on $ext_if inet proto udp from any to $isp_dns port $dns_port queue imena_out keep state
pass out on $ext_if inet proto {tcp, udp} from any to any port $net_im_ports queue icq1_out keep state
pass out on $ext_if inet proto tcp from any to any port $admin_ports queue ssh1_out keep state
pass out on $ext_if inet proto tcp from any to any port $www_ports flags S/SA queue def1_out keep state
#EXT_IF ALL RULES END#

#Client1 rules begin#
pass quick on $int_if inet proto tcp from any to any port ssh queue ssh1_in keep state

pass in on $int_if inet proto icmp all icmp-type $icmp_types queue icmp_in
pass in on $int_if inet proto tcp from $client1 to any port $www_ports queue def1_in flags S/SA  keep state
pass in on $int_if inet proto udp from $client1 to any port $dns_port queue dns1_in keep state
pass in on $int_if inet proto {tcp, udp} from $client1 to any port $net_im_ports queue icq1_in keep state
pass in on $int_if inet proto tcp from $client1 to any port $admin_ports queue ssh1_in keep state
#Client1 rules end#

#Client2 rules begin#
pass in on $int_if inet proto tcp from $client2 to any port $www_ports queue def2_in flags S/SA  keep state
pass in on $int_if inet proto udp from $client2 to any port $dns_port queue dns2_in keep state
pass in on $int_if inet proto {tcp, udp} from $client2 to any port $net_im_ports queue icq2_in keep state
#Client2 rules end#

#Client3 rules begin#
pass in on $int_if inet proto tcp from $client3 to any port $www_ports queue def3_in flags S/SA  keep state
pass in on $int_if inet proto udp from $client3 to any port $dns_port queue dns3_in keep state
#Client3 rules end#

#Client4 rules begin#
pass in on $int_if inet proto tcp from $client4 to any port $www_ports queue def4_in flags S/SA  keep state
pass in on $int_if inet proto udp from $client4 to any port $dns_port queue dns4_in keep state
#Client4 rules end#

#Client5 rules begin#
pass in on $int_if inet proto tcp from $client5 to any port $www_ports queue def5_in flags S/SA  keep state
pass in on $int_if inet proto udp from $client5 to any port $dns_port queue dns5_in keep state
pass in on $int_if inet proto {tcp, udp} from $client5 to any port $net_im_ports queue icq5_in keep state
pass in on $int_if inet proto tcp from $client5 to any port $admin_ports queue ssh5_in keep state
#Client5 rules end#

#Client6 rules begin#
pass in on $int_if inet proto tcp from $client6 to any port $www_ports queue def6_in flags S/SA  keep state
pass in on $int_if inet proto udp from $client6 to any port $dns_port queue dns6_in keep state
#Client6 rules end# 
(не полностью мой случай) все работает правда чото медленно делится канал - но делится и возвращает полосу если свободно так вот если меняю действие out на in в секции #EXT_IF ALL RULES BEGIN# то нихера не работает.