Hi-Tech Arduino Компьютеры Интернет
HV-Lab Reference Linux Форум
Справочники Libraries Windows Галерея
Электроника Hardware Hardware Загрузки
Печатные платы Forum Программирование Мини-чат
[ Февр 26, 07:42 ] admin: Форум перешел в разряд архивного.
[ Февр 24, 19:02 ] admin: переехали на новый сервер. Грядут перемены.
[ Фев 20, 08:38 ] кулибин: Переход на SSL был непрост (особенно с абсолютными путями на изображения, но мы его осуществили)
RSS статьи
 
Статьи

Статьи->Linux->Разборки с серверами(Часть 4) [ Поиск ]

Разборки с серверами(Часть 4) - Контроль трафика
Отправил: кулибин, Суббота, 31 Января 2009 20:03

Сделав некоторый перерыв в статьях по серверам, наконец-то продолжу, благо подвернулась работенка по настройке интернет-шлюза с билинговой системой.
Задача: имеется корпоративная локальная сеть и сервер типа Pentium3-500, используемый в качестве точки доступа в интернет. На сервере размещается ОС настроенная на доступ в интернет и подсчет трафика. 
Первоначально на сервере стояла windows и UserGate, что сильно докучало владельцу, ибо с сервером были постоянные проблемы, и ему очень хотелось перевести его на Linux. При выборе дистрибутива мой взгляд пал на долго у меня стоявшую до этого SuSe Linux Enterprise Server 10 SP2, который можно свободно загрузить с официального сайта Novell. Там же можно зарегистрироваться и получить бесплатный пакет обновлений на два месяца. Мне было необходимо установить систему вчистую, вам же ничего делать не надо — работайте со своим дистрибутивом.
Нам необходимо контролировать весь интернет-трафик, проходящий через сервер. Хотелось бы, чтобы отчеты раз в месяц появлялись у кого-то на почте или приходили по фтп. Статистика должна быть по каждому пользователю исключительно в виде объема скаченного трафика.
Существуют полноценные билинг-системы, позволяющие контролировать трафик по всем портам, производить авторизацию пользователей, отключать их при превышении объема скачанного трафика, считать деньги и много другое. Такое решение в основном используется провайдерами, поскольку обладают специфическими возможностями. Ставить большинство таких систем очень сложно, но существуют и простые варианты. В любом случае повозиться придется.
Системы учета трафика можно поделить на два типа:
основанные на iptables
Считают ip-трафик по всем и вся, широкие возможности тарификации и отключения юзеров, фиксация по ip и MAC адресам, однако довольно скудный вывод результатов — работает iptables исключительно с машиной, а не с юзером, списка посещаемых страниц не дает.
Однако системы, основанные на прокси-сервере Squid лишены подобного недостатка. Такие системы предлагают очень развитую системы работы с пользователем — каждому можно настроить свои права доступа, обрезать определенные сайты, выдать наиподробнейшую статистику о посещаемых пользователем сайтах, однако считают трафик только по 80-му порту. Это создает некоторые трудности.
Я пошел первым путем — решил использовать ipcad (Cisco IP accounting simulator)— простой демон учета трафика, эмулирующей поведение маршрутизатора Cisco. Прекрасно работает в связке с iptables. Установка и настройка программы настолько тривиальна, что делается буквально за пару минут. Однако за простоту приходятся платить — у программы отсутствует какой-либо GUI и приходится писать скрипты для вывода статистики. Скрипты благо пишутся за 5-10 минут для каждого конкретного случая и, если это необходимо, запускаются демоном периодических заданий cron.
Установка и настройка IPCAD
Загружаем с официального сайта http://lionet.info/ipcad/ свежую версию.
Можем все сделать через консоль:
# emerge ipcad
Или установить из скачанного архива. Распаковываем его командой
$ tar -xvf ipcad-3.7.3.tar.gz
после чего заходим в директорию
$ cd ipcad-3.7.3
и устанавливаем
$ ./configure
$ make
# make install
Настройка пакета ведется посредством редактирования файла
nano -w /usr/local/etc/ipcad.conf
Как положено любому нетронутому пользователем конфигу, внутри него содержится достаточная для настройки информация по конфигурация. Вооружайтесь словарем и читайте как conf-файл, так и man ipcad
в файле обратите внимание на следующие строчки:
Подсчет трафика на определенном интерфейсе. Если у вас Ethernet-сеть, то это будут eth0 и eth1. Запустите ifconfig -a чтобы посмотреть названия интерфейсов в вашей системе и впишите их.
interface eth0
interface eth1
Путь к дефолтовому дамп-файлу.
dumpfile =/var/log/ipcad/ipcad-curr.dump
Создадим папку для него:
# mkdir -m 700 /var/log/ipcad;
параметрами задаем права доступа — пусть к папке будет иметь доступ только root-пользователь.
Запускаем:
# /usr/sbin/ipcad -rds
-r говорит программе при запуске загружать дамп из файла, -d — демонизует программу, -s заставляет при завершении работы программы сохранять дамп в файл.
Понятно, что каждый раз при загрузке системы вручную включать не по админски, поэтому открываем файл /etc/conf.d/local.start и прописываем в нем предыдущую команду. Теперь все будет делаться автоматически. Учтите, что расположение файла в зависимости от дистрибутива может меняться.
Поскольку этот демон не имеет какого-либо интерфейса, приходится использовать rsh — Remote Shell. Выглядит это следующим образом:
rsh hostname команда, где hostname — это месторасположение ipcad, в нашем случае localhost.
rsh host help выдает список возможных комбинаций, вот некоторые из них:
show ip accounting #Вывести статистику
clear ip accounting #Сбросить статистику
show interface <интерфейс> #Выводит статистику по интерфейсу
dump [<путь>] #Сохраняет статистику в дамп. Если путь к дампу не указывать, то путь берется из файла конфигурации.
restore [<путь>] # Восстановить статистику из файла
import [<путь>] #Импортировать статистику из файла
stat #Показать текущее состояние
shutdown #Завершить работу ipcad
Чтобы ipcad корректно завершался при завершении работы системы, открываем файл /etc/conf.d/local.stop и прописываем строку rsh localhost shutdown
Теперь разберемся со скриптами. В задачи учета статистики входит своевременное сохранение дампа в файл из ОЗУ, обработка информации и backup данных. Писать все будем на shell-скриптах (можно также писать на Python, Perl и многом другом).
Работа с демоном периодических заданий CRON
В качестве cron я поставил vixie-cron. В нашем случае его задачей будет являться периодичный запуск скриптов из папки, скажем, /root/ipcad/
В Gentoo cron ставится так:
# emerge vixie-cron
ставим его в автозагрузку:
# rc-update add vixie-cron default
задаем файл /etc/crontab как основной:
# crontab /etc/crontab
Это файл содержит в себе все задания, включая ссылки на ежечасные, ежедневные, еженедельные и ежемесячные.
Каждое задание описывается несколькими парамтерами.
Допустим нам надо, чтобы каждые 5 минут cron заставлял rsh сохранить дамп.
Прописываем:
*/5 * * * * root rsh localhost dump >/dev/null
Вместо звездочек также используются конкретные значения, например, запуск генерации статистики каждый месяц первого числа в 0:00:
0 0 1 * * root sh /root/ipcad/traf.mounth >/var/www/localhost/htdocs/traffic.html
путь после > означает, куда будет производиться вывод команды. В первом случае в бездну - «в никуда»
пять звездочек обозначают пять чисел:
1 — минуты 1-59
2 — часы 1-23
3- день месяца 1-31
4 - месяц 1-12
5 — день недели 0-7(0 и 7 — это воскресенье)
«*» обозначает, что учитывается каждое значение. Но, чтобы, скажем, запускать скрипт раз в 6 дней, достаточно прописать
  • * */6 * * * user command, можно перечислить и через запятую:
  • * * * * 3,7 user command — данная команда будет запускаться по средам и воскресеньям.
 далее идет с чьими правами запускается команда, далее — сама команда.
Существует графический интерфейс для управления заданиями — Kcron. Он позволяет просто и быстро создать новое задание, однако не позволяет задать его с периодичностью раз в минуту — минимум раз в 5 минут. Это легко обходится корректировкой /etc/crontab
Также, Kcron позволяет именовать задания. Выглядит это следующим образом:
#Eto nazvanie. Kcron ne ponimaet russkix bykv
* * * * * rsh localhost dump # это уже само задание.

Добавим в crontab строку */5 * * * * root rsh localhost dump >/dev/null
и сохраним файл.
Теперь попробуем обработать статистику.
Выведем содержимое дампа на экран:
cat /var/log/ipcad/ipcad-curr.dump
Source Destination Packets Bytes
192.168.0.101 192.168.0.255 1 233
205.188.8.150 192.168.0.103 121 19783
192.168.0.103 205.188.8.150 125 10108
192.168.0.50 224.0.0.1 5 140
194.190.183.213 192.168.0.103 90 6045
192.168.0.103 194.190.183.213 96 6067
192.168.0.103 192.168.0.50 55 3430
192.168.0.50 192.168.0.103 55 6570

Interface eth0: received 8917115, 5 m average 439 bytes/sec, 1 pkts/sec
Flow entries made: 8
Memory usage: 0% (896 from 10485760)
Free slots for rsh clients: 9
IPCAD uptime is 4:52
urlnn.ru uptime is 4:52
перед нами 4 столбца.
  1. IP отправителя пакетов
  2. IP принимающего пакеты.
  3. Количество отправленных пакетов
  4. объем переданной информации
Заставим вывести только относящиеся нашему пользователю строчки:
cat /var/log/ipcad/ipcad-curr.dump |grep 192.168.0.103
205.188.8.150 192.168.0.103 126 20230
192.168.0.103 205.188.8.150 130 10326
194.190.183.213 192.168.0.103 143 9620
192.168.0.103 194.190.183.213 154 9728
192.168.0.103 192.168.0.50 86 5408
192.168.0.50 192.168.0.103 81 9708
Однако,если сейчас подсчитать трафик по последнему столбцу, то будет учитываться как входящий, так и исходящий трафик. Чтобы этого не происходило, воспользуемся выводом по столбцам, обрезав столбец 1. Этому поспособствует команда cut
cut -c17-80 /var/log/ipcad/ipcad-curr.dump |grep 192.168.0.103
192.168.0.103 123 19863
192.168.0.103 125 8411
192.168.0.103 71 8484
параметр -c означает, с какого по какой столбец делать вывод. Под столбцом подразумевается набор символов на экране, находящихся друг под другом. Количество столбцов в консоли определяется настройками. Зайдите в Настройка->Размер и поставьте необходимый.
Теперь наконец подсчитаем трафик при помощи awk — языка обработки данных.
cut -c17-80 /var/log/ipcad/ipcad-curr.dump | grep 192.168.0.103 | awk '{s+=$3} END {print(s/1048576)}'
Запись s+=$3 означает, что мы суммируем все значения в третьем столбце. После чего результат в байтах переводим в Мб и печатаем.
Если нам больше ничего и не надо, то сохраняем эту строку в файл, который будем запускать cron-ом. Оформим файл как положено shell-скриптам. В первой строке указываем на интерпретатор. У нас это bash.
#!/bin/bash
Перед этой строкой пустых строк быть не должно! Решетка также обязательна.
После можно задать имена переменных, чтобы сделать скрипт более универсальным.
START=103
STOP=105
PODSET=0
Добавим цикл, перебирающий по IP:
for i in seq $START $STOP;
do
echo "Статистика для 192.168.$PODSET.$i, Mbytes"
cut -c17-80 /var/log/ipcad/ipcad-curr.dump | grep 192.168.'$PODSET'\.'$i' | awk '{s+=$3} END {print(s/1048576)}'
done
Сохраняем в файл, скажем, traff.curr, который будет выводить статистику в любой удобный момент времени. Сохраним в домашней папке. Теперь командой:
sh ~/traff.curr
получаем список IP с трафиком по ним. Теперь добавим немного смекалки и html-тегов и получим на выходе html-файл, который можно открыть в браузере. 
Если ваша фантазия этим не ограничится, то можете написать скрипты на Perl и/или php, добавить всевозможные тулбары, таблицы, кнопочки, менюшки, еще кучу параметров, подключить ко всему этому настройку iptables, squid и получить в итоге мощную билинг-систему, полностью удовлетворяющую вашим потребностям. Подобная билинг-система может стать вашей визитной карточкой. Главное — правильно выбрать инструменты для ее создания.
Я не рассказал о настройках файрвола iptables. С его помощью можно как минимум пробросить маршрутизацию между внутренней и внешней сетью. Но об этом — в следующем номере.
<продолжение следует>
Артем Кашканов

Голосов Голосов: 0 - В среднем:

Добавить комментарий Оценить
Комментарии

Статистика
Всего 205 статей в базе
Наиболее просматриваемые: Arduino и сеть RS485.
Лучшие по оценкам: РЦВМ1 - Релейная Цифровая Вычислительная Машина

Пользователи в разделе статьи: 3 (0 Пользователи 3 Гости и 0 Скрытые пользователи)
Видимые пользователи:


 
 

MKPortal©2003-2008 mkportal.it
MultiBoard ©2007-2009 RusMKPortal
Страница сгенерированна за 0.01128 секунд с 24 обращениями в базу данных

Intel Core i5-3450 2Gb RAM 100Gb HDD 100Mbps Ethernet

© Artem Kashkanov 2005-2016