PDA

Bekijk de volledige versie : Приоритезация трафика (shaping) для разных провайдеров, тарифов и целей



leniviy
03-03-2008, 20:03
можно пропустить всю эту болтовню и сразу идти сюда: http://wl500g.info/showthread.php?p=87742#post87742



сложность в том, что wshaper умеет классифицировать пакеты только по номеру порта, а исходящие соединения rtorrent идут через случайный порт.

Единственное решение, которое приходит в голову, настроить rtorrent через локальный прокси, а в wshaper передавать порт прокси сервера.

leniviy
04-03-2008, 08:21
Как сделать, чтобы rtorrent работал через прокси? опция http_proxy не помогает.

я понял как надо сделать. Есть tsocks - соксификатор, который перехватывает вызов connect()
Если написать аналогичную библиотеку, которая будет перехватывать connect() и внутри вызывать bind() к заранее определенному набору портов. Один и тот же локальный порт теоретически можно использовать для подключений к разным хостам.
Этот же набор портов использовать в wshaper

velsi
04-03-2008, 10:02
сложность в том, что wshaper умеет классифицировать пакеты только по номеру порта, а исходящие соединения rtorrent идут через случайный порт.


если rtorrent установлен на самом рутере, то выход достаточно простой - весь трафик изначально пихать в самый низкориоритетный класс

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

поэтому буду признателен, если местные гуру нам помогут =)

я сейчас работаю с этим (роутер раздает адреса 192.168.100.хх):

#!/bin/sh

DOWNLINK=$3
UPLINK=$4
DEV=$2

if [ "$1" = "status" ]
then
tc -s qdisc ls dev $DEV
tc -s class ls dev $DEV
exit
fi


# clean existing down- and uplink qdiscs, hide errors
tc qdisc del dev $DEV root 2> /dev/null > /dev/null
tc qdisc del dev $DEV ingress 2> /dev/null > /dev/null

if [ "$1" = "stop" ]
then
exit
fi

###### uplink
# set queue size to give latency of about 2 seconds on low-prio packets
ip link set dev $DEV qlen 30

# changes mtu on the outbound device. Lowering the mtu will result
# in lower latency but will also cause slightly lower throughput due
# to IP and TCP protocol overhead.
ip link set dev $DEV mtu 1000

# install root HTB, point default traffic to 1:30:

tc qdisc add dev $DEV root handle 1: htb default 30 r2q 1

# shape everything at $UPLINK speed - this prevents huge queues in your
# DSL modem which destroy latency:

tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit burst 1540 cburst 1

# high prio class 1:10:

tc class add dev $DEV parent 1:1 classid 1:10 htb rate $((3*$UPLINK/10))kbit ceil ${UPLINK}kbit prio 0

# desktop class 1:20

tc class add dev $DEV parent 1:1 classid 1:20 htb rate $((6*$UPLINK/10))kbit ceil ${UPLINK}kbit prio 1

# bulk data/bittorrent class 1:30

tc class add dev $DEV parent 1:1 classid 1:30 htb rate $((1*$UPLINK/10))kbit ceil $((8*$UPLINK/10))kbit prio 2

# all get Stochastic Fairness:
tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev $DEV parent 1:30 handle 30: sfq perturb 10

# TOS Minimum Delay (ssh, NOT scp) in 1:10:
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 \
match ip tos 0x10 0x10 flowid 1:10

# ICMP (ip protocol 1) in the interactive class 1:10 so we
# can do measurements & impress our friends:
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 \
match ip protocol 1 0xff flowid 1:10

# To speed up downloads while an upload is going on, put ACK packets in
# the interactive class:
tc filter add dev $DEV parent 1: protocol ip prio 1 u32 \
match ip protocol 6 0xff \
match u8 0x05 0x0f at 0 \
match u16 0x0000 0xffc0 at 2 \
match u8 0x10 0xff at 33 \
flowid 1:10

# prioritize small packets (<64 bytes)
tc filter add dev $DEV parent 1: protocol ip prio 1 u32 \
match ip protocol 6 0xff \
match u8 0x05 0x0f at 0 \
match u16 0x0000 0xffc0 at 2 \
flowid 1:10

# from desktops - mark 6
tc filter add dev $DEV parent 1: protocol ip prio 10 handle 6 fw flowid 1:20

iptables -A PREROUTING -t mangle -s 192.168.100.0/24 -j MARK --set-mark 6

########## downlink #############
# slow downloads down to somewhat less than the real speed to prevent
# queuing at our ISP. Tune to see how high you can set it.
# ISPs tend to have *huge* queues to make sure big downloads are fast
#
# attach ingress policer:

tc qdisc add dev $DEV handle ffff: ingress

# filter *everything* to it (0.0.0.0/0), drop everything that's
# coming in too fast:

tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \
0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1

ABATAPA
04-03-2008, 10:09
я понял как надо сделать. Есть tsocks - соксификатор, который перехватывает вызов connect()
Если написать аналогичную библиотеку, которая будет перехватывать connect() и внутри вызывать bind() к заранее определенному набору портов. Один и тот же локальный порт теоретически можно использовать для подключений к разным хостам.
Этот же набор портов использовать в wshaper

Проще собрать модуль ipt_owner для iptables и ядра, и отслеживать все соединения от нужных PID.

leniviy
06-03-2008, 22:52
получилось написать прогу для винды, которая привязывает исходящие соединения к набору портов. В данном случае 15000-16000.
когда доделаю для винды, сделаю для линукса.
к моей проге хочу привязать качалку и uTorrent.
http://wl500g.info/attachment.php?attachmentid=2612&stc=1&d=1204818853

wshaper слабенький, и выложенный здесь скрипт тоже слабенький. Буду учить tc и ip

velsi
07-03-2008, 12:08
wshaper слабенький, и выложенный здесь скрипт тоже слабенький. Буду учить tc и ip
давай... не забудь поделиться с общественностью достигнутыми резуальтатами =)

leniviy
09-03-2008, 12:07
пример. аплинк 250
почему бы для низкого приоритета вместо того как в whshaper:

tc class add dev vlan1 parent 1:1 classid 1:30 htb rate 200kbit burst 1 cburst 1 prio 0

не использовать вот это?


tc class add dev vlan1 parent 1:1 classid 1:30 htb rate 25kbit ceil 250kbit burst 1 cburst 1 prio 0


в первом случае низкоприоритетный траффик будет забивать канал и никогда не будет работать на полную мощность.
а во втором случае он будет автоматически тротлиться, если появляется более высокоприоритетный траффик

leniviy
09-03-2008, 12:11
*lartc = Linux Advanced Routing & Traffic Control HOWTO


[admin@router netfilter]$ tc qdisc add dev br0 root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 8
RTNETLINK answers: Invalid argument

я так понимаю, что в ядре чего-то не хватает.

leniviy
09-03-2008, 12:13
например так не работает:


[admin@router netfilter]$ tc filter add dev br0 parent 1: protocol ip prio 16 u32 match ip sport 12345-12346 0xffff flowid 1:10
Illegal "match"

al37919
09-03-2008, 13:02
в iptables диапазон задается через двоеточие

leniviy
09-03-2008, 13:47
ага, понял. а в match - по маске. так что диапазон портов надо подбирать кратный 2

iptables -t mangle .......... -j MARK ..........
для помечания исходящих коннектов
iptables -A PREROUTING -t mangle .......... -j MARK .........
для помечания входящик коннектов

правильно?

Ilmarinen
09-03-2008, 14:35
iptables -t mangle .......... -j MARK ..........
для помечания исходящих коннектов
iptables -A PREROUTING -t mangle .......... -j MARK .........
для помечания входящик коннектов

правильно?
Нет, не правильно в первом варианте не указана цепочка.
iptables -A PREROUTING -t mangle .......... -j MARK в любом случае используется для маркировки пакетов, только для входящих и исходящих условия разные. Укажите в условиях -s source_ip, в качестве source_ip используйте адреса локальных компьютеров или роутера, в зависимости что Вам требуется и будет происходить маркировка исходящего трафика, для входящего укажите -d ip_адрес_маршрутизатора. В качестве критерия можно так же использовать имя интерфейса с которого был получен пакет -i.
Рекомендую посмотреть http://www.opennet.ru/docs/RUS/iptables/ там есть очень понятная схема.

leniviy
09-03-2008, 20:12
надо фильтровать *.pppoe.avangarddsl.ru в отдельный класс. Есть такой модуль?

ABATAPA
09-03-2008, 20:15
надо фильтровать *.pppoe.avangarddsl.ru в отдельный класс. Есть такой модуль?

Есть. Называется - "руки + голова".
Посмотрите диапазон адресов.

leniviy
09-03-2008, 21:25
lynx -dump "http://www.db.ripe.net/whois?form_type=simple&full_query_string=&searchtext=RU-AVANGARD-DSL&do_search=Search" | grep inetnum

более менее разобрался с egress. теперь неепонятка с ingress.
Например в egress скорость указывается в классе. А в ingress скорость указывается в фильтре

tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \
0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1


сегодня надеюсь выложу часть скрипта

ABATAPA
12-03-2008, 06:29
Например в egress скорость указывается в классе. А в ingress скорость указывается в фильтре


Потому что ingress class-less (т.е. безклассовый).

leniviy
12-03-2008, 22:09
http://wl500g.info/showthread.php?p=88238#post88238

ABATAPA
13-03-2008, 07:59
shape-test filter vlan1 2 d 1 "protocol ip prio 10 u32 match ip dport 80 0xffff"

А не sport?

leniviy
13-03-2008, 08:27
у меня скорость закачки без шейпинга 120 килобайт. сайты не открываются.
с шейпингом 110 килобайт и резко проседает, когда скачивается страничка. сайты открываются быстро

ABATAPA, нет. dport
shape-test filter vlan1 2 d
все равно фильтрует исходящие пакеты

для приоритизации скачиваний я использую задержку ACK пакетов.
Но соотношение ACKCOEF зависит от количества активных соединений.
Чем их больше, тем мельче входящие пакеты.
Если в ACK пакете указан размер входящего пакета, то эту проблему можно решить. Если нет, то только следить за сетевой активностью и перезапускать shape-test с разными параметрами.

ABATAPA
13-03-2008, 12:35
ABATAPA, нет. dport
shape-test filter vlan1 2 d
все равно фильтрует исходящие пакеты

Для upload и download - dport?

leniviy
13-03-2008, 14:20
ну что тут непонятного?
Чтобы заставить ту сторону слать нам пакеты медленнее мы задерживаем пакеты с подтверждением доставки. У пакетов с подтверждением мы - ОТПРАВИТЕЬ, а тот, с кого мы качаем - ПОЛУЧАТЕЛЬ


Проще собрать модуль ipt_owner для iptables и ядра, и отслеживать все соединения от нужных PID.
я буду очень признателен, если кто-нибудь подскажет, ответ
Где обычно берут эти модули?
Нужно ли перекомпилировать iptables?
можно ли собрать этот модуль на роутере или надо ставить тулчейн?

ABATAPA
13-03-2008, 15:45
ну что тут непонятного?
Чтобы заставить ту сторону слать нам пакеты медленнее мы задерживаем пакеты с подтверждением доставки. У пакетов с подтверждением мы - ОТПРАВИТЕЬ, а тот, с кого мы качаем - ПОЛУЧАТЕЛЬ


Интересно... И что, в обоих случаях destination port = 80?!
Или же все же речь тут идет о трафике ОТ 80 порта на удаленной стороне, и с любого порта на локальной стороне К 80 порту удаленной?


я буду очень признателен, если кто-нибудь подскажет, ответ
Где обычно берут эти модули?

Обычно там же, где и другие. Но в прошивках Олега этот модуль не собран.



можно ли собрать этот модуль на роутере или надо ставить тулчейн?
О сборке для роутера есть немало тем, почитайте их.

leniviy
13-03-2008, 21:59
Тема QoS иногда всплывает, но все ограничивается советом использовать слабенький wshaper. Если на роутере не стоит качалка, то можно этим и ограничиться. Но у многих эта качалка есть.
Предлагаю заняться этим вопросом. На первую страницу будем класть ссылки на реально работающие инструкции, как настроить шейпинг.

например так:
Авангард СПб http://wl500g.info/showthread.php?p=88238#post88238

Здесь лежит скрипт для удобного просмотра скоростей по классам http://wl500g.info/showthread.php?p=101369#post101369

leniviy
15-03-2008, 15:47
1) Если у прова есть LAN с высокой скоростью (MAN), то надо подготовиться.
Надо сделать файл-список ip адресов провайдера.
Файл назовем "/etc/isp-ip-addrs.lst"
формат такой:

89.110.48.0/21
89.110.56.0/22
...
78.37.112.0/20
в /usr/local/.files добавим строчку /etc/isp-ip-addrs.lst

Если ip прова внешние, то можно достать их из интернетовской базы, иначе заполним список вручную. Я сижу на Авангарде СПб, вот скрипт для него
/opt/sbin/avangard


#!/bin/sh
# требуется пакет lynx
FILEPATH="/etc/isp-ip-addrs.lst"
UPDATE=1
if [ -e "$FILEPATH" ]; then
FILEAGE=$(((`date +%s`-`stat -c %Y "$FILEPATH"`)/60/60/24))
if [ "$FILEAGE" -lt 30 ]; then
UPDATE=0
fi
fi
if [ $UPDATE = 1 ]; then
echo updating
lynx -dump "http://www.db.ripe.net/whois?form_type=simple&full_query_string=&searchtext=RU-AVANGARD-DSL&do_search=Search" | \
grep "inetnum\:" | awk '
func ceil(f) { {split(0+f,a,".")} {if ((a[1]==(0+f))||(a[1]<0)) {return a[1]}} {return a[1]+1} } \
{split($2,a1,".")} {split($4,a2,".")} \
{print $2 "/" \
32-ceil(log((a2[1]*16777216+a2[2]*65536+a2[3]*256+a2[4])-(a1[1]*16777216+a1[2]*65536+a1[3]*256+a1[4]))/log(2)) \
" #" $1 " " $2 " " $3 " " $4 \
} \
' > "$FILEPATH"
fi
#printf '%02X' `echo ${IP_ADDR}| sed -e "s/\./ /g"`
#let __x=0x; echo $__x


2) тепрь сам скрипт /usr/loscal/sbin/shape-test:


#!/bin/sh
DEV=$2
CLSPREF=$3
DOWNLINK=$4
UPLINK=$5

DISC=$7
ROOTCLS=$8
ACKCOEF=$6

FILTERUD=$4
FILTERPRIO=$5
FILTERSTR="$6"
if [ -z "$1" ]; then
echo "Использование:"
echo "shape-test start DEV CLSPREF DOWNLINK UPLINK [ACKCOEF] [DISC] [ROOTCLS]"
echo "shape-test status DEV"
echo "shape-test stop DEV"
echo "shape-test filter DEV CLSPREF <u|d> <1|2|3> \"prio и условие в формате tc filter\" [DISC] [ROOTCLS]"

echo "shape-test start можно запускать повторно с другим CLSPREF, тогда"
echo "надо указать DISC"
echo "shape-test filter можно вызывать многократно после shape-test start"
echo "<1|2|3> - приоритет траффика"
echo "prio должен быть больше 10"
echo "пример:"
echo "shape-test filter vlan1 2 u 1 \"protocol ip prio 10 u32 match ip dport 80 0xffff\" "


echo "с DOWNLINK, UPLINK и DEV должно быть все понятно"
echo "ACKCOEF - объем скачанного поделить на объем соответствуюющего ACK траффика"
echo "ACKCOEF надо увеличивать, пока не начнет падать скорость закачки"
echo "число 125 получил опытным путем на закачке с ftp сервера"
echo "число 50 получил опытным путем на торренте"
echo "CLSPREF - префикс создаваемого дерева (от 2 до fff)"
echo "DISC - дисциплина, к которой присоединяется дерево классов"
echo "если DISC пусто, то создается корневая дисциплина"
echo "ROOTCLS - класс, к которому присоединяется дерево классов (может быть 0)"
echo "если ROOTCLS пусто, то ROOTCLS=0"

echo ""
echo ""
exit 1
fi

if [ "$1" = "status" ]
then
tc -s qdisc ls dev $DEV
tc -s class ls dev $DEV
exit
fi
if [ -z "$ROOTCLS" ]; then
ROOTCLS=0
fi
CREATEROOT=0
if [ -z "$DISC" ]; then
DISC=1
CREATEROOT=1
fi
if [ -z "$ACKCOEF" ]; then
ACKCOEF=50
fi

D=$DISC
C=$ROOTCLS
N=$CLSPREF
DC=${D}:${C}
DCN=${DC}${N}
CN=${C}${N}
if [ "$1" = "stop" ]
then
tc qdisc del dev $DEV root > /dev/null 2>&1
tc qdisc del dev $DEV ingress > /dev/null 2>&1
exit
fi

if [ "$1" = "filter" ]; then
echo "$1 DEV=$DEV CLSPREF=$CLSPREF FILTERUD=$FILTERUD FILTERPRIO=$FILTERPRIO FILTERSTR=\"$FILTERSTR\" DISC=$DISC ROOTCLS=$ROOTCLS"
if [ "$FILTERUD" = "u" ]; then
tc filter add dev $DEV parent ${DCN}0 $FILTERSTR flowid ${DCN}${FILTERPRIO}
fi
if [ "$FILTERUD" = "d" ]; then
tc filter add dev $DEV parent ${DCN}f $FILTERSTR flowid ${DCN}`printf "%x" $((15-$FILTERPRIO))`
fi
exit
fi

echo $1 DEV=$DEV CLSPREF=$CLSPREF DOWNLINK=$DOWNLINK UPLINK=$UPLINK ACKCOEF=$ACKCOEF DISC=$DISC ROOTCLS=$ROOTCLS

if [ $CREATEROOT = 1 ]; then
DISC=1
R=1
tc qdisc del dev $DEV root > /dev/null 2>&1
tc qdisc del dev $DEV ingress > /dev/null 2>&1
# очищаем дерево шейперов

tc qdisc add dev $DEV root handle ${DC} htb default 555
# корневая дисциплина. по умолчанию направляет пакеты в несуществующий класс 555
# все равно придется добавлять фильтр на корневой класс
# иначе не будут работать фильтры второго порядка

tc filter add dev $DEV parent ${DC} protocol ip prio 9999 u32 match ip dst 0.0.0.0/0 flowid ${DCN}0
# фильтр по умолчанию на корневой класс
fi

tc class add dev $DEV parent ${DC} classid ${DCN}0 htb rate $(($UPLINK))kbit
# канал ${N}

tc class add dev $DEV parent ${DCN}0 classid ${DCN}1 htb \
rate $((6*$UPLINK/10))kbit ceil $(($UPLINK))kbit prio 1
# высокий приоритет отдачи
tc class add dev $DEV parent ${DCN}0 classid ${DCN}2 htb \
rate $((3*$UPLINK/10))kbit ceil $((10*$UPLINK/10))kbit prio 2
# средний приоритет отдачи
tc class add dev $DEV parent ${DCN}0 classid ${DCN}3 htb \
rate $((1*$UPLINK/10))kbit ceil $((10*$UPLINK/10))kbit prio 3
# низкий приоритет отдачи

tc qdisc add dev $DEV parent ${DCN}1 handle ${CN}1: sfq perturb 10
tc qdisc add dev $DEV parent ${DCN}2 handle ${CN}2: sfq perturb 10
tc qdisc add dev $DEV parent ${DCN}3 handle ${CN}3: sfq perturb 10
# если не добавить sfq, пакеты будут отбрасываться даже если скорость
# отдачи ниже лимита

tc class add dev $DEV parent ${DCN}0 classid ${DCN}f htb \
rate $((10*$DOWNLINK*1024/10/$ACKCOEF))
# класс для ACK пакетов. в 2 раза больше расчетной скорости, чтобы
# никогда не отбрасывать пакеты приоритетного траффика

tc class add dev $DEV parent ${DCN}f classid ${DCN}e htb rate $((10*$DOWNLINK*1024/10/$ACKCOEF))
# высокий приоритет
tc qdisc add dev $DEV parent ${DCN}e handle ${CN}e: sfq perturb 10

tc class add dev $DEV parent ${DCN}f classid ${DCN}d htb rate $((3*$DOWNLINK*1024/10/$ACKCOEF)) ceil $((10*$DOWNLINK*1024/10/$ACKCOEF))
# средний приоритет
#tc qdisc add dev $DEV parent ${DCN}d handle ${CN}d: sfq perturb 10

tc class add dev $DEV parent ${DCN}f classid ${DCN}c htb rate $((1*$DOWNLINK*1024/10/$ACKCOEF)) ceil $((10*$DOWNLINK*1024/10/$ACKCOEF))
# низкий приоритет
#tc qdisc add dev $DEV parent ${DCN}c handle ${CN}c: sfq perturb 10

#
#
# ***** фильтры ******
#
#

tc filter add dev $DEV parent ${DCN}0 protocol ip prio 9999 u32 match ip dst 0.0.0.0/0 flowid ${DCN}2
# фильтр по умолчанию на средний приоритет

#
# *********** download
#
tc filter add dev $DEV parent ${DCN}0 protocol ip prio 1 u32 \
match ip protocol 6 0xff \
match u8 0x05 0x0f at 0 \
match u16 0x0000 0xffc0 at 2 \
match u8 0x10 0xff at 33 \
flowid ${DCN}f
# фильтровать ACK пакеты в класс *f

tc filter add dev $DEV parent ${DCN}f protocol ip prio 9999 u32 \
match ip dst 0.0.0.0/0 flowid ${DCN}d
# фильтр ACK пакетов по умолчанию на средний приоритет

# *ACK TOS Minimum Delay (ssh, NOT scp)
tc filter add dev $DEV parent ${DCN}f protocol ip prio 5 u32 \
match ip tos 0x10 0xff flowid ${DCN}e
#
# *********** /download
#

# TOS Minimum Delay (ssh, NOT scp)
tc filter add dev $DEV parent ${DCN}0 protocol ip prio 2 u32 \
match ip tos 0x10 0xff flowid ${DCN}1

# ICMP (ip protocol 1) in the interactive class 1:10 so we
# can do measurements & impress our friends:
tc filter add dev $DEV parent ${DCN}0 protocol ip prio 2 u32 \
match ip protocol 1 0xff flowid ${DCN}1

# prioritize small packets (<64 bytes)
tc filter add dev $DEV parent ${DCN}0 protocol ip prio 2 u32 \
match ip protocol 6 0xff \
match u8 0x05 0x0f at 0 \
match u16 0x0000 0xffc0 at 2 \
flowid ${DCN}1

leniviy
15-03-2008, 15:48
3) скрипт запуска по авангард

UPD: перешел на тариф 1024, переделал скрипт запуска с учетом VoIP и UDP, DNS больше не тормозит. Спасибо YAG

/usr/local/sbin/shape-avangard


#!/bin/sh
if [ -z "$1" ]; then
echo must specify device
exit 1
fi
DEV=$1
# авангард 1024
# реальная скорость аплода в сумме 528 даже если с тебя качает авангардовец
# скорость даунлода 1056
# + скорость даунлода с авангардовцев 1024

DOWNLINK=1056
UPLINK=528
DOWNLINKMAN=1024
UPLINKMAN=757
FASTMANUPLOAD=0
# FASTMANUPLOAD=0 - MAN и WAN делят общий канал аплод
# FASTMANUPLOAD=1 - независимый канал аплод для MAN

shape-test start $DEV 2 $DOWNLINK $UPLINK 40
# интернет

shape-test filter $DEV 2 u 1 "protocol ip prio 10 u32 match ip dport 80 0xffff"
shape-test filter $DEV 2 d 1 "protocol ip prio 10 u32 match ip dport 80 0xffff"
shape-test filter $DEV 2 u 1 "protocol ip prio 10 u32 match ip dport 443 0xffff"
shape-test filter $DEV 2 d 1 "protocol ip prio 10 u32 match ip dport 443 0xffff"
shape-test filter $DEV 2 u 1 "protocol ip prio 10 u32 match ip dport 21 0xffff"
shape-test filter $DEV 2 d 1 "protocol ip prio 10 u32 match ip dport 21 0xffff"
shape-test filter $DEV 2 u 1 "protocol ip prio 10 u32 match ip dport 25 0xffff"
shape-test filter $DEV 2 d 1 "protocol ip prio 10 u32 match ip dport 25 0xffff"
shape-test filter $DEV 2 u 1 "protocol ip prio 10 u32 match ip dport 110 0xffff"
shape-test filter $DEV 2 d 1 "protocol ip prio 10 u32 match ip dport 110 0xffff"
# Приоритет для обычного интернета

shape-test filter $DEV 2 u 3 "protocol ip prio 10 u32 match ip sport 65533 0xffff"
shape-test filter $DEV 2 d 3 "protocol ip prio 10 u32 match ip sport 65533 0xffff"
# Приоритет для rtorrent

shape-test filter $DEV 2 u 3 "protocol ip prio 10 u32 match ip sport 63128 0xffff"
shape-test filter $DEV 2 d 3 "protocol ip prio 10 u32 match ip sport 63128 0xffff"
# Приоритет для публичного 3proxy

shape-test filter $DEV 2 u 1 "protocol ip prio 5 u32 match ip tos 0x68 0xff match ip protocol 0x11 0xff"
shape-test filter $DEV 2 d 1 "protocol ip prio 5 u32 match ip tos 0x68 0xff match ip protocol 0x11 0xff"
shape-test filter $DEV 2 u 1 "protocol ip prio 5 u32 match ip tos 0xb8 0xff match ip protocol 0x11 0xff"
shape-test filter $DEV 2 d 1 "protocol ip prio 5 u32 match ip tos 0xb8 0xff match ip protocol 0x11 0xff"
# high priority for VoIP traffic (by TOS)

shape-test filter $DEV 2 u 1 "protocol ip prio 5 u32 match ip sport 5004 0xffff match ip protocol 0x11 0xff"
shape-test filter $DEV 2 d 1 "protocol ip prio 5 u32 match ip sport 5004 0xffff match ip protocol 0x11 0xff"
shape-test filter $DEV 2 u 1 "protocol ip prio 5 u32 match ip sport 5060 0xffff match ip protocol 0x11 0xff"
shape-test filter $DEV 2 d 1 "protocol ip prio 5 u32 match ip sport 5060 0xffff match ip protocol 0x11 0xff"
# high priority for VoIP traffic (by source port)

shape-test filter $DEV 2 u 1 "protocol ip prio 5 u32 match ip protocol 0x11 0xff"
# all UDP traffic

tc qdisc del dev $DEV ingress > /dev/null 2>&1
tc qdisc add dev $DEV ingress handle ffff:

tc filter add dev $DEV parent ffff: protocol ip prio 15 u32 match ip protocol 0x11 0xff \
police index 15 rate ${DOWNLINK}kbit buffer 50k drop flowid :2
# all UDP traffic

tc filter add dev $DEV parent ffff: protocol ip prio 20 u32 match ip src \
0.0.0.0/0 police index 20 rate $((DOWNLINK*98/100))kbit buffer 50k drop flowid :2
# чтобы даунлод был чуть меньше $DOWNLINK и не мешал UDP пакетам

#************************************************* *****************
# локалка провайдера
shape-test start $DEV 3 $DOWNLINKMAN $UPLINKMAN 40 1
# локалка провайдера (используем это дерево только для даунлода параметр UPLINK Не имеет особого значения)

if [ "$FASTMANUPLOAD" = "1" ]; then
while read ADDR B; do tc filter add dev $DEV parent 1: protocol ip prio 1 \
u32 match ip dst $ADDR flowid 1:30; done < /etc/isp-ip-addrs.lst
# добавить фильтры, чтобы даунлод и аплод из MAN шли через дерево 3
else
while read ADDR B; do tc filter add dev $DEV parent 1:2f protocol ip prio 1 \
u32 match ip dst $ADDR flowid 1:3f; done < /etc/isp-ip-addrs.lst
# добавить фильтры, чтобы даунлод из MAN шел через дерево 3
fi

while read ADDR B; do tc filter add dev $DEV parent ffff: protocol ip \
prio 10 u32 match ip dst $ADDR police index 10 rate ${DOWNLINKMAN}kbit buffer 50k \
drop flowid :1; done < /etc/isp-ip-addrs.lst
# добавить фильтры, чтобы даунлод с авангардовцев был $DOWNLINKMAN

shape-test filter $DEV 3 u 3 "protocol ip prio 10 u32 match ip sport 65533 0xffff"
shape-test filter $DEV 3 d 3 "protocol ip prio 10 u32 match ip sport 65533 0xffff"
# Приоритет для rtorrent

shape-test filter $DEV 3 u 3 "protocol ip prio 10 u32 match ip sport 63128 0xffff"
shape-test filter $DEV 3 d 3 "protocol ip prio 10 u32 match ip sport 63128 0xffff"
# Приоритет для публичного 3proxy


4) добавить в /usr/local/sbin/post-firewall


#traffic shaping
/usr/local/sbin/shape-avangard $1

king2
11-04-2008, 18:02
Корбина, тариф 9200 килобит.

Ограничения: не работает при наличии качалки на роутере.
Преимущества: работает шейпинг как исходящего, так и входящего трафика с приоритезацией.

Базовый скрипт (shape.sh):
Устанавливает на указанном девайсе ограничение скорости, делит траффик на 3 полосы в соотношении 50/40/10 процентов, устанавливает базовые фильтры.


#!/bin/sh
# Wonder Shaper, last modified by Oleg King (aka king2)
#
# wshaper-king2 (start|stop|status) WAN LAN DOWNLINK UPLINK

# shape_device(device, speed)
DEV="$1"
SPEED="$2"

# install root HTB, shape everything to collect all the queue in our router, and divide traffic into 3 parts
tc qdisc add dev $DEV root handle 1: htb default 777
tc class add dev $DEV parent 1:0 classid 1:1 htb burst 256k rate 100mbit ceil 100mbit
tc class add dev $DEV parent 1:1 classid 1:2 htb burst 64k rate ${SPEED}kbit ceil ${SPEED}kbit

# setclass: device, class_id, prio, total uplink, percentage of uplink
tc class add dev $DEV parent 1:2 classid 1:10 htb burst 64k rate $((50*$SPEED/100))kbit ceil ${SPEED}kbit prio 1
tc class add dev $DEV parent 1:2 classid 1:20 htb burst 64k rate $((40*$SPEED/100))kbit ceil ${SPEED}kbit prio 2
tc class add dev $DEV parent 1:2 classid 1:30 htb burst 64k rate $((10*$SPEED/100))kbit ceil ${SPEED}kbit prio 3

tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
#tc qdisc add dev $DEV parent 1:30 handle 30: sfq perturb 10

# PRIO1 --- Business class traffic ---
# high priority for VoIP traffic (by TOS)
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 \
match ip tos 0x68 0xff \
match ip protocol 0x11 0xff \
flowid 1:10
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 \
match ip tos 0xb8 0xff \
match ip protocol 0x11 0xff \
flowid 1:10

# ICMP (ip protocol 1) in the interactive class
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 \
match ip protocol 1 0xff \
flowid 1:10

# all UDP traffic are interractive
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 \
match ip protocol 0x11 0xff \
flowid 1:10

# to make downloads fast while an upload is going on, speed up ACK packets
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 \
match ip protocol 6 0xff \
match u8 0x05 0x0f at 0 \
match u16 0x0000 0xffc0 at 2 \
match u8 0x10 0xff at 33 \
flowid 1:10

# TOS Minimum Delay (ssh, NOT scp)
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 \
match ip tos 0x10 0xff \
flowid 1:10

# PRIO2 --- Economy class traffic ---
# web browsing is better than other traffic
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 \
match ip sport 80 0xffff flowid 1:20
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 \
match ip dport 80 0xffff flowid 1:20
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 \
match ip sport 433 0xffff flowid 1:20
tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 \
match ip dport 433 0xffff flowid 1:20

# other traffic goes to default 1:20
tc filter add dev $DEV parent 1:0 protocol ip prio 7 u32 \
match ip dst 0.0.0.0/0 flowid 1:20

king2
11-04-2008, 18:08
Основной скрипт (wshaper-king2.sh):
Вызывается из post-firewall, устанавливает базовые ограничения для WAN и LAN интерфейсов, плюс дополнительно устанавливает:
- торренты как приоритет 3 для WAN и LAN
- 192.168.1.1 плюс все, что вытащено из маршрутов - как траффик без ограничений скорости для LAN



#!/bin/sh
# Wonder Shaper, last modified by Oleg King (aka king2)
#
# wshaper-king2 (start|stop|status) WAN LAN UPLINK DOWNLINK

WAN=$2
LAN=$3
UPLINK=$4
DOWNLINK=$5

# show status and exit
if [ "$1" = "status" ]
then
echo "Outgoing traffic:";
echo "-----------------";
tc -s class ls dev $WAN
echo "Incoming traffic:";
echo "-----------------";
tc -s class ls dev $LAN
exit
fi

# clean existing downlink and uplink qdiscs, hide errors
tc qdisc del dev $WAN root 2> /dev/null > /dev/null
tc qdisc del dev $LAN root 2> /dev/null > /dev/null
if [ "$1" = "stop" ]
then
exit
fi

### WAN ###
/usr/local/sbin/shape.sh $WAN $UPLINK

# PRIO3 --- torrents will fly with laggage ToS=0x3f and ports 4663 + 21760-22015 ---
tc filter add dev $WAN parent 1:0 protocol ip prio 5 u32 \
match ip tos 0x3f 0xff \
flowid 1:30
tc filter add dev $WAN parent 1:0 protocol ip prio 5 u32 \
match ip sport 0x5500 0xff00 \
flowid 1:30
tc filter add dev $WAN parent 1:0 protocol ip prio 5 u32 \
match ip sport 4663 0xffff \
flowid 1:30

### LAN ###
/usr/local/sbin/shape.sh $LAN $DOWNLINK

# PRIO0 --- MAN always first and unlimited
tc filter add dev $LAN parent 1:0 protocol ip prio 1 u32 \
match ip src 192.168.1.1/32 \
flowid 1:2
tc filter add dev $LAN parent 1:0 protocol ip prio 1 u32 \
match ip dst 192.168.1.1/32 \
flowid 1:2

MANLIST=`ip route | grep vlan1 | grep -v default | awk '{print $1}'`
for a in $MANLIST
do
tc filter add dev $LAN parent 1:0 protocol ip prio 1 u32 \
match ip src $a flowid 1:2
tc filter add dev $LAN parent 1:0 protocol ip prio 1 u32 \
match ip dst $a flowid 1:2
echo "adding $a to MAN filter..."
done

# PRIO3 --- torrents will fly with laggage --- (dst ports 4663 + 21760-22015)
tc filter add dev $LAN parent 1:0 protocol ip prio 5 u32 \
match ip dport 4663 0xffff \
flowid 1:30
tc filter add dev $LAN parent 1:0 protocol ip prio 5 u32 \
match ip dport 0x5500 0xff00 \
flowid 1:30


Более подробное описание скрипта имеется здесь (http://wl500g.info/showthread.php?t=13609&page=5) (сообщение #74 и далее).

Запуск скрипта - в post-firewall:


#!/bin/sh
/usr/local/sbin/wshaper-king2.sh start "$1" br0 9200 9200

A-r-t
30-04-2008, 14:06
еще один хороший шейпер, с подробным описанием установки (для чайников, таких как я) есть сдесь http://wl500g.info/showthread.php?t=13877

YAG
04-05-2008, 18:03
leniviy, спасибо за работу. Испытал Ваш вариант. Пока нравицца. Вопрос следующий. Каким образом можно отделить трафик интернет-радио, в частности, www.101.ru. Хочется его отправить в высокий приоритет в шейпере на br0. Понятно, что качалку на роутере радио не обскачет, но среди всего остального должно же заиграть, если я правильно понимаю. Так ведь? Или может быть радио можно как-то отделить по ACK пакетам, они там вообще есть? )))

leniviy
04-05-2008, 20:06
YAG, попробуй в скрипт запуска (который у меня shape-avangard) , добавить


shape-test filter $DEV 2 u 1 "protocol ip prio 5 u32 match ip dport 554 0xffff"
shape-test filter $DEV 2 d 1 "protocol ip prio 5 u32 match ip dport 554 0xffff"

leniviy
04-05-2008, 20:09
Или может быть радио можно как-то отделить по ACK пакетам, они там вообще есть? )))
Спасибо за отзыв. На 101.ru обычное TCP соединение. Я проверил, идет на адрес mms.online.ru:554

YAG
05-05-2008, 00:06
Спасибо за быстрый ответ. Хотя уже успел сам разобраться. Все верно, за исключением того, что некоторые сервера у них работают на 80 порту.

Еще пара вопросов. Не увидел правил для VoIP. Их нет у Вас? Добавил сам по портам и по TOS, но еще не проверил. Завтра. И еще одно. У меня mlDonkey. Он отдает на 6882 порту у меня судя по настройкам... Но начал проверять tcpdump'ом и заметил что качает он и на 6882 и на 6881, а также еще кучу портов задействует в районе 1251 - 1282 примерно. Это то что отловил при одном качавшемся торренте. Надо мануал что-ли на него смотреть чтобы все узнать... Вопрос вот в чем. Можно ли в правилах прописать диапазон портов а не один порт?

А вообще, leniviy, спасибо огромное за саму идею. Ограничением ACK-пакетов в исходящем канале регулировать входящий трафик. Хоть и полумера :-), поскольку пакеты разной длины могут быть, но работает очень эффективно при наличии качалки на роутере. Даже просто при тестировании скорости на www.speedtest.net мой ничем не ограниченный mldonkey быстренько прогибается до минимума, а тест показывает почти максимальные значения скорости и минимальные ping'а. При этом играет спокойно радио и работает sipnet-телефон.

leniviy
05-05-2008, 11:26
дипазон портов по маске. например, порты 21760-22015 задаются так:
dport 0x5500 0xff00
я в edonkey еще плохо разбираюсь. Но наверное там, как в торренте, входящие и исходящие конекты равноценны, и нет простого способа классифицировать исходящий коннект, так как неизвестны номера портов. Когда будет время, напишу либу, которая будет править tos или юзать so_reuseaddr. YAG, напиши, что ты сделал для voip.

YAG
05-05-2008, 13:56
YAG, напиши, что ты сделал для voip.

Добавил так

shape-test filter $DEV 2 u 1 "protocol ip prio 5 u32 match ip tos 0x68 0xff match ip protocol 0x11 0xff"
shape-test filter $DEV 2 d 1 "protocol ip prio 5 u32 match ip tos 0x68 0xff match ip protocol 0x11 0xff"
shape-test filter $DEV 2 u 1 "protocol ip prio 5 u32 match ip tos 0xb8 0xff match ip protocol 0x11 0xff"
shape-test filter $DEV 2 d 1 "protocol ip prio 5 u32 match ip tos 0xb8 0xff match ip protocol 0x11 0xff"
# high priority for VoIP traffic (by TOS)

shape-test filter $DEV 2 u 1 "protocol ip prio 5 u32 match ip sport 5004 0xffff match ip protocol 0x11 0xff"
shape-test filter $DEV 2 d 1 "protocol ip prio 5 u32 match ip sport 5004 0xffff match ip protocol 0x11 0xff"
shape-test filter $DEV 2 u 1 "protocol ip prio 5 u32 match ip sport 5060 0xffff match ip protocol 0x11 0xff"
shape-test filter $DEV 2 d 1 "protocol ip prio 5 u32 match ip sport 5060 0xffff match ip protocol 0x11 0xff"
# high priority for VoIP traffic (by source port)

shape-test filter $DEV 2 u 1 "protocol ip prio 5 u32 match ip protocol 0x11 0xff"
# all UDP traffic

Не верно?

leniviy
06-05-2008, 09:31
верно, я про UDP забыл. Смотрю, у меня DNS медленно резолвится.

imageofyou
15-05-2008, 19:57
Авангард СПб http://wl500g.info/showthread.php?p=88238#post88238
Спасибо большое за проделанную работу!
Но есть вопрос: учитывает ли этот скрипт закачки на роутере?
UPD: разобрался, учитывает =)

Другой вопрос: есть ли возможность сделать так, чтобы аплоад на авангардовцев был больше аплоада по тарифному плану (в вашем примере это цифра равна 528 - я так и не понял откуда она взята) - в идеале 800 кбит (ширина исходящего канала)?

leniviy
22-05-2008, 11:32
Спасибо большое за проделанную работу!
Но есть вопрос: учитывает ли этот скрипт закачки на роутере?
UPD: разобрался, учитывает =)

Другой вопрос: есть ли возможность сделать так, чтобы аплоад на авангардовцев был больше аплоада по тарифному плану (в вашем примере это цифра равна 528 - я так и не понял откуда она взята) - в идеале 800 кбит (ширина исходящего канала)?

1) учитывает
2) нельзя, в "Авангарде" аплод общий.

немного переделал скрипт, спасибо YAG

YAG
24-05-2008, 20:43
Я вот все играюсь со скриптом. Кое что переделал. В целом вот несколько вопросов.
1. Читал что prio всего до 7 может быть. Да и как-то не совсем понял логику обращения с ними у Вас. Переделал по своему. Потом как-нибудь опишу.
2. Зачем все пихать в 20-ю трубу? Не проще ACK сразу в 2f?
3. Поскольку тяжело классифицировать входящий траффик от качалок роутера, то по умолчанию кидаю не во второй приоритет, а в третий. Ну а все остальное что нужно во второй можно туда положить и ручками.

leniviy
26-05-2008, 17:46
1. Читал что prio всего до 7 может быть. Да и как-то не совсем понял логику обращения с ними у Вас. Переделал по своему. Потом как-нибудь опишу.

может, в других qdisc?
кстати, почему-то при скорости 1024 мой скрипт менее эффективен, чем при 550.
Когда качаю торренты, скорость отдельного TCP соединения на 80 порт без скрипта ~1Kb. С скриптом всего 20Kb. При канале 550кбит скрипт позволял нормально смотреть ютуб.

leniviy
27-05-2008, 09:05
я тут с удивлением узнал, что QoS - это еще и футбольный клуб Queen of the South ))

Matashin
02-06-2008, 20:14
Пользуюсь WL500gp около полугода
за это время разобрался в основном с его настройкой.

Интернет работает на 2-х компьютерах и ноутбуке, все отлично,
подключил внешний винт.

Торрент работает, особенно хорошо стал работать после обновления rTorrent на версию из темы
"Еще раз про rTorrent и web-морду к нему" http://wl500g.info/showthread.php?t=14256 :)

Осталась одна проблема которую мне пока никак не удается решить:

Как можно управлять приоритетами при разделении траффика?
или хотя бы самый простой вариант как сделать приоритет траффика торрента самым низким?

искал на форуме, пробовал несколько вриантов, но без особого успеха. :(

подскажите, может кто решал такую проблему.

YAG
02-06-2008, 22:07
Вот объясните зачем плодить кучу веток на одну и ту же тему? По ней и так их несколько. И вполне живых, стоит заметить.

Dekker
03-06-2008, 08:46
ищите по запросу QoS да отЫщется ...

imageofyou
05-06-2008, 11:09
Другой вопрос: есть ли возможность сделать так, чтобы аплоад на авангардовцев был больше аплоада по тарифному плану (в вашем примере это цифра равна 528 - я так и не понял откуда она взята) - в идеале 800 кбит (ширина исходящего канала)?

2) нельзя, в "Авангарде" аплод общий.



В случае "Авангард-Калининград" аплоад внутри сети (а точнее, среди пиринг-партнеров) происходит на скорости 1 Мбит (точнее - 800 кбит - скорость исходящего соединения модема). Проверено выключением шейпера - скорость аплоада повышается до 100 килобайт в секунду.
В связи с этим не могли бы вы подсказать, что нужно изменить в вашем скрипте, чтобы получить аплоад на авагардовцев до 800 кбит.

Уточню тарифный план:
DOWNLINK=250
DOWNLINKMAN=1024
UPLINK=250
UPLINKMAN=1024

Физическое ограничение:
UPLINK+UPLINKMAN <= 800

Заранее благодарен!

leniviy
05-06-2008, 11:47
В случае "Авангард-Калининград" аплоад внутри сети (а точнее, среди пиринг-партнеров) происходит на скорости 1 Мбит (точнее - 800 кбит - скорость исходящего соединения модема). Проверено выключением шейпера - скорость аплоада повышается до 100 килобайт в секунду.
В связи с этим не могли бы вы подсказать, что нужно изменить в вашем скрипте, чтобы получить аплоад на авагардовцев до 800 кбит.

Уточню тарифный план:
DOWNLINK=250
DOWNLINKMAN=1024
UPLINK=250
UPLINKMAN=1024

Физическое ограничение:
UPLINK+UPLINKMAN <= 800

Заранее благодарен!

1) надо добавить параметр UPLINKMAN и заменить в скрипте число 757 на $UPLINKMAN
2) смотрим на диаграмму в этом посте: http://wl500g.info/showpost.php?p=90026&postcount=58
то, что красным зачеркнуто - это как сейчас. А надо, чтобы пакеты в MAN шли по красной стрелке.
надо переделать этот кусок:

while read ADDR B; do tc filter add dev $DEV parent 1:2f protocol ip prio 1 \
u32 match ip dst $ADDR flowid 1:3f; done < /etc/isp-ip-addrs.lst
# добавить фильтры, чтобы даунлод с авангардовцев шел через дерево 3

примерно так:

while read ADDR B; do tc filter add dev $DEV parent 1: protocol ip prio 1 \
u32 match ip dst $ADDR flowid 1:30; done < /etc/isp-ip-addrs.lst

imageofyou
05-06-2008, 12:24
1) надо добавить параметр UPLINKMAN и заменить в скрипте число 757 на $UPLINKMAN
2) смотрим на диаграмму в этом посте: http://wl500g.info/showpost.php?p=90026&postcount=58
то, что красным зачеркнуто - это как сейчас. А надо, чтобы пакеты в MAN шли по красной стрелке.


Спасибо огромное!!! Все заработало как надо! =)

PS диаграмма по ссылке не открывается (архив в аттаче битый), а на мелкой не видно

damir
11-06-2008, 06:46
А где можно взять скрипт для случая если качалка установлена на роутере? Думаю поставить torrent клиент на роутере, подцепить внешний ХДД. Единственная проблема- шейпер траффика. Как, что и чем?
Задача простейшая- три компа, скорость 200 кб/с входящая. Нужно сделать так, чтобы веб-серфинг не лагал ни на одном из компов. При этом другие закачки (FTP, с веб-серверов, файл-обменников и т.п.) на компах тоже должны иметь приоритет выше чем на торренте установленном на роутере.
Проблема в том что в Линуксе не ориентируюсь совершенно, плохо представляю как установить скрипт, стандартные команды и т.п. Буду признателен если кинете черновым скриптом и документацией на русском. Или хотя бы скажите названия книг которые стоит купить для максимально быстрого освоения Линухи на Роутере.

leniviy
11-06-2008, 09:35
damir, имхо тебе про QoS думать еще рано. Поставишь ХДД и rtorrent, и половина твоих вопросов отпадет.

damir
11-06-2008, 11:53
leniviy

Спасибо за совет :)
Ну, видимо я так и сделаю. Просто ДО установки ХДД хотелось бы узнать, как торрент на роутере повлияет на скорость Инета у пользователей. Другими словами, можно ли будет нормально серфить инет и ставить на закачку файлы не только на роутере. А иначе нет смысла городить огород.
Все готовое я не жду, мне нужны только примеры и документация на русском, а голова и своя есть ;)

П.С. Пошел ставить rtorrent )

leniviy
11-06-2008, 12:08
на скорости 200кб скрипт shape-test должен хорошо работать. вебсерфинг лагать не будет, но между 3 компами честного деления трафика не будет.

YAG
11-06-2008, 15:39
на скорости 200кб скрипт shape-test должен хорошо работать. вебсерфинг лагать не будет, но между 3 компами честного деления трафика не будет.

Не в скорости дело. Все это без проблем работает для исходящего трафика. Работает просто здорово. Зажать можно что угодно и как угодно. Понятно что входящий зажать не получаецца. С Вашим скриптом проблема только в том, что торренты (уж незнаю в силу протокола или в силу того что потоков очень много... или может быть размер пакета отличается... не выяснял) при одинаковой скорости закачки отправляют ACK-трафика больше чем другие протоколы. Поэтому при появлении 1 кбит/с другого ACK-трафика необходимо ограничить ACK-трафик торрентов на 5 кбит/с, в то время как Ваш скрипт его ограничивает только на 1 кбит/c. И другого решения нет в принципе.

З.Ы.: Веб серфинг всегда можно настроить так что лагать не будет. Нужно только сильно не жадничать на торренты.
З.З.Ы.: Что значит честное деление трафика? Как в известном анекдоте это по братски, по справедливости или по ровну?
З.З.З.Ы.: Все конкретные цифры в этом посте приведены только для примера и не несут никакой смысловой нагрузки.

imageofyou
11-06-2008, 15:54
С Вашим скриптом проблема только в том, что торренты (уж незнаю в силу протокола или в силу того что потоков очень много... или может быть размер пакета отличается... не выяснял) при одинаковой скорости закачки отправляют ACK-трафика больше чем другие протоколы.

Пользуюсь сим скриптом уже 6 дней - торрент (transmission) качает не переставая. При этом серфинг с ноута происходит абсолютно прозрачно - как будто канал свободен. Проблем не ощущал ни разу!


Уточню тарифный план:
DOWNLINK=250
DOWNLINKMAN=1024
UPLINK=250
UPLINKMAN=1024

Физическое ограничение:
UPLINK+UPLINKMAN <= 800

leniviy
11-06-2008, 17:04
до 512 кбит shape-test будет работать хорошо. при 1024 кбит намного хуже

YAG
11-06-2008, 17:08
до 512 кбит shape-test будет работать хорошо. при 1024 кбит намного хуже

А можно услышать логическое объяснение? :)

leniviy
11-06-2008, 17:58
нет, YAG, я сам не знаю почему все стало хуже работать, когда я перешел с 512 на 1024.
Я думаю, может уменьшить burst для ACK пакетов, чтобы реагировало быстрее? Тогда может быть приоритетный трафик будет эффективнее отбирать полосу.

YAG
11-06-2008, 18:02
нет, YAG, я сам не знаю почему все стало хуже работать, когда я перешел с 512 на 1024

Да потому что нет объяснения. У Вас (провайдера) что-то еще поменялось. (В чудеса я не верю). ;)

leniviy
11-06-2008, 20:06
сейчас прочитал подробно про параметр prio класса htb. Раньше я его не использовал, так как думал, что он бесполезный.
Сейчас я назначил prio 0 для класса 1:2e, который для http. Вроде помогло. Ютуб не лагает при активном торренте, а торрент просел с 120 до 70кб.
Этот параметр определяет, какому классу достается свободный трафик. Буду проверять дальше.

class htb 1:2f parent 1:20 rate 3379bps ceil 3379bps burst 1632b cburst 1632b
Sent 2447227 bytes 40338 pkts (dropped 0, overlimits 0)
rate 3606bps 59pps
lended: 13859 borrowed: 0 giants: 0
tokens: -9874 ctokens: -9874

class htb 1:2e parent 1:2f leaf 2e: prio 0 rate 3379bps ceil 3379bps burst 1632b cburst 1632b
Sent 325858 bytes 5803 pkts (dropped 0, overlimits 0)
rate 1311bps 22pps
lended: 5803 borrowed: 0 giants: 0
tokens: 384266 ctokens: 384266

class htb 1:2d parent 1:2f prio 1 rate 1013bps ceil 3379bps burst 1609b cburst 1632b
Sent 1321659 bytes 20806 pkts (dropped 3686, overlimits 0)
rate 1349bps 20pps backlog 1p
lended: 15242 borrowed: 5563 giants: 0
tokens: -50539 ctokens: 380387

class htb 1:2c parent 1:2f prio 1 rate 337bps ceil 3379bps burst 1602b cburst 1632b
Sent 799830 bytes 13731 pkts (dropped 4189, overlimits 0)
rate 882bps 14pps backlog 1p
lended: 5434 borrowed: 8296 giants: 0
tokens: -116438 ctokens: 384266

YAG
11-06-2008, 20:18
сейчас прочитал подробно про параметр prio класса htb. Раньше я его не использовал, так как думал, что он бесполезный.
Сейчас я назначил prio 0 для класса 1:2e, который для http. Вроде помогло. Ютуб не лагает при активном торренте, а торрент просел с 120 до 70кб.
Этот параметр определяет, какому классу достается свободный трафик.


Если грубо, то в "листьях" этот параметр определяет в какой очередности обрабатывать пакетики... А в классах определяет приоритет наследования пропускной способности в пределах класса.
Это как я понимаю.

ABATAPA
11-06-2008, 22:51
Пользуюсь сим скриптом уже 6 дней - торрент (transmission) качает не переставая. При этом серфинг с ноута происходит абсолютно прозрачно - как будто канал свободен. Проблем не ощущал ни разу!

Насколько эффективно используется полоса торрентом при пустом канале?

imageofyou
12-06-2008, 08:59
Из 250 кбит внешки - типичное значение 220-240 кбит. т.е. в среднем на 90%. Но здесь надо учитывать и "проблемы" провайдера..

leniviy
15-06-2008, 08:52
кто-нибудь знает, как посмотреть статистику (текущую скорость) по ingress фильтрам?
tc -s filter ls dev vlan1
показывает только egress фильтры.

vs12345
16-06-2008, 14:07
есть вопросы возможно глупые :confused:
у меня WL-500W + Dlink 300 (Wan port)
PPoE (bridge = vpi:0,vci:35 - инет 128/128 = ppp0) + DHCP (bridge = vpi:0,vci:37 - локалка провайдера 6000/650)
настроил PPoE + DHCP (прошивка сама все хавает кроме шлюза - вешает на eth1) - машрут до шлюза вручную (пробывал вкл DHCP route - Yes = тоже работает)
все работает но есть проблема:
при закачке с локалки провайдера (примерно качает 650 kb/s) не просто нельзя достучаться до интернета по http но и DNS ppp0 не пингуется

- думал поможет shaper
- ставил скрипт от leniviy, параметры DOWNLINK=122, UPLINK=122,
DOWNLINKMAN=4096, UPLINKMAN=650, в файл isp-ip-addrs.lst вносил одну строку 10.253.0.0/24, - примерно так
но никакой разницы не ощущалось,
в логе куча строк типа
kernel: HTB: quantum of class 1002F is small. Consider r2q change.
- насколько критичные ошибки (насколько я понял это из-за того что канал узкий = 128), может скрипт и не работал??!

- короче посоветуйте, пожалуйста.
- может я в соединениях накосячил?

leniviy
16-06-2008, 14:43
vs12345. Похоже, что входящие пакеты из MAN забивают всю очередь у провайдера (провайдер мог накосячить). Надо попытаться замерить, при какой скорости закачки из MAN (с выключенным QoS) замедляется и перестает работать интернет.
Скорее всего нужно только ingress поставить.
поменяй DOWNLINKMAN на 600, заработает интернет после этого?
wshaper тоже должен помочь. Попробуй поискать wshaper поновее, но подойдет и тот, что в прошивке.

6000/650 - вот это меня смущает. Когда закачки из MAN вправду будут 6 мбит, только после этого надо будет настраивать QoS.

Кстати, при прямом подключении к компу какие скорости?

vs12345
17-06-2008, 08:03
поменяй DOWNLINKMAN на 600, заработает интернет после этого?
при подключении к компу какие скорости?
инет начинает работать когда ограничиваешь download в качалке до 550, но жутко тупит, - терпимо работает где-то при ограничении до 470.
- вашим скриптом, пока ограничивать не удается, - то есть при любых настройках скрипта по dhcp соединению качалка качает по максимуму = 645kb/s - ppoe впадает в ступор

я не совсем понимаю механизм работы прошивки с dhcp соединением?!
- 500w видит bridge dhcp соединение на длинк300 и принимает решение подключить его?? причем ppoe и dhcp у меня на разных vpi и vci.
- а ручной режим есть для dhcp, гдде об этом почитать?

Jani4ik
19-06-2008, 01:03
Народ, всем привет!
Помогите сделать шейпер для такой конфигурации сети см. аттач.
Нужно жестко ограничить пользователей, плавающие пакеты (когда канал будет свободнее) не нужны.

п.с. на Асусе нет не каких качалок и не будет.

leniviy
19-06-2008, 09:18
Помогите сделать шейпер для такой конфигурации что такое плавающие пакеты?

YAG
19-06-2008, 11:02
Думаю автор имел ввиду то что не надо отдавать всю полосу одному, если остальные ее не используют...

Решение в общем-то здесь (http://wl500g.info/showthread.php?t=8796) есть. Шейпер надо повесить на br0. Для ограничения исходящей (от пользователей) скорости использовать ingress. Я делал так. Вроде работало. :-)

Jani4ik
19-06-2008, 14:21
Думаю автор имел ввиду то что не надо отдавать всю полосу одному, если остальные ее не используют...

Решение в общем-то здесь (http://wl500g.info/showthread.php?t=8796) есть. Шейпер надо повесить на br0. Для ограничения исходящей (от пользователей) скорости использовать ingress. Я делал так. Вроде работало. :-)
Можно подробней, на примере?;) А то я не очень разбираюсь.:o

Jani4ik
19-06-2008, 14:23
Думаю автор имел ввиду то что не надо отдавать всю полосу одному, если остальные ее не используют...

Решение в общем-то здесь (http://wl500g.info/showthread.php?t=8796) есть. Шейпер надо повесить на br0. Для ограничения исходящей (от пользователей) скорости использовать ingress. Я делал так. Вроде работало. :-)

Можно подробнее, на примере?:rolleyes: А то я в Linux не очень разбираюсь.:o

Jani4ik
20-06-2008, 11:47
что такое плавающие пакеты?
Вот что я имел введу :rolleyes:

Думаю автор имел ввиду то что не надо отдавать всю полосу одному, если остальные ее не используют...

leniviy
20-06-2008, 12:06
Все, как сказал YAG. Ingress, правда, не позволит сделать borrowing (плавающие пакеты) на исходящий трафик. Я вот не знаю, если пометить входящие пакеты на br0, метки сохранятся на внешнем интерфейсе? Тогда можно было бы сделать borrowing в обе стороны.

Jani4ik
20-06-2008, 12:08
все, как сказал YAG. ingress, правда, не позволит сделать borrowing (плавающие пакеты)

Можно подробнее на примере?
п.с. borrowing (плавающие пакеты) - ненужен

YAG
20-06-2008, 12:34
Зачит так... Добавляем в конец шейпера, который должен висеть на $3 (br0)


tc qdisc add dev $DEV handle ffff: ingress

tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \
192.168.1.2 police rate 256kbit burst 10k drop flowid :1

tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \
192.168.1.3 police rate 64kbit burst 10k drop flowid :1

tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \
192.168.1.4 police rate 64kbit burst 10k drop flowid :1

Должно все работать.

Jani4ik
20-06-2008, 12:38
Зачит так... Добавляем в конец шейпера, который должен висеть на $3 (br0)


tc qdisc add dev $DEV handle ffff: ingress

tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \
192.168.1.2 police rate 256kbit burst 10k drop flowid :1

tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \
192.168.1.3 police rate 64kbit burst 10k drop flowid :1

tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \
192.168.1.4 police rate 64kbit burst 10k drop flowid :1

Должно все работать.

Спасибо, вечером проверю, сейчас на работе..

leniviy
20-06-2008, 12:52
Я сделал скриптик для показа текущих скоростей по классам. может кому пригодится. Задача, показать статистику по скоростям классов без всякой лишней инфы.
rates.awk

#!/usr/bin/awk -f
BEGIN {
fmt = "%-6s %-6s %8s %8s %8s\n";
if (header "" != "0") printf fmt , "0Class" , "parent" , "minrate" , "ceil" , "currate";
}
func rate2bps(rate)
{
if (match(rate,"[0-9]bps")>0) return substr(rate, 1, length(rate)-3); \
else if (match(rate,"[0-9]Kbps")>0) return substr(rate, 1, length(rate)-4)*1024; \
else if (match(rate,"[0-9]Kbit")>0) return substr(rate, 1, length(rate)-4)*1024/8; \
else if (match(rate,"[0-9]Mbps")>0) return substr(rate, 1, length(rate)-4)*1024*1024; \
else if (match(rate,"[0-9]Mbit")>0) return substr(rate, 1, length(rate)-4)*1024*1024/8; \
}
{ \
if ((substr($0, 1, 1)!=" ")) { \
if (match($0, "^class htb ")>0) { \
bBlock=1; \
sClass=$3; \
currate=0;
for (i=1;i<NF;i++) {
if ($i=="root") {
root = 1;
parent = "root";
} else if ($i=="parent") {
root = 0;
parent = $(i+1);
} else if ($i=="rate") minrate = rate2bps($(i+1));
else if ($i=="ceil") ceil = rate2bps($(i+1));
}
} else {
if (($0=="")&&(bBlock==1)) {
printf fmt , sClass , parent , minrate , ceil , currate;
}
bBlock=0;
}
} else if (($1=="rate")&&(bBlock==1)) { \
currate=rate2bps($2);
}
}

килобиты исправил
Вывод подходит для дальнейшего анализа. Можно например подправить параметры классов, если htb недостаточно гибок:

[admin@router 3]$ tc -s class ls dev vlan1 | awk -f rates.awk | sort
0Class parent minrate ceil currate
1:20 root 67584 67584 56986
1:21 1:20 40448 67584 315
1:22 1:20 20224 67584 22582
1:23 1:20 6656 67584 34007
1:2c 1:2f 337 3379 112
1:2d 1:2f 1013 3379 126
1:2e 1:2f 3379 3379 41
1:2f 1:20 3379 3379 240
1:30 root 96896 96896 8
1:31 1:30 58112 96896 0
1:32 1:30 29056 96896 0
1:33 1:30 9600 96896 0
1:3c 1:3f 327 3276 0
1:3d 1:3f 983 3276 9
1:3e 1:3f 3276 3276 0
1:3f 1:30 3276 3276 7

YAG
20-06-2008, 14:32
Я сделал скриптик для показа текущих скоростей по классам. может кому пригодится.

За скрипт сенькс. Только вот давнешний вопрос тогда всплывает. Вообще общепринято вроде, что 1 кбит/с = 1000 бит/с, 1 кб/с = 1024 б/с. Разве нет? :)

EugeenB
20-06-2008, 15:32
За скрипт сенькс. Только вот давнешний вопрос тогда всплывает. Вообще общепринято вроде, что 1 кбит/с = 1000 бит/с, 1 кб/с = 1024 б/с. Разве нет? :)Вышел стандарт, точнее ТР 2007/003/BY, где закреплены обозначения множительных приставок для информационных единиц:
1 кБ - один килобайт = 1000 байт
1 киБ - один кибибайт = 1024 байт
1 МБ - один мегабайт = 1000000 байт
1 МиБ - один мебибайт = 1048576 байт
далее - Гиби-, Теби, Пеби, и т.д.

YAG
20-06-2008, 16:23
Вышел стандарт, точнее ТР 2007/003/BY, где закреплены обозначения множительных приставок для информационных единиц:
1 кБ - один килобайт = 1000 байт
1 киБ - один кибибайт = 1024 байт
1 МБ - один мегабайт = 1000000 байт
1 МиБ - один мебибайт = 1048576 байт
далее - Гиби-, Теби, Пеби, и т.д.

Приехали.... В килобайте тыща байт уже стала...

leniviy
20-06-2008, 17:56
а, точно. про мегабиты перепутал. спасибо.
про килобайты и кибибайты: лично я слышал, что это пока рекомендация

ABATAPA
20-06-2008, 19:49
Вышел стандарт, точнее ТР 2007/003/BY, где закреплены обозначения множительных приставок для информационных единиц:
1 кБ - один килобайт = 1000 байт
1 киБ - один кибибайт = 1024 байт
1 МБ - один мегабайт = 1000000 байт
1 МиБ - один мебибайт = 1048576 байт
далее - Гиби-, Теби, Пеби, и т.д.


Вышел?
Это - международный стандарт (МЭК 60027–2, IEC 60027-2(2000)) с 1998 года, ГОСТ 8.417-2002 "ГСИ. Единицы величин" (http://www.gost.ru/).


Так что "вышел" он очень давно, только, как обычно, люди ничего не знают и знать не хотят.

EugeenB
21-06-2008, 12:33
Вышел?
Именно что вышел (был актуализирован):
ТР 2007/003/BY- в 2007 году. А до тех пор,туземные стандарты объединения племён "Мумбу-Юмбу" и "Ням-Ням"
международный стандарт (МЭК 60027–2, IEC 60027-2(2000)) нас не колыхал ;) :)
А некотрых, судя по письмам в этом треде, и до сих пор не колышет. :)

YAG
21-06-2008, 13:31
Так.. Спор в этой ветке не нужен. Нужно только выяснить какие соотношения используются при выводе статистики tc -s class ls dev vlan1

ABATAPA
21-06-2008, 21:36
А до тех пор,туземные стандарты объединения племён "Мумбу-Юмбу" и "Ням-Ням" нас не колыхал ;) :)


Да ну?! И ГОСТ?
Посмотрел бы я на Вас при подготовке документации и стандартизации чего-либо, как бы Вас ГОСТ "не колыхал"...

vs12345
22-06-2008, 22:44
у меня WL-500W + Dlink 300 (Wan port)
1. PPoE (bridge = vpi:0,vci:35 - инет 128/128 = ppp0)
2. DHCP (bridge = vpi:0,vci:37 - локалка провайдера 645/645 = br0)
скорости проверены опытным путем...

Подскажите пожалуйста как настроить шейпер на 3 компа
wl-500w : 192.168.1.170 (rTorrent+ADOS)
мой IP : 192.168.1.77 (pppoe = 64/64 , dhcp 581/581)
клиент1 IP : 192.168.1.41 (pppoe = 32/32 , dhcp 32/32)
клиент2 IP : 192.168.1.42 (pppoe = 32/32 , dhcp 32/32)
у клиентов верхние ограничения хочу прописать жестко, а на своем оставить возможность захватывать весь канал, если клиенты не активны

такая вот стандартная потребность :cool:

p.s. если я правильно понимаю то мне надо взять скрипт от leniviy и повесить его на br0, а вот какие при этом его (скипта) параметры - это вопрос?

leniviy
23-06-2008, 09:31
vs12345, для такой сложной схемы тебе надо написать скрипт для распределения трафика по трем клиентам.

leniviy
23-06-2008, 10:04
2. DHCP (bridge = vpi:0,vci:37 - локалка провайдера 645/645 = br0)
как это br0? А твой LAN на этом же интерфейсе? По идее должен быть vlan1, раз ты получаешь адрес по DHCP. У роутера с такой конфой должно быть не 2, а 3 айпишника

Будет очень трудно шейпить входящий траф: если шейпить на br0, то трафик для rTorrent не будет учитываться, htb не будет ограничивать rTorrent, и он забьет весь канал. Если шейпить на внешнем (ppp0 или vlan1), как это сделано у меня, то точность будет никакая. Можно попробовать скомбинировать эти 2 варианта. Я думаю, что все это можно оформить только опытным путем. Короче помочь вряд ли смогу.

П.С.: Мой скрипт можно использовать для подключения wshaper-образных веток для каждого клиента; в каждой ветке трафик будет делиться на 3 класса по приоритету.
В корень дерева надо поместить что-то вроде скрипта, который использует Jani4ik. Мороки много, и я точно не буду писать этот скрипт.

vs12345
23-06-2008, 12:37
vs12345, для такой сложной схемы тебе надо написать скрипт для распределения трафика по трем клиентам.

а если взять и упростить задачу (может я изложил сложновато) - например, один клиент приоритетный (я) и все остальные (2-е)??

а насчет vlan1 я так понял - это так прошивка Олега с архитектурой wl-500w работает.!? - вобщем у меня dhcp на br0 (vlan1 у меня щас вообще отсутствует, и Lan тоже на br0).

vs12345
23-06-2008, 12:47
как это br0? А твой LAN на этом же интерфейсе? По идее должен быть vlan1, раз ты получаешь адрес по DHCP. У роутера с такой конфой должно быть не 2, а 3 айпишника

- да, все верно 3 IP
1 : 192.168.1.170
2 : 87.x.x.x - точно непомню (pppoe)
3 : 10.253.x.x (dhcp)

а разве не у всех так с dhcp??

leniviy
23-06-2008, 12:52
у меня dhcp на br0 (vlan1 у меня щас вообще отсутствует, и Lan тоже на br0).. А кто раздает айпишники, роутер или провайдер?
Я не знаю, можно ли внутри моста шейпить, наверное нельзя.

Для инета можно на внешний интерфейс (ppp) повесить мой скрипт, а на внутренний - скрипт Jani4ik. И проверку добавить, откуда идет пакет, из интернета, или нет.
--------------
прочитал 63 пост. 10.253.x.x проверь еще раз, на каком он интерфейсе. Может просто eth*

vs12345
23-06-2008, 13:12
. А кто раздает айпишники, роутер или провайдер?
на локалку соответственно роутер 192.168.1.0,
остальные провайдер


Я не знаю, можно ли внутри моста шейпить, наверное нельзя.
ну это тебе виднее


Для инета можно на внешний интерфейс (ppp) повесить мой скрипт, а на внутренний - скрипт Jani4ik. И проверку добавить, откуда идет пакет, из интернета, или нет.
--------------
прочитал 63 пост. 10.253.x.x проверь еще раз, на каком он интерфейсе. Может просто eth*
- я на работе, - через пару часов проверю и отпишусь, а то я начинаю путаться в показаниях :)

vs12345
23-06-2008, 14:48
прочитал 63 пост. 10.253.x.x проверь еще раз, на каком он интерфейсе. Может просто eth*
прошу прощения действительно 10.253.145.x на eth1
вот таблица маршрутов:
Destination Gateway Genmask Flags Metric Ref Use Iface
172.19.0.1 * 255.255.255.255 UH 0 0 0 ppp0
10.253.0.0 10.253.145.1 255.255.255.0 UG 0 0 0 eth1
192.168.1.0 * 255.255.255.0 U 0 0 0 br0
10.253.145.0 * 255.255.255.0 U 0 0 0 eth1
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default 172.19.0.1 0.0.0.0 UG 0 0 0 ppp0
на pppoe IP переменный типа 172.19.42.y

leniviy
23-06-2008, 20:47
vs12345, вешай shape-test на ppp0. За основу можно взять скрипт shape-avangard. Оттуда можно убрать всё, что связано с локалкой провайдера, а можно не убирать, но тогда должен существовать /etc/isp-ip-addrs.lst
В прошлый раз этот скрипт не сработал. Ты на какой интерфейс его вешал?
И всё-же, если подключить модем к компу, скорость из MAN тоже 645, а не 6000?
Раньше ты писал, что при закачке из MAN перестаёт работать интернет, это прекратилось? В чём была причина?

vs12345
23-06-2008, 22:18
В прошлый раз этот скрипт не сработал. Ты на какой интерфейс его вешал?
- на ppp0



И всё-же, если подключить модем к компу, скорость из MAN тоже 645, а не 6000?
- нет реально max качает 645 кбайт/сек (6000 - это на порту)


Раньше ты писал, что при закачке из MAN перестаёт работать интернет, это прекратилось? В чём была причина?
- причина не найдена! вот что происходит:

повесил еще раз на ppp0 с параметрами (MAN занизил пробывал 645,523,423 - не помогает)
DOWNLINK=122
DOWNLINKMAN=423
UPLINK=122
UPLINKMAN=423

в /etc/isp-ip-addrs.lst
прописал
10.253.0.0/24
10.253.145.0/24

- происходит примерно следующее, сек за 10-40 качалка несмотря на шейпер выходит на максимальную скорость 645kb/s, и забивает канал так что днс(213.24.85.12) перестает пинговаться и ppp0 отваливается - вот лог при этом:

Jun 24 00:01:10 pppd[866]: LCP terminated by peer
Jun 24 00:01:10 PPPoE: Disconnected
Jun 24 00:01:10 pppd[866]: Child process /tmp/ppp/ip-down (pid 1358) terminated with signal 11
Jun 24 00:01:13 pppd[866]: Connection terminated.
Jun 24 00:01:13 pppd[866]: Connect time 20237520.7 minutes.
Jun 24 00:01:13 pppd[866]: Sent 5734 bytes, received 5850 bytes.

или так
Jun 24 00:33:44 pppd[866]: No response to 6 echo-requests
Jun 24 00:33:44 pppd[866]: Serial link appears to be disconnected.
Jun 24 00:33:45 PPPoE: Disconnected
Jun 24 00:33:51 pppd[866]: Connection terminated.
Jun 24 00:33:51 pppd[866]: Connect time 32.1 minutes.
Jun 24 00:33:51 pppd[866]: Sent 351791 bytes, received 859972 bytes.


- pppoe не реконектится (не прбивается) пока не остановишь закачку

leniviy
24-06-2008, 08:20
Всё, я понял. Поскольку MAN и WAN на разных интерфейсах, нельзя чисто средствами tc организовать деление трафика м/у ними.
Это можно сделать только с помощью скрипта, который я ещё не написал.
А пока, просто ограничь закачку из MAN 500кб. Для этого повесь shape-test ещё и на eth1 c параметрами 500/500
не забудь отрегулировать параметр ACKCOEF.

скрипт shape-avangard содержит эти параметры: (DOWNLINK, DOWNLINKMAN, UPLINK, UPLINKMAN), потому что у меня MAN и WAN на одном интерфейсе. А у тебя DOWNLINKMAN и UPLINKMAN не будут иметь эффекта, если вешать этот скрипт на ppp0. И наоборот, DOWNLINK и UPLINK не будут иметь эффекта, если повесить его на eth1.


за скоростями классов следи этой прогой http://wl500g.info/showpost.php?p=101369&postcount=50
там vlan1 замени на ppp0 или eth1

vs12345
24-06-2008, 09:11
Это можно сделать только с помощью скрипта, который я ещё не написал.
- то есть ты его пишешь?!!! :)


А пока, просто ограничь закачку из MAN 500кб. Для этого повесь shape-test ещё и на eth1 c параметрами 500/500
не забудь отрегулировать параметр ACKCOEF.
- понял, попробую вечером
- вот по необразованности насчет ACKCOEF хочу спросить:

"ACKCOEF - объем скачанного поделить на объем соответствуюющего ACK траффика"
- и как вычислить объем соответствуюющего ACK траффика?


А у тебя DOWNLINKMAN и UPLINKMAN не будут иметь эффекта, если вешать этот скрипт на ppp0. И наоборот, DOWNLINK и UPLINK не будут иметь эффекта, если повесить его на eth1.
- примерно понятно, - лучше сделать 2 разных скрипта запуска для каждого интерфейса.

- огромное СПАСИБО за помощь, leniviy

добавил позже:
- повесил скрипты на ppp0 и eth1
- на eth1 результат странный - шейпит но непонятно для меня ;)
- при DOWNLINKMAN = 645, UPLINKMAN = 645, ACKCOEF = 40 - скорость download'а = 77kb/s
скорости классов:
1:30 2232bps 2232
1:3f 2230bps 2230
1:3d 2230bps 2230
- параметры менял зависимости не найду? helpMe...

2bars
25-06-2008, 18:12
парни сижу несколько часов уже не могу понять...
у меня есть MAN и там пробрасывают тунель на мой айпи... с точки зрения маршрутизатора все есть сеть... правдо в интеренте и в ман ходит по разным скоростям... интернет-192 кб/cек MAN-100 мбит/сек...
создал фаил isp-ip-addrs.lst с MAN подсетями... теперь главное:
как выделить жестко 32 кбит/сек одному компу, а остальное чтобы хавал я и рутер, причем если меня нет рутер хавает все, если я есть то мне отдавал приоритет. уже глаза на лоб лезут, очень много непонятного...
как примерно буде твыглядить скрипт и тот что писал ленивый в 2 посте пойдет для меня и как его надо сконфигурировать ?

Спасибо!

leniviy
25-06-2008, 18:26
скорость download'а = 77kb/s
Вот и хорошо. 77kb/s - это 616kbit. Вроде неплохая скорость.
1:30 2232bps 2232 - это суммарная отдача.
Увеличишь ACKCOEF - скорость упадёт. Уменьшишь - может подрастёт, может нет. Лучше оставить как есть, а DOWNLINKMAN сделать 500, чтобы не мешало интернету.

leniviy
25-06-2008, 18:45
интернет-192 кб/cек в смысле полтора мегабита?


как выделить жестко 32 кбит/сек одному компу, а остальное чтобы хавал я и рутер
смотрим здесь http://wl500g.info/showpost.php?p=93801&postcount=1, но копипастим с умом. Берем только то, что вешается на br0. Обрати внимание на назначение класса 1:100. Без него MAN будет медленный. У masters тоже не всё гладко работало.

На интерфейс с VPN (или что там) вешай shape-test.

Это всё предварительно. Инфы маловато. Куда воткнут кабель MAN? Кто выдаёт ip? Перечисли свои подсети, как в этом посте http://wl500g.info/showpost.php?p=101730&postcount=66


П.С. проверь скорость закачки из MAN. У роутера вроде предел ~24 мбит.

2bars
25-06-2008, 18:55
не... мне ман ваще не надо шейпить.... он сам не плохо делится...
а по поводу 192 кбит/сек... с учётом этих изменений все в силе?

leniviy
25-06-2008, 19:01
а по поводу 192 кбит/сек... с учётом этих изменений все в силе?
даже лучше ))
Я отредактировал тот пост.
------------------------------
В скрипте masters много лишнего, можно запутаться. Но смысл -
1) ограничить для одного компа скорость в инет (отфильтруй по маске сети !LAN и !MAN)
2) не ограничивать для него скорость LAN и MAN
3) дать всем остальным компам на br0 скорость 100мбит
Эти 3 правила надо применить ДВАЖДЫ! Первый раз для egress, второй раз для ingress.
в скрипте masters по br0 есть только egress. Значит тебе ещё и добавить в него ingress

2bars
25-06-2008, 19:10
вообщем...
кабель MAN воткнут в порт для WAN, провайдер 1, виртуальные ланы не настраивал. ип выдает dhcp сервер из WAN

$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
unGW.unity * 255.255.255.255 UH 0 0 0 vlan1
192.168.1.0 * 255.255.255.0 U 0 0 0 br0
10.25.0.0 * 255.255.248.0 U 0 0 0 vlan1
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default unGW.unity 0.0.0.0 UG 0 0 0 vlan1


подсети ...


cat isp-ip-addrs.lst
10.10.0.0/16
10.200.200.0/22
10.1.0.0/16
10.26.0.0/16
10.27.0.0/16
10.25.0.0/21
10.30.0.0/16
10.31.0.0/16
10.25.8.0/21
10.32.0.0/16
10.38.0.0/16
10.37.0.0/16
10.73.0.0/16
10.111.0.0/16
10.0.128.0/17
80.69.155.128/25
213.234.4.0/28
91.202.204.0/22


кстати я вспомнил что ночью провайдер увеличивает скорость со 192 до 256 кбит\сек :)

leniviy
25-06-2008, 19:29
Структура сети, как у меня. Модификацию скрипта выложил в начало ветки в 21:45 по Москве.

gutzeit
27-06-2008, 10:34
я несколько модифицировал скрипт, приведенный на форуме, получил следующее:

#!/bin/sh

DOWNLINK=100000
SPEED=280
LANMASK=`nvram get lan_ipaddr`/24
LIF=br0
WIF=eth1

tc qdisc del dev $LIF root > /dev/null 2>&1
tc qdisc del dev $LIF ingress > /dev/null 2>&1

tc qdisc add dev $LIF root handle 1: htb default 1

tc class add dev $LIF parent 1: classid 1:100 htb rate 100mbit prio 1

tc class add dev $LIF parent 1: classid 1:1 htb rate ${DOWNLINK}kbit burst 6k

tc filter add dev $LIF parent 1: protocol ip prio 1 u32 match ip src $LANMASK flowid 1:100
tc filter add dev $LIF parent 1: protocol ip prio 2 u32 match ip src 0.0.0.0/0 flowid 1:1

tc class add dev $LIF parent 1:1 classid 1:10 htb rate ${SPEED}kbit ceil $(($SPEED+$SPEED/8))kbit burst 6k prio 1
tc class add dev $LIF parent 1:1 classid 1:20 htb rate ${SPEED}kbit ceil ${DOWNLINK}kbit burst 6k prio 2

tc qdisc add dev $LIF parent 1:100 handle 100: sfq perturb 10
tc qdisc add dev $LIF parent 1:10 handle 10: sfq perturb 10

for COUNTER in `seq 2 254`; do
tc filter add dev $LIF parent 1:1 protocol ip prio 1 u32 match ip dst 192.168.1.$COUNTER flowid 1:10
done


Главная задача - шейпить каждого подключившегося из внутренней сетки чуть больше 256 кбит/с.

Все бы здорово, первый клиент выкачивает с нормальной скоростью, но второй уже где-то в 2 раза меньше. В чем может быть трабл?

leniviy
27-06-2008, 11:09
for COUNTER in `seq 2 254`; do
tc filter add dev $LIF parent 1:1 protocol ip prio 1 u32 match ip dst 192.168.1.$COUNTER flowid 1:10
done
Имхо в этих фильтрах нет смысла. Тут надо завести 253 классов, и каждого юзера в свой класс. А то ты дал 253 людям канал 300kbit.


Все бы здорово, первый клиент выкачивает с нормальной скоростью, но второй уже где-то в 2 раза меньше. В чем может быть трабл? то-есть скорость выше у того, кто первый подключился? Это нормально, через минуту-две всё выровнится.

gutzeit
27-06-2008, 11:11
понял, сейчас попробую, то что второй качает медленнее первого не нормально конечно

gutzeit
27-06-2008, 11:32
Сделал такую тему:

DOWNLINK=100000
SPEED=280
LANMASK=`nvram get lan_ipaddr`/24
LIF=br0
WIF=eth1

tc qdisc del dev $LIF root > /dev/null 2>&1
tc qdisc del dev $LIF ingress > /dev/null 2>&1

tc qdisc add dev $LIF root handle 1: htb default 1

tc class add dev $LIF parent 1: classid 1:100 htb rate 100mbit prio 1

tc class add dev $LIF parent 1: classid 1:1 htb rate ${DOWNLINK}kbit burst 6k

tc filter add dev $LIF parent 1: protocol ip prio 1 u32 match ip src $LANMASK flowid 1:100
tc filter add dev $LIF parent 1: protocol ip prio 2 u32 match ip src 0.0.0.0/0 flowid 1:1

tc qdisc add dev $LIF parent 1:100 handle 100: sfq perturb 10

for COUNTER in `seq 2 254`; do
tc class add dev $LIF parent 1:1 classid 1:$COUNTER htb rate ${SPEED}kbit ceil $(($SPEED+$SPEED/8))kbit burst 6k prio 1
tc qdisc add dev $LIF parent 1:$COUNTER handle 10: sfq perturb 10
tc filter add dev $LIF parent 1:$COUNTER protocol ip prio 1 u32 match ip dst 192.168.1.$COUNTER flowid 1:10
done

Вообще шейпится перестало :-(

leniviy
27-06-2008, 11:47
parent 1:1 , а не parent 1:$COUNTER
flowid 1:$COUNTER , а не flowid 1:10

2bars
28-06-2008, 21:38
у меня так ничего и не получилось... ребят выручайте, эффекта нету...

сеть такая как в аттаче на картинке.

192,168,1,3 должен быть ограничен по скорости в интернет, именно этот компьютер, остальноене важно...
остальной канал должен идти мне и роутеру...
сеть MAN не должна затрагиватся...
заранее спасибо...

а вот подсети которые шейпить не надо т.е. MAN

10.10.0.0/16
10.200.200.0/22
10.1.0.0/16
10.26.0.0/16
10.27.0.0/16
10.25.0.0/21
10.30.0.0/16
10.31.0.0/16
10.25.8.0/21
10.32.0.0/16
10.38.0.0/16
10.37.0.0/16
10.73.0.0/16
10.111.0.0/16
10.0.128.0/17
80.69.155.128/25
213.234.4.0/28
91.202.204.0/22

вроде бы начало получатся но почемукто я не могу делать следующее..
iptables -A INPUT -p tcp -m tos --tos 0x16
с tos ваще работать не получается ? как маркировать пакеты не могу понять.... :(

кароч ковырял ковырял... вот чё вышло

DEV=br0
UPLINK=192

# install root HTB, point default traffic to 1:99:
tc qdisc add dev $DEV root handle 1: htb default 99

# root class 1
tc class add dev $DEV parent 1: classid 1:1 htb rate 100mbit

# router traffic subslass 2 (router IP=192.168.1.1)

tc class add dev $DEV parent 1:1 classid 1:2 htb rate 100mbit
tc qdisc add dev $DEV parent 1:2 handle 2: sfq perturb 10
tc filter add dev $DEV parent 1: protocol ip prio 10 u32 match ip src 192.168.1.1 flowid 1:2
while read ADDR B; do tc filter add dev $DEV parent 1: protocol ip prio 1 u32 match ip src $ADDR flowid 1:2; done < /etc/isp-ip-addrs.lst

# internet traffic subclass 10
tc class add dev $DEV parent 1:1 classid 1:10 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit

# internet traffic subclasses 12, 13,... for each client IP
tc class add dev $DEV parent 1:10 classid 1:13 htb rate 35kbit burst 6k prio 2

# creating quques for each class
tc qdisc add dev $DEV parent 1:12 handle 12: sfq perturb 10
tc qdisc add dev $DEV parent 1:13 handle 13: sfq perturb 10


#sending traffic from clinet's IP's to classes

tc filter add dev $DEV parent 1: protocol ip prio 0 u32 match ip dst 192.168.1.3 flowid 1:13



для теста взял 64 канал... нифига он не шейпит... можно ли этот скрипт на vlan1 вешать ? :) или тока на br0? шейпит тока без качалки на рутере :*(

если скрипт останется таким ? то роутер обязательно выделит заветные 32 кб клиенту 192,168,1,3, остальной трафик будет находится между мной и роутером ? или как...
или если врубить роутер он всеравно все перехватит ?

2bars
29-06-2008, 18:39
DEV1=vlan1
DEV2=br0
UPLINKIN=70
SERG=35
SASHA=35

#iptables -A PREROUTING -t mangle -i $DEV2 -j MARK --set-mark 2 #маркер

iptables -t mangle -A POSTROUTING -o br0 -j MARK --set-mark 2

tc qdisc add dev $DEV1 root handle 1: htb default 12

tc class add dev $DEV1 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit

tc class add dev $DEV1 parent 1:1 classid 1:10 htb rate 100mbit ceil 100mbit
tc class add dev $DEV1 parent 1:1 classid 1:11 htb rate ${UPLINKIN}kbit ceil ${UPLINKIN}kbit burst 6k
tc class add dev $DEV1 parent 1:1 classid 1:12 htb rate 1kbit ceil ${UPLINKIN}kbit burst 6k

while read ADDR B; do tc filter add dev $DEV1 parent 1: protocol ip prio 2 u32 match ip dst $ADDR flowid 1:10; done < /etc/isp-ip-addrs.lst
tc filter add dev $DEV1 protocol ip parent 1: prio 1 handle 2 fw flowid 1:11

tc qdisc add dev eth0 parent 1:10 handle 20: pfifo limit 5
tc qdisc add dev eth0 parent 1:11 handle 30: pfifo limit 5
tc qdisc add dev eth0 parent 1:12 handle 40: sfq perturb 10

################################################## ######

tc qdisc add dev $DEV2 root handle 1: htb default 99

tc class add dev $DEV2 parent 1: classid 1:1 htb rate 100mbit

tc class add dev $DEV2 parent 1:1 classid 1:2 htb rate 100mbit
tc qdisc add dev $DEV2 parent 1:2 handle 2: sfq perturb 10
tc filter add dev $DEV2 parent 1: protocol ip prio 10 u32 match ip src 192.168.1.1 flowid 1:2
while read ADDR B; do tc filter add dev $DEV2 parent 1: protocol ip prio 1 u32 match ip src $ADDR flowid 1:2; done < /etc/isp-ip-addrs.lst

tc class add dev $DEV2 parent 1:1 classid 1:10 htb rate ${UPLINKIN}kbit ceil ${UPLINKIN}kbit

tc class add dev $DEV2 parent 1:10 classid 1:12 htb rate ${SASHA}kbit burst 6k prio 2
tc class add dev $DEV2 parent 1:10 classid 1:13 htb rate ${SERG}kbit burst 6k prio 2

tc qdisc add dev $DEV2 parent 1:12 handle 12: sfq perturb 10
tc qdisc add dev $DEV2 parent 1:13 handle 13: sfq perturb 10

tc filter add dev $DEV parent 1: protocol ip prio 20 u32 match ip dst 192.168.1.2 flowid 1:12
tc filter add dev $DEV parent 1: protocol ip prio 20 u32 match ip dst 192.168.1.3 flowid 1:13

это уже я почти сам навоял ... походу тоже чёто плохо работает... помогите кто-либо

opyzhov
03-09-2008, 21:07
Приветствую форумчане..есть проблемка..Не подскажите ..

запускаю в post-mount
/sbin/wshaper start ppp0 2000 512
загружается все ок..
по команде wshaper status ppp0 выводит данные
через какое то время снова захожу в консоль и по команде проверки статуса - тишина.. набираю killall wshaper... тоже пишет нет процесса....
куда девается wshaper?

аппарат asus wl-500w(1.9.2.7-10) + 1Gb+SQUID, качалка стоит на отдельной машине (порты проброшены),
в инет выходят 3 компа lan и ноут wi-fi через squid ..сквид настроен в прозрачном режиме с редиректом порта (iptables -t nat -A PREROUTING -i br0 -p tcp --dport 80 -j REDIRECT --to-port 3128)
Оператор инета - Авангард (СПб)
задача, чтобы при забитом канале (в основном исходящем, т.к. входящий широкий) люди нормально в инет выходили..

настройки wshaper не менял использую то что в прошивке..(может это не правильно и надо что то там поменять??)

vectorm
03-09-2008, 22:06
Приветствую форумчане..есть проблемка..Не подскажите ..

запускаю в post-mount
/sbin/wshaper start ppp0 2000 512
загружается все ок..
по команде wshaper status ppp0 выводит данные
через какое то время снова захожу в консоль и по команде проверки статуса - тишина.. набираю killall wshaper... тоже пишет нет процесса....
куда девается wshaper?

аппарат asus wl-500w(1.9.2.7-10) + 1Gb+SQUID, качалка стоит на отдельной машине (порты проброшены),
в инет выходят 3 компа lan и ноут wi-fi через squid ..сквид настроен в прозрачном режиме с редиректом порта (iptables -t nat -A PREROUTING -i br0 -p tcp --dport 80 -j REDIRECT --to-port 3128)
Оператор инета - Авангард (СПб)
задача, чтобы при забитом канале (в основном исходящем, т.к. входящий широкий) люди нормально в инет выходили..

настройки wshaper не менял использую то что в прошивке..(может это не правильно и надо что то там поменять??)
swap есть? Помониторь занятость памяти.

opyzhov
07-09-2008, 14:55
swap есть? Помониторь занятость памяти.

есть

total used free shared buffers
Mem: 30164 29344 820 0 3104
Swap: 136512 24000 112512
Total: 166676 53344 113332

а как мониторить ??
через mrtg??

vectorm
07-09-2008, 20:09
есть

total used free shared buffers
Mem: 30164 29344 820 0 3104
Swap: 136512 24000 112512
Total: 166676 53344 113332

а как мониторить ??
через mrtg??
top например

zmv
11-10-2008, 20:20
Уважаемые спецы по шейперам! Подскажите, пожалуйста, как реализовать двух-приоритетный шейпер: высокий приоритет для подключенного компа на закачку любого (всего) трафика с захватом по возможности полного канала (1024 кбит/с); и низкий приоритет для качалок, установленных на роутере (чтобы они забирали канал только когда с компа не качают).
Вот схема:

msa100rus
25-10-2008, 16:23
Так же проблема, что и в предыдущем посте. Скрипты приведенные в начале ковыряю, вроде какой-то эффект есть, но очень незначительный. Т.е. комфортного серфинга, при включенном на роутере рТоррент, и близко нету. А задачка-то, ИМХО, типичная. Очень многие используют конфигурацию: "роутер + качалка на усб винт" + "большой комп с которого серфим инет, иногда что-то выкачиваем с http или ftp".
Все же - возможно сделать c помощью traffic control такое или искать другие пути?

vectorm
25-10-2008, 19:01
Так же проблема, что и в предыдущем посте. Скрипты приведенные в начале ковыряю, вроде какой-то эффект есть, но очень незначительный. Т.е. комфортного серфинга, при включенном на роутере рТоррент, и близко нету. А задачка-то, ИМХО, типичная. Очень многие используют конфигурацию: "роутер + качалка на усб винт" + "большой комп с которого серфим инет, иногда что-то выкачиваем с http или ftp".
Все же - возможно сделать c помощью traffic control такое или искать другие пути?
Настройтк нормально rtorrent, и не надо будет никаких шейперов.

msa100rus
25-10-2008, 19:36
Настройтк нормально rtorrent, и не надо будет никаких шейперов.

О! Какой интересный человек ответил. Первоначально настраивал роутер по Вашей инструкции с нуля, показалась мне одной из самых толковых. Хорошо. Выражаю свое уважение.

Подскажите пожалуйста, как именно настроить рТоррент? Есть какой-то ключевой момент, который от меня ускользает или ... ?

vectorm
26-10-2008, 11:42
О! Какой интересный человек ответил. Первоначально настраивал роутер по Вашей инструкции с нуля, показалась мне одной из самых толковых. Хорошо. Выражаю свое уважение.

Подскажите пожалуйста, как именно настроить рТоррент? Есть какой-то ключевой момент, который от меня ускользает или ... ?
Ограничения по скорости и кол-ву коннектов выставите. Точнее Вам в теме про Rtorrent ответят, возможно еще какую тонкость подскажут, если конфиг rtorrent приложите.

zmv
27-10-2008, 06:50
Ограничения по скорости ...
Это не дело - канал должен всегда по максимуму использоваться! В этой теме рассматриваем перераспределение всей пропускной способности, а не тупое ограничение для каждого приложения.

vectorm
27-10-2008, 08:46
Это не дело - канал должен всегда по максимуму использоваться! В этой теме рассматриваем перераспределение всей пропускной способности, а не тупое ограничение для каждого приложения.
Я человеку ответил, как без заморочек сделать так, чтобы инет не тормозил.

Что личто меня, то я не вижу смысла выделять качалкам больше 80% канала

residend
17-11-2008, 15:50
У меня провайдер корбина, используется l2tp соединение с интернетом + локальная сеть. Скорости интернет 4096/4096 кбит, локалка провайдера 100 мбит. Попробовал скрипт от lenivy, прописав под свои параметры, не заработал он, хотя всё делал по описаному.

поначалу смутило отсутствие у меня "/usr/local/.files", но создал его и туда необходимою строчку прописал. (о том, что мои познания в линухе стремяться к нулю, я говорить не буду, иначе наверно всё получилось бы)

Вообщем уже совсем запутался, поэтому просто опишу то, что я хотел бы добиться от шейпера:

1. Приоритет http трафика, voip, и др - это я как понимаю в любом скрипте прописывается портами (или по АСК пакетам, хотя как их найти?)

2. все качалки в самый низкий приоритет, в не зависимости от того, на роутере они находятся, или на клиентских машинах (тоже так понимаю портами прописывается, или возможно )

3. Чтобы интернет трафик автоматом делился между компьютерами в сети в зависимости от их активности, т.е. если траф потребляет только один комп, то всё ему, если в этот момент появляется ещё один потребитель, то ему отдаётся до 50% полосы и тд... (ну это наверно уже надо отдельный скрипт запускать, но при этом чтобы первые 2 пункта тоже работали)

4. Скорость MAN, я думаю, не обязательно шейпить.


Вообщем для начала, как этот скрипт (от leniviy) запустить и настроить под моё подключение к инету? По шагам, если не сложно - думаю это многим пригодиться!

Заранее спасибо откликнувшимся!

PS: wl-500gP, прошивка от Олега -10

slaynew
08-02-2009, 08:21
Добрый день.

У нашего isp Олимпус (Акадо) г.Екатеринбург есть такой хитрый тариф:
download = 0,5 Mbit * K, где K - коэ-фт от 1 до 10
upload = 0,5 Mbit

При этом заранее этот коэф-т не узнать, можно только видеть историю за последние сутки. Соответсвенно используя тот же скрипт от leniviy нельзя явно задать скорость download. Если задать минимальные 512/512 - все хорошо серфится, но жалко что зря не используется канал для rtorrent, когда K>1. Напротив если указать максимум 5120/512, то невозможно серфить если K<10, т.к. торрент съедает все...

Есть мысли как сделать в данном случае, чтобы только 53, 80, 443 порты были приоритетными, а для всего остального - остаток канала?

Сейчас пока думаю сделать просто чтобы по крону днем (когда есть необходимость серфить) запускался шейпер на 512/512, а на ночь на 5120/512 либо вообще без шейпера т.к. только rtorrent один будет в это время использоваться..

sshura
02-03-2009, 08:37
Что-то поизучал-поизучал...

Все решения достаточно сложны. А мне, в принципе, нужно следующее:
На компе живет торрент. Он качает на всю ширину канала.
Если с этого компа (или любого другого - есть еще 2) пойдет HTTP трафик, то отдать ему приоритет.
По идее, - это не должно быть столь сложно...? Или чего-то недопонимаю?

Есть решение для интерфейса br0 - http://wl500g.info/showpost.php?p=93270&postcount=15
Но будет ли работать, при условии качалки на роутере и переназначении на vlan1 либо ppp0. (L2tp - Corbina)

temikus
02-03-2009, 08:58
Что-то поизучал-поизучал...

Все решения достаточно сложны. А мне, в принципе, нужно следующее:
На компе живет торрент. Он качает на всю ширину канала.
Если с этого компа (или любого другого - есть еще 2) пойдет HTTP трафик, то отдать ему приоритет.
По идее, - это не должно быть столь сложно...? Или чего-то недопонимаю?

Именно это всем и нужно.
Суть проблемы в том, что нужно управлять входящим трафиком, а это может делать только провайдер.
Можно пробовать дропать входящие от провайдера пакеты (торрент пакеты), и тогда приложение должно снижать скорость обмена, но это не дает 100% результата.

Вопрос к спецам по шейпингу:
Я бы еще хотел попробовать маркировать исходящие от торрента пакеты, задерживать их в исходящей очереди дольше чем обычные, и дропать их, если есть любые другие (http пакеты). Я считаю, что таким образом, при наличии http трафика можно значительно снизить трафик торрента.
Есть ли в этом смысл? Может ли получиться? Какими именно средствами лучше воспользоваться для решения данной задачи?
PS
Думаю вряд ли кто ответит, тема что-то заглохла, но тем не менее, жду ответа с нетерпением.

MMX2
02-03-2009, 09:46
Именно это всем и нужно.
Суть проблемы в том, что нужно управлять входящим трафиком, а это может делать только провайдер.
Можно пробовать дропать входящие от провайдера пакеты (торрент пакеты), и тогда приложение должно снижать скорость обмена, но это не дает 100% результата.

Вопрос к спецам по шейпингу:
Я бы еще хотел попробовать маркировать исходящие от торрента пакеты, задерживать их в исходящей очереди дольше чем обычные, и дропать их, если есть любые другие (http пакеты). Я считаю, что таким образом, при наличии http трафика можно значительно снизить трафик торрента.
Есть ли в этом смысл? Может ли получиться? Какими именно средствами лучше воспользоваться для решения данной задачи?
PS
Думаю вряд ли кто ответит, тема что-то заглохла, но тем не менее, жду ответа с нетерпением.

+1 полностью согласен! Неужели для решения задачи приоритезации трафика двух приложений необходимо рыть землю (читай линукс) до динозавров?:)

sshura
02-03-2009, 10:11
Именно это всем и нужно.
Вопрос к спецам по шейпингу:
Я бы еще хотел попробовать маркировать исходящие от торрента пакеты, задерживать их в исходящей очереди дольше чем обычные, и дропать их, если есть любые другие (http пакеты). Я считаю, что таким образом, при наличии http трафика можно значительно снизить трафик торрента.
Есть ли в этом смысл? Может ли получиться? Какими именно средствами лучше воспользоваться для решения данной задачи?
PS
Думаю вряд ли кто ответит, тема что-то заглохла, но тем не менее, жду ответа с нетерпением.

Ну про маркировку пакетов здесь была тема - просто патчится торрент и уже пакеты идут маркированные.
НО - решение, как я понял, для торрентов с ПК.
И главная задача минимизации трафика торрентов так и не решена. ТО есть если я качаю по HTTP, - все равно торренты оставят себе хоть половину канала, весь не освободят.

temikus
02-03-2009, 10:24
Ну про маркировку пакетов здесь была тема - просто патчится торрент и уже пакеты идут маркированные.
НО - решение, как я понял, для торрентов с ПК.
И главная задача минимизации трафика торрентов так и не решена. ТО есть если я качаю по HTTP, - все равно торренты оставят себе хоть половину канала, весь не освободят.

Все зависит от того, можно ли сделать задержку маркированных пакетов на время, за которое успеют проскочить http запросы.
А еще лучше, если есть в очереди хоть один http или др. не маркированный пакет, то дропать из очереди все маркированные.
Позволит ли tc сделать такие настройки?

sshura
02-03-2009, 10:36
а вот это вопрос.
Тут либо все довольные ушли из темы, либо положили на шейпинг х....
Надеюсь что довольные... и что вернутся поделиться как им это получилось и насколько.

imageofyou
02-03-2009, 10:58
Ребят, на первых двух страницах изложено практически все что нужно. Работает вполне нормально. Правда, в контексте четырехкратного величения скорости по сравнению с прежними временами, актуальность точного шейпинга уже намного ниже.

sshura
02-03-2009, 11:26
Так торрент к примеру - ведь он жрет весь канал.
Я хочу скачать файл через HTTP - быстро. Хочется не отключать торрент, а чтобы это было на уровне приоритезации.
Половины канала для этого - мало. Надо чтобы 90% отдавал. Не меньше.

Adelek
20-03-2009, 10:32
Всем привет.
Извиняйте сразу если данная тема поднималась, но что-то конкретного и нужного я не нашёл.. Читал темы про QOS и прочии.. поиском пользовался... ничего не помогло.

Вообщем суть в следующем:
Сразу выражаю благодарность Олегу за Bandwitch Managment отличная штука, есть большое НО...
как понимаете он режет весь трафик по всем портам если не указывать порт внутри сети. понятно можно прописать порты и прочее.. но это не пойдёт.

КАК сделать так чтоб внутри сети (WI-FI, LAN) скорость не ограничивалась, а ограничение только было на Интернет.

Приоритеты никакие не нужны. Нужно ТУПО ограничивать скорость как работает Олеговский Bandwitch Man. , Но для Интернета.

Заранее спасибо за помощь.

kozian
23-03-2009, 10:06
может кто-нибудь уж поможет... глухо как в танке..(((

есть вариант ограничения, но очень своеобразного, через iptables:


iptables -A INPUT-p TCP -i $INET_IFACE --dport 80 -m limit --limit 2/second --limit-burst 2 -j ACCEPT
iptables -A INPUT -p TCP -i $INET_IFACE --dport 80 -j DROP

Это для случая доступа из инета... Ограничение в 2 соединения в секунду. Но это не совсем ограничение скорости... (для Вашей нужды надо допилить напильником, как минимум)

Adelek
23-03-2009, 14:20
нет это совсем не подходит.. ну неужели нельзя сделать также как у Олега в прошивке.. но чтоб не резало всё.. а резало только тот траф ко торый идёт в интерфейс WAN. теоритически думаю больших сложностей в этом нет... но практически, т.к. в этом не смыслю.. не знаю как сделать. Хееелппп...:confused:

m0xf
23-03-2009, 17:03
Да, всё очень просто :D
man iptables
man iproute2

Adelek
27-03-2009, 07:35
и ещё такой вопрос. возможно ли загрузить такую программульку которая будет считать каждый день сколько трафика прошло через определённый айпи. т.е. например сетка у меня.. каждый имеет свой внутренний айпи. ну вот сколько трафа шло с такого-то айпи... сколько трафа шло с другого айпи..
кто нибудь делал это?

ramile
27-03-2009, 07:41
и ещё такой вопрос. возможно ли загрузить такую программульку которая будет считать каждый день сколько трафика прошло через определённый айпи. т.е. например сетка у меня.. каждый имеет свой внутренний айпи. ну вот сколько трафа шло с такого-то айпи... сколько трафа шло с другого айпи..
кто нибудь делал это?

Ага, это называется прокси сервер ))

Adelek
27-03-2009, 09:32
остроумно.. без тебя мы как будто не знали... D)))
нужна на линухе прога которая будет считать траф с определённых заданных айпи. и вести текстовый лог.

vectorm
29-03-2009, 22:24
остроумно.. без тебя мы как будто не знали... D)))
нужна на линухе прога которая будет считать траф с определённых заданных айпи. и вести текстовый лог.
1. Почитайте наконец про синтаксис команд iptables и iproute2.
2. Трафикосчиталка - например squid + модули к нему - все есть в инете.

Adelek
30-03-2009, 15:51
1. Почитайте наконец про синтаксис команд iptables и iproute2.
2. Трафикосчиталка - например squid + модули к нему - все есть в инете.

Я всё прекрасно понимаю.. в инете всё есть.. но главная проблема как это всё прикрутить и прочее.. и главное чтоб работало. я просто с Линой на ВЫ. так что извините... ПОМогите уж.. что к чему там... буду очень благодарен.
Первое: Мне нужно научиться ограничивать скорость только для доступа в инет( чтоб локалка по вай-фай и ЛАН не резалась)
Второе: Трафикосчиталка нужна, которая будет считать с какого айпи сколько накачали.

Спасибо всем кто откликнется и поможет.

sergio000
30-04-2009, 08:58
прочитал что написали про шейпер канала но я в линуксах далёкий человек.
может кто то мне поможет , задача такая на работе 25 компов нет раздаёт наша любимая железяка , надо сделать так чтобы у всех компов скорость не превышала 128 к/b коме 4 шт и плюс при этом был баланс у всех в трафике локальная сеть не интересует нас , входной канал 1.5 м/b ,
подключается по VPN. встроенный Bandwidth Management не работает почему то скорость не режет.
Напишите если можете подробную инструкцию для не шарящих что где и куда надо писать

Alex159
10-05-2009, 15:07
Господа, очень глупый вопрос:
А можно просто поставить ограничение скорости для порта или интерфейса (Vlan), безо всяких приоритезаций и т.д. Bandwidch Management не фунционален поскольку ограничивает скорость закачки для конкретного IP и не может даже сделать того же для подсети. В идеале хочется просто ставить ограничения на LAN-овских портах, а WAN без ограничений.

hae
13-05-2009, 15:18
Здравствуйте, поскольку у меня ограничен трафик, как можно программно запретить выходить в нет после достижения указанного входного и выходного трафика. На wl500 работает vnstat. Спасибо

YSL
26-05-2009, 19:03
Статистика и ограничение скорости по IP на DIR-320.
Какой есть софт для этого, именно по IP?
Прошу помощи так как поиск результатов не дал.

ceramic
26-05-2009, 19:41
Статистика и ограничение скорости по IP на DIR-320.
Какой есть софт для этого, именно по IP?
iptables


Прошу помощи так как поиск результатов не дал.
Не может быть. Ко-во тем по топику исчисляется десятками.
Например:
http://wl500g.info/showthread.php?t=18005&highlight=%EE%E3%F0%E0%ED%E8%F7%E5%ED%E8%E5+%F1%EA %EE%F0%EE%F1%F2%E8
http://wl500g.info/showthread.php?t=13472&highlight=%EE%E3%F0%E0%ED%E8%F7%E5%ED%E8%E5+%F1%EA %EE%F0%EE%F1%F2%E8

YSL
26-05-2009, 21:59
А Bandwidth Management в web интерфейсе коректно рубит скорость по IP?
И по статистике можно по конкретней как и что, так как в linux не спец. Желательно статистика по IP с web интерфейсом, а если есть что то типа UserGate было бы вообще супер. Прочтение всех постов толку не дало мне нужно конкретно, зашел туда ввел то, все.
Спасибо.

ceramic
26-05-2009, 22:29
..., так как в linux не спец.
Становиться спецом вовсе не обязательно. Но желание разобраться + немного времени необходимо.

Прочтение всех постов толку не дало мне нужно конкретно, зашел туда ввел то, все.Спасибо.
Выше указанная тема про мониторинг наиболее подходит для этого.
Если нет, то надо начинать с тем темы для новичков. По другому -- ни как.

YSL
30-05-2009, 19:52
Ну помогите кто нибудь.
Уже несколько дней пытаюсь настроить учет трафика на DIR-320 с прошивкой 1.9.2.7-d-298, перепробовал все что предлагали и как правило в конце были всякие проблемы.
Кто сможет не кидать по ссылкам а грамотно написать что и куда нужно сделать по очереди расписать процесс настройки чтобы в конце все работало,так как в linux не очень хорошо разбираюсь, надоело скитаться по всему форуму.
Все что мне нужно:
1-Учет интернет трафика по IP.
2-Возможность установить квоты по трафику, по окончанию установленных мб выключать инет.
3-Ограничение скорости по IP.

lsd_wiz
30-05-2009, 22:32
1) iptables -A FORWARD -s $LOCAL_IP -j ACCEPT
iptables -A FORWARD -d $LOCAL_IP -j ACCEPT
2) iptables -nvx -L FORWARD | grep "$LOCAL_IP" #трафик для $LOCAL_iP
3) самати в гугле. готовые скрипты по биллингу и подсчёту трафика
Пример:


#!/bin/sh
iptables -nvxL FORWARD | grep 192.168 | grep 0.0.0.0/0 | awk '{print($2,$8,$9)}'>> /opt/ee
iptables -Z FORWARD >> /dev/null
cat ee | sort $2 $3 | awk 'BEGIN{a="0"; b="0"; cnt=0;}{if (($2==a)&&($3==b)) {cnt=cnt+$1;} else {if ((a != "0")&&(cnt > 0)) {print(a,b,cnt);}a=$2; b = $3;cnt=$1;}}END{}'

YSL
31-05-2009, 09:03
Я понимаю что тут спецы сидят, и думают что их с полуслова можно понять, и знаю что в инете есть все но человеку который плохо знает linux ну очень сложно разобраться в этом.
МОЖЕТ ХОТЬ КТО, НАПИСАТЬ ОТ А ДО Я ЧТО И КАК НУЖНО СДЕЛАТЬ КУДА ЧТО ПИСАТЬ ЧТОБЫ ВСЕ РАБОТАЛО НУ НЕУЖЕЛИ ТАК СЛОЖНО, НАДОЕЛО ПИСАТЬ.
ПРОШУ ОБЪЯСНИТЬ ПОДРОБНО.
Вот что получается.

[admin@(none) root]$ iptables -A FORWARD -s $LOCAL_IP -j ACCEPT
Bad argument `ACCEPT'
Try `iptables -h' or 'iptables --help' for more information.
[admin@(none) root]$

Да, и что делать с скриптом ?

И еще если можно чтобы все это:

1-Учет интернет трафика по IP.
2-Возможность установить квоты по трафику, по окончанию установленных мб выключать инет.
3-Ограничение скорости по IP.

было в web браузере видно, и настраивать можно было.

lsd_wiz
31-05-2009, 11:25
вместо переменной $LOCAL_IP поишеш локальный айпишник типа 192.168.0.1 и так далее....
Во вторых попруй связку PopTop + VnStat для тебя так будет проще.

YSL
31-05-2009, 22:32
попробуй связку PopTop + VnStat

Спасибо, но если бы кто написал по пунктам как это все настроить :confused:
У меня складывается впечатление что, или это слишком сложный вопрос или всем тупо пофиг, никто толком ПОДРОБНО ЗДЕСЬ НЕ ХОЧЕТ ПИСАТЬ...
Я устал ждать точной конкретной помощи.......

lsd_wiz
31-05-2009, 22:51
Спасибо, но если бы кто написал по пунктам как это все настроить :confused:
У меня складывается впечатление что, или это слишком сложный вопрос или всем тупо пофиг, никто толком ПОДРОБНО ЗДЕСЬ НЕ ХОЧЕТ ПИСАТЬ...
Я устал ждать точной конкретной помощи.......
юзай поиск! это раз
vnstat - начальная настрока тут! http://wl500g.info/showthread.php?t=18096
poptop - http://wl500g.info/showthread.php?t=19022
КОГДА ПРОЧИТАЕШ И СДЕЛАЕШ ЧТО НАПИСАНО СТАНЕТ ЛУЧШЕ!

lsd_wiz
31-05-2009, 23:08
Вот мой счётчик трафика,


mkdir /opt/Billing
mkdir /opt/Billing/logs
mkdir /opt/Billing/users
touch /opt/Billing/run
touch /opt/Billing/cnt
chmod +x /opt/Billing/cnt
chmod +x /opt/Billing/run
таблица юзероф:
nano /opt/etc/users


00:00:11:11:11 192.168.1.1
00:00:1a:1a:1a 192.168.1.2

Добавляем правило+счётчик для каждого юзверя:
добавить в post-firewall


#!/bin/sh
CFG="/opt/.cfg"
echo "#!/bin/sh" > $CFG
USR="/opt/etc/users"
cat $USR | awk '{print("iptables -A FORWARD -s",$2,"-j ACCEPT")}' >> $CFG
cat $USR | awk '{print("iptables -A FORWARD -d",$2,"-j ACCEPT")}' >> $CFG
sh $CFG

для того чтоб не потерять счётчики из-за случайной перезагрузки:
nano /opt/Billing/run


#!/bin/sh
DATE="logs/`date +%d-%m-%Y`.log"
LOG="users/`date +%d-%m-%Y`.log"
iptables -nvxL FORWARD | grep 192.168 | grep 0.0.0.0/0 | awk '{
if (($2) != 0){print($2,$8,$9)}}'>> $DATE
iptables -Z
echo "#!/bin/sh" > .test
chmod +x .test
cat /opt/etc/users | awk '{
if(($2) != ""){print("/opt/Billing/cnt",$2)}}' >> .test
rm $LOG
sh ./.test
rm .test

Сам Счётчик
nano /opt/Billing/cnt


#!/bin/sh
LOG="logs/`date +%d-%m-%Y`.log"
ULOG="users/`date +%d-%m-%Y`.log"
echo "$1 `cat $LOG | grep \"0.0.0.0/0 $1\" | awk '
BEGIN{a=0;x=0;b=0;y=0}
{
if (index($1,\"d\") == 0) a=(a+$1)
x=a/1024/1024
}
END{if((a) != 0){print x}else{print 0}}'` `cat $LOG | grep \"$1 0.0.0.0/0\" | awk '
BEGIN{a=0;b=0}
{
if (index($1,\"d\") == 0) b=(b+$1)
y=b/1024/1024
}
END{if((b) != 0){print y}else{print 0}}'`" >> $ULOG

Добовляем в ссылку в cron


ls -s /opt/Billing/run /opt/etc/cron.5mins

YSL
03-06-2009, 07:47
В поисках
1- Cтатистики инет трафика по IP,
2- Ограничению трафика,
3- Урезание скорости по IP и работа по таймеру,
4- И все в web интерфейсе для админа, и юзеров просмотр своей статистики через web
пришел к выводу что нет человека который даст нормальный совет по моим вопросам, все что давали советы, спасибо, но ничего у меня не завелось.
Да и по описанию не то чуть-чуть.
Может ответы на мои вопросы даст билинг, посоветуйте бесплатный, хороший, простой в настройке это главное ,я linux только начал изучать, ели можно очень подробно.
Прошивка 1.9.2.7-d-310.

satch
03-06-2009, 08:10
вы вообще понимаете что такие вещи делают на серверах и роутер по мощностям не подходит?
upd: вроде в заводской прошивке видел авторизацию с сервера freeradius, но в таком случае опять-же нужен стороний сервер

lsd_wiz
03-06-2009, 18:33
1) в линуксе в основном билинг основан на iptebles, и для начала надо понять что это такое. http://www.opennet.ru/docs/RUS/iptables/
2) если загнался на веб интерфейсе сделай доступ только по мак-адресам.(и в стандарной прошивке и от олега - это есть.) самое простое и надёжое.
3) Скрипт каторый будет считать трафик я изложил выше, вот веб-инерфейс к нему со всяким там php и cgi ресуйте сами. Но для того чтобы его использовать, необходимо изначально настроить роутер как это описано на форуме. также будет нужна флешка до 2гб, для хранения логов и прог.

ЗЫ. По поводу всяких авторизаций по логину и пассу, билиинга на основе php. Эти идеи уже излагались на форуме. Даже предлагались готовые решения.

YSL
03-06-2009, 22:29
lsd_wiz Вам вопрос.
В папке /opt/Billing/users/03-06-2009.log создался за 30 мин

192.168.1.11 0 0
0 0

В папке /opt/Billing/logs/03-06-2009.log файл пустой

где статистика сделал все как у вас, не работает.

Да и в файле таблица юзеров:
nano /opt/etc/users
Код:

00:00:11:11:11 192.168.1.1
00:00:1a:1a:1a 192.168.1.2

в начале что за цифры, и как дальше если 10 юзеров?

Создаю файл post-firewall в /usr/local/sbin/post-firewall а он исчезает после перезагрузки.

Да, короче нет нормальной статистики, а жалко что нет спецов буду искать по инету....

lsd_wiz
05-06-2009, 16:44
превый столб мак адрес второй айпи адрессу, разделитель лучше всего использовать табуляцию.
пример
01:1e:23:63:0d:fb 192.168.1.1
00:1b:23:00:01:11 192.168.1.2
что касается /usr/local/sbin/post-firewall, будте добры читайте внимательно начальную настройку, после правки(изменения) в подобных файлах


flashfs save && flashfs commit && flashfs enable && reboot

YSL
05-06-2009, 19:30
Спасибо, все работает только в каких единицах оно показывает, в кб, и где входящий а где исходящий?

192.168.1.11 0 0.00963211

и что за 0 после IP?

И как это все можно, как табличку в web странице показать?

lsd_wiz
05-06-2009, 23:25
идет: айпи | входящий | исходящий, всё в мегабайтах


#!/bin/sh
LOG="/opt/Billing/logs/`date +%d-%m-%Y`.log"
ULOG="/opt/Billing/users/`date +%d-%m-%Y`.log"
echo "$1 in: `cat $LOG | grep \"0.0.0.0/0 $1\" | awk '
BEGIN{a=0;x=0;b=0;y=0}
{
if (index($1,\"d\") == 0) a=(a+$1)
x=a/1024/1024 # a = трафик в байтах делем на 1024 получаем кб ещё на 1024 в мб и тд.
}
END{if((a) != 0){printf(\"%.2f\",x)}else{print 0}}'` Mb/out: `cat $LOG | grep \"$1 0.0.0.0/0\" | awk '
BEGIN{a=0;b=0}
{
if (index($1,\"d\") == 0) b=(b+$1)
y=b/1024/1024 # b = трафик в байтах делем на 1024 получаем кб ещё на 1024 в мб и тд.
}
END{if((b) != 0){printf(\"%.2f\",y)}else{print 0}}'` Mb" >> $ULOG
для вывода в каких еденицах
скрипт для вывода в web счас напишу)

Вот самый простой скрипт который будет считывать логи, и кидать их в веб. Но нужно сконфигурировать lighttpd или воспользоваться busybox. Подробно тут http://wl500g.info/showpost.php?p=128994&postcount=6
и общий трафик
кинуть в /opt/etc/cron.5mins/
и назвать как нить, например end.sh
и сделать его исполняемым chmod +x /opt/etc/cron.5mins/end.sh


#!/bin/sh
LOG="/opt/Billing/logs/total"
ULOG="/opt/Billing/users/total"
rm $LOG
rm $ULOG
ls -l /opt/Billing/users/ | awk '{system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($6) != 0){print}}' >> $LOG
echo "Total in: `cat $LOG | awk '
BEGIN{a=0;b=0}
{
if (index($3,\"d\") == 0) a=(a+$3)
}
END{if((a) != 0){printf(\"%.2f\",a)}else{print 0}}'` Mb/out: `cat $LOG | awk '
BEGIN{a=0;b=0}
{
if (index($6,\"d\") == 0) b=(b+$6)
}
END{if((b) != 0){printf(\"%.2f\",b)}else{print 0}}'` Mb" > $ULOG

кинуть в /opt/etc/cron.5mins/
и назвать как нить, например web.sh
и сделать его исполняемым chmod +x /opt/etc/cron.5mins/web.sh


#!/bin/sh
WEB="/opt/share/www/stat.html" #путь куда писать
echo "<html><head><title>статистика:</title></head><body><pre>" > $WEB
ls -l /opt/Billing/users/ | awk '{print($9);system("cat /opt/Billing/users/"$9)}' | awk '{if(($4) != 0 && ($6) != 0){print}}' >> $WEB
cat /opt/Billing/users/total >> $WEB
echo "</pre></body></html>" >> $WEB

для красоты я б вырезал из всех скриптов значание ".log", красифше смотрится с меньшим гемороем =*

YSL
06-06-2009, 04:43
Большое спасибо понемногу врубаюсь в суть вопроса,
но не считает входящий трафик, и total, и при добалении еще юзеров у них не считает ни in ни out ни total:(

в web смотрится так:
192.168.1.11 in: 0 Mb/out: 0.79 Mb
192.168.1.15 in: 0 Mb/out: 0.00 Mb
192.168.1.2 in: 0 Mb/out: 0 Mb
total
Total in: 0 Mb/out: 0 Mb
Total in: 0 Mb/out: 0 Mb

Прошу помощи !!!

И еще:

1- можно чтобы в web в строчке юзера было общее in и out типа так (192.168.1.11 in: 0 Mb/out: 0.79 Mb total= 0,79 Mb)

2- можно сделать кнопку типа (Обновить статистику/Refresh stats ) и (Обновить web/Refresh web) было бы удобно, смотреть статистику на данный момент и не ждать 5 мин.

3- по поводу ограничения скорости по IP еще что то можно сделать? А Bandwidth Management коректно работает в web интерфейсе, он вроде режет скорость по IP?

4- и если можно как то задавать юзерам ограничение на трафик, по истечению которого инет вырубается?

Надеюсь оно считает правильно и только инет трафик, локальный не надо считать ?

Пока все.
Но думаю еще будут вопросы.
Спасибо.

lsd_wiz
06-06-2009, 08:29
можеш паказать что выводит iptables -nvxL FORWARD

YSL
06-06-2009, 08:32
[admin@(none) root]$ iptables -nvxL FORWARD
Chain FORWARD (policy ACCEPT 1336 packets, 64187 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- br0 br0 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
373198 67314128 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 DROP all -- !br0 ppp0 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- !br0 vlan2 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate DNAT
0 0 DROP all -- * br0 0.0.0.0/0 0.0.0.0/0
10000 679281 ACCEPT all -- * * 192.168.1.11 0.0.0.0/0
2 80 ACCEPT all -- * * 192.168.1.15 0.0.0.0/0
0 0 ACCEPT all -- * * 0.0.0.0/0 192.168.1.11
0 0 ACCEPT all -- * * 0.0.0.0/0 192.168.1.15
[admin@(none) root]$

lsd_wiz
06-06-2009, 08:53
У тебя проблеммы с конфигом iptebles
попробуй в post-firewall в начале добавить
iptables -F FORWARD
должно быть так iptables -nvxL FORWARD:


Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * ppp+ 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- ppp+ * 0.0.0.0/0 0.0.0.0/0
19 1097 ACCEPT all -- * * 192.168.2.1 0.0.0.0/0 #исходящий
0 0 ACCEPT all -- * * 192.168.3.1 0.0.0.0/0
0 0 ACCEPT all -- * * 192.168.1.88 0.0.0.0/0
0 0 ACCEPT all -- * * 192.168.0.74 0.0.0.0/0
0 0 ACCEPT all -- * * 192.168.1.230 0.0.0.0/0
0 0 ACCEPT all -- * * 192.168.3.29 0.0.0.0/0
13 803 ACCEPT all -- * * 0.0.0.0/0 192.168.2.1 # входящий
0 0 ACCEPT all -- * * 0.0.0.0/0 192.168.3.1
0 0 ACCEPT all -- * * 0.0.0.0/0 192.168.1.88
0 0 ACCEPT all -- * * 0.0.0.0/0 192.168.0.74
0 0 ACCEPT all -- * * 0.0.0.0/0 192.168.1.230
0 0 ACCEPT all -- * * 0.0.0.0/0 192.168.3.29

YSL
06-06-2009, 10:02
Тепеть все ок как у тебя.
Все заработало.

lsd_wiz
06-06-2009, 23:49
Last version, stable.
/opt/etc/cron.5mins/run.sh

#!/bin/sh
ULOG="/opt/Billing/total"
DATE="/opt/Billing/logs/`date +%d-%m-%Y`"
LOG="/opt/Billing/users/`date +%d-%m-%Y`"
WEB="/opt/share/www/stat.html"
rm $LOG
rm $ULOG
iptables -nvxL FORWARD | grep 192.168 | grep 0.0.0.0/0 | awk '{
if (($2) != 0){print($2,$8,$9)}}'>> $DATE
iptables -Z
cat /opt/etc/users | awk '{if(($2) != ""){system("/opt/Billing/cnt "$2)}}'
sleep 5s
ls -l /opt/Billing/users/ | awk '{system("cat /opt/Billing/users/"$9)}' | awk '
BEGIN{a=0;b=0,c=" MByte "}
{
if(($3) != 0 && ($6) != 0)
{
if (index($3,"d") == 0){a=(a+$3)}
if (index($6,"d") == 0){b=(b+$6)}
}
}
END
{
if((a) != 0){printf("%.2f",a);printf(c)}else{print 0}
if((b) != 0){printf("%.2f",b);printf(c)}else{print 0}
}' >> $ULOG

echo "<html><head><title>Статистика</title></head><body><pre>" > $WEB
ls -l /opt/Billing/users/ | awk '{print("<b>",$9,"</b>");system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($6) != 0){print($1,$2,$3,$4,$5,$6,$7)}}' >> $WEB
echo "<b>Total: </b>`cat /opt/Billing/total`</pre></body></html>" >> $WEB

/opt/Billing/cnt


#!/bin/sh
LOG="/opt/Billing/logs/`date +%d-%m-%Y`"
ULOG="/opt/Billing/users/`date +%d-%m-%Y`"
echo "$1 in: `cat $LOG | grep \"0.0.0.0/0 $1\" | awk '
BEGIN{a=0;x=0;b=0}
{
if (index($1,\"d\") == 0) a=(a+$1)
x=a/1024/1024
}
END{if((a) != 0){printf(\"%.2f\",x)}else{print 0}}'` Mb out: `cat $LOG | grep \"$1 0.0.0.0/0\" | awk '
BEGIN{a=0;b=0;y=0}
{
if (index($1,\"d\") == 0) b=(b+$1)
y=b/1024/1024
}
END{if((b) != 0){printf(\"%.2f\",y)}else{print 0}}'` Mb" >> $ULOG

Кнопку Refresh можно дабавить, тогда из cron нада переместить скрипт в папку и написать небольшой php скрипт который будет запускать его всесто крона, при нажатии кнопачки. Надо ман по php4 почитать.
По поводу ограничения и лимитов по трафику, тут надо читать ман по iptables

YSL
07-06-2009, 03:36
Еще очень актуальная штука total для каждого за весь период пример

06-06-2009
192.168.1.11 in: 0.11 Mb out: 0.51 Mb total 0.62 Mb
192.168.1.2 in: 24.30 Mb out: 1.17 Mb total 25.47 Mb

07-06-2009
192.168.1.11 in: 0.10 Mb out: 0.60 Mb total 1.32 Mb
192.168.1.2 in: 10.30 Mb out: 2.00 Mb total 33.77 Mb

lsd_wiz
07-06-2009, 08:19
/opt/Billing/cnt


#!/bin/sh
LOG="/opt/Billing/logs/`date +%d-%m-%Y`"
ULOG="/opt/Billing/users/`date +%d-%m-%Y`"
echo "$1 in: `cat $LOG | grep \"0.0.0.0/0 $1\" | awk '
BEGIN{a=0;x=0;b=0;y=0}
{
if (index($1,\"d\") == 0) a=(a+$1)
x=a/1024/1024
}
END{if((a) != 0){printf(\"%.2f\",x)}else{print 0}}'` Mb out: `cat $LOG | grep \"$1 0.0.0.0/0\" | awk '
BEGIN{a=0;b=0}
{
if (index($1,\"d\") == 0) b=(b+$1)
y=b/1024/1024
}
END{if((b) != 0){printf(\"%.2f\",y)}else{print 0}}'` Mb" | awk '
BEGIN{a=0;b=" Total: ";c=" Mbyte"}
{
#if (index($3,"d") == 0) && (index($6,"d") == 0)
a=($3+$6)
}
END{print($1,$2,$3,$4,$5,$6,$7,b,a,c)}' >> $ULOG

на выходе имеем
192.168.xxx.xxx in: 2315.05 Mb out: 44.25 Mb Total: 2359.3 Mbyte
и поправить run.sh


ls -l /opt/Billing/users/ | awk '{print("<b>",$9,"</b>");system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($6) != 0){print($1,$2,$3,$4,$5,$6,$7,$8,$9,$10)}}' >> $LOG

Break Action
08-06-2009, 01:13
Что-то у меня по юзерам и тотал не считает! Зато в логах учет ведет.
=\

UPDATED: Нашел причины.
Для тотала. Вместо $LOG надо $WEB

ls -l /opt/Billing/users/ | awk '{print("<b>",$9,"</b>");system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($6) != 0){print($1,$2,$3,$4,$5,$6,$7,$8,$9,$10)}}' >> $WEB
далее файл cnt, не запускался пока не дал ему расширение .sh и сделал изменение в файле /opt/etc/cron.5mins/run.sh

cat /opt/etc/users | awk '{if(($2) != ""){system("/opt/billing/cnt.sh "$2)}}'

СПАСИБО ЗА ВАШУ СТАТИСТИКУ!

UPDATED2: Подскажите плз, как заставить считать статистику запросов самого роутера. Простой занос его IP в список пользователей, не дал положительного результата.

YSL
08-06-2009, 08:56
Есть скрипт статистики (run) и он запускается из /opt/etc/cron.5mins/run но нужно сделать кнопку в web (ОБНОВИТЬ СТАТИСТИКУ) чтобы запускать скрипт из /opt/etc/cron.5mins/run самому.
Спасибо.

Сам скрипт run

#!/bin/sh
ULOG="/opt/Billing/total"
DATE="/opt/Billing/logs/`date +%d-%m-%Y`"
LOG="/opt/Billing/users/`date +%d-%m-%Y`"
WEB="/opt/share/www/stat.html"
rm $LOG
rm $ULOG
iptables -nvxL FORWARD | grep 192.168 | grep 0.0.0.0/0 | awk '{
if (($2) != 0){print($2,$8,$9)}}'>> $DATE
iptables -Z
cat /opt/etc/users | awk '{if(($2) != ""){system("/opt/Billing/cnt "$2)}}'
sleep 5s
#end
ls -l /opt/Billing/users/ | awk '{system("cat /opt/Billing/users/"$9)}' | awk '
BEGIN{a=0;b=0;y=0}
{
if(($3) != 0 && ($6) != 0)
{
if (index($3,"d") == 0){a=(a+$3)}
if (index($6,"d") == 0){b=(b+$6)}
}
}
END
{
if((a) != 0){printf("%.2f",a);printf(c)}else{print 0}
if((b) != 0){printf("%.2f",b);printf(c)}else{print 0}
}' >> $ULOG
#web
echo "<html><head><title>Cтатистика</title></head><body><pre>" > $WEB
ls -l /opt/Billing/users/ | awk '{print("<b>",$9,"</b>");system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($6) != 0){print($1,$2,$3,$4,$5,$6,$7,$8,$9,$10)}}' >> $WEB
cat /opt/Billing/users/total >> $WEB
echo "</pre></body></html>" >> $WEB

karter
08-06-2009, 12:42
Есть скрипт статистики (run) и он запускается из /opt/etc/cron.5mins/run но нужно сделать кнопку в web (ОБНОВИТЬ СТАТИСТИКУ) чтобы запускать скрипт из /opt/etc/cron.5mins/run самому.
Спасибо.

http://wl500g.info/showthread.php?t=18546

lsd_wiz
08-06-2009, 17:02
тут немного сложнее чем с юзерами, во-первых надо определиться что и в какую сторону считать.
Есть канечно пару идей:
если есть скрипт который конфигурирует iptables то надо сделать вот что
разрешить форвард юзерам те что в списке users,кто не прошёл в в predrouting и dnat куданить по дальше. Вот тут есть 2 варианта,
1) считать общий трафик юзеров за период и онимать его от того что в ifconfig на итерфейсе wan. это и будет флуд роутера.
2) если в цепочках будет так: iptables -nvxL FORWARD


Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
230 22069 ACCEPT all -- * * user_1 0.0.0.0/0 #out
213 56687 ACCEPT all -- * * 0.0.0.0/0 user_1 #in
6 468 common-check all -- * * 0.0.0.0/0 0.0.0.0/0

то то что прилетело не от юзероф будет в последней цепочке, и то это будет ссумарный трафик в обоих направлениях.
ЗЫ. считаю что трафик самого роутера состовяет ~1-2% от общего трафика, если даже не меньше. Отсюда учёт его вести бессмысленно.

YSL
09-06-2009, 03:09
http://wl500g.info/showthread.php?t=18546

Ответа я там не нашел.
Кто то может написать скрипт?

Да, если еще и к моему скрипту прикрутить, это, чтобы появилась кнопка, (Обновить) было бы вообще супер. У меня что то не получается.

Было бы не плохо добавить строчку all day total, пример

06-06-2009
192.168.1.11 in: 0.10 Mb out: 0.10 Mb total 0.20 Mb all day total 0.20 Mb

07-06-2009
192.168.1.11 in: 0.10 Mb out: 0.30 Mb total 0.40 Mb all day total 0.60 Mb

08-06-2009
192.168.1.11 in: 0.20 Mb out: 0.10 Mb total 0.30 Mb all day total 0.90 Mb

Очень актуальная строчка

Vollsky
09-06-2009, 05:15
Ответа я там не нашел.
Кто то может написать скрипт?
Все там есть. Вот ваш случай:
<?php
exec("/opt/etc/cron.5mins/run",$data);
for ($i=0; $i< count($data);$i++) :
print "$data[$i]<br>";
endfor;
?>
в переменной $data результат работы программы.
Или вам еще и оформление выдать?:)

walkera
10-06-2009, 11:27
Народ возник следующий вопрос, поскольку оплата идет за траффик..

Можно лимитировать юзеров на определенный объем траффика?
Если да то как... есть меню bandwidth.. но чтото оно все нето...

прошивка чешская 1.9.2.7...

Народ ну может посредством интерфейса асуса это и не сделать...

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

конкретно как незнаю.. познания линукса есть...

так понимаю что идентифицировать и разграничивать юзеров придется по мак адресам... если подскажешь в каком направлении искать.. буду признателен.

ceramic
10-06-2009, 12:07
в линуксе понимаю...
Хм. Так а в чем проблема тогда???


конкретно как незнаю.. познания линукса есть...
так понимаю что идентифицировать и разграничивать юзеров придется по мак адресам... если подскажешь в каком направлении искать.. буду признателен.

У меня нет познаний линукса. Впервые с ним столкнулся с покупкой роутера. По теме мониторинга на этом форуме есть куча тем, и, как по мне, разжёвано подробнейшим образом. Вверху страницы есть кнопка "поиск" (бесплатно).
Вкратце у меня сделано так:
1. IP привязаны к mac в родной веб-морде.
2. в постбуте формируются цепочки iptables для подсчета трафика по IP.
3. cron-ом каждые 5 мин собираются данные по юзерам и проверяется лимит. При превышении лимита iptables закрывает IP и mac.

Break Action
11-06-2009, 22:50
Было бы не плохо добавить строчку all day total, пример

06-06-2009
192.168.1.11 in: 0.10 Mb out: 0.10 Mb total 0.20 Mb all day total 0.20 Mb

07-06-2009
192.168.1.11 in: 0.10 Mb out: 0.30 Mb total 0.40 Mb all day total 0.60 Mb

08-06-2009
192.168.1.11 in: 0.20 Mb out: 0.10 Mb total 0.30 Mb all day total 0.90 Mb

Очень актуальная строчка
Я могу дописать, но я что-то не совсем понял, что вы хотите?! total и есть all day total

lsd_wiz
13-06-2009, 18:39
добовляем новый скрипт
/opt/Billing/all


#!/bin/sh
LOG="/opt/Billing/logs"
ULOG="/opt/Billing/users/"
cd $ULOG
cat `ls -1 $ULOG` | grep $1 | awk '
BEGIN {a=0}
{
if (($4) != 0){
a=a+$4
}}
END {print a}'

терерь делаем изменение в самом счётчике


#!/bin/sh
LOG="/opt/Billing/logs/`date +%d-%m-%Y`"
ULOG="/opt/Billing/users/`date +%d-%m-%Y`"
echo "$1 in: `cat $LOG | grep \"0.0.0.0/0 $1\" | awk '
BEGIN{a=0;x=0;b=0;y=0}
{
if (index($1,\"d\") == 0) a=(a+$1)
x=a/1024/1024
}
END{if((a) != 0){printf(\"%.2f\",x)}else{print 0}}'` Mb out: `cat $LOG | grep \"$1 0.0.0.0/0\" | awk '
BEGIN{a=0;b=0}
{
if (index($1,\"d\") == 0) b=(b+$1)
y=b/1024/1024
}
END{if((b) != 0){printf(\"%.2f\",y)}else{print 0}}'` Mb `sh /opt/Billing/all $1`" | awk '
BEGIN{a=0;b=" Total: ";c=" Mb";d=0;e=" All day "}
{
#if (index($3,"d") == 0) && (index($6,"d") == 0)
a=($3+$6)
d=($8+a)
}
END{print($1,$2,$3,$4,$5,$6,$7,b,a,c,e,d,c)}' >> $ULOG

ps возможно ошибся в awk со столбцами в последней строчке, проверте...

YSL
13-06-2009, 22:20
В лог все пишет, а в web, не выводит:(


Я могу дописать, но я что-то не совсем понял, что вы хотите?! total и есть all day total

Я имел ввиду строчку (за все дни total)

Строчку all day не правильно считает, там копия цифр строчки total

13-06-2009
192.168.1.11 in: 0.87 Mb out: 3.93 Mb Total: 4.8 Mb All day 4.8
192.168.1.15 in: 14.75 Mb out: 1.26 Mb Total: 16.01 Mb All day 16.01
192.168.1.2 in: 178.09 Mb out: 36.29 Mb Total: 214.38 Mb All day 214.38
14-06-2009
192.168.1.11 in: 1.09 Mb out: 5.04 Mb Total: 6.13 Mb All day 6.13
192.168.1.2 in: 303.88 Mb out: 38.48 Mb Total: 342.36 Mb All day 342.36
15-06-2009
192.168.1.11 in: 0.64 Mb out: 2.89 Mb Total: 3.53 Mb All day 3.53
192.168.1.15 in: 5.83 Mb out: 0.41 Mb Total: 6.24 Mb All day 6.24
192.168.1.2 in: 85.05 Mb out: 16.49 Mb Total: 101.54 Mb All day 101.54
total
Total in: 3020.53 Mb/out: 378.74 Mb
Total in: 3020.53 Mb/out: 378.74 Mb

lsd_wiz
14-06-2009, 10:50
ls -l /opt/Billing/users/ | awk '{print("<b>",$9,"</b>");system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($6) != 0){print($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$1 3)}}' >> $WEB


d=($8+a) поэкспереметируй с этой строчкой...

YSL
15-06-2009, 23:52
А как с ней эксперементировать ???!!!:confused:
Как приплюсовать All day за прошедший день из лога к All day за текущий ???!!!
Да ппц задача )

lsd_wiz
16-06-2009, 05:23
$1 $2 $3 $4 $5 $6 $7
192.168.1.11 in: 0.87 Mb out: 3.93 Mb Total: 4.8 Mb All day 4.8

значит $8 это будет ввывод этой комады
`sh /opt/Billing/all $1`
вот это значение надо сложить со значением тотал за сегодня тобиш а, d=($8+a) и получиш результат полный трафик для юзера за всю историю. если у тебя не так выдаёт занчит попробуй взять другую пепременную $7 или $9

YSL
16-06-2009, 10:19
$1 $2 $3 $4 $5 $6 $7
192.168.1.11 in: 0.87 Mb out: 3.93 Mb Total: 4.8 Mb All day 4.8

значит $8 это будет ввывод этой комады
`sh /opt/Billing/all $1`
вот это значение надо сложить со значением тотал за сегодня тобиш а, d=($8+a) и получиш результат полный трафик для юзера за всю историю (не за всю а только за сегодня). если у тебя не так выдаёт занчит попробуй взять другую пепременную $7 или $9


Перепробовал все варианты не работает (
Суть я понял но вот как сложить все total за всю историю из логв?????

Формула: total(трафик за прошлый день) + total(трафик за сегодняшний день) = Traffic for all days (трафик за все дни)

И в скрипте all ошибка.
# ./all
./all: line 5: syntax error: unterminated quoted string

Break Action
16-06-2009, 12:35
Я решил статистику организовать в базу SQlite(базу уже собрал), сейчас надо выделить время на интерфейс (я сам пишу на Perl).
Теперь вопрос, надо ли статистика на перле?

PS: Для себя я все равно буду писать.

lsd_wiz
16-06-2009, 15:52
13-06-2009
192.168.1.1 2100.17 50.22 2150.39 12753.7
14-06-2009
192.168.1.1 1494.12 34.06 1528.18 14281.8
15-06-2009
192.168.1.1 1008.41 27.37 1035.78 15317.6
16-06-2009
Total: 17911.46 MByte 504.63 MByte
в all нету ошибки на 5 строке.


Я решил статистику организовать в базу SQlite(базу уже собрал), сейчас надо выделить время на интерфейс (я сам пишу на Perl).
Теперь вопрос, надо ли статистика на перле?

PS: Для себя я все равно буду писать.
пиши на php гемора будет меньше.

Break Action
16-06-2009, 17:56
Сорри, но PHP не мой родной, а на Перловке, я пишу. Да и сложностей там не должно быть.

YSL
17-06-2009, 08:45
lsd_wiz проверь пожалуйста где ошибка ну не считает у меня all day, я уже замучился править.
Проверь у себя пожалуйста на работоспособность, и выложи уже стабильно рабочую версию.
Спасибо.

скрипт run


#!/bin/sh
ULOG="/opt/Billing/total"
DATE="/opt/Billing/logs/`date +%d-%m-%Y`"
LOG="/opt/Billing/users/`date +%d-%m-%Y`"
WEB="/opt/share/www/stat.html"
rm $LOG
rm $ULOG
iptables -nvxL FORWARD | grep 192.168 | grep 0.0.0.0/0 | awk '{
if (($2) != 0){print($2,$8,$9)}}'>> $DATE
iptables -Z
cat /opt/etc/users | awk '{if(($2) != ""){system("/opt/Billing/cnt "$2)}}'
sleep 5s
#end
LOG="/opt/Billing/logs/total"
ULOG="/opt/Billing/users/total"
rm $LOG
rm $ULOG
ls -l /opt/Billing/users/ | awk '{system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($6) != 0){print}}' >> $LOG
echo "Общий трафик: `cat $LOG | awk '
BEGIN{a=0;b=0}
{
if (index($3,\"d\") == 0) a=(a+$3)
}
END{if((a) != 0){printf(\"%.2f\",a)}else{print 0}}'` Mb/Вход. : `cat $LOG | awk '
BEGIN{a=0;b=0}
{
if (index($6,\"d\") == 0) b=(b+$6)
}
END{if((b) != 0){printf(\"%.2f\",b)}else{print 0}}'` Mb/Исход. " > $ULOG
#web
echo "<html><head><title>Cтатистика LISNA NET:</title></head><body><pre>" > $WEB
ls -l /opt/Billing/users/ | awk '{print("<b>",$9,"</b>");system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($6) != 0){print($1,$2,$3,
cat /opt/Billing/users/total >> $WEB
echo "</pre></body></html>" >> $WEB

скрипт cnt


#!/bin/sh
LOG="/opt/Billing/logs/`date +%d-%m-%Y`"
ULOG="/opt/Billing/users/`date +%d-%m-%Y`"
echo "$1 Вход: `cat $LOG | grep \"0.0.0.0/0 $1\" | awk '
BEGIN{a=0;x=0;b=0;y=0}
{
if (index($1,\"d\") == 0) a=(a+$1)
x=a/1024/1024
}
END{if((a) != 0){printf(\"%.2f\",x)}else{print 0}}'` Mb Исход: `cat $LOG | grep \"$1 0.0.0.0/0\" | awk '
BEGIN{a=0;b=0}
{
if (index($1,\"d\") == 0) b=(b+$1)
y=b/1024/1024
}
END{if((b) != 0){printf(\"%.2f\",y)}else{print 0}}'` Mb `sh /opt/Billing/all $1`" | awk '
BEGIN{a=0;b=" Total: ";c=" Mb";d=0;e=" All day "}
{
#if (index($3,"d") == 0) && (index($6,"d") == 0)
a=($3+$6)
d=($8+a)
}
END{print($1,$2,$3,$4,$5,$6,$7,b,a,c,e,d,c)}' >> $ULOG

lsd_wiz
17-06-2009, 16:00
#!/bin/sh
ULOG="/opt/Billing/total"
DATE="/opt/Billing/logs/`date +%d-%m-%Y`"
LOG="/opt/Billing/users/`date +%d-%m-%Y`"
WEB="/opt/share/www/stat.html"
rm $LOG
rm $ULOG
iptables -nvxL FORWARD | grep 192.168 | grep 0.0.0.0/0 | awk '{
if (($2) != 0){print($2,$8,$9)}}'>> $DATE
iptables -Z
cat /opt/etc/users | awk '{if(($2) != ""){system("/opt/Billing/cnt "$2)}}'
sleep 5s
#end
LOG="/opt/Billing/logs/total"
ULOG="/opt/Billing/users/total"
rm $LOG
rm $ULOG
ls -l /opt/Billing/users/ | awk '{system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($6) != 0){print}}' >> $LOG
echo "Общий трафик: `cat $LOG | awk '
BEGIN{a=0;b=0}
{
if (index($3,\"d\") == 0) a=(a+$3)
}
END{if((a) != 0){printf(\"%.2f\",a)}else{print 0}}'` Mb/Вход. : `cat $LOG | awk '
BEGIN{a=0;b=0}
{
if (index($6,\"d\") == 0) b=(b+$6)
}
END{if((b) != 0){printf(\"%.2f\",b)}else{print 0}}'` Mb/Исход. " > $ULOG
#web
echo "<html><head><title>Cтатистика LISNA NET:</title></head><body><pre>" > $WEB
ls -l /opt/Billing/users/ | awk '{print("<b>",$9,"</b>");system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($6) != 0){print($1,$2,$3, <-.... ?
cat /opt/Billing/users/total >> $WEB
echo "</pre></body></html>" >> $WEB

YSL
17-06-2009, 18:20
Не работает
И еще ошибка есть.

# ./run
BusyBox v1.13.4 (2009-04-26 20:56:17 MSD) multi-call binary

Usage: rm [OPTION]... FILE...

Remove (unlink) the FILE(s). Use '--' to
indicate that all following arguments are non-options.

Options:
-i Always prompt before removing
-f Never prompt
-r,-R Remove directories recursively

./run: line 6: can't create : nonexistent directory
Press any key to continue...


#!/bin/sh
ULOG="/opt/Billing/total"
DATE="/opt/Billing/logs/`date +%d-%m-%Y`"
LOG="/opt/Billing/users/`date +%d-%m-%Y`"
WEB="/opt/share/www/stat.html"
rm $LOG
rm $ULOG
iptables -nvxL FORWARD | grep 192.168 | grep 0.0.0.0/0 | awk '{
if (($2) != 0){print($2,$8,$9)}}'>> $DATE
iptables -Z
cat /opt/etc/users | awk '{if(($2) != ""){system("/opt/Billing/cnt "$2)}}'
sleep 5s
#end
LOG="/opt/Billing/logs/total"
ULOG="/opt/Billing/users/total"
rm $LOG
rm $ULOG
ls -l /opt/Billing/users/ | awk '{system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($6) != 0){print}}' >> $LOG
echo "Общий трафик: `cat $LOG | awk '
BEGIN{a=0;b=0}
{
if (index($3,\"d\") == 0) a=(a+$3)
}
END{if((a) != 0){printf(\"%.2f\",a)}else{print 0}}'` Mb/Вход. : `cat $LOG | awk '
BEGIN{a=0;b=0}
{
if (index($6,\"d\") == 0) b=(b+$6)
}
END{if((b) != 0){printf(\"%.2f\",b)}else{print 0}}'` Mb/Исход. " > $ULOG
#web
echo "<html><head><title>Cтатистика LISNA NET:</title></head><body><pre>" > $WEB
ls -l /opt/Billing/users/ | awk '{print("<b>",$9,"</b>");system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($6) != 0){print($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$1 3)}}' >> $WEB
cat /opt/Billing/users/total >> $WEB
echo "</pre></body></html>" >> $WEB

Break Action
17-06-2009, 18:46
Для устранения ошибки RM
надо заменить все строки
rm $XXXX на
rm -f $XXX
То есть файл будет удален, только если он существует.

YSL
17-06-2009, 22:43
Да спасибо ошибки уже нет но все равно не работает :confused:


#!/bin/sh
ULOG="/opt/Billing/total"
DATE="/opt/Billing/logs/`date +%d-%m-%Y`"
LOG="/opt/Billing/users/`date +%d-%m-%Y`"
WEB="/opt/share/www/stat.html"
rm -f $LOG
rm -f $ULOG
iptables -nvxL FORWARD | grep 192.168 | grep 0.0.0.0/0 | awk '{
if (($2) != 0){print($2,$8,$9)}}'>> $DATE
iptables -Z
cat /opt/etc/users | awk '{if(($2) != ""){system("/opt/Billing/cnt "$2)}}'
sleep 5s
#end
LOG="/opt/Billing/logs/total"
ULOG="/opt/Billing/users/total"
rm -f $LOG
rm -f $ULOG
ls -l /opt/Billing/users/ | awk '{system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($6) != 0){print}}' >> $LOG
echo "Общий трафик: `cat $LOG | awk '
BEGIN{a=0;b=0}
{
if (index($3,\"d\") == 0) a=(a+$3)
}
END{if((a) != 0){printf(\"%.2f\",a)}else{print 0}}'` Mb/Вход. : `cat $LOG | awk '
BEGIN{a=0;b=0}
{
if (index($6,\"d\") == 0) b=(b+$6)
}
END{if((b) != 0){printf(\"%.2f\",b)}else{print 0}}'` Mb/Исход. " > $ULOG
#web
echo "<html><head><title>Cтатистика LISNA NET:</title></head><body><pre>" > $WEB
ls -l /opt/Billing/users/ | awk '{print("<b>",$9,"</b>");system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($6) != 0){print($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$1 3)}}' >> $WEB
cat /opt/Billing/users/total >> $WEB
echo "</pre></body></html>" >> $WEB

16-06-2009
192.168.1.11 Вход: 1.15 Mb Исход: 5.07 Mb Total: 6.22 Mb All day 6.22
192.168.1.2 Вход: 226.07 Mb Исход: 52.98 Mb Total: 279.05 Mb All day 279.05
17-06-2009
192.168.1.11 Вход: 0.94 Mb Исход: 4.27 Mb Total: 5.21 Mb All day 5.21
192.168.1.2 Вход: 73.61 Mb Исход: 15.83 Mb Total: 89.44 Mb All day 89.44
total
Общий трафик: 3348.02 Mb/Вход. : 464.06 Mb/Исход.
Общий трафик: 3348.02 Mb/Вход. : 464.06 Mb/Исход.

И почему то у меня две строчки (Общий трафик)

lsd_wiz
18-06-2009, 05:25
блин ты что не видиш что у тебя повторяются значения и опереации в скрипте. Вот стабилно рабочие скрипты


#!/bin/sh
ULOG="/opt/Billing/total"
DATE="/opt/Billing/logs/`date +%d-%m-%Y`"
LOG="/opt/Billing/users/`date +%d-%m-%Y`"
WEB="/opt/share/www/stat.html"
rm $LOG
rm $ULOG
iptables -nvxL FORWARD | grep 192.168 | grep 0.0.0.0/0 | awk '{
if (($2) != 0){print($2,$8,$9)}}'>> $DATE
iptables -Z
cat /opt/etc/users | awk '{if(($2) != ""){system("/opt/Billing/cnt "$2)}}'
sleep 5s
ls -l /opt/Billing/users/ | awk '{system("cat /opt/Billing/users/"$9)}' | awk '
BEGIN{a=0;b=0,c=" "}
{
if(($3) != 0 && ($6) != 0)
{
if (index($2,"d") == 0){a=(a+$2)}
if (index($3,"d") == 0){b=(b+$3)}
}
}
END
{
if((a) != 0){printf("%.2f",a);printf(c)}else{print 0}
if((b) != 0){printf("%.2f",b);printf(c)}else{print 0}
}' >> $ULOG
echo "<html><head><title>Cтатистика LISNA NET:</title></head><body><pre>" > $WEB
ls -l /opt/Billing/users/ | awk '{print("<b>",$9,"</b>");system("cat /opt/Billing/users/"$9)}' | awk '{if(($3) != 0 && ($2) != 0){print($1,$2,$3,$4,$5)}}' >> $WEB
cat /opt/Billing/users/total >> $WEB
echo "</pre></body></html>" >> $WEB



#!/bin/sh
LOG="/opt/Billing/logs"
ULOG="/opt/Billing/users/"
cd $ULOG
cat `ls -1 $ULOG` | grep $1 | awk '
BEGIN {a=0}
{
if (($4) != 0){
a=a+$4
}}
END {print a}'



#!/bin/sh
LOG="/opt/Billing/logs/`date +%d-%m-%Y`"
ULOG="/opt/Billing/users/`date +%d-%m-%Y`"
DATE="`date +%d-%m-%Y`"
echo "$1 `cat $LOG | grep \"0.0.0.0/0 $1\" | awk '
BEGIN{a=0;x=0;b=0;x=0}
{
if (index($1,\"d\") == 0) a=(a+$1)
x=a/1024/1024
}
END{if((a) != 0){printf(\"%.2f\",x)}else{print 0}}'` `cat $LOG | grep \"$1 0.0.0.0/0\" | awk '
BEGIN{a=0;b=0;y=0}
{
if (index($1,\"d\") == 0) b=(b+$1)
y=b/1024/1024
}
END{if((b) != 0){printf(\"%.2f\",y)}else{print 0}}'` `sh /opt/Billing/all $1`" | awk '
BEGIN{a=0;b=0}
{
a=($2+$3)
b=($4+a)
}
END{print($1,$2,$3,a,b)}' >> $ULOG


зы форматирование в web я делаю отдельно вот вывод


[admin@Router Billing]$ cat users/17-06-2009
192.168.1.2 0 0 0 2949.77
192.168.1.3 17.97 3.78 21.75 15844.1

идёт $1=АйПи $2=Вход $3=Исход $4=Общ_за_День $5=Весь_за_Историю
ls -l /opt/Billing/users/ | awk '{print("<b>",$9,"</b>");system("cat /opt/Billing/users/"$9)}' | awk '{if(($2) != 0 && ($3) != 0){print($1,"in:",$2)}}' >> $WEB
Это для примера

Вот пример выводa в web с форматированием


echo "<html><body><table border=1>" > $WEB
echo "<tr><td><font color=blue>User_id</font></td><td><font color=green>Input:</font></td><td><font color=red>Output:</font></td><td><font color=blue>Total:</font></td><td><font color=blue>All day's:</font></td>" >> $WEB
ls -1 /opt/Billing/users/ | awk '{print("<tr><td>"$1"</td></tr>");system("cat /opt/Billing/users/"$1)}' | awk '{
print(\
"<tr><td><font color=blue>",$1,"</font></td><td><font color=green>",$2,"</font></td><td><font color=red>",$3,"</font></td><td><font color=blue>",$4,"</font></td><td><font color=blue>",$5,"</font></td></tr>")}' >> $WEB
echo "<tr><td><font color=blue>All total:</font></td>`cat /opt/Billing/total | awk '{print(\"<td><font color=green>\",$1,\"</font></td><td><font color=red>\",$2,\"</font></td>\")}'`</tr>" >> $WEB
echo "</table></body></html>" >> $WEB

YSL
18-06-2009, 22:10
Все там есть. Вот ваш случай:
<?php
exec("/opt/etc/cron.5mins/run",$data);
for ($i=0; $i< count($data);$i++) :
print "$data[$i]<br>";
?>
в переменной $data результат работы программы.
Или вам еще и оформление выдать?:)

Да если можно,чтобы появилась кнопка, (Обновить)


блин ты что не видиш что у тебя повторяются значения и опереации в скрипте. Вот стабилно рабочие скрипты


#!/bin/sh
ULOG="/opt/Billing/total"
DATE="/opt/Billing/logs/`date +%d-%m-%Y`"
LOG="/opt/Billing/users/`date +%d-%m-%Y`"
WEB="/opt/share/www/stat.html"
rm $LOG
rm $ULOG
iptables -nvxL FORWARD | grep 192.168 | grep 0.0.0.0/0 | awk '{
if (($2) != 0){print($2,$8,$9)}}'>> $DATE
iptables -Z
cat /opt/etc/users | awk '{if(($2) != ""){system("/opt/Billing/cnt "$2)}}'
sleep 5s
ls -l /opt/Billing/users/ | awk '{system("cat /opt/Billing/users/"$9)}' | awk '
BEGIN{a=0;b=0,c=" "}
{
if(($3) != 0 && ($6) != 0)
{
if (index($2,"d") == 0){a=(a+$2)}
if (index($3,"d") == 0){b=(b+$3)}
}
}
END
{
if((a) != 0){printf("%.2f",a);printf(c)}else{print 0}
if((b) != 0){printf("%.2f",b);printf(c)}else{print 0}
}' >> $ULOG
echo "<html><body><table border=1>" > $WEB
echo "<tr><td><font color=blue>User_id</font></td><td><font color=green>Input:</font></td><td><font color=red>Output:</font></td><td><font color=blue>Total:</font></td><td><font color=blue>All day's:</font></td>" >> $WEB
ls -1 /opt/Billing/users/ | awk '{print("<tr><td>"$1"</td></tr>");system("cat /opt/Billing/users/"$1)}' | awk '{
print(\
"<tr><td><font color=blue>",$1,"</font></td><td><font color=green>",$2,"</font></td><td><font color=red>",$3,"</font></td><td><font color=blue>",$4,"</font></td><td><font color=blue>",$5,"</font></td></tr>")}' >> $WEB
echo "<tr><td><font color=blue>All total:</font></td>`cat /opt/Billing/total | awk '{print(\"<td><font color=green>\",$1,\"</font></td><td><font color=red>\",$2,\"</font></td>\")}'`</tr>" >> $WEB
echo "</table></body></html>" >> $WEB



#!/bin/sh
LOG="/opt/Billing/logs"
ULOG="/opt/Billing/users/"
cd $ULOG
cat `ls -1 $ULOG` | grep $1 | awk '
BEGIN {a=0}
{
if (($4) != 0){
a=a+$4
}}
END {print a}'



#!/bin/sh
LOG="/opt/Billing/logs/`date +%d-%m-%Y`"
ULOG="/opt/Billing/users/`date +%d-%m-%Y`"
DATE="`date +%d-%m-%Y`"
echo "$1 `cat $LOG | grep \"0.0.0.0/0 $1\" | awk '
BEGIN{a=0;x=0;b=0;x=0}
{
if (index($1,\"d\") == 0) a=(a+$1)
x=a/1024/1024
}
END{if((a) != 0){printf(\"%.2f\",x)}else{print 0}}'` `cat $LOG | grep \"$1 0.0.0.0/0\" | awk '
BEGIN{a=0;b=0;y=0}
{
if (index($1,\"d\") == 0) b=(b+$1)
y=b/1024/1024
}
END{if((b) != 0){printf(\"%.2f\",y)}else{print 0}}'` `sh /opt/Billing/all $1`" | awk '
BEGIN{a=0;b=0}
{
a=($2+$3)
b=($4+a)
}
END{print($1,$2,$3,a,b)}' >> $ULOG


не работает вот это
пример

18-06-2009
192.168.1.11 0.90 4.19 5.09 5.09
192.168.1.2 203.00 59.73 262.73 262.73
19-06-2009
192.168.1.11 0.03 0.19 0.22 0.22
192.168.1.2 6.83 3.72 10.55 10.55
total
Общий трафик: 0 Mb/Вход. : 0 Mb/Исход.

Ты можешь у себя проверить скрипты может у меня что то не то, хотя делаю как ты писал!!!
А в web с форматированием прикольно получилась табличка.

Vollsky
19-06-2009, 06:20
Да если можно,чтобы появилась кнопка, (Обновить)Для этого достаточно ознакомиться с работой "форм". Поиск! Вот как пример: http://webdesign.site3k.net/?/conjuncture/append/d/forms.html

lsd_wiz
19-06-2009, 13:08
скрипты работают.

просто распакуй в корень

YSL
19-06-2009, 23:06
Не работает

Для меня это сложно если можно напишите код который можно вставить в html скрипт с кнопкой (Обновить) и чтобы она запускала скрипт статистики.
Спасибо.

Ураааааа вот этот работает. СПАСИБО ТЕБЕ lsd_wiz !!!:)
В итоге очень даже красиво получилось
http://i.piccy.info/i3/84/57/99b5c1709bb7650d17017ce54709.jpeg (http://piccy.info/)

Еще вопрос теперь как в место IP, имя юзера сделать?
Пример: Вася (192.168.1.1)

lsd_wiz
20-06-2009, 08:34
Еще вопрос теперь как в место IP, имя юзера сделать?
Пример: Вася (192.168.1.1)


ls -1 /opt/Billing/users/ | awk '{print("<tr><td>"$1"</td></tr>");system("cat /opt/Billing/users/"$1)}' | awk '{
if(($1) == "192.168.1.1"){$1="Вася"}
print(\
"<tr><td><font color=blue>",$1,"</font></td><td><font color=green>",$2,"</font></td><td><font color=red>",$3,"</font></td><td><font color=blue>",$4,"</font></td><td><font color=blue>",$5,"</font></td></tr>")}' >> $WEB

Или переписать скрипты и имя фигачить сразу в /opt/etc/users


00:12:2c:34:12:34 192.168.1.1 Вася

и имя брать прямо оттуда.

YSL
20-06-2009, 18:03
По просьбам пишу полное описание настройки скрипта статистики.

Для работи скрипта нужно сконфигурировать lighttpd (http://wl500g.info/showpost.php?p=53152&postcount=1) и cron (http://wl500g.info/showpost.php?p=128993&postcount=5).
Не забываем при настройке lighttpd в файл lighttpd.conf добавить строчку

index-file.names = ( "index.php", "index.html")
server.event-handler = "poll" # needed on OS X
mimetype.assign
Настраиваем подсчет трафика:
Для удобства настройки и работы еще можно настроить mc (http://wl500g.info/showpost.php?p=128993&postcount=5).
1.Создаем директории


mkdir /opt/Billing
mkdir /opt/Billing/logs
mkdir /opt/Billing/users
touch /opt/Billing/all
touch /opt/Billing/cnt
touch /opt/etc/cron.5mins/end
chmod +x /opt/Billing/cnt
chmod +x /opt/Billing/all
chmod +x /opt/etc/cron.5mins/end


2.Создаем таблицу юзеров какую нам нада (пример)
nano /opt/etc/users

00:00:11:11:11:00 192.168.1.11
00:00:1a:1a:1a:00 192.168.1.15
00:00:1c:1c:1a:00 192.168.1.2
где (00:00:11:11:11:00) mac адрес сетевой и (192.168.1.1) ip юзера или своей сетевой.
Ctrl O
Enter
Ctrl X



2.Сам скрипт счетчика
nano /opt/Billing/cnt

#!/bin/sh
LOG="/opt/Billing/logs/`date +%d-%m-%Y`"
ULOG="/opt/Billing/users/`date +%d-%m-%Y`"
DATE="`date +%d-%m-%Y`"
echo "$1 `cat $LOG | grep \"0.0.0.0/0 $1\" | awk '
BEGIN{a=0;x=0;b=0;x=0}
{
if (index($1,\"d\") == 0) a=(a+$1)
x=a/1024/1024
}
END{if((a) != 0){printf(\"%.2f\",x)}else{print 0}}'` `cat $LOG | grep \"$1 0.0.0.0/0\" | awk '
BEGIN{a=0;b=0;y=0}
{
if (index($1,\"d\") == 0) b=(b+$1)
y=b/1024/1024
}
END{if((b) != 0){printf(\"%.2f\",y)}else{print 0}}'` `sh /opt/Billing/all $1`" | awk '
BEGIN{a=0;b=0}
{
a=($2+$3)
b=($4+a)
}
END{print($1,$2,$3,a,b)}' >> $ULOG
Ctrl O
Enter
Ctrl X

3. Создаем еще скрипт
nano /opt/Billing/all

#!/bin/sh
ULOG="/opt/Billing/users/"
cd $ULOG
cat * | grep $1 | awk '
BEGIN {a=0}
{if (($4) != 0){a=a+$4}}
END {print a}'
Ctrl O
Enter
Ctrl X

4.И еще один
nano /opt/etc/cron.5mins/end

#!/bin/sh
ULOG="/opt/Billing/total"
DATE="/opt/Billing/logs/`date +%d-%m-%Y`"
LOG="/opt/Billing/users/`date +%d-%m-%Y`"
WEB="/opt/share/www/user.html"
rm $LOG
rm $ULOG
iptables -nvxL FORWARD | grep 192.168 | grep 0.0.0.0/0 | awk '{
if (($2) != 0){print($2,$8,$9)}}'>> $DATE
iptables -Z
cat /opt/etc/users | awk '{if(($2) != ""){system("/opt/Billing/cnt "$2)}}'
sleep 5s
ls -l /opt/Billing/users/ | awk '{system("cat /opt/Billing/users/"$9)}' | awk '
BEGIN{a=0;b=0,c=" "}
{
if(($3) != 0 && ($2) != 0)
{
if (index($2,"d") == 0){a=(a+$2)}
if (index($3,"d") == 0){b=(b+$3)}
}
}
END
{
if((a) != 0){printf("%.2f",a);printf(c)}else{print 0}
if((b) != 0){printf("%.2f",b)}else{print 0}
}' >> $ULOG
echo "<html><link rel=stylesheet type=text/css href=vnstat_blue.css><body>" >> $WEB
echo "<body><table border=1>" > $WEB
echo "<tr><td><font color=blue>User_id</font></td><td><font color=green>Input:</font></td><td><font color=red>Output:</font></td><td><font color=blue>Total:</font></td><td><font color=blue>All day's:</font></td>" >> $WEB
ls -1 /opt/Billing/users/ | awk '{print("<tr><td>"$1"</td></tr>");system("cat /opt/Billing/users/"$1)}' | awk '{
print(\
"<tr><td><font color=blue>",$1,"</font></td><td><font color=green>",$2,"</font></td><td><font color=red>",$3,"</font></td><td><font color=blue>",$4,"</font></td><td><font color=blue>",$5,"</font></td></tr>")}' >> $WEB
echo "<tr><td><font color=blue>All total:</font></td>`cat /opt/Billing/total | awk '{print(\"<td><font color=green>\",$1,\"</font></td><td><font color=red>\",$2,\"</font></td>\")}'`</tr>" >> $WEB
echo "</table></body></html>" >> $WEB

Ctrl O
Enter
Ctrl X

5.Добавляем правило+счётчик для каждого юзера
добавить в nano /usr/local/sbin/post-firewall

#!/bin/sh
iptables -F FORWARD
CFG="/opt/.cfg"
echo "#!/bin/sh" > $CFG
USR="/opt/etc/users"
cat $USR | awk '{print("iptables -A FORWARD -s",$2,"-j ACCEPT")}' >> $CFG
cat $USR | awk '{print("iptables -A FORWARD -d",$2,"-j ACCEPT")}' >> $CFG
sh $CFG
Ctrl O
Enter
Ctrl X


chmod +x /usr/local/sbin/post-firewall

7.В конце для сохранения

flashfs save && flashfs commit && flashfs enable && reboot

Проверяем работу iptables

iptables -nvxL FORWARD

Должно быть так

# iptables -nvxL FORWARD
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
469 111714 ACCEPT all -- * * 192.168.1.2 0.0.0.0/0
450 34108 ACCEPT all -- * * 192.168.1.11 0.0.0.0/0
528 424124 ACCEPT all -- * * 0.0.0.0/0 192.168.1.2
115 8178 ACCEPT all -- * * 0.0.0.0/0 192.168.1.11

Если по другому (или все 0 в таблице) то iptables не правильно работает проверяем
nano /usr/local/sbin/post-firewall


#!/bin/sh
iptables -F FORWARD
CFG="/opt/.cfg"
echo "#!/bin/sh" > $CFG
USR="/opt/etc/users"
cat $USR | awk '{print("iptables -A FORWARD -s",$2,"-j ACCEPT")}' >> $CFG
cat $USR | awk '{print("iptables -A FORWARD -d",$2,"-j ACCEPT")}' >> $CFG
sh $CFG

И не забываем что нужно вставлять код так как есть, без лишних пробелов и остальных символов, копировать (Ctrl+C), так как работать не будет.


После перегрузки роутера заходим на http://192.168.1.1:8081/user.html(не забываем что порт 8081 может быть разным смотря как вы настроили его в /opt/etc/lighttpd/lighttpd.conf)

server.port = 8081
И имеем приблизительно через некоторое время такую картинку
Обновление происходит каждые 5 минут из /opt/etc/cron.5mins/end автоматически.
http://i.piccy.info/i3/84/57/99b5c1709bb7650d17017ce54709.jpeg

Еще можно в место IP сделать имена юзеров.
В скрипте /opt/etc/cron.5mins/end меняем на:

ls -1 /opt/Billing/users/ | awk '{print("<tr><td>"$1"</td></tr>");system("cat /opt/Billing/users/"$1)}' | awk '{
if(($1) == "192.168.1.11"){$1="Вася"}
if(($1) == "192.168.1.15"){$1="Петя"}
if(($1) == "192.168.1.2"){$1="Маша"}
print(\
"<tr><td><font color=blue>",$1,"</font></td><td><font color=green>",$2,"</font></td><td><font color=red>",$3,"</font></td><td><font color=blue>",$4,"</font></td><td><font color=blue>",$5,"</font></td></tr>")}' >> $WEB

Вроде все.

Еще можно установить vnStat + vnStat PHP frontend (http://wl500g.info/showpost.php?p=128995&postcount=7).

http://i.piccy.info/i4/e3/09/960f3c02c713c427c1c17d518f40.jpeg

У меня после такой установки vnstat не заработал (все нули).
Причина оказалась в стандартных для vnstat настройках cron.
При установке ipkg install vnstat в директорию /opt/etc/cron.d/ пишется файл vnstat с ежепятиминутной командой /opt/bin/vnstat -u
При ее выполнении vnstat находит директорию /opt/var/lib/vnstat/dumps, почему-то думает, что это его база, не может ее прочитать и стопорится.
Поэтому файл /opt/etc/cron.d/vnstat я удалил, а /opt/etc/cron.5mins/vnstat.sh сделал следующим:


rm /opt/etc/cron.d/vnstat

touch /opt/etc/cron.5mins/vnstat.sh

chmod +x /opt/etc/cron.5mins/vnstat.sh

Открываем
nano /opt/etc/cron.5mins/vnstat.sh

#!/bin/sh

dump_dir="/opt/var/lib/vnstat/dumps"

vnstat -u -i ppp0
vnstat -u -i vlan1
vnstat -u -i eth1

vnstat --dumpdb -i ppp0 > $dump_dir/vnstat_dump_ppp0
vnstat --dumpdb -i vlan1 > $dump_dir/vnstat_dump_vlan1
vnstat --dumpdb -i eth1 > $dump_dir/vnstat_dump_eth1
Ctrl O
Enter
Ctrl X

flashfs save && flashfs commit && flashfs enable && reboot

После перезагрузки ждем 5 мин и наблюдаем статистику.
Все.:cool:

YSL
22-06-2009, 17:42
После обновления прошивки не работает скрипт статистики, показывает все нули.


[admin@(none) root]$ iptables -nvxL FORWARD
Chain FORWARD (policy ACCEPT 475 packets, 163305 bytes)
pkts bytes target prot opt in out source destination
[admin@(none) root]$

Помогите, по моему что то с iptables.
В чем может быть причина?

Что нет спецов.
ПОМОГИТЕ.

Vollsky
23-06-2009, 09:07
Что нет спецов.
ПОМОГИТЕ.Давайте исходный текст вашей Web странички, внешний вид с указанием где должна быть эта кнопка и тогда я вам ее "прикручу".

ssyyzz
23-06-2009, 09:20
<?php
exec("/opt/etc/cron.5mins/run",$data);
for ($i=0; $i< count($data);$i++) :
print "$data[$i]<br>";
?>
<br>
<A HREF="***адрес страницы в окне браузера, без звездочек и в двойных кавычках типа http://192.168.1.1/blablabla.php***">Обновить</A>

Nebulosa
23-06-2009, 11:26
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Statistic</title>
</head>
<body>
<form action="" method="POST"><input type="submit" value="Refresh" name="button"></form>
<?php
if ( $_POST["button"]=="Refresh" )
{
exec("/opt/etc/cron.5mins/run",$data);
for ($i=0; $i< count($data);$i++) :
print "$data[$i]<br>";
}
?>
</body>

lsd_wiz
23-06-2009, 15:54
у тебя не запускается post-firewall
Проделай настройку с заново.

YSL
23-06-2009, 22:21
Спасибо, да действительно не правильно вставил в post-farewall, нужно внимательно вставлять скопированые скрипты, тогда все работать будет.:)

А как вот это прикрутить к скрипту !!!???


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Statistic</title>
</head>
<body>
<form action="" method="POST"><input type="submit" value="Refresh" name="button"></form>
<?php
if ( $_POST["button"]=="Refresh" )
{
exec("/opt/etc/cron.5mins/end",$data);
for ($i=0; $i< count($data);$i++) :
print "$data[$i]<br>";
}
?>
</body>

И получится кнопочка "Refresh" которая запустит скрипт при нажатии, и обновит данные.
Отдельно проверил что то он не запускает скрипт.(

Не запускает он скрипт!!!

Вот из скрипта который формирует WEB страничку

echo "<body><p><strong>Статистика трафика.</strong></p>
<p><strong>/ Статистика / Сообщения / Счет / Обновить /</strong></p>
<table border=1>" > $WEB
echo "<tr>
<td width="120"><div align="center"><strong><font color="blue">IP Юзера</font></strong></div></td>
<td width="72"><div align="center"><strong><font color=green>Входящий:</font></strong></div></td>
<td width="80"><div align="center"><strong><font color=red>Исходящий:</font></strong></div></td>
<td width="73"><div align="center"><strong><font color=blue>За день:</font></strong></div></td>
<td width="83"><div align="center"><strong><font color=red>За все дни:</font></strong></div></td>
" >> $WEB
ls -1 /opt/Billing/users/ | awk '{print("<tr><td>"$1"</td></tr>");system("cat /opt/Billing/users/"$1)}' | awk '{
if(($1) == "192.168.1.2"){$1="Комп-1"}
if(($1) == "192.168.1.11"){$1="DreamBox"}
if(($1) == "192.168.1.15"){$1="Notebook"}
print(\
"<tr><td><font color=blue>",$1,"</font></td><td><font color=green>",$2,"</font></td><td><font color=red>",$3,"</font></td><td><font color=blue>",$4,"</font></td><td><font color=red><strong>",$5,"</strong></font></td></tr>")}' >> $WEB
echo "<tr>
<td><strong><font color=blue>Общий трафик:</font></strong></td>
`cat /opt/Billing/total | awk '{print(\"<td><strong><font color=green>\",$1,\"</font></strong></td><td><strong><font color=red>\",$2,\"</font></strong></td>\")}'`</tr>" >> $WEB
echo "</table>
</body></html>" >> $WEB

Как правильно его вписать сюда.
Вверху просто слово ссылка (Обновить) вот на него нужно нажать и скрипт должен запускаться.

Vollsky
24-06-2009, 10:38
Не запускает он скрипт!!!

Вот из скрипта который формирует WEB страничку

Как правильно его вписать сюда.
Вверху просто слово ссылка (Обновить) вот на него нужно нажать и скрипт должен запускаться.
Вместо первых двух строк поставте это:

echo "<body><h3 align=center><hr width=480 noShade SIZE=8>Статистика трафика.</h3>
<center><b>/ Статистика / Сообщения / Счет </b>
<form action="" method=post>
<input type="submit" value="Обновить" name="button"></form>
<?php
if ( $_POST['button'] == "Обновить" ){exec("/opt/etc/cron.5mins/run");}
?>
и будет вам счастье.
PS
про chmod не забудьте - права на исполнение файла "run"

YSL
24-06-2009, 10:57
После нажатия кнопки обновить выдает:
404 - Not Found

скрипт /opt/etc/cron.5mins/end находится на роутере dir-320(asus) а запускаю web страничку с компа windows.

Less
24-06-2009, 11:53
Подложыте эти файлы на роутер.
Преименуйте run2.txt в run2, up_but.txt в up_but.php.

up_but.php должен быть в /opt/Billing/
run2 должен быть в /opt/etc/crone.5mins/

Для просмотра статистики используйте адрес http://my.router/user.php

Vollsky
24-06-2009, 14:13
После нажатия кнопки обновить выдает:
404 - Not Found

скрипт /opt/etc/cron.5mins/end находится на роутере dir-320(asus) а запускаю web страничку с компа windows.
Прошу прощения - забыл экранировать спецсимволы.
echo "<body><h3 align=center><hr width=480 noShade SIZE=8>Статистика трафика.</h3>
<center><b>/ Статистика / Сообщения / Счет </b>
<form action=\"\" method=post>
<input type=\"submit\" value=\"Обновить\" name=\"button\"></form>
<?php
if ( \$_POST['button'] == \"Обновить\" ){exec(\"/opt/etc/cron.5mins/run\");}
?>

lsd_wiz
24-06-2009, 16:12
echo "<html>" > $WEB
echo "<body><table border=1>" >> $WEB
echo "<form action=\"\" method=\"POST\"><input type=\"submit\" value=\"Refresh\" name=\"button\"></form><?phpif ( $_POST[\"button\"]==\"Refresh\" ){exec(\"/opt/etc/cron.5mins/end\",$data);for ($i=0; $i< count($data);$i++):print \"$data[$i]<br>\";}?>" >> $WEB
echo "<tr><td><font color=blue>User_id</font></td><td><font color=green>Input:</font></td><td><font color=red>Output:</font></td><td><font color=blue>Total:</font></td><td><font color=blue>All day's:</font></td>" >> $WEB
ls -1 /opt/Billing/users/ | awk '{print("<tr><td>"$1"</td></tr>");system("cat /opt/Billing/users/"$1)}' | awk '{
print(\
"<tr><td><font color=blue>",$1,"</font></td><td><font color=green>",$2,"</font></td><td><font color=red>",$3,"</font></td><td><font color=blue>",$4,"</font></td><td><font color=blue>",$5,"</font></td></tr>")}' >> $WEB
echo "<tr><td><font color=blue>All total:</font></td>`cat /opt/Billing/total | awk '{print(\"<td><font color=green>\",$1,\"</font></td><td><font color=red>\",$2,\"</font></td>\")}'`</tr>" >> $WEB
echo "</table></body></html>" >> $WEB

PS. чтоб скрипт работал, необходимо установить пакет php-fcgi и
$WEB должен иметь расширение .php и иметь права на исполнеение.
WEB="/opt/share/www/index.php"
chmod a+rx /opt/share/www/index.php

YSL
25-06-2009, 03:23
Не работает.
После запуска скрипта на роутере через пути проходит 7-8 сек запуска и инфа обновляется в web а после нажатия на кнопку обновление через 5 мин, ну cron естественно и запускает скрипты а не кнопка.

Только Less чтото у меня с кодировкой не пойму как поправить после нажатия.

��������� 25-June-2009 01:30:50

Less
25-06-2009, 09:12
То что у Вас ромбиками "Обновлено" замените руками.
echo 'Обновлено '. date("d-F-Y H:i:s") .'<br>';

Бросьте мне в архиве папку Billing, я на роутере перетру, что бы скрипты отрабатывались правильно.

YSL
25-06-2009, 19:13
ОК спасибо.

Еще остался один вопрос, как организовать ограничение трафика для IP.

Я в этом не разбираюсь вот если кто напишет простой скрипт ограничения количества трафика было бы неплохо :)

Тоже интересует как можно ограничить количество трафика IP адресу. Кто напишет небольшой скрипт?

lsd_wiz
29-06-2009, 16:05
читай ман по iptables, или ищи готовые скрипты.

Less
01-07-2009, 08:20
Этот как Вы "выразились" небольшой скрипт должен выполнять функцию биллинговой системы.

lsd_wiz
04-07-2009, 09:34
если в браузере набрать примероно вот это

http://www.opennet.ru/docs/RUS/iptables/
потом нажать ctrl+f, ввести примерно вот это limit
то можно увидеть
8.8. Limit-match.txt
Сценарий limit-match.txt написан с целью продемонстрировать работу с критерием limit. Запустите этот скрипт и попробуйте отправлять на этот хост ping-пакеты с различными интервалами.

ЗЫ. Весь рессурс на русском, и если что то почитать, то можно освоить азы iptables.
А если у гугла спросить примерно такое:
и потом ненада гоорить что поиск ничего не даёт! :cool:

YSL
04-07-2009, 18:35
А не проще сам скрипт кинуть, чем учить, вопросы задаются от нехватки времени, да и непонятно много чего, и люди ждут четкий ответ, лично мне это не помогло, как организовать для каждого IP адреса например 2000 мб лимита в месяц, и скорость прием/передачи (которую можно менять)урезана у всех до 30 Кб/сек :)
Спасибо.

Break Action
05-07-2009, 22:08
Так он уже у вас есть, вам надо только определить границу, разрешенного объема траффика и после добавлять правило iptables для запрета выхода в нет, конкретному IP/MAC.

YSL
06-07-2009, 11:39
Как добавить правило, и в какой скрипт?
Теоретически я понимаю что в скрипт можно добавить правило лимит например 2000мб для 192.168.1.12, но как, не знаю.
Выкладываю еще раз скрипты...

Скрипт end

#!/bin/sh
ULOG="/opt/Billing/total"
DATE="/opt/Billing/logs/`date +%d-%m-%Y`"
LOG="/opt/Billing/users/`date +%d-%m-%Y`"
WEB="/opt/share/www/user.html"
rm $LOG
rm $ULOG
iptables -nvxL FORWARD | grep 192.168 | grep 0.0.0.0/0 | awk '{
if (($2) != 0){print($2,$8,$9)}}'>> $DATE
iptables -Z
cat /opt/etc/users | awk '{if(($2) != ""){system("/opt/Billing/cnt "$2)}}'
sleep 5s
ls -l /opt/Billing/users/ | awk '{system("cat /opt/Billing/users/"$9)}' | awk '
BEGIN{a=0;b=0,c=" "}
{
if(($3) != 0 && ($2) != 0)
{
if (index($2,"d") == 0){a=(a+$2)}
if (index($3,"d") == 0){b=(b+$3)}
}
}
END
{
if((a) != 0){printf("%.2f",a);printf(c)}else{print 0}
if((b) != 0){printf("%.2f",b)}else{print 0}
}' >> $ULOG
echo "<html><link rel=stylesheet type=text/css href=vnstat_blue.css><body>" >> $WEB
echo "<body><table border=1>" > $WEB
echo "<tr><td><font color=blue>User_id</font></td><td><font color=green>Input:</font></td><td><font color=red>Output:</font></td><td><font color=blue>Total:</font></td><td><font color=blue>All day's:</font></td>" >> $WEB
ls -1 /opt/Billing/users/ | awk '{print("<tr><td>"$1"</td></tr>");system("cat /opt/Billing/users/"$1)}' | awk '{
print(\
"<tr><td><font color=blue>",$1,"</font></td><td><font color=green>",$2,"</font></td><td><font color=red>",$3,"</font></td><td><font color=blue>",$4,"</font></td><td><font color=blue>",$5,"</font></td></tr>")}' >> $WEB
echo "<tr><td><font color=blue>All total:</font></td>`cat /opt/Billing/total | awk '{print(\"<td><font color=green>\",$1,\"</font></td><td><font color=red>\",$2,\"</font></td>\")}'`</tr>" >> $WEB
echo "</table></body></html>" >> $WEB

Скрипт cnt

#!/bin/sh
LOG="/opt/Billing/logs/`date +%d-%m-%Y`"
ULOG="/opt/Billing/users/`date +%d-%m-%Y`"
DATE="`date +%d-%m-%Y`"
echo "$1 `cat $LOG | grep \"0.0.0.0/0 $1\" | awk '
BEGIN{a=0;x=0;b=0;x=0}
{
if (index($1,\"d\") == 0) a=(a+$1)
x=a/1024/1024
}
END{if((a) != 0){printf(\"%.2f\",x)}else{print 0}}'` `cat $LOG | grep \"$1 0.0.0.0/0\" | awk '
BEGIN{a=0;b=0;y=0}
{
if (index($1,\"d\") == 0) b=(b+$1)
y=b/1024/1024
}
END{if((b) != 0){printf(\"%.2f\",y)}else{print 0}}'` `sh /opt/Billing/all $1`" | awk '
BEGIN{a=0;b=0}
{
a=($2+$3)
b=($4+a)
}
END{print($1,$2,$3,a,b)}' >> $ULOG


Может такой вариант подойдет например лимит для 192.168.1.12 в 2Gb?
Но IP будет не один а несколько.


host=192.168.1.12
iptables -F $host
iptables -A $host -c 0 0 -m quota --quota 2048000 -j int_lans_in
iptables -A $host -j DROP
ПОМОГИТЕ как его в скрипт правильно вписать.

Ну и знаю что с помощью iptables еще можно задавать скорость трафика для определенного IP например в 30 Кб/сек, как это правило тоже в скрипт прописать.

Ограничение на IP/подсеть:



#!/bin/sh
lan=eth0
tc=`which tc`
$tc qdisc del dev $lan root
$tc qdisc add dev $lan root handle 1: htb default 3
$tc class add dev $lan parent 1: classid 1:1 htb rate 2048kbit
$tc class add dev $lan parent 1:1 classid 1:2 htb rate 2024kbit ceil 2048kbit prio 1
$tc class add dev $lan parent 1:1 classid 1:3 htb rate 24kbit ceil 2048kbit prio 2
$tc filter add dev $lan protocol ip parent 1: u32 match ip dst 192.168.0.0/24 flowid 1:2

Хотя Bandwidth Management в web интерфейсе неплохо с этой задачей справляется.
Осталось только ограничение количества трафика.

lsd_wiz
08-07-2009, 18:59
в ipgk есть такой пакет trickle.

trickle - это маленькая утилита предназначенная для ограничивания скорости полосы пропускания в программах. Она пригодится нам, когда появится необходимость в ограничении максимальной скорости download/upload в какой-либо из программ использующих интернет/интранет, дабы не забивать весь канал.
Подробно тут:

http://surrender-zen-way.blogspot.com/2008/11/htb-shaper.html
http://linux.xlibs.net/2008/03/21/trickle-traffic-limiter/
так называемый shaper, специальная сафтина для работы по ограничению и лимитированию трафика.
ЗЫ. Народ, ненада лениться, в ipkg-opt list есть все ответы! Если грамотно задать вопрос, то поисковик найдёт ответ! (C) Google 2009

YSL
08-07-2009, 22:33
А для какого IP это правило?
И где для разных IP прописать лимит?

Может такой вариант подойдет например лимит для 192.168.1.12 в 2Gb?
Но IP будет не один а несколько.

host=192.168.1.12
iptables -F $host
iptables -A $host -c 0 0 -m quota --quota 2048000 -j int_lans_in
iptables -A $host -j DROP

если правильно то как его вставить в существующий скрипт чтоб работало.

ceramic
12-07-2009, 19:59
если правильно то как его вставить в существующий скрипт чтоб работало.

Не правильно. iptables "помнит" только данные текущего сеанса.
Проверку на лимит надо делать в основном теле скрипта.

if трафик > лимит
iptables -I FORWARD [-s IP] [-m mac --mac-source MAC] -j REJECT
fi

iptables, по результатам проверки, только для блокировки IP/MAC.

satellite1977
13-07-2009, 21:23
Здравствуйте уважаемые форумчане.
Есть три компьютера с определенными IP адресами. С помощью Bandwidth Management (последняя Олеговская прошивка) каждому IP выделено по 256 kbit/s. Ограничение работает отлично, но... До 256 kbit/s ограничивается ВСЕ - внешка ,и локальная сеть, и FTP Server роутера и т.д.
Прошу помощи в в следующих вопросах:
1. Можно ли средствами визуальной оболочки (меню) роутера увеличить до макс. скорости скорость локальной сети и FTP. (Я не нашел таких возможностей)?
2. Если 1-ый пункт невозможен, то можно ли не отключая Bandwidth Manager изменить параметры в определенных конфиг. файлах роутера (в каких?) чтобы снять ограничения локалки и FTP?

За несколько дней поиска по форуму я так и не нашел рассмотрения подобной темы, поэтому и пишу все это. Заранее спасибо за ответы.

satellite1977
15-07-2009, 17:01
Вот что сам смог нарыть опытным путем.
При включении опции Bandwidth Manager создаются правила и классы на eth0 и eth1, а именно:
1. Дисциплина qdisc htb 1:
2. Верхний класс class htb 1:1 root rate 800Mbit ceil 800Mbit
3. Классы-наследники класса 1:1, их ровно столько, сколько правил вы создали в Bandwidth Manager. Нумеруются эти классы начиная с 1:10 и т.д. Их параметры совпадают с параметрами Bandwidth Manager. Т.е. если в Bandwidth Manager есть правило - для IP 192.168.1.10 задать скорость 256кбит/с, то класс будет примерно таким - class htb 1:10 parent 1:1 prio 0 rate 256Kbit ceil 256Kbit.
Вроде бы так.

alex2010
16-07-2009, 00:20
Сильно не пинайте.
Есть такая задача:
Стоит асус с прошивкой от Олега.
инет заведён через ppp0.
торренты стоят на самом роутере и на локальных компах.
нужно веб-трафик слелать самым приорететным, как проще всего это сделать?

YSL
25-07-2009, 13:50
Так правильно?
И что подставить под слово (трафик) у меня инет через ppp0.


if трафик > 2048000
iptables -I FORWARD [-s 192.168.1.12] [-m mac --mac-source 00:87:F7:88:87:65] -j REJECT
fi

oleg71
08-08-2009, 20:46
Решил попробывать и
вот что получилось?
Что ж это я не доглядел, подскажите?

rromcic
16-08-2009, 09:22
[admin@(none) root]$ mkdir /opt/Billing
mkdir: cannot create directory '/opt/Billing': Read-only file system

Как перебороть?

LnrMn
16-08-2009, 09:26
[admin@(none) root]$ mkdir /opt/Billing
mkdir: cannot create directory '/opt/Billing': Read-only file system

Как перебороть?

Флешка подключена?

rromcic
16-08-2009, 09:31
Флешка подключена?

Sorry забыл, видно воскрессное утро не для этого :)

metronom
17-08-2009, 11:30
Добрый всем день, тупой вопрос но тем не менее, Скажите пожалуйста а тот вариант готового скрипта который здесь http://www.wl500g.info/showpost.php?p=149929&postcount=63 он подойдет для asus wl-500gv2?

Просто имею сей аппарат. 10 прошивка, настроил по DURAK EDITION, также вставил готовые скрипты которые по ссылке выше,
и при вводе 192.168.1.1:8082/users.html ни че не показывает (8082 указан в lightttpd.conf) , как-будто страницы users не существует, сервер lightttpd работает (запрос192.168.1.1:8082 выдает lightttpd запущен),

в чем может быть дело, и где смотреть.

ceramic
17-08-2009, 12:41
Скажите пожалуйста а тот вариант готового скрипта который здесь http://www.wl500g.info/showpost.php?p=149929&postcount=63 он подойдет для asus wl-500gv2?
Да.


...и при вводе 192.168.1.1:8082/users.html ни че не показывает.
Вроде в оригинале адрес не 192.168.1.1:8082/userS.html
а 192.168.1.1:8082/user.html (или 192.168.1.1:8082).

metronom
17-08-2009, 13:08
Да.


Вроде в оригинале адрес не 192.168.1.1:8082/userS.html
а 192.168.1.1:8082/user.html (или 192.168.1.1:8082).

ну я так написал по памяти, ввожу как в посте, проблема не в этом:rolleyes:

подскажите где посмотреть и что, если может кто помочь могу выложить настройки какие надо

Makloth
28-09-2009, 08:01
Аналогичная ситуация. user.html не генерируется, лог пустой, в папке /users/ тоже "нихт вобла".
lighttpd живой, авторизует правильно.
Как посмотреть логи Cron'а?
Может надо отрубить dhcp и вбить статичные IP?

SkySlider
15-10-2009, 01:47
Вроде сделал всё по инструкции но траффик не считает. Лог генерится каждые 5 минут нормально, но с нулями. Html пустой даже без нулей, только колонки шаблонные. Куда копать?
post-firewall

#!/bin/sh
iptables -F FORWARD
CFG="/opt/.cfg"
echo "#!/bin/sh" > $CFG
USR="/opt/etc/users"
cat $USR | awk '{print("iptables -A FORWARD -s",$2,"-j ACCEPT")}' >> $CFG
cat $USR | awk '{print("iptables -A FORWARD -d",$2,"-j ACCEPT")}' >> $CFG
sh $CFG

## FIREWALL
## set default policy
# iptables -P INPUT DROP
## remove last default rule
# iptables -D INPUT -j DROP

Okon
25-10-2009, 22:57
Вроде сделал всё по инструкции но траффик не считает. Лог генерится каждые 5 минут нормально, но с нулями. Html пустой даже без нулей, только колонки шаблонные. Куда копать?
post-firewall

#!/bin/sh
iptables -F FORWARD
CFG="/opt/.cfg"
echo "#!/bin/sh" > $CFG
USR="/opt/etc/users"
cat $USR | awk '{print("iptables -A FORWARD -s",$2,"-j ACCEPT")}' >> $CFG
cat $USR | awk '{print("iptables -A FORWARD -d",$2,"-j ACCEPT")}' >> $CFG
sh $CFG

## FIREWALL
## set default policy
# iptables -P INPUT DROP
## remove last default rule
# iptables -D INPUT -j DROP


Тоже долго провозился ... этот код создает скрипт в /opt, который на момент запуска (в инструкции этот код помещается в post-firewall) может отсутствовать. Перенес код в /usr/local/sbin/post-mount - все заработало.

YSL
04-11-2009, 07:36
Все работает делаем все по инструкции (http://www.wl500g.info/showpost.php?p=149929&postcount=63) и проблем не будет.:)

sk.sk
05-11-2009, 11:31
А у меня появилось ряд проблемок (( помогите разобраться:

страница генериться, скрипты не полноценно выполняються и проблема с пост-фаерволом :

ПО КОМАНДЕ : iptables -nvxL FORWARD :::::

Chain FORWARD (policy ACCEPT 41 packets, 2036 bytes)
pkts bytes target prot opt in out source dest ination
0 0 ACCEPT all -- br0 br0 0.0.0.0/0 0.0.0. 0/0
0 0 DROP all -- * * 0.0.0.0/0 0.0.0. 0/0 state INVALID
33 1716 TCPMSS tcp -- * * 0.0.0.0/0 0.0.0. 0/0 tcp flags:0x16/0x02 TCPMSS clamp to PMTU
555 176867 ACCEPT all -- * * 0.0.0.0/0 0.0.0. 0/0 state RELATED,ESTABLISHED
0 0 DROP all -- !br0 ppp0 0.0.0.0/0 0.0.0. 0/0
0 0 DROP all -- !br0 vlan2 0.0.0.0/0 0.0.0. 0/0
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0. 0/0 ctstate DNAT
0 0 DROP all -- * br0 0.0.0.0/0 0.0.0. 0/0
(но это потомучто в пост фаерволе нет :

#!/bin/sh
iptables -F FORWARD
CFG="/opt/.cfg"
echo "#!/bin/sh" > $CFG
USR="/opt/etc/users"
cat $USR | awk '{print("iptables -A FORWARD -s",$2,"-j ACCEPT")}' >> $CFG
cat $USR | awk '{print("iptables -A FORWARD -d",$2,"-j ACCEPT")}' >> $CFG
sh $CFG

А если в post-firewall прописать ваш скрипт заменив оригинальный


#!/bin/sh
grep -q -- '--dport 0\b' /tmp/nat_rules && grep -v -- '--dport 0\b' /tmp/nat_rules |
iptables-restore

у меня перестаёт работать инет

Так- же по ходу запуска скрипта из крона в ручную лезут следующие ошибки :

BusyBox v1.1.3 (2009.02.22-14:37+0000) multi-call binary

Usage: grep [-ihHnqvs] PATTERN [FILEs...]

/opt/Billing/cnt: /opt/Billing/cnt: 25: 192.168.1.3 0.0.0.0/0: not found
/opt/Billing/users/: Is a directory
BusyBox v1.1.3 (2009.02.22-14:37+0000) multi-call binary

Usage: awk [OPTION]... [program-text] [FILE ...]

./end: ./end: 37: {
print(\
"<tr><td><font color=blue>",$1,"</font></td><td><font color=green>",$2,"</font></td><td><font
color=red>",$3,"</font></td><td><font color=blue>",$4,"</font></td><td><font
color=blue>",$5,"</font></td></tr>")}: not found
awk: cmd. line:1: Unexpected end of string

Искрине прошу помощи в поиске и решении проблем

в оригинале не знаю что делает команда grep но по моим догадкам она собрает моршруты и отправляет их в файл nat_rules от кудого потом востанавливает с помощью команды iptables-restore

а в сам nat_rules поподает следущее:



*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:VSERVER - [0:0]
-A PREROUTING -d (мой айпи внешний) -j VSERVER
-A PREROUTING -d 10.10.0.186 -j VSERVER
-A VSERVER -p tcp -m tcp --dport 50078 -j DNAT --to-destination 192.168.1.3:500$
-A VSERVER -p udp -m udp --dport 50078 -j DNAT --to-destination 192.168.1.3:500$
-A VSERVER -p udp -m udp --dport 14426 -j DNAT --to-destination 192.168.1.4:144$
-A VSERVER -p tcp -m tcp --dport 14426 -j DNAT --to-destination 192.168.1.4:144$
-A VSERVER -p tcp -m tcp --dport 38604 -j DNAT --to-destination 192.168.1.3:3389
-A VSERVER -p udp -m udp --dport 65211 -j DNAT --to-destination 192.168.1.162:6$
-A VSERVER -p udp -m udp --dport 57051 -j DNAT --to-destination 192.168.1.2:570$
-A VSERVER -p tcp -m tcp --dport 16612 -j DNAT --to-destination 192.168.1.215:9$
-A VSERVER -p udp -m udp --dport 16622 -j DNAT --to-destination 192.168.1.130:1$
-A VSERVER -p tcp -m tcp --dport 16622 -j DNAT --to-destination 192.168.1.130:1$
-A VSERVER -p udp -m udp --dport 59369 -j DNAT --to-destination 192.168.1.130:5$
-A VSERVER -p udp -m udp --dport 56831 -j DNAT --to-destination 192.168.1.224:5$
-A VSERVER -p udp -m udp --dport 62590 -j DNAT --to-destination 192.168.1.130:6$
-A VSERVER -p tcp -m tcp --dport 8181 -j DNAT --to-destination 192.168.1.1:8181
-A POSTROUTING -o ppp0 ! -s (мой айпи внешний) -j MASQUERADE
-A POSTROUTING -o vlan2 ! -s 10.10.0.186 -j MASQUERADE
-A POSTROUTING -o br0 -s 192.168.1.0/24 -d 192.168.1.0/24 -j MASQUERADE
-A PREROUTING -p tcp -i br0 --dport 8181:8181 -j autofw --related-proto tcp --r$
COMMIT


естественно убрав скрипт



grep -q -- '--dport 0\b' /tmp/nat_rules && grep -v -- '--dport 0\b' /tmp/nat_rules |
iptables-restore


и вставив ВАШ я лешаюсь инета но проблема появлееться ещё одна (я так думаю дело в копи пасте он криво вставляет но взгляните всё же, т.к. я просмотрел всё и раз по 10 минимум)

запускаю скрипт в ручную после изменения постфаера вашим методом и получаю






/opt/etc/cron.5mins/end
BusyBox v1.1.3 (2009.02.22-14:37+0000) multi-call binary

Usage: grep [-ihHnqvs] PATTERN [FILEs...]

/opt/Billing/cnt: /opt/Billing/cnt: 25: 192.168.1.3 0.0.0.0/0: not found
BusyBox v1.1.3 (2009.02.22-14:37+0000) multi-call binary

Usage: grep [-ihHnqvs] PATTERN [FILEs...]

/opt/Billing/cnt: /opt/Billing/cnt: 25: 192.168.1.6 0.0.0.0/0: not found
/opt/Billing/users/: Is a directory
awk: cmd. line:3: Unexpected end of string
awk: cmd. line:1: Unexpected end of string



Заранее Благодарен ВСЕМ

YAHOR_1
06-11-2009, 11:20
помогите проблема в соедующем
# server.event-handler = "freebsd-kqueue" # needed on OS X
у меня меняеться ( иначе rtorrent не видно) на
server.event-handler = "poll" # needed on OS X
можно ли с этой строчкой оживить http://192.168.1.1:8081/user.html

YSL
06-11-2009, 11:35
помогите проблема в соедующем
# server.event-handler = "freebsd-kqueue" # needed on OS X
у меня меняеться ( иначе rtorrent не видно) на
server.event-handler = "poll" # needed on OS X
можно ли с этой строчкой оживить http://192.168.1.1:8081/user.html

Если у тебя работает lighttpd то ничего менять не нужно.
У меня после обновления lighttpd перестал он работать разкампелировал (убрал #)эту строчку и все заработало.

lsd_wiz
09-11-2009, 23:16
простенькая рубилка трафика
cкорости нарезки выделины жирным, в КилоБайтах/ceк.
орининал статьи тут:
http://www.xakep.ru/post/49421/default.asp

Вносим небольшие измениея в /opt/etc/users


speed (in KByte/s)
mac ip class min max

ff:ff:ff:ff:аа: 00192.168.1.1 1:11 10 100 User_1
ff:ff:ff:ff:dd:ff 192.168.1.2 1:12 1 10 User_1





#!/bin/sh

# QoS v 0.1
# Created by lsd_wiz

USER="/opt/etc/users"
#ALL="128kpbs" # all chanel speed
case $1 in
start)
# default chain
tc qdisc add dev br0 root handle 1: htb default 20
tc class add dev br0 parent 1: classid 1:1 htb rate 128kbps ceil 128kbps
cat $USER | awk 'BEGIN{a=10}
{
system("tc class add dev br0 parent 1:1 classid "$3" htb rate "$4"kbps ceil "$5"kbps")
system("tc qdisc add dev br0 parent "$3" handle "a":0 sfq perturb 10")
system("tc filter add dev br0 protocol ip parent 1:0 prio 1 u32 match ip src "$2" flowid "$3)
a=a+10
}
END{print a}'
;;
stop)
# default chain
tc qdisc del dev br0 root handle 1: htb default 20
tc class del dev br0 parent 1: classid 1:1 htb rate 128kbps ceil 128kbps
cat $USER | awk 'BEGIN{a=10}
{
system("tc class del dev br0 parent 1:1 classid "$3" htb rate "$4"kbps ceil "$5"kbps")
system("tc qdisc del dev br0 parent "$3" handle "a":0 sfq perturb 10")
system("tc filter del dev br0 protocol ip parent 1:0 prio 1 u32 match ip src "$2" flowid "$3)
a=a+10
}
END{print a}';;
*)
echo "usege (start|stop)"
exit 1
esac

GUID
25-11-2009, 14:28
Спасибо за скрипты.
Теперь осталось разобраться в них и привести к "нормальному виду" ;)



iptables -nvxL FORWARD | grep 192.168 | grep 0.0.0.0/0

Если я делал:
iptables -F FORWARD
перед тем как внести новые правила в цепочку FORWARD, то "grep 0.0.0.0/0" - не нужен. Так?




echo "$1 `cat $LOG | grep \"0.0.0.0/0 $1\" | awk '

Мне кажется, что grep содержит ошибку, т.к. при $1="192.168.1.1" будут отбираться: 192.168.1.1, 192.168.1.10, 192.168.1.11 и т.д.




if (index($1,\"d\") == 0) a=(a+$1)

Вот это условие поставило меня в тупик. Мы ищем в строке $1 символ "d", так? А откуда он там может взяться?

GUID
11-12-2009, 12:34
Помогите разобраться с цепочкой FORWARD, pls!
Задача стоит простая: подсчет трафика входящего/исходящего для каждого явно разрешенного клиентского ip. Предложенное в данной теме решение опробовано и даже работает, с одним НО: YSL в своем howto предлагает затирать оригинальную цепочку, что мне кажется не несколько авантюрным решением.
Оригинальная FORWARD:


[admin@DIR-320 root]$ iptables -nvxL FORWARD
Chain FORWARD (policy ACCEPT 36748 packets, 2234165 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- br0 br0 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
10 20 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 DROP all -- !br0 vlan1 0.0.0.0/0 0.0.0.0/0
0 0 SECURITY all -- !br0 * 0.0.0.0/0 0.0.0.0/0 state NEW
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate DNAT
0 0 DROP all -- * br0 0.0.0.0/0 0.0.0.0/0


Если следовать инструкции из данной темы (+последнее "запрещающее все" правило), то получается следующее:


[admin@DIR-320 root]$ iptables -nvxL FORWARD
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
10 20 ACCEPT all -- * * 192.168.3.1 0.0.0.0/0
30 40 ACCEPT all -- * * 192.168.3.2 0.0.0.0/0
10 20 ACCEPT all -- * * 0.0.0.0/0 192.168.3.1
30 40 ACCEPT all -- * * 0.0.0.0/0 192.168.3.2
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0


Мои очень скромные познания в сетях наводят на мысль, что этот вариант цепочки все-таки более правильный (правила из исходной цепочки, в которых я не разобрался, оствлены без изменений):


0 0 ACCEPT all -- br0 br0 0.0.0.0/0 0.0.0.0/0
4)0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
10 20 ACCEPT all -- * * 192.168.3.1 0.0.0.0/0 state RELATED,ESTABLISHED
30 40 ACCEPT all -- * * 192.168.3.2 0.0.0.0/0 state RELATED,ESTABLISHED
10 20 ACCEPT all -- * * 0.0.0.0/0 192.168.3.1 state RELATED,ESTABLISHED
30 40 ACCEPT all -- * * 0.0.0.0/0 192.168.3.2 state RELATED,ESTABLISHED
1)0 0 DROP all -- !br0 vlan1 0.0.0.0/0 0.0.0.0/0
2)0 0 SECURITY all -- !br0 * 0.0.0.0/0 0.0.0.0/0 state NEW
3)0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate DNAT
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0


Вопросы:
1. Правило 1: отбрасывает все пакеты, которые идут на WAN не из LAN+WiFi. Вопрос: в нашем случае верно утверждение: vlan1 == !br0 ?
2. Правило 2: Все "запросы соединения" из WAN направляются в цепочку SECURITY. Это нужно для проброса портов? Иными словами: если я уберу это правило, то проброс портов (настроенный через web-морду) скорее всего работать не будет.
3. Правило 3: зачем оно нужно и что делает?
4. Я правильно понимаю, что:
плюсы моего варианта:
- возможность проброса портов
- выше защита (хотя бы за счет отбрасывания пакетов с "state INVALID")
минусы моего варианта:
- ниже точность подсчета трафика из-за того, что часть пакетов пойдет через правила 4 и 2.

Заранее СПАСИБО!

KinoMan
31-12-2009, 03:12
GUID
Я немного переделал этот скрипт так чтобы не затирать оригинальную цепочку FORWARD.

post-firewall у меня выглядит так


#!/bin/sh

iptables -N STAT_IP

iptables -I FORWARD 1 -j STAT_IP
iptables -A STAT_IP -s 192.168.100.97 -j RETURN
iptables -A STAT_IP -d 192.168.100.97 -j RETURN
iptables -A STAT_IP -s 192.168.100.118 -j RETURN
iptables -A STAT_IP -d 192.168.100.118 -j RETURN
iptables -A STAT_IP -s 192.168.100.5 -j RETURN
iptables -A STAT_IP -d 192.168.100.5 -j RETURN
iptables -A STAT_IP -s 192.168.100.16 -j RETURN
iptables -A STAT_IP -d 192.168.100.16 -j RETURN
iptables -A STAT_IP -j RETURN



192.168.100.97 и другие - это адреса, по которым у меня считается статистика

Скрипт end нужно немного видоизменить


#!/bin/sh
ULOG="/opt/Billing/total"
DATE="/opt/Billing/logs/`date +%d-%m-%Y`"
LOG="/opt/Billing/users/`date +%d-%m-%Y`"
WEB="/opt/share/www/user.html"
rm $LOG
rm $ULOG
iptables -nvxL STAT_IP | grep 192.168 | grep 0.0.0.0/0 | awk '{
if (($2) != 0){print($2,$8,$9)}}'>> $DATE
iptables -Z
cat /opt/etc/users | awk '{if(($2) != ""){system("/opt/Billing/cnt "$2)}}'
sleep 5s
ls -l /opt/Billing/users/ | awk '{system("cat /opt/Billing/users/"$9)}' | awk '
BEGIN{a=0;b=0,c=" "}
{
if(($3) != 0 && ($2) != 0)
{
if (index($2,"d") == 0){a=(a+$2)}
if (index($3,"d") == 0){b=(b+$3)}
}
}
END
{
if((a) != 0){printf("%.2f",a);printf(c)}else{print 0}
if((b) != 0){printf("%.2f",b)}else{print 0}
}' >> $ULOG
echo "<html><link rel=stylesheet type=text/css href=vnstat_blue.css><body>" >> $WEB
echo "<body><table border=1>" > $WEB
echo "<tr><td><font color=blue>User_id</font></td><td><font color=green>Input:</font></td><td><font color=red>Output:</font></td><td><font color=blue>Total:</font></td><td><font color=blue>All day's:</font></td>" >> $WEB
ls -1 /opt/Billing/users/ | awk '{print("<tr><td>"$1"</td></tr>");system("cat /opt/Billing/users/"$1)}' | awk '{
print(\
"<tr><td><font color=blue>",$1,"</font></td><td><font color=green>",$2,"</font></td><td><font color=red>",$3,"</font></td><td><font color=blue>",$4,"</font></td><td><font color=blue>",$5,"</font></td></tr>")}' >> $WEB
echo "<tr><td><font color=blue>All total:</font></td>`cat /opt/Billing/total | awk '{print(\"<td><font color=green>\",$1,\"</font></td><td><font color=red>\",$2,\"</font></td>\")}'`</tr>" >> $WEB
echo "</table></body></html>" >> $WEB



В итоге



$ iptables -nvxL FORWARD
Chain FORWARD (policy ACCEPT 188 packets, 15352 bytes)
pkts bytes target prot opt in out source destination
4759 3158274 STAT_IP all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- br0 br0 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
11 484 TCPMSS tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x17/0x02 TCPMSS clamp to PMTU
4571 3142922 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 DROP all -- !br0 ppp0 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- !br0 vlan1 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate DNAT
0 0 DROP all -- * br0 0.0.0.0/0 0.0.0.0/0





$ iptables -nvxL STAT_IP
Chain STAT_IP (1 references)
pkts bytes target prot opt in out source destination
269 11684 RETURN all -- * * 192.168.100.97 0.0.0.0/0
269 354384 RETURN all -- * * 0.0.0.0/0 192.168.100.97
0 0 RETURN all -- * * 192.168.100.118 0.0.0.0/0
0 0 RETURN all -- * * 0.0.0.0/0 192.168.100.118
0 0 RETURN all -- * * 192.168.100.5 0.0.0.0/0
0 0 RETURN all -- * * 0.0.0.0/0 192.168.100.5
0 0 RETURN all -- * * 192.168.100.16 0.0.0.0/0
0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0

oleg71
03-01-2010, 15:56
при выполнении скрипта end.sh
выдает вот это:


и трафик показывает нули везде,
а дату ставит:(

KinoMan
03-01-2010, 23:50
oleg71
а что выдает у вас


iptables -nvxL FORWARD

?

oleg71
04-01-2010, 21:41
oleg71
а что выдает у вас


iptables -nvxL FORWARD

?

вывод как по инструкции был, сейчас снес за неработоспособность
моих рук :(
все делал раза четыре перепроверял все одно
заладил - это директория и все тут!

P.S. делал и по твоему рецепту
$ iptables -nvxL STAT_IP
Chain STAT_IP (1 references)
pkts bytes target prot opt in out source destination
269 11684 RETURN all -- * * 192.168.100.97 0.0.0.0/0
269 354384 RETURN all -- * * 0.0.0.0/0 192.168.100.97
0 0 RETURN all -- * * 192.168.100.118 0.0.0.0/0
0 0 RETURN all -- * * 0.0.0.0/0 192.168.100.118
0 0 RETURN all -- * * 192.168.100.5 0.0.0.0/0
0 0 RETURN all -- * * 0.0.0.0/0 192.168.100.5
0 0 RETURN all -- * * 192.168.100.16 0.0.0.0/0
0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
только с моими ип.

GUID
05-01-2010, 08:12
GUID
Я немного переделал этот скрипт так чтобы не затирать оригинальную цепочку FORWARD.

СПАСИБО!!!
буду разбираться ;)

oleg71 у Вас ошибка в end.sh - внимательно копируем + проверяем пути

vvm
08-05-2010, 11:27
Пользыватели Входяший Исходящий За день За все дни

06-05-2010

Комп 3.15 2.90 6.05 6.05
Галя 126.55 18.48 145.03 145.03
VoIP 0.37 0.34 0.71 0.71
Notek 50.41 2.47 52.88 52.88

07-05-2010

Комп 40.73 2.84 43.57 49.62
Галя 52.45 8.29 60.74 205.77
VoIP 3.33 3.14 6.47 7.18
Notek 150.44 4.88 155.32 208.2

08-05-2010

Комп 112.21 10.46 122.67 172.29
Галя 134.10 2.83 136.93 342.7
VoIP 1.32 1.19 2.51 9.69
Notek 10.77 1.09 11.86 220.06
Общий трафик

Общий трафик не считает
Нет ни нулей, ничего. Где копать?