Обсуждение статьи тематического каталога: Linux Расчет трафика через Iptables. (linux firewall iptables traffic)Ссылка на текст статьи: http://www.opennet.me/base/net/traf_mes.txt.html
Первое ограничение легко борется путем болле частого запускания скрипта считывания трафика. У меня работает раз в час.
>Первое ограничение легко борется путем болле частого запускания скрипта считывания трафика. У
>меня работает раз в час.Каждый час я запускаю "соседний" скрипт для другого - мониторинга когда машина работает (например по выходным охранники сидят в инете).
Все хорошо, но зачем .xls - ведь есть mysql
Борис
Потому, что файл отдал начальству и забыл о нем.
Просто в моей последней редакции этого скрипта идет автоматичекая замена ip адреса на имя пользователя. Поэтому моего участия там больше не нужно.
а чем ipac-ng не подошел для этого?
У меня не требуется ничего инсталлировать. Сейчас для меня это важно. Как важно и для всех начинающих. Система-то полноценно работает, и любое вмешательство только в том случае если все проверил, во всем уверен и сможешь починить.:-)))
все таки респектабельней было бы всю статистику в базу ложить. А там уже с ней разбираться.
Согласен. Но пока этого не требуется. точнее она просто еще не установлена на сервере.
У тебя между считыванием счетчиков и обнулением проходит время - данные теряются за этот период.
Опцию -Z можна задать вместе с -L.
Из man-а "It is legal to specify the -L, --list (list) option as well, to see the counters immediately before they are cleared."
А вот за это спасибо. Посмотрю, что можно сделать.
После присвоения параметров добавляем строчки...# Присваивание параметров для мониторинга
...
# Вывод данных во временный файл и
# очистка счетчиков для следующего дня
/sbin/iptables -LZ -v -x > dat.tmpЗатем в расчете величины трафика меняем строки на следующие...
# Расчет величины трафика входящего на интерфэйс eth1
# Максимальный расчетный трафик за день - 953МВ
IN=`cat dat.tmp | grep in_traf | head -c 18 | tail -c 9`
FW=`cat dat.tmp | grep fwd_in_traf | head -c 18 | tail -c 9`
...Затем в расчете пользователей меняем аналогичные строки...
# Расчет пользователей
...
RX=`cat dat.tmp | grep chain_$i | head -c 18 | tail -c 9`
...В конце скрипта удаляем строку с обнулением трафика!
Внимание. В строках расчета входящего трафика изменились параметры команду grep!
Еще одно уточнение... У меня почему-то не работает параметр "-LZ" в одной строке.
поэтому я сделал это в 2 строчки.>После присвоения параметров добавляем строчки...
>
># Присваивание параметров для мониторинга
>...
># Вывод данных во временный файл и
># очистка счетчиков для следующего дня
...
/sbin/iptables -L -v -x > dat.tmp
/sbin/iptables -Z
...
iptables -L -v -x -Z
а не -LZ
>iptables -L -v -x -Z
>а не -LZДа, все правильно.
А не подскажите ли как изменятся скрипты, если есть два интерфейса с локальной сетью...
>А не подскажите ли как изменятся скрипты, если есть два интерфейса с
>локальной сетью...А подробнее? трафик нужно считать между 2-мя локальными сетками? или еще как? Сколько внешних интерфейсов? и пр... Чем полнее, тем лучше...:-)
Дополнения и ,возможно, улучшения:
1)строки -LZ и не будут работать, нужно ставить так
/sbin/iptables -L -Z -v -x -n > dat.tmp
тогда сначала информация о траффике запишется в файл, а затем обнулиться
2)конструкцию `head -c 18 | tail -c 9` можно заменить на такую `awk '{print $2}'` - эффект такой-же
Так вот: имеется сетки (192.168.12.0, и 192.168.0.0), и к ним два интерфейса (192.168.12.51, и 192.168.0.2). Вопросик: как можно подправить чтобы скрипты считали для обоих сетей.
И ещё есть доработочка к скриптам: я считаю что считать нужно не в цепочке FORWARD, а в OUTPUT, иначе при работе через сквид трафик не считается (по крайней мере мне так показалось.)
Если у тебя сквид - считать нужно все цепочки (OUTPUT и FORWARD) поскольку не все запросы кеширует сквид (mail, telnet и пр.).
Но, если у тебя там стоит еще и файл-сервер (Samba, etc...), то тогда нужно придумывать, как разделить это дело уже по протоколам...:-(((((
ой, забыл, внешний интерфейс только один...
Мне кажется нужно вместо IP-адресов подставить сети
198.16.12.0/24 и 198.16.0.0/24 и считать на здоровье
iptables -A INPUT -d 198.16.12.0/24 -j ACCEPT
iptables -A INPUT -d 198.16.0.0/24 -j ACCEPT
iptables -A OUTPUT -s 198.16.12.0/24 -j ACCEPT
iptables -A OUTPUT -s 198.16.0.0/24 -j ACCEPT
и можно снимать трафик по сетям, но искать в grep придется так:
iptables -L INPUT -Z -v -x -n > datin.tmp
couuntin=`cat datin.tmp | grep 198.16.12.0/24 | awk '{print $2}'`аналогично и выходная цепочка
>Мне кажется нужно вместо IP-адресов подставить сети
>198.16.12.0/24 и 198.16.0.0/24 и считать на здоровье
>iptables -A INPUT -d 198.16.12.0/24 -j ACCEPT
>iptables -A INPUT -d 198.16.0.0/24 -j ACCEPT
>iptables -A OUTPUT -s 198.16.12.0/24 -j ACCEPT
>iptables -A OUTPUT -s 198.16.0.0/24 -j ACCEPT
>и можно снимать трафик по сетям, но искать в grep придется так:
>
>iptables -L INPUT -Z -v -x -n > datin.tmp
>couuntin=`cat datin.tmp | grep 198.16.12.0/24 | awk '{print $2}'`countin=`awk '/198.16.12.0\/24/ {print $2}'`
>
>аналогично и выходная цепочка
у меня немного другой вариант решения той же самой проблемы. что делать в случае использования ваших скриптов, если машина часто выключается, так как стоит в обшаге и даёт друзьям доступ в инет :) и соседу не нравится её шум? причём выключается кнопочкой power... как быть, если iptables часто подправляется, в результате чего, и в предыдушем случае, iptables теряет всю статистику? инет у нас шустрый, 1Gb канал, так что за несколко минут может натечь мепабайтный траффик. ваше решение как видно не подходит :)
может кому понравится вариант заставить iptables логать через syslog, используя kernel.debug скажем, и ловить лог на эту facility через pipe. написать демона, что будет слушать pipe и диференцировать тнфу - это лог юзверя с локального ip(я бросаю его в sql :), это сообшение ядра...
так удобней будет - черти в любой момент могут посмотреть это дело на страничке, на индивидуальных шарах. и причём инфа неза кждый час, а online :))
по голове надо настучать за отключение power'ом
мне тут раз перегрузили (не могли из X'ов выйти, блин)
так после этого на винте 2 бэд-блока образовалось
и один из них в swap-разделе... пришлось весь диск переформатировать...а по поводу syslog - в iptables есть ULOG - для userspace programm
легче будет
простите за опечатки - клава слишком продвинутая, без русских букв - не дорос ещё до неё :)
по поводу power'a - дык стучу, не спасает :( и ещё мелочь - тут как бы общага, вырубают его, бедняжку, и не обязательно power'ом.
а по поводу ULOG - к тому времени я в нём ещё не разобрался, написать демона проще было. не подкинешь инфы? из мануала я мало что вытянул :((
>по голове надо настучать за отключение power'ом
>мне тут раз перегрузили (не могли из X'ов выйти, блин)
>так после этого на винте 2 бэд-блока образовалось
>и один из них в swap-разделе... пришлось весь диск переформатировать...
>
>а по поводу syslog - в iptables есть ULOG - для userspace
>programm
>легче будетГде ж оно легче? Я дня 3 прогу на С писал, так оказалось, что у netlinka ограничение на размер буфера, так что она с short read вылетала. Пришлось сырцы править и ядро пересобирать.
Правда мне содержимое пакетов анализировать нужно было и ulogd не помогал, но все равно для подсчета трафика лог парсить нужно, так по-моему статистику снимать легче.
Кстати, если просто с интерфейса нужно, так почему бы `cat /proc/net/dev>tmp.dat` переодически не использовать?
прога была написана мене чем за два дня.
статистику мне надо снимать не с интерфейса(на нём 2 ip, хотя по зтой причине), а считать каждый пакет отдельно.
можно парсить файл, что выдаёт syslod, но тогда придётся вешать парсер на cron, каторый в принципе катит, но обновляет _слишком_ редко(реже раз в минуту).
от поэтому я и перенаписал парсер лога syslog так, чтобы он на входе брал не файл, а pipe. так что сейчас юзверь можёт сьесть лишнего траффика не более чем на размер пакета :)) а тогда 1М * 60 сек - что-то много для общаги, не находишь?
прога написана на си, ест не более 1% процессорного времени, выход бросает в sql.
Ender а можешь выслать мне свои примеры, хотелось бы посмотреть...
>прога была написана мене чем за два дня.
>статистику мне надо снимать не с интерфейса(на нём 2 ip, хотя по
>зтой причине), а считать каждый пакет отдельно.
>можно парсить файл, что выдаёт syslod, но тогда придётся вешать парсер на
>cron, каторый в принципе катит, но обновляет _слишком_ редко(реже раз в
>минуту).
>от поэтому я и перенаписал парсер лога syslog так, чтобы он на
>входе брал не файл, а pipe. так что сейчас юзверь можёт
>сьесть лишнего траффика не более чем на размер пакета :)) а
>тогда 1М * 60 сек - что-то много для общаги, не
>находишь?
>прога написана на си, ест не более 1% процессорного времени, выход бросает
>в sql.Я тоже занимаюсь этой задачей сейчас
Я брал статистику не с сислога а напрямую с канала /proc/kmesg (сислог сам берет данные оттуда)
но при этом столкнулся с такой проблемой: при большом трафике (10 мбит, загрузка 100%) канал переполнялся и строчки лога терялись, и считалось неправильно.. увеличение буфера не помогло. У тебя канал еще шире и качают наверно поболе :) у тебя не возникало такой проблемы?
>Я тоже занимаюсь этой задачей сейчас
>Я брал статистику не с сислога а напрямую с канала /proc/kmesg (сислог
>сам берет данные оттуда)
>но при этом столкнулся с такой проблемой: при большом трафике (10 мбит,
>загрузка 100%) канал переполнялся и строчки лога терялись, и считалось неправильно..
>увеличение буфера не помогло. У тебя канал еще шире и качают
>наверно поболе :) у тебя не возникало такой проблемы?
нет, проблемы такой не стояло. хотя у нас сеть и 100Mbit (1G канал - это до города. на нём мы все и сидим) и трафик бывает под 3M/sec и выше, но мой провайдер считает трафик чуть чуть по иному, чем я - я считаю всё, что только бросается в лог, а пров часть пакетов игнорирует. и хоть убейте, понятия не имею какую. в общем мной тподсчитанный рафик всегда больше, чем тот, за который я плачу деньги.
при проверке же со счётчиками iptables я особых расхождений не заметил.
смотрите файл tcounterd.tar.bz2 на ftp://nick.dorms.spbu.ru.
предуперждаю сразу - это моя самая первая прога, написанная под линух, да ещё и под mysql. причём написанная под влиянием обстоятельтсв - потратил у меня один несколько сотен метров на халяву, пока его вырубило. теперь не тратит :)
Может кто скинет этот исходничек на мыло shaeh@rambler.ru а то не могу зайти на FTP
1
Извините, я новичек, и поэтому непонял...
чего нужно записать вместо "...*"
у меня внешний интерфейс eth0
внутренняя сеть 192.168.100.0
адреса в сети 192.168.100.2 и 192.168.100.10
подскажите чего как в ентих скриптах прописать
А то больше трафик нечем считать,netGate неработает...
net-acct как-то неправильно считает...
одна надежда на ентот скрипт осталась :))
Люди! Помогите ламеру. После создания IP-цепочек отрубило 21 порт. Теперь получился однорукий FTP, жалуются субчики. Подскажите шо делать.
>Люди! Помогите ламеру. После создания IP-цепочек отрубило 21 порт. Теперь получился однорукий
>FTP, жалуются субчики. Подскажите шо делать.Включить порт обратно и почитать примеры цепочек. В этом же каталоге есть инфа по установке и настройке iptables
>Люди! Помогите ламеру. После создания IP-цепочек отрубило 21 порт. Теперь получился однорукий
>FTP, жалуются субчики. Подскажите шо делать.для statefull файервола
modprobe ip_conntrack_ftp
и
modprobe ip_nat_ftp (если нужно натить)и вначале скрипта
iptables -A INPUT -m state --state ! NEW,INVALID -j ACCEPT
iptables -A FORWARD -m state --state ! NEW,INVALID -j ACCEPT (если нужно)
Может быть я чего-то не понял... у меня возник вопрос - а можно ли использовать приведенный выше скрипт для подсчета траффика по конкретным IP адрессам?
Ситуация такая - есть сетка с одной адресацией 192.168.0. но на самом деле в сети две между собой не связанные фирмы, которые выходят в инет через роутер 192.168.0.151 Хотелось бы знать сколько в день (неделю, месяц) съедают траффика они, а сколько мы. Так как платим мы поровну, но жрут они значительно больше нас.Заранее спасибо.
Да, может считать по отдельным ip адресам.
это в том месте где мы заводим цепочки для пользователей.
Просто потом нужно будет просуммировать отдельные адреса.Лезь ко мне в аську я тебе отпишу как это лучше сделать. #25221460
Послушайте, а как вы считаете, если считать входящий трафик в таблице Mangle? Я вроде так сделал, пока работает, ща буду проверять на правдивость.
Подскажите пожалуйста, как задать переменную не только месяца и дня (MNTH=`date +%m`;DAT=`date +%d`), но и часов и минут?
Набираешь "man date" и смотришь раздел "формат"
"date +%M" - минуты
"date +%H" - часы
А вообще там есть еще несколько размеров часов...Так что лучше в мануал...
Нашёл, спасибо!
Внимательно прочитал, но может быть есть у кого готовый скрипт (для минимальной правки) для следующей задачи : есть локалка (192.168.0.0), машина с MandrakeLinux 9.0 (iptables) с 2 сетевухами - одна в локалку, другая во внешний мир(выделенка).Нужно считать траффик как исходящий, так и входящий для сети + учитывать его объем как для конкретного пользователя, так и по конкр.IP - адресу + видеть куда ходил пользователь. Счетчики для пользователя желательно не сбрасывать, работа в режиме накопления.
Буду очень благодарен, если поможете.
Игорь.
P.S. firewall будет слеплен с помощью guarddog (поддерживается iptables).
Добрый! Игорь сейчас у меня такая же проблемка. Насело начальство на контроль траффика, помогите готовым скриптиком.
RH 7.2 eth0(локалка), ppp0(в свет), iptables v1.2.3
Люди а у кого есть скрипт собирающий эту статистику в базу даных mysql?
>Люди а у кого есть скрипт собирающий эту статистику в базу даных
>mysql?
могк бросить пример.#! /usr/bin/perl -w
use Mysql;
$db = Mysql->Connect('localhost', 'iplog', 'iplog');@tables = $db->ListTables;
$query = $db->Query("select ip,cur,name,lim,paid from conf");
for($i = 0; $i < $query->numrows; $i++)
{
($ip, $cur, $name, $limit, $paid) = $query->FetchRow;
%{$users{$ip}} = ('current' => $cur, 'limit' => $limit, 'paid' => $paid);
$names{$ip} = $name;
unless(grep {$_ eq $name} @tables)
{
$db->Query("create table $name (year int not null, month int not null, day int not null, hour int not null, min int not null, sec int not null, ip char(16) not null, len int not null, dir int not null)");
}
}
%months = ('Nov' => 11, 'Dec' => 12);$traffic = 0 unless $traffic = `cat /var/log/traffic`;
open LOG, "/var/log/kernel/debug";
foreach(<LOG>)
{
next unless ($month, $day, $hour, $min, $sec, $src, $dst, $len) =
m/^(\w\w\w)\s+(\d+)\s+(\d+):(\d+):(\d+)\sender\skernel:\s+.*SRC=([\d\.]+)\sDST=([\d\.]+)\sLEN=(\d+)\s/;
$year = (localtime(time))[5] + 1900;
# log - общая таблица. сбрасываю абсолюсно все пакеты
$db->Query("insert into log values ($year, $months{$month}, $day, $hour, $min, $sec, '$src', '$dst', $len)");
if(!exists $users{$src} && exists $users{$dst})
{
$users{$dst}{'current'} += $len;
#я вставляю и пакеты в mysql, не надо - затри
$db->Query("insert into $names{$dst}{'current'} values ($year, $months{$month}, $day, $hour, $min, $sec, '$src', $len, 1)");
}
if(exists $users{$src} && !exists $users{$dst})
{
$users{$src}{'current'} += $len;
$db->Query("insert into $names{$src}{'current'} values ($year, $months{$month}, $day, $hour, $min, $sec, '$dst', $len, 0)");
}
$traffic += $len;
$users{'0.0.0.0/0'}{'current'} += $len;
}
close LOG;system("echo $traffic > /var/log/traffic");
foreach(keys %users)
{
$db->Query("update conf set cur = $users{$_}{'current'} where ip = '$_'");
system("iuseroff $names{$_}") if $users{$_}{'current'} >= $users{$_}{'limit'} + $users{$_}{'paid'};
}
всё, что не нарвится - естесственно можно менять :) это как пример лога в mysql
Доброго времени суток.
я вот читал читал этот флейм и до сихпор не понял, зачем велосипед изобретать если существует кучища отработаных и стабильных пакетов:
ulogd porject, ipac-ng, net-acct, netacct-mysql, etc., каждый из которых хорош по-своему, и каждый-же можно переделать так, как кому заблагорассудится.
Просьба выше сказаное не воспринимать как жесткую критику в свой адрес.
просто я высказал свое мнение (субъективное ессно (: )
ах да позабыл сказать, мне возможно тоже скоро прийдется организовывать нечто подобное (учет траффика, контроль IP & MAC, билинг)..
кстати есть неплохой имхо ресурс: linux advanced routing and traffic control (http://lartc.org) мож кто оттуда почерпнет для себя чтонить новое.
Благодарю за внимаение (:
Enjoy!
>Доброго времени суток.
>я вот читал читал этот флейм и до сихпор не понял, зачем
>велосипед изобретать если существует кучища отработаных и стабильных пакетов:
>ulogd porject, ipac-ng, net-acct, netacct-mysql, etc., каждый из которых хорош по-своему, и
>каждый-же можно переделать так, как кому заблагорассудится.
>Просьба выше сказаное не воспринимать как жесткую критику в свой адрес.
>просто я высказал свое мнение (субъективное ессно (: )
>ах да позабыл сказать, мне возможно тоже скоро прийдется организовывать нечто подобное
>(учет траффика, контроль IP & MAC, билинг)..
>кстати есть неплохой имхо ресурс: linux advanced routing and traffic control (http://lartc.org)
>мож кто оттуда почерпнет для себя чтонить новое.
>Благодарю за внимаение (:
>Enjoy!
>Хотел бы узнать результат, как вы вышли сположения по подсчету траффика
Я хотел бы спросить у народа мнение:В представленном скрипте:
eth0 - интерфейс в инет ?
eth1 - интерфейс в локальную сеть ?Если предположить вышеуказанное - то трафик IN+FW - получается не тот ...
А по цепочкам chain_$i - вообще ничего нет :((Может кто-нибудь укажет мне, что я делаю не так ?
Если лень рассматривать мой скрипт конфигурации, то ответьте хотя бы на вопрос о интерфейсах :))Вот мой скрипт:
#!/bin/sh
INET_IP="1.2.3.4"
INET_IFACE="eth0"LAN_IP="192.168.0.1"
LAN_IFACE="eth1"PRIV_PORTS="0:1023"
UNPRIV_PORTS="1024:65535"LO_IFACE="lo"
LO_IP="127.0.0.1"$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP$IPTABLES -N bad_tcp_packets
$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets$IPTABLES -N in_traf
*********************
$IPTABLES -N fwd_in_traf
************************
$IPTABLES -N chain_2
********************$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP$IPTABLES -A tcp_packets -p TCP -s 192.168.0.255/24 --sport $UNPRIV_PORTS --dport 23 -j allowed
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 2074 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 4000 -j ACCEPT$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT$IPTABLES -A in_traf -j RETURN
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
$IPTABLES -A fwd_in_traf -j RETURN
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^$IPTABLES -A chain_2 -j RETURN
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
$IPTABLES -A INPUT -i eth1 -j in_traf
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BROADCAST_ADDRESS -j ACCEPT$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED \
-j ACCEPT
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
$IPTABLES -A FORWARD -o eth0 -d 192.168.0.2 -j chain_2
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets
$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP
Если хочешь посчитать траффик то правила для forward должны быть такими
iptables -A FORWARD -o eth0 -s any/0 -d 192.168.0.0/24 -j chain_2
iptables -A FORWARD -o eth0 -s 192.168.0.0/24 -d any/0 -j chain_3iptables -A chain_2 -j ACCEPT
iptables -A chain_3 -j ACCEPTтогда траффик будет считаться и туда и обратно для всей сети кроме этой машины, а унее надо счтать input & output
здравствуйте подскажите как нужно изменить скрипт если я хожу в инет через модем:
есть соединение ppp0 оно постоянно отключается и выключается :) dialup короче :)
есть три сетевухи внутри eth0,1,2 нужно подсчитать траффик входящий для каждого пользователя.
Спасибо.
По твоему сценарию настрил свой скрипт с небольшими дополнениями, но суть оталась та же. После запуска скрипта iptables вистет намертво, причем перестает пропускать трафик совсем !!!! при запросе iptables -L оооченнь долго думает. В чем может быть проблема.
ЗЫ: перед запуском скрипта остановил iptables и удалил файл /etc/sysconfig/iptables
испльзую iptables v1.2.6a
Он не виснет, а загружается, у меня но 433 Селероне с 3-мя сетями он грузится минут 15-20...
Я так думаю. не через -L нужно снимать а с файлика /proc/net/не помню какой но внем намного проще взять. пИмя правила последнее в строке
Я тут накропал с горем пополам скрипт который снимает вход и выход по каждому ипишнику идущему через шлюз вроде все пашет
но возникла проблема я никак не могу посчитать траф IN OUT самого шлюза(дело в том что у меня запускаются кроны которые снимают дамп базенки с внешнего сервера )
у меня eth0-наружный eth1(192.168.0.100)-локалка
подскажите плз я пытался сделать так
iptables -A INPUT -i eth0 -d localhost -s ! 192.168.0.0/24 -j chain_inv
iptables -A OUTPUT -i eth0 -s localhost -d ! 192.168.0.0/24 -j chain_outv
но поймать не смог - да и думаю что бред написал
пробовал другими путями но добился только того что получаю общее число пройденого трафа через внешний интерфейсвот мой пример моего скрипта на iptables для учета статистики по всем ип адресам локальной сети
#!/bin/sh
IPTABLES="iptables"
while [ $i -le 254 ]
do
$IPTABLES -N chain_in$i
$IPTABLES -N chain_out$i
let i=$i+1
done
i=1
while [ $i -le 254 ]
do
$IPTABLES -A chain_in$i -j RETURN
$IPTABLES -A chain_out$i -j RETURN
let i=$i+1
donei=1
while [ $i -le 254 ]
do
$IPTABLES -A FORWARD -i eth1 -s 192.168.0.$i -d ! 192.168.0.100 -j chain_out$i
$IPTABLES -A FORWARD -i eth0 -d 192.168.0.$i -s ! 192.168.0.100 -j chain_in$i
let i=$i+1
done
$IPTABLES -t nat -A POSTROUTING -p TCP -j MASQUERADEPS не материте сильно:) я в этом только начал копаться вполне возможно что вообще бред написал:(
У меня немного другое горе
есть шлюз который подк к инетe через VPN по тунелю
eth0 - лок
eth1 - внеш
ещё поднимается тунель ppp0
дык вот траф инетный видно на eth1 а не на ppp0
почему ?
как тут вести статистику по клиентам ?
Странно. Вроде должен подниматься pptp0 или я ошибаюсь?
Но все равно... Считай просто на eth0 да и все...
Мне нужно перенаправить входящие из инета пакеты на порт 1352 в другой порт но на локальной машине. Я пишу вот это:[root@localhost sbin]# iptables -t nat -A PREROUTING -p tcp -d 81.30.192.36 --dport 1352 -j DNAT --to-destination 192.168.1.2:1352
И мне он выдает вот это:
/lib/modules/2.4.18-6mdk/kernel/net/ipv4/netfilter/ip_tables.o.gz: init_module:
Device or resource busy
Hint: insmod errors can be caused by incorrect module parameters, including invalid IO or IRQ parameters
modprobe: insmod /lib/modules/2.4.18-6mdk/kernel/net/ipv4/netfilter/ip_tables.o.gz failed
modprobe: insmod ip_tables failed
iptables v1.2.5: can't initialize iptables table `nat': iptables who? (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.Что делать и как? Если можно то поподробнее я с линуксом знаком не давно и едро пересобирать не умею.
>Мне нужно перенаправить входящие из инета пакеты на порт 1352 в другой
>порт но на локальной машине. Я пишу вот это:
>
>[root@localhost sbin]# iptables -t nat -A PREROUTING -p tcp -d 81.30.192.36 --dport
>1352 -j DNAT --to-destination 192.168.1.2:1352
>
>И мне он выдает вот это:
>
>/lib/modules/2.4.18-6mdk/kernel/net/ipv4/netfilter/ip_tables.o.gz: init_module:
>Device or resource busy
>Hint: insmod errors can be caused by incorrect module parameters, including invalid
>IO or IRQ parameters
>modprobe: insmod /lib/modules/2.4.18-6mdk/kernel/net/ipv4/netfilter/ip_tables.o.gz failed
>modprobe: insmod ip_tables failed
>iptables v1.2.5: can't initialize iptables table `nat': iptables who? (do you need
>to insmod?)
>Perhaps iptables or your kernel needs to be upgraded.
>
>Что делать и как? Если можно то поподробнее я с линуксом знаком
>не давно и едро пересобирать не умею.В ядрах 2.4.18-5 нет поддержки iptables.
Решение:
Поставить другое ядро.
Например kernel-2.4.18-18mppe.i386.rpm
Взять его по этой ссылке. 12 мег..
http://prdownloads.sourceforge.net/poptop/kernel-2.4.18-18mp...
Хорошая штука, наверное, но, почему-то, до распаковки не узнаешь, что только для Апача_1.3.хх. У меня - 2.0.43, и инсталлироваться пакет не захотел. Может, чего-нибудь я не так делал? Буду признателен, если кто подскажет, как надо
A chem otlichaetsya eto ot togo chto napisano vyshe? Zachen sozdavat' otdel'nye chainy dlya pol'zovatelei esli mozhno sozdat' odin chain dlya nix, a tam prosto neskol'ko pravil?
#!/bin/bash
/sbin/iptables -N accounting
/sbin/iptables -I INPUT 1 -i ppp0 -j accounting
/sbin/iptables -I OUTPUT 1 -o ppp0 -j accounting
/sbin/iptables -I FORWARD 1 -i ppp0 -j accounting
/sbin/iptables -I FORWARD 1 -o ppp0 -j accounting
i=2
while [ $i -le 254 ]
do
/sbin/iptables -A accounting -i ppp0 -d 192.168.90.$i -j RETURN
/sbin/iptables -A accounting -o ppp0 -s 192.168.90.$i -j RETURN
i=`expr $i + 1`
done
Сделал биллинг на основе данного скрипта, вроде считает. Хотя все не так выглядит как хотелось бы.
Хотелось бы узнать:
Есть ли готовый скрипт который может анализировать эти текстовые файлы и создавать что нить более наглядное? Или может кто-нибудь поделиться мыслями какие шаги должны быть в скрипте для анализа этих текстовых файлов?
Хотелось бы просто видеть сколько мб прокачивается всего и по отдельным айпи в частности на одной странице .
немного програмирую на bash, но если вариантов нет попробую изучуть подходящий для этого язык.
Заранее спасибо за ответы.
быстро и просто кладет в базукаждый час
========================
iptables -vnxL -Z FORWARD |grep ACCEPT |grep -e "192.168" |perl stat.mysql.saver
сорс stat.mysql.saver
======================================
#! /usr/bin/perluse Mysql;
$db = Mysql->Connect('localhost', 'traffic', 'root');#!/usr/bin/perl
while (<STDIN>) {
#print $_;
($empty, $pkts, $bytes, $target, $prot, $opt, $in, $out, $source, $destination) = split(/\s+/);
#print $pkts;
#print "\n\r";
$sql = "insert into traffic values ('', '$pkts', '$bytes', '$target', '$prot', '$opt', '$in', '$out', '$sour
ce', '$destination', NOW())";
$db->Query($sql);
}
сделал скрипт, генерит страничку со статистикой,
скрин можно посмотреть здесь
http://sgb.irk.ru/~andrek/img/traf.jpg
базу кладет в mysql, работает с настройками iptables см. наверх.
скрипт лежит здесь
http://sgb.irk.ru/~andrek/files/start.pl
вся настройка внутри.
картинка симпотная, но сам скрипт недоступен - you don't have permission to access bla-bla.. сheck it, plz? :)
ок, проверил, права исправил :)
Статистики на месяц нету пока только по дням, мыслей есть много но нету времени..
Если кто сделает подсчет за месяц, кинь инфо плиз.
Успехов!
Андрей.
>ок, проверил, права исправил :)
>Статистики на месяц нету пока только по дням, мыслей есть много но
>нету времени..
>Если кто сделает подсчет за месяц, кинь инфо плиз.
>Успехов!
>Андрей.
спасибо :)
если не лениться не буду, может и сделаю статистику по месяцам
Вот еще одна рабочая ссылка на скрипт
http://wizardplus.irk.ru/~andrek/files/start.pl
Скрина нету, сами увидите при загрузке.
Использую простой метод сбора информации для дальнейшего расчета траффика,
который описан в руководствах по iptables.
Задаю правила на брэндмауэре (для эксперимента подключил свой компьютер
через брэндмауэр к локальной сети)
eth0(192.168.11.9) - включен в мой компьютер (ip 192.168.11.60),
eth1(192.168. 1.9) - в локальную сетьПравила такие:
iptables -A FORWARD -i eth1 -o eth0 -d 192.168.11.60 -j LOG --log-level info --log-prefix FORWARD paketsiptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.1.9
в /etc/syslog.conf добавил kernel.=info /var/log/iptables
Перекачиваю информацию из локальной сети (100Mbit) на свой компьютер.
При небольшом трафике все ОК, но при увеличении в лог попадают заголовки не всех пакетов.При суммировании длинны пакетов получилось следущее.
Выкачав информации объемом 400Mb я насчитал только порядка 20Mb.Да и при просмотре файла видно что количество строк раз в 10 меньше чем
должно было пройти пакетов.При использовании ULOG картина аналогичная.
Комманда iptables -v -L показывает все верно.
Может где нибудь необходимо размер какого-нибудь буфера увеличить ???.
>Комманда iptables -v -L показывает все верно.
>
>Может где нибудь необходимо размер какого-нибудь буфера увеличить ???.может здесь зарыта собака:
man iptables, далее смотри --limit rate
лимиты совпадений, по умолчанию допускается 3 совпадения в час
# Насчет всяких там ограничений по счетчикам...IN=`iptables -L INPUT -v -x | grep traf | awk '{print $2}'`
FW=`iptables -L FORWARD -v -x | grep traf | awk '{print $2}'`echo qwerty | awk -v inp=$IN -v fwd=$FW '
{
printf "INPUT + FORWARD = %f\n", a+b;
printf "INPUT=.6f FORWARD=.6f\n",a,b;
}'# awk посчитает все во float'е, и числа могут
# быть о-чень большого размера, кому не лень -
# попробуйте... Здесь счетчики в байтах, кому не
# нравится - можно поделить на 1024, а можно -
# и еще раз...
Sorry, в предыдущем тексте непонятки с квадратиками... Это стандартный сишный printf float-чисел, например - процент14.6f.
Вот мой скрип, был написан за пару часов. Так что несколько кривоват, но работает и решает проблему добавления юзеров (ип-адресов)=====================[tcount]=
#!/bin/bash. /etc/tcount/tcount.conf
HOSTS=`cat $HOSTS_ACCEPT_CONF`
ins_mod() {
for MOD in $IP_MOD
do
M=`lsmod | grep ^$MOD`
if [ -z "$M" ]
then
`modprobe $MOD`
fi
done
}
addrule() {
$IPTABLES -N TCOUNT_OUT_$1
$IPTABLES -N TCOUNT_IN_$1
$IPTABLES -F TCOUNT_OUT_$1
$IPTABLES -F TCOUNT_IN_$1
$IPTABLES -A INPUT -j TCOUNT_IN_$1
$IPTABLES -A FORWARD -j TCOUNT_OUT_$1
$IPTABLES -A FORWARD -j TCOUNT_IN_$1
$IPTABLES -A OUTPUT -j TCOUNT_OUT_$1
$IPTABLES -A TCOUNT_OUT_$1 -s $2
$IPTABLES -A TCOUNT_IN_$1 -d $2
$IPTABLES -t nat -A POSTROUTING -s $1 -o eth0 -j SNAT --to-source 192.168.1.1
}rmrule() {
$IPTABLES -D INPUT -j TCOUNT_IN_$1
$IPTABLES -D FORWARD -j TCOUNT_OUT_$1
$IPTABLES -D FORWARD -j TCOUNT_IN_$1
$IPTABLES -D OUTPUT -j TCOUNT_OUT_$1
$IPTABLES -D TCOUNT_OUT_$1 -s $2
$IPTABLES -D TCOUNT_IN_$1 -d $2
$IPTABLES -F TCOUNT_OUT_$1
$IPTABLES -F TCOUNT_IN_$1
$IPTABLES -X TCOUNT_OUT_$1
$IPTABLES -X TCOUNT_IN_$1
$IPTABLES -t nat -D POSTROUTING -s $1 -o eth0 -j SNAT --to-source 192.168.1.1
}start() {
ins_mod
echo "adding rules"
for HOST in $HOSTS
do
addrule $HOST $HOST
done
}stop() {
echo "removing rules"
for HOST in $HOSTS
do
rmrule $HOST $HOST
done
}restart() {
stop
start
}if [ "$1" = "start" ]
then
start
elif [ "$1" = "stop" ]
then
stop
elif [ "$1" = "restart" ]
then
restart
else
echo "use: $0 {start|stop|restart}"
fi
# END
=====================[write]=
#!/bin/bashMYSQL="/usr/bin/mysql -utcount --password=password tcount -e"
IPTABLES="/sbin/iptables"DATE=`date +"%Y-%m-%d"`
NAME="Test"my_write() {
sql="INSERT INTO \`traffic\` ( \`id\` , \`date\` , \`ip\` , \`inb\` , \`outb\` ) VALUES ( '' , '$DATE', '$1', '$TRAF_IN', '$TRAF_OUT' );"
`$MYSQL "$sql"`
}my_change() {
OLD_IN=`$MYSQL "$sql" | sed -e "1d" | awk '{print $1}'`
OLD_OUT=`$MYSQL "$sql" | sed -e "1d" | awk '{print $2}'`
let "NEW_IN = $TRAF_IN + $OLD_IN"
let "NEW_OUT = $TRAF_OUT + $OLD_OUT"
sql="UPDATE \`traffic\` SET \`inb\` = '$NEW_IN', \`outb\` = '$NEW_OUT'
WHERE \`date\` = '$DATE' AND \`ip\` = '$1' LIMIT 1 ;"
`$MYSQL "$sql"`
}work() {
sql="SELECT inb , outb FROM traffic WHERE date='$DATE' AND ip LIKE '$1'"
IN=`$MYSQL "$sql" | sed '1d' | awk '{print $1}'`
OUT=`$MYSQL "$sql" | sed '1d' | awk '{print $2}'`
TRAF_OUT=`$IPTABLES -L -Z TCOUNT_OUT_$1 -x -v | sed -e "1,2D" | awk '{print $2}' | sed -e '2d'`
TRAF_IN=`$IPTABLES -L -Z TCOUNT_IN_$1 -x -v | sed -e "1,2D" | awk '{print $2}' | sed -e '2d'`
echo "$TRAF_IN"
if [ "$IN" = "" ]
then
my_write $1
else
my_change $1
fi}
for HOST in `cat /etc/tcount/accept.conf`
do
work $HOST
done#END
=====================[accept.conf]=
192.168.0.1
192.168.0.3
192.168.0.4
192.168.0.5
192.168.0.6=====================[tcount.conf]=
IPTABLES="/sbin/iptables"
HOSTS_ACCEPT_CONF="/etc/tcount/accept.conf"
IP_MOD="iptable_nat ipt_conntrack iptable_filter ip_tables"tcount - добавляет и удаляет правила
write - пишет статистику в базу
accept.conf - список хостов которым разрешен доступ в инет
tcount.conf - пути
Кто искал готовое решение по учету траффика для пользователей с разделением на внешний- забугорный и т.д. рекомендую взглянуть: http://stg.dp.ua/