iptables traffic counter | Версия для печати |
Не претендую на новизну. Но потратив некоторое время на поиски чего-нибудь простого и подходящего мне, к сожалению, как всегда пришел к выводу читайте man и howto и пользуйтесь /dev/hands.
(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 |