До боли известная задача. Есть комп. клуб.. АДСЛ инет всего 6Мбит на вход, в нем мира 1Мбит, исход 1Мбит всего...
Есть FreeBSD 7.0 pf + nat + squid (сквид реально нужен!!! для вырезания баннеров+теоретической борьбы с порно(режик) + статистика lightsquid + экономия ВРЕМЕНИ загрузки и узкой полосы)
Задача.
Сделать динамическое разделение траффика для клиентов.
Тоесть для каждого ИП, дать гарантированно 128Кбит мира и 512 Кбит ЮА и негарантированно столько, сколько есть свободно в данный момент... а дальше пойдут еще и приоритеты.
Начал реализацию. И тут первые грабли. Входящий траффик прошедший через прозрачный сквид, отдается сразу клиенту, и не попадает под шейпинг...
Тоесть первая задача: поймать и пошейпить входящий http траф, до того как он попадет на squid, или перед тем как squid отдаст его клиенту...
Просьба подсказать кто знает, как реализовать ?
итак
Код: Выделить всё
ifconfig -a
sk0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=b<RXCSUM,TXCSUM,VLAN_MTU>
ether 00:13:d4:ad:a7:de
inet 192.168.0.100 netmask 0xffffff00 broadcast 192.168.0.255
media: Ethernet autoselect (1000baseTX <full-duplex,flag0,flag1>)
status: active
fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=b<RXCSUM,TXCSUM,VLAN_MTU>
ether 00:02:b3:8b:12:ab
inet 77.88.... netmask 0xfffffffc broadcast 77.88.196.19
media: Ethernet autoselect (100baseTX <full-duplex>)
vim /etc/pf.conf
ext_if = "fxp0"
external_addr = "77.88...."
int_if = "sk0"
internal_addr = "192.168.0.0/24"
scrub in on $ext_if all fragment reassemble min-ttl 20 max-mss 1500
scrub in on $ext_if all no-df
scrub on $ext_if all reassemble tcp
altq on $ext_if cbq bandwidth 6Mb queue { def, ftp, udp, http_ua, ssh, icmp }
queue def bandwidth 18% cbq(default borrow red)
queue ftp bandwidth 10% cbq(borrow red)
queue udp bandwidth 30% cbq(borrow red)
queue http_ua bandwidth 20% cbq(red)
queue ssh bandwidth 20% cbq(borrow red) { ssh_login, ssh_bulk }
queue ssh_login bandwidth 25% priority 4 cbq(ecn)
queue ssh_bulk bandwidth 75% cbq(ecn)
queue icmp bandwidth 2% cbq
rdr on $int_if inet proto tcp from $internal_addr to !192.168.0.0/24 port { 80, 3128, 8000, 8080 } -> 192.168.0.100 port 3128
nat on fxp0 from 192.168.0.0/24 to any -> 77.88......
pass in on $ext_if proto tcp from <ua_ix> port 80 to any queue http_ua label "ua_http_in"
<ua_ix> таблица ЮА префиксов
pfctl -t ua_ix -T show |more
62.16.0.0/19
62.64.64.0/21
62.64.64.0/18
62.64.88.0/21
62.64.96.0/21
62.64.112.0/21
.....
менял посл. правило на pass in on $ext_if proto tcp from any port 80 to any queue http_ua label "ua_http_in"
не помогает...
pfctl -sl
ua_http_in 3146 0 0 0 0 0 0
Заранее просьба не пинать за какие-то неправильные строки не относящиеся к конкретному вопросу, а также НЕ предлагать ipfw pipe, delay tools, /etc..