iptables traffic counter Версия для печати   


Не претендую на новизну. Но потратив некоторое время на поиски чего-нибудь простого и подходящего мне, к сожалению, как всегда пришел к выводу читайте man и howto и пользуйтесь /dev/hands.
Если честно то периодически лень берет верх

Используется только IPTABLES и bash.
Конфигурация:
RH 8.0 - Server/Firewall and etc
eth0 - смотрит наружу IP: 192.168.0.10
eth1- смотрит в мою local'ку IP: 10.0.0.1
В local'ке две машины Workstation and Laptop, иногда брат приезжает с третьей машиной, будем называть его OTHER.
За основу взяты некоторые scripts публично доступные.


  1. Нужно считать трафик TCP как INBOUND так и OUTBOUND.
  2. Трафик с провайдерской сеткой.
  3. Траффик с интернетом.
  4. Ну и конечно сколько жрет внешнего трафика каждая машина.

(P.S. Если все это будет полезно для кого-то, то мне будет приятно)
Поехали:
Начнем с того что надо вставить пару строчек (не совсем пару но кто хочет может вынести их в отдельный файл) в ваш script который настраивает iptables.

1. Переменные используемые в скрипте firwall'а:
IPTABLES="/sbin/iptables"
# 1.1 Your external device
INET_IP="192.168.0.10"
INET_IFACE="eth0"

# 1.2 Internet Service Provider's Network
ISP_IP="192.168.0.1"
ISP_IP_RANGE="192.168.0.0/24"

# Local Area Network configuration.
# your LAN's IP range and localnet host's IP. /24 means to only use the first 24
# bits of the 32 bit IP address. the same as netmask 255.255.255.0

LAN_IP="10.0.0.1"
LAN_IP_RANGE="10.0.0.0/24"
LAN_IFACE="eth1"
LAN_IP_WORKSTATION="10.0.0.11"
LAN_IP_LAPTOP="10.0.0.10"


Это мы установили переменные, которые в дальнейшем будут использоваться, ну и для удобочитаемости пригодятся.

2. Настраиваем chains/цепочки INPUT, OUTPUT and FORWARD чтобы отобрать трафика который нас интересует. По команде -j RETURN в цепочках для расчета траффика, пакет вернется на следующее правило которое следует за нашими правилами для INPUT, OUTPUT и FORWARD. Так что не волнуйтесь мышь не проскочит. Эти правила должны стоять первыми в своих цепочках.
# Перенаправляем трафик входящий с внешнего устройства
$IPTABLES -A INPUT -d $INET_IP -i $INET_IFACE -j TRAFFIC
# Перенаправляем трафик локальной сети
$IPTABLES -A FORWARD -o $LAN_IFACE -d $LAN_IP_RANGE -j TRAFFIC_FW
$IPTABLES -A FORWARD -s $LAN_IP_RANGE -o $INET_IFACE -j TRAFFIC_FW

# Перенаправляем трафик исходящий с внешнего устройства
$IPTABLES -A OUTPUT -s $INET_IP -o $INET_IFACE -j TRAFFIC

3. Далее настраиваем chains/цепочки которые будем использовать для расчета трафика
# Create separate chains for TRAFFIC Counter
$IPTABLES -N TRAFFIC
# Для трафика с localnet
$IPTABLES -N TRAFFIC_FW
# Для IN трафика вашего сервера
$IPTABLES -N TRAFFIC_TCP_INBOUND
# Для OUT трафика вашего сервера
$IPTABLES -N TRAFFIC_TCP_OUTBOUND

# Your overall INBOUND and OUTBOUND traffic with external network except ISP ip range
# Ваш INBOUND and OUTBOUND traffic с внешней сетью за исключением провайдерской подсети
$IPTABLES -N TRAFFIC_TCP_INBOUND_EXT
$IPTABLES -N TRAFFIC_TCP_OUTBOUND_EXT

# Your overall INBOUND and OUTBOUND traffic with ISP network
# Ваш INBOUND and OUTBOUND traffic с провайдерской подсетью
$IPTABLES -N TRAFFIC_TCP_INBOUND_ISP
$IPTABLES -N TRAFFIC_TCP_OUTBOUND_ISP

# Your overall INBOUND and OUTBOUND traffic of your server
$IPTABLES -N TRAFFIC_TCP_INBOUND_SERVER
$IPTABLES -N TRAFFIC_TCP_OUTBOUND_SERVER

# Your overall INBOUND and OUTBOUND traffic of your local network
$IPTABLES -N TRAFFIC_TCP_INBOUND_FRWD
$IPTABLES -N TRAFFIC_TCP_INBOUND_WS
$IPTABLES -N TRAFFIC_TCP_INBOUND_LAPTOP
$IPTABLES -N TRAFFIC_TCP_INBOUND_LNET

#
$IPTABLES -N TRAFFIC_TCP_OUTBOUND_FRWD
$IPTABLES -N TRAFFIC_TCP_OUTBOUND_WS
$IPTABLES -N TRAFFIC_TCP_OUTBOUND_LAPTOP
$IPTABLES -N TRAFFIC_TCP_OUTBOUND_LNET


4. Далее настраиваем chains/цепочки чтобы они работали так как нам нужно и разбрасывали трафик по подцепочкам (Будьте внимательны не все команды уместились на одной строке)

#
# Create content for TRAFFIC chains
#*********************************************************** *****
# Основная цепочка, здесь фильтруется трафик для сервера на IN and OUT

$IPTABLES -A TRAFFIC -p tcp -d $INET_IP -i $INET_IFACE -j TRAFFIC_TCP_INBOUND
$IPTABLES -A TRAFFIC -p tcp -s $INET_IP -o $INET_IFACE -j TRAFFIC_TCP_OUTBOUND
$IPTABLES -A TRAFFIC -j RETURN

# Основная цепочка здесь фильтруется трафик для localnetwork на IN and OUT
$IPTABLES -A TRAFFIC_FW -p tcp -d $LAN_IP_RANGE -o $LAN_IFACE -j TRAFFIC_TCP_INBOUND_FRWD
$IPTABLES -A TRAFFIC_FW -p tcp -s $LAN_IP_RANGE -o $INET_IFACE -j TRAFFIC_TCP_OUTBOUND_FRWD
$IPTABLES -A TRAFFIC_FW -j RETURN




# Исходящий трафик с localnetwork
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_FRWD -s $LAN_IP_LAPTOP -o $INET_IFACE -j TRAFFIC_TCP_OUTBOUND_LAPTOP
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_FRWD -s $LAN_IP_WORKSTATION -o $INET_IFACE -j TRAFFIC_TCP_OUTBOUND_WS
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_FRWD -s $LAN_IP_RANGE -o $INET_IFACE -j TRAFFIC_TCP_OUTBOUND_LNET
# Redirect для подсчета трафика для ISP и Internet
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_FRWD -s $LAN_IP_RANGE -o $INET_IFACE -d $ISP_IP_RANGE -j TRAFFIC_TCP_OUTBOUND_ISP
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_FRWD -s $LAN_IP_RANGE -o $INET_IFACE ! -d $ISP_IP_RANGE -j TRAFFIC_TCP_OUTBOUND_EXT
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_FRWD -j RETURN

# Исходящий трафик с Work Station
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_WS -j RETURN
# Исходящий трафик с Laptop
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_LAPTOP -j RETURN
# Исходящий трафик с OTHER т.е. весь оставшийся
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_LNET -j RETURN

# Исходящий трафик с Server/Firewall
# Redirect для подсчета траффика для ISP и Internet
$IPTABLES -A TRAFFIC_TCP_OUTBOUND -s $INET_IP -o $INET_IFACE -d $ISP_IP_RANGE -j TRAFFIC_TCP_OUTBOUND_ISP
$IPTABLES -A TRAFFIC_TCP_OUTBOUND -s $INET_IP -o $INET_IFACE ! -d $ISP_IP_RANGE -j TRAFFIC_TCP_OUTBOUND_EXT
$IPTABLES -A TRAFFIC_TCP_OUTBOUND -s $INET_IP -o $INET_IFACE -j TRAFFIC_TCP_OUTBOUND_SERVER
$IPTABLES -A TRAFFIC_TCP_OUTBOUND -j RETURN


# Трафик предназначенный для ISP
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_ISP -j RETURN
# Трафик предназначенный для Internet
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_EXT -j RETURN
# Исходящий трафик с Server/Firewall
$IPTABLES -A TRAFFIC_TCP_OUTBOUND_SERVER -j RETURN



# Входящий трафик на Server/Firewall
# Redirect для подсчета трафика от ISP и Internet
$IPTABLES -A TRAFFIC_TCP_INBOUND -d $INET_IP -i $INET_IFACE -s $ISP_IP_RANGE -j TRAFFIC_TCP_INBOUND_ISP
$IPTABLES -A TRAFFIC_TCP_INBOUND -d $INET_IP -i $INET_IFACE ! -s $ISP_IP_RANGE -j TRAFFIC_TCP_INBOUND_EXT
$IPTABLES -A TRAFFIC_TCP_INBOUND -d $INET_IP -i $INET_IFACE -j TRAFFIC_TCP_INBOUND_SERVER
$IPTABLES -A TRAFFIC_TCP_INBOUND -j RETURN

# От ISP
$IPTABLES -A TRAFFIC_TCP_INBOUND_ISP -j RETURN
# От Internet
$IPTABLES -A TRAFFIC_TCP_INBOUND_EXT -j RETURN
# Входящий трафик на Server/Firewall
$IPTABLES -A TRAFFIC_TCP_INBOUND_SERVER -j RETURN

# Входящий трафик на localnetwork
$IPTABLES -A TRAFFIC_TCP_INBOUND_FRWD -d $LAN_IP_LAPTOP -o $LAN_IFACE -j TRAFFIC_TCP_INBOUND_LAPTOP
$IPTABLES -A TRAFFIC_TCP_INBOUND_FRWD -d $LAN_IP_WORKSTATION -o $LAN_IFACE -j TRAFFIC_TCP_INBOUND_WS
$IPTABLES -A TRAFFIC_TCP_INBOUND_FRWD -d $LAN_IP_RANGE -o $LAN_IFACE -j TRAFFIC_TCP_INBOUND_LNET
# Redirect для подсчета трафика от ISP и Internet
$IPTABLES -A TRAFFIC_TCP_INBOUND_FRWD -d $LAN_IP_RANGE -o $LAN_IFACE -s $ISP_IP_RANGE -j TRAFFIC_TCP_INBOUND_ISP
$IPTABLES -A TRAFFIC_TCP_INBOUND_FRWD -d $LAN_IP_RANGE -o $LAN_IFACE ! -s $ISP_IP_RANGE -j TRAFFIC_TCP_INBOUND_EXT
$IPTABLES -A TRAFFIC_TCP_INBOUND_FRWD -j RETURN

# Входящий трафик на Workstation
$IPTABLES -A TRAFFIC_TCP_INBOUND_WS -j RETURN
# Входящий трафик на Laptop
$IPTABLES -A TRAFFIC_TCP_INBOUND_LAPTOP -j RETURN
# Входящий трафик на OTHER т.е. все отальные
$IPTABLES -A TRAFFIC_TCP_INBOUND_LNET -j RETURN

С настройками iptables покончено

5. Далее пишем скрипт который выполняется cron/кроном он будет запрашивать iptables, подсчитывать и выводить отчеты по трафику либо на /dev/stdout либо в файл путь к которому указывается в начале скрипта.
Пример команды запуска скрипта:
/sbin/traflog -s -p
Данная команда выводит на /dev/stdout статистику для вашего сервера.
( Будте внимательны Вывод в файл по умолчанию. )

#!/bin/sh
#
#    traflog - logger of iptable's statistic
#
# Path to your system iptables
IPTABLES="/sbin/iptables"
# Path to dir with log output
F_PATH="/var/log/firewall/traflog"
#
# Files have names like 'YearMonthDate . whose trafic
F_LNET="$F_PATH/"`date +"%Y%m%d"`".lnet"
F_SERV="$F_PATH/"`date +"%Y%m%d"`".serv"
F_OVER="$F_PATH/"`date +"%Y%m%d"`".over"
F_ALL="$F_PATH/"`date +"%Y%m%d"`".all"

LAPTOP_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND_LAPTOP -v -x -n | grep RETURN | head -c 18 | tail -c 9`
WS_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND_WS -v -x -n | grep RETURN | head -c 18 | tail -c 9`
LNET_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND_LNET -v -x -n | grep RETURN | head -c 18 | tail -c 9`
LNET_ISP_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND_FRWD -v -x -n | grep TRAFFIC_TCP_INBOUND_ISP | head -c 18 | tail -c 9`
LNET_EXT_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND_FRWD -v -x -n | grep TRAFFIC_TCP_INBOUND_EXT | head -c 18 | tail -c 9`

LAPTOP_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND_LAPTOP -v -x -n | grep RETURN | head -c 18 | tail -c 9`
WS_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND_WS -v -x -n | grep RETURN | head -c 18 | tail -c 9`
LNET_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND_LNET -v -x -n | grep RETURN | head -c 18 | tail -c 9`
LNET_ISP_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND_FRWD -v -x -n | grep TRAFFIC_TCP_OUTBOUND_ISP | head -c 18 | tail -c 9`
LNET_EXT_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND_FRWD -v -x -n | grep TRAFFIC_TCP_OUTBOUND_EXT | head -c 18 | tail -c 9`

SERVER_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND_SERVER -v -x -n | grep RETURN | head -c 18 | tail -c 9`
SERVER_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND_SERVER -v -x -n | grep RETURN | head -c 18 | tail -c 9`
SERVER_ISP_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND -v -x -n | grep TRAFFIC_TCP_INBOUND_ISP | head -c 18 | tail -c 9`
SERVER_ISP_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND -v -x -n | grep TRAFFIC_TCP_OUTBOUND_ISP | head -c 18 | tail -c 9`
SERVER_EXT_IN=`$IPTABLES -L TRAFFIC_TCP_INBOUND -v -x -n | grep TRAFFIC_TCP_INBOUND_EXT | head -c 18 | tail -c 9`
SERVER_EXT_OUT=`$IPTABLES -L TRAFFIC_TCP_OUTBOUND -v -x -n | grep TRAFFIC_TCP_OUTBOUND_EXT | head -c 18 | tail -c 9`

SERVER_OVR_IN=`expr $SERVER_EXT_IN + $SERVER_ISP_IN`
SERVER_OVR_OUT=`expr $SERVER_EXT_OUT + $SERVER_ISP_OUT`

OVR_ISP_IN=`expr $LNET_ISP_IN + $SERVER_ISP_IN`
OVR_ISP_OUT=`expr $LNET_ISP_OUT + $SERVER_ISP_OUT`
OVR_EXT_IN=`expr $LNET_EXT_IN + $SERVER_EXT_IN`
OVR_EXT_OUT=`expr $LNET_EXT_OUT + $SERVER_EXT_OUT`

OVR_IN=`expr $SERVER_OVR_IN + $LNET_IN`
OVR_OUT=`expr $SERVER_OVR_OUT + $LNET_OUT`
OVERALL=`expr $OVR_IN + $OVR_OUT`

############################################################ #####
#			Here is output for local network	#
############################################################ #####
localtraf() {
    echo "" >> $F_LNET
    echo `date +"%d/%m/%Y  %T"`"	TRAFFIC FOR LOCAL NET" >> $F_LNET
    echo "Input		Output			Description" >> $F_LNET
    echo "$LAPTOP_IN	$LAPTOP_OUT		Laptop" >> $F_LNET
    echo "$WS_IN	$WS_OUT		Workstation:" >> $F_LNET
    echo "$LNET_ISP_IN	$LNET_ISP_OUT		Local Network to TSP" >> $F_LNET
    echo "$LNET_EXT_IN	$LNET_EXT_OUT		Local Network to Internet" >> $F_LNET
    echo "------------------------------------------------------ --------------" >> $F_LNET
    echo "$LNET_IN	$LNET_OUT		Overall for Local Network" >> $F_LNET
}
############################################################ #####
#			Here is output for Server		#
############################################################ #####
servertraf() {
    echo "" >> $F_SERV
    echo `date +"%d/%m/%Y  %T"`"	TRAFFIC FOR SERVER" >> $F_SERV
    echo "Input		Output			Description" >> $F_SERV
    echo "$SERVER_IN	$SERVER_OUT		Server" >> $F_SERV
    echo "$SERVER_ISP_IN	$SERVER_ISP_OUT		Server to ISP" >> $F_SERV
    echo "$SERVER_EXT_IN	$SERVER_EXT_OUT		Server to Internet" >> $F_SERV
    echo "------------------------------------------------------ --------------" >> $F_SERV
    echo "$SERVER_OVR_IN		$SERVER_OVR_OUT			Overall for Server" >> $F_SERV
}
############################################################ #####
#			Here is output for Overall		#
############################################################ #####
overalltraf() {

    echo "" >> $F_OVER
    echo `date +"%d/%m/%Y  %T"`"	OVERALL TRAFFIC FOR:    "`hostname` >> $F_OVER
    echo "Input		Output			Description" >> $F_OVER
    echo "$LNET_IN	$LNET_OUT		LOCAL NETWORK" >> $F_OVER
    echo "$SERVER_OVR_IN		$SERVER_OVR_OUT			SERVER" >> $F_OVER
    echo "$OVR_ISP_IN		$OVR_ISP_OUT			With ISP" >> $F_OVER
    echo "$OVR_EXT_IN		$OVR_EXT_OUT			Internet" >> $F_OVER
    echo "------------------------------------------------------ --------------" >> $F_OVER
    echo "$OVR_IN		$OVR_OUT			TOTALL" >> $F_OVER
}
############################################################ #####
#			Here is short output for Overall	#
############################################################ #####
shorttraf() {

    echo `date +"%d/%m/%Y  %T"`"	INBOUND: $OVR_IN	OUTBOUND: $OVR_OUT" >> $F_ALL
}
resettraf() {
    $IPTABLES -Z
}

case "$1" in

    -b)
	if [ "$2" = "-p" ]; then
		F_ALL="/dev/stdout"
	fi
	shorttraf
	if [ "$2" = "-r" ]; then
		resettraf
	fi
	RETVAL=0
	;;
    -o)
    	if [ "$2" = "-p" ]; then
		F_OVER="/dev/stdout"
	fi
	overalltraf 
	if [ "$2" = "-r" ]; then
		resettraf
	fi
	RETVAL=0
	;;
    -l)
    	if [ "$2" = "-p" ]; then
		F_LNET="/dev/stdout"
	fi
	localtraf
	if [ "$2" = "-r" ]; then
		resettraf
	fi
	RETVAL=0
	;;
    -s)
    	if [ "$2" = "-p" ]; then
		F_SERV="/dev/stdout"
	fi
	servertraf 
	if [ "$2" = "-r" ]; then
		resettraf
	fi
	RETVAL=0
	;;
    -a)
    	if [ "$2" = "-p" ]; then
		F_ALL="/dev/stdout"
		F_LNET="/dev/stdout"
		F_SERV="/dev/stdout"
		F_OVER="/dev/stdout"
	fi
	localtraf
	servertraf
	overalltraf
	shorttraf
	if [ "$2" = "-r" ]; then
		resettraf
	fi
	RETVAL=0
	;;
    *)
	echo $"usage: traflog [-bolsa] [-pr]"
	echo $"	-b		log Overall traffic statistic in brif"
	echo $"	-o		log only Overall statistic"
	echo $"	-l		log internet traffic for local network"
	echo $"	-s		log internet traffic for server"
	echo $"	-a		log internet traffic for All"
	echo $"	-r		reset statistic in ALL chains of iptables"
	echo $"	-p		display statistic information only on /dev/stdout"
	echo $""
	echo $"	log path: 	$FILE"
	exit 1
esac
exit $RETVAL


6. И последнее кидаем указанную ниже строчку в /etc/crontab или как он у вас называется, и ждем 23:55 каждого дня чтобы посмотреть статистику дня. Если натерпится выводите командой /sbin/traflog -a -p на экран.

55 23 * * * root /etc/firewall/traflog -a -r
( Непременно с ключом -r чтобы сбросить статистику за прошедший день. )

P.S. Для тех кто не знает как работает iptables
Имейте ввиду трафик вашей локальной сети который идет наружу в цепочки INPUT and OUTPUT не попадает, а проходит через FORWARD.

Прочитайте по iptable на:

Опубликовал: Sergo
Дата: 30.07.2003
постоянный адрес статьи: http://linuxportal.ru/entry.php/P84_0_3_0/