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

Лимит по траффику...

Добавлено: 2006-03-21 15:49:26
Urgor
Наступил такой интересный момент - порнуха у пользователей зарезана, приличная часть сайтов развлекательного назначения тоже заразана, баннеры режутся, короче, зарезано очень и очень много. А вот потребление траффика больше не снижается :( Народ припугнутый "драконовскими" методами, типа по 200 мегабайт инета на каждого протянул недолго - месяца полтора - потом просекли, что если попросить то включают анлим :(
А можно отсюда подробнее? Как можно сделать лимит скажем 30 мег/сутки? Или хотя бы падение скорости устроить при привышении определенного лимита, как у провов?

Добавлено: 2006-03-21 19:38:00
Alex Keda
у меня сделано по 200 мег в месяц. Рубится тока по http - но можно и в фаер правила добалять

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

/usr/script/work/>cat traff_limit.sh
#!/bin/sh
#
#
#
db_user="ipacctd"
db_passwd="ipacctd"
db_name="ipacctd"
path_to_limit="/usr/home/lissyara/smb_share/all_of_sites/squid/limited_IP.conf"

year=`date '+%Y'`
month=`date '+%m'`


#
echo "192.168.20.253" > ${path_to_limit}
mysql_query="/usr/local/bin/mysql --user=${db_user} --password=${db_passwd} \
--database=${db_name}"

${mysql_query} --execute="SELECT \`to_IP\`, SUM(\`bytes\`) AS \`bytes\` FROM \`sk0_${year}\` WHERE \
\`to_IP\` LIKE '192.168.20.%' AND \`from_IP\` != '192.168.20.254' AND \
\`from_IP\` != '213.234.195.210' AND \`date\` LIKE '${year}-${month}-%' GROUP BY \`to_IP\` ORDER BY \`bytes\`" \
| grep -v "to_IP" | \
grep -v "192.168.20.142" | grep -v "192.168.20.30" | \
grep -v "192.168.20.152" | grep -v "192.168.20.31" | \
grep -v "192.168.20.123" | grep -v "192.168.20.158" | \
grep -v "192.168.20.141" | grep -v "192.168.20.148" |\
{
while read stroka
do
user_IP=`echo ${stroka} | awk '{print $1}'`
user_bytes=`echo ${stroka} | awk '{print $2}'`
if [ ${user_bytes} -ge 209715200 ]
then
    echo ${user_IP} >> ${path_to_limit}
fi
done
}
killall -1 squid

Добавлено: 2006-03-27 8:01:38
Urgor
Хм. Хм. А ипы у тебя статические??? При смене ипа по dhcp статистика по нему накроется... Надо как-то к именам хостов привязывать.

Добавлено: 2006-03-27 8:25:39
Alex Keda
Динамика.
Но, вообще-то, комп старается старый IP получить. По возможности.
Обычно ему это удаётся.

Добавлено: 2006-03-27 9:10:38
Urgor
Теоретически да, но вероятность все же есть... посему хотса сделать "как правильно" :)
А как будет выглядеть инетная статистика? Как частные адреса на внешнем интерфейсе?

Добавлено: 2006-03-27 9:20:04
Alex Keda
на внешнем адресе nat - там не может быть частных адресов, они на внутреннем интерфейсе.

Добавлено: 2006-03-27 9:45:18
Urgor
Т.е. мы смотрим на нутряном интерфейсе весь траффик, который адресован не самому серваку?

Добавлено: 2006-03-27 9:49:42
Alex Keda
точно :)
а что, из квери к mysql этого не видно? :)

Добавлено: 2006-03-27 9:52:59
Urgor
Неа =) Инет то еще не притащили, грят деньков через 10-15 буде... А прокся (мне нужен с авторизацией) отмечается как: '2006-03-26','12:16:00','192.168.0.200','3128','192.168.0.37','client','tcp','7464','8296'

Добавлено: 2006-03-27 14:46:43
Urgor
# Стираем пустые строки (а вот откуда они вылазиют я так и непонял....)
${sql_preffix} --execute="DELETE FROM \`traffic_tmp\` WHERE from_IP='' AND \
port_from_IP='' AND to_IP='' AND port_to_IP='' AND protocol=''"
# Стираем строки в которых полное число байт (вместе с технической инфой)
# равно нулю (тоже непойми откуда берутся - раз в статистику trafd попали -
# значит соединение было и байты должны были б быть...)
Наверное вот отсюда:

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

 (xl0) asu-002.mbfkk.spb.ru at Mar 22 15:46:56 - Mar 22 16:19:10
 Summary: 478306 data bytes, 674654 all bytes, 18 records
     From           Port         To            Port  Proto     Data       All

Добавлено: 2006-03-27 15:14:11
Alex Keda
э нет... там не отражено, но щас оно хитрее делается там на входе стит

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

grep "^[0-9]"
- т.е. левак сразу отсекается. а вот строки пустые есть :)))

Добавлено: 2006-03-27 15:21:48
Urgor
Но все же где-то рядом, очень, очень близко. Бо у меня перлОвый нормально во временную базу пишет. Мдя, приходится учить "албанский" :)

Добавлено: 2006-03-27 15:56:14
Alex Keda
х.з. :)
Перловый подо что? trafd или ipacctd?

Добавлено: 2006-03-28 8:10:28
Urgor
Под trafd, но IMHO под ipacctd модифицировать будет не сложно (главное таблицы не трогать). Но у меня задумка грандиозная =) Сделать группы, квоты, рассылку предупреждений после ужимания канала и после отрубания (когда квоту на отдел выберут)... вообщем всю рутину возложить на сервак.
А заодно и язык еще один изучу.

Добавлено: 2006-03-28 8:17:36
Alex Keda
я тоже подобное начал - но времени не хватило доделать.
тока я с web мордой делать собирался.... на php и shell

Добавлено: 2006-03-29 14:07:52
Urgor
Начал делать... появилось несколько вопросов:
1. Правила пайпов обязательно писать всамом начале правил файрвола или мона к правилам ната опустить?
2. При перезагрузке правил скажем раз в 10 минут (сквиду конфиг тоже придется перечитывать) машинке не поплохеет?

Добавлено: 2006-03-29 14:31:30
Alex Keda
наскока я понял - нужно вверху. ссылку не дам, прямого утверждения не помню :(
а чё вдруг поплохеет-то?
Сквида я killall -1 squid заставляю перечитываться. Это лучше чем перезапуск.

Добавлено: 2006-03-29 15:17:12
northern
обрати внимание на переменную sysctl net.inet.ip.fw.one_pass:
net.inet.ip.fw.one_pass: 1 Когда установлено, пакет, выходящий из потока dummynet, не проходит через брандмауэр повторно, В противном случае, после обработки канала пакет повторно вводится в брандмауэр по следующему правилу.
то есть если у тебя она=1, то после выхода из pipe пакет покидает файер.

Добавлено: 2006-03-29 15:21:22
Alex Keda
Ага. Тока с фаером где по дефолту deny all from any to any нолик ставить не стоит... Ибо по возвращении в фаер применится последнее правило :))) Сам нарывался :)))

Добавлено: 2006-03-29 15:29:53
northern
ты имеешь ввиду если у тебя вего две строки в файере: pipe и deny ip from any to any? тогда да. А с другой стороны ты наваял фаер (точнее я, нарвался тоже :) ), вверху поставил pipe и думаешь, что у тебя защита, а пакетики-то после трубы уходят.

Добавлено: 2006-03-29 15:49:18
Alex Keda
хм... дело то в том, что я снаружи не лимитирую.
А замечание дельное.

Добавлено: 2006-03-29 15:50:29
Alex Keda
northern писал(а):обрати внимание на переменную sysctl net.inet.ip.fw.one_pass:
net.inet.ip.fw.one_pass: 1 Когда установлено, пакет, выходящий из потока dummynet, не проходит через брандмауэр повторно, В противном случае, после обработки канала пакет повторно вводится в брандмауэр по следующему правилу.
то есть если у тебя она=1, то после выхода из pipe пакет покидает файер.
цитата знакомая... линк дай?
Чё-то меня сомнения затерзали...

Добавлено: 2006-03-29 15:55:48
northern

Добавлено: 2006-03-29 16:04:41
Alex Keda
несходится... если бы покидали то до диверта бы не доходило...
щас пробовал - divert срабатывает при любом раскладе - а он у меня после труб...

Добавлено: 2006-03-29 16:55:44
northern
не знаю... дома дивертов не было, я только по логу и понял, что что-то не так. Ставлю несколько pipe, смотрю ipfw show - как написано так и есть: если one_pass=1 после первой трубы уходит из фaйера. Ставлю 0 - проходит все трубы. Да по скорости видно, заходит в канал или нет, дома-то ADSL 8Mb. Надо разобраться. Смотрю ман 4.11, тоже - пишут, уходить должен после трубы:
Pass packet to a dummynet(4) ''pipe'' (for bandwidth limitation,
delay, etc.). See the TRAFFICSHAPER (DUMMYNET)CONFIGURATION
Section for further information. The search terminates; however,
on exit from the pipe and if the sysctl ( 8 ) variable
net.inet.ip.fw.one pass is not set, the packet is passed again to
the firewall code starting from the next rule.