Учёт трафика с помощью IpTables.

Софт под Linux, разные программы, но только связанные с Linux

Модератор: /dev/random

Electron
Сообщения: 201
ОС: Можно Windows написать? :-)

Учёт трафика с помощью IpTables.

Сообщение Electron »

Вечер добрый. Создавал ли кто-нибудь скрипты для учёта трафика с помощью IpTables? Что-нибудь вроде: написал правило; скрипт считал количество байт для заданного правила; записал в файл.

Если не жалко - поделитесь, пожалуйста. :rolleyes:
Gentoo Linux 2006.0 from Stage3-Pentium4 on Intel Celeron 2.1 Ghz, 512M RAM, NV GeForce 5200FX
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Учёт трафика с помощью IpTables.

Сообщение elide »

ну у меня достаточно специфичная хреновина...

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

clear(){
    $IPT -F
    $IPT -X
    $IPT -P INPUT $1
    $IPT -P FORWARD $1
    $IPT -P OUTPUT $1

######## TRAFFIC COUNTERS!!! DON'T REMOVE ########
        $IPT -A INPUT -i $PPP -s xxx.xxx.xxx.xxx/24
        $IPT -A OUTPUT -o $PPP -d xxx.xxx.xxx.xxx/24
        $IPT -A INPUT -i $PPP ! -s xxx.xxx.xxx.xxx/24
        $IPT -A OUTPUT -o $PPP ! -d xxx.xxx.xxx.xxx/24
#################################################
}
это в /etc/rc.d/rc.firewall
#!/bin/sh
(
D=`date -Iseconds`
echo $D input `iptables -L -Z INPUT -vnx | awk '{if(NR==3)print "inner: "$2; if(NR==4)print "outer: "$2}'`
echo $D output `iptables -L -Z OUTPUT -vnx | awk '{if(NR==3)print "inner: "$2; if(NR==4)print "outer: "$2}'`
echo
) >> /var/log/ipt_traf_log
это скрипт, который по крону запускается для сбора статистики.

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

#!/bin/sh

FILE=/var/log/ipt_traf_log

FORMAT=full

function calc(){
        awk '
                BEGIN {
                        II=0;
                        IO=0;
                        OI=0;
                        OO=0;
                        mb=1024*1024;
                        green="\033[40m\033[1;32m";
                        red = "\033[40m\033[1;31m";
                        yell ="\033[40m\033[1;33m";
                        normal="\033[0m";

                }
                END {
                        if(FF == "full"){
                                printf("Period: %s%s%s\n", green, PERIOD, normal);
                                printf("\tInner traffic:\n");
                                printf("\t\tinbound : %8.3f Mb (%10d b)\n",II/mb,II);
                                printf("\t\toutbound: %8.3f Mb (%10d b)\n",IO/mb,IO);
                                printf("\tOuter traffic:\n");
                                printf("\t\tinbound : %8.3f Mb (%10d b)\n",OI/mb,OI);
                                printf("\t\toutbound: %8.3f Mb (%10d b)\n",OO/mb,OO);
                        }
                        if(FF == "compact"){
                                printf("Inner: ");
                                printf("%8.3f M ",II/mb);
                                printf("%8.3f M    |||    ",IO/mb);
                                printf("Outer: ");
                                printf("%8.3f M ",OI/mb);
                                printf("%8.3f M\n",OO/mb);
                        }
                }
                /input/ {II+=strtonum($4); OI+=strtonum($6);}
                /output/ {IO+=strtonum($4); OO+=strtonum($6);}
                ' PERIOD=$1 FF=$FORMAT
}

function hour(){
        HOUR=`date -Ihour | grep -Po "^[^+:]+"`
        cat "$FILE" | grep $HOUR | calc Hour
}
function day(){
        cat "$FILE" | grep `date -I` | calc Day
}
function month(){
        MONTH=`date -Ihour | grep -Po "^\d+-\d+"`
        cat "$FILE" | grep $MONTH | calc Month
}
function overall(){
        cat "$FILE" | calc Overall
}

while getopts hdmtac opt
do
        case "$opt" in
                h)FUNC=hour;;
                d)FUNC=day;;
                m)FUNC=month;;
                t)FUNC=overall;;
                a)FUNC='hour; day; month; overall';;
                c)FORMAT=compact;;
        esac
done

eval ${FUNC:-'day'}
а это - скрипт trafstat, который по логам считает потребление.
специфика всего этого - то, что считается только два вида траффика на ppp0 - внутри сети провайдера и наружу. потому как они оплачиваются отдельно. но принцип тут понятен, так что можно обощить для любых правил.
слава роботам!
Спасибо сказали:
Electron
Сообщения: 201
ОС: Можно Windows написать? :-)

Re: Учёт трафика с помощью IpTables.

Сообщение Electron »

Огромное спасибо! :P
Gentoo Linux 2006.0 from Stage3-Pentium4 on Intel Celeron 2.1 Ghz, 512M RAM, NV GeForce 5200FX
Спасибо сказали:
hello
Сообщения: 3

Re: Учёт трафика с помощью IpTables.

Сообщение hello »

Вопрос к тем кто знает:

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

#!/bin/sh

FILE=/var/log/ipt_traf_log

FORMAT=full

function calc(){
        awk '
                BEGIN {
                        II=0;
                        IO=0;
                        OI=0;
                        OO=0;
                        mb=1024*1024;
                        green="\033[40m\033[1;32m";
                        red = "\033[40m\033[1;31m";
                        yell ="\033[40m\033[1;33m";
                        normal="\033[0m";

                }
                END {
                        if(FF == "full"){
                                printf("Period: %s%s%s\n", green, PERIOD, normal);
                                printf("\tInner traffic:\n");
                                printf("\t\tinbound : %8.3f Mb (%10d b)\n",II/mb,II);
                                printf("\t\toutbound: %8.3f Mb (%10d b)\n",IO/mb,IO);
                                printf("\tOuter traffic:\n");
                                printf("\t\tinbound : %8.3f Mb (%10d b)\n",OI/mb,OI);
                                printf("\t\toutbound: %8.3f Mb (%10d b)\n",OO/mb,OO);
                        }
                        if(FF == "compact"){
                                printf("Inner: ");
                                printf("%8.3f M ",II/mb);
                                printf("%8.3f M    |||    ",IO/mb);
                                printf("Outer: ");
                                printf("%8.3f M ",OI/mb);
                                printf("%8.3f M\n",OO/mb);
                        }
                }
                /input/ {II+=strtonum($4); OI+=strtonum($6);}
                /output/ {IO+=strtonum($4); OO+=strtonum($6);}
                ' PERIOD=$1 FF=$FORMAT
}

function hour(){
        HOUR=`date -Ihour | grep -Po "^[^+:]+"`
        cat "$FILE" | grep $HOUR | calc Hour
}
function day(){
        cat "$FILE" | grep `date -I` | calc Day
}
function month(){
        MONTH=`date -Ihour | grep -Po "^\d+-\d+"`
        cat "$FILE" | grep $MONTH | calc Month
}
function overall(){
        cat "$FILE" | calc Overall
}

while getopts hdmtac opt
do
        case "$opt" in
                h)FUNC=hour;;
                d)FUNC=day;;
                m)FUNC=month;;
                t)FUNC=overall;;
                a)FUNC='hour; day; month; overall';;
                c)FORMAT=compact;;
        esac
done

eval ${FUNC:-'day'}


Почему выдается следующая ошибка?

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

./script -h
grep: Ключ -P не поддерживается
Использование: grep [OPTION]... PATTERN [FILE]...
Попробуйте `grep --help' для получения более подробного описания.


Как поправить скрипт чтобы заработал? в мануале то про -P говорится что поддерживается.
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Учёт трафика с помощью IpTables.

Сообщение Portnov »

-P может и не поддерживаться. Юзайте в таком случае pcregrep (это отдельный пакет).
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
xorader
Сообщения: 1030
Статус: собирающий миры
ОС: Debian

Re: Учёт трафика с помощью IpTables.

Сообщение xorader »

...или egrep
Molchanov Alexander (aka Xor)
*offtopic* - ololo!
Спасибо сказали: