Date: 30 Aug 2002
From: Switch(TX) <budkokv@online.ru>
Subject: [Linux] Расчет трафика через Iptables.
В свое время у меня возникла задача измерения трафика пользователей и трафика от провайдера.
При использовании 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'ю как проще.
И еще одно ограничение: поскольку мы не считаем трафик, который идет от приложений роутера к пользователям, то возможна очень маленькая погрешность.
И последнее. Если вдруг можно было сделать иначе или у меня есть ошибки – то просто напишите от этом. В Линуксе я недавно.