Расчет трафика через Iptables

Каждому администратору рано или поздно приходится искать ответ на вопрос: "Какой трафик генерирует каждый из узлов моей сети?". Решению этой проблемы с использованием iptables и Linux и посвящена данная статья .

[Константин Будько (budkokv@online.ru)]

В свое время у меня возникла задача измерения трафика пользователей и трафика от провайдера. При использовании iptables решение достаточно легкое, нетрудоемкое, хотя и имеет свои ограничения. О них позже.

Конфигурация сети:
От провайдера HDCL в CISCO 1601
Далее в роутер (ASPLinux 8.2) с двумя интерфейсами
Далее в локальную сеть.

На роутере только SSH и DNS (пока).

И два скрипта: правил фильтрации и счетчиков

##########################################################################
# ! /bin/bash
# iptables.load - установка правил
# Входящие политики по умолчанию
...*
# Дополнительные цепочки
...*
# Цепочки для расчета трафика приходящего на внешний интефейс
# Таким образом мы имеем весь трафик который к нам 
# пришел от провайдера.
/sbin/iptables -N in_traf
/sbin/iptables -N fwd_in_traf
# Цепочки для расчета трафика по пользователям
i=1
while [ $i -le 254 ]
    do
        /sbin/iptables -N chain_$i
        i=`expr $i + 1`
    done
# Работа цепочек
...*
# Работа цепочек по расчету трафика
/sbin/iptables -A in_traf -j RETURN
/sbin/iptables -A fwd_in_traf -j RETURN
i=1
while [ $i -le 254 ]
    do
        /sbin/iptables -A chain_$i -j RETURN
        i=`expr $i + 1`
    done
# Работа входящей цепочки
# Эти цепочки должны стоять обязательно первыми.
/sbin/iptables -A INPUT -i eth1 -j in_traf
...*
# Работа цепочки роутинга
# Эти цепочки должны стоять обязательно первыми.
i=1
while [ $i -le 254 ]
    do
        /sbin/iptables -A FORWARD -o eth0 -d 192.168.1.$i -j chain_$i
        i=`expr $i + 1`
    done
/sbin/iptables -A FORWARD -i eth1 -j fwd_in_traf
...*
# Работа исходящей цепочки
...*
# Работа цепочки маскарадинга
...*
# End
#########################################################################
*... - здесь должны быть ваши правила.
Этот файл нужно поставить в автозагрузку.

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

#############################################################################
# ! /bin/bash
# traf.logging - Сбор трафика в файлы *.xls
# Смена директории по умолчанию
# Эти файлы находятся в директории /root
# поэтому мне было проще писать их в поддиректорию
# откуда ини забираются по ssh и спокойно открываются в Excel'e
# В результате получаются файлы с именами "номер месяца".xls и 
# users_"номер месяца".xls
# Внутри него создается таблица вида:
# Дата - последний байт ip адреса - трафик в байтах
cd /root/trafic
# Присваивание параметров для мониторинга
MNTH=`date +%m`
DAT=`date +%d`
# Расчет величины трафика входящего на интерфeйс 
# eth1 ( Внешний интерфейс)
# Максимальный расчетный трафик за день - 953МВ
IN=`/sbin/iptables -L INPUT -v -x | grep traf | head -c 18 | tail -c 9`
FW=`/sbin/iptables -L FORWARD -v -x | grep traf | head -c 18 | tail -c 9`
RX=`expr $IN + $FW`
# Вывод расчетной величины трафика в файл
echo "$DAT	$RX" >> ${MNTH}.xls
# Расчет индивидуальных пользователей
i=1
while [ $i -le 254 ]
    do
        RX=`/sbin/iptables -L FORWARD -v -x | grep chain_$i | head -c 18 | tail -c 9`
        if [ $RX -ne 0 ]
            then echo "$DAT	$i	$RX" >> users_${MNTH}.xls
        fi
        i=`expr $i + 1`
    done
# Очистка счетчиков трафика для следующего дня
/sbin/iptables -Z
# Done
###############################################################################

Я думаю, что многим станет понятно ограничение в 953МВ в день на каждого из пользователей и на общий трафик. Просто знаков в получаемом числе только 9. Заметьте, что в командах echo используются не пробелы, а символы табуляции. Excel так проще.

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

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

[Источник: Opennet.ru]

[ опубликовано 17/04/2003 ]

Константин Будько (budkokv@online.ru) - Расчет трафика через Iptables   Версия для печати