Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #33, АВГУСТ 2003 г.

ПЕРЕКУСИМ ПЕРЛОВКОЙ?

DemiurG (arkhangel@mail.ru)

Спецвыпуск Xakep, номер #033, стр. 033-062-1


Пишем скрипты для системы трафика во FreeBSD

Ну чего, разобрался с IPA? Теперь все пользователи у тебя под контролем? Но почему-то боссы недовольны... Им хочется, чтобы не только ты один контролировал систему учета, но и чтобы они без твоего вмешательства могли просмотреть, сколько у пользователей там капает. Да и сами юзера бунтуют немного - им кажется, что некто (наверное ты) накручивает трафик и выдает неверные данные. Что же... Разубедим их в этом!

ОТВЕТ ЕСТЬ ЭКВИВАЛЕНТ МЫСЛИ

Если не забыл, в предыдущей статье мы создали полноценную систему трафика, но узнать по ней данные мог только админ с доступом по ssh. Согласись, что далеко не каждому пользователю объяснишь, что такое ssh, как туда зайти - да и аспект безопасности остается, вдруг догадается что-нибудь изменить. Поэтому мы будем создавать friendly-user-interface. Самое простое (а в данном случае и правильное) решение - создать web-интерфейс. То есть у тебя в локалке работает web-сервер, который получает данные от системы трафика и уже раскладывает их в аккуратную табличку. Но каким образом веб-сервер получит эти данные? Придется использовать базу данных. Я не буду мутить воду и полностью представлю свою наработку. Моя система трафика (как я и хотел) состоит из маленьких кирпичиков, из которых уже складывается целое:

1. Работает ipfw. Он считает трафик (так как в нем заданы необходимые правила).

2. Вывод ipfw обрабатывает IPA. Это сделано для удобства. IPA является посредником между моим скриптом и ipfw. Плюсы в том, что они делают многие вещи, которые мне не нужно делать, - складывают/вычитают данные, имеют собственную базу, то есть даже если твоя база радикально упала - всегда есть резервная текстовая копия.

3. Вывод IPA обрабатывает скрипт ipastat.pl. Он заносит все данные в базу MySQL (можно выбирать любую другую - это личное дело каждого).

4. Выборку из базы делает скрипт mysql.cgi. Данные получаются в виде очень милой лаконичной таблицы.

Если с первыми двумя шагами все ясно (мы их рассмотрели в предыдущих двух статьях), то каким образом обрабатывать вывод IPA - непонятно. Я решил не делать выборку из его текстовой базы (она чересчур примитивна и сложна для работы) и обрабатывать вывод напрямую. Если мы запустим ipastat c ключом -n (ipastat -x -R . -n), то получим данные по всем пользователям без таблицы, и эти данные можно отлично обработать в Перле. Для каждого пользователя в IPA должно быть создано одно правило вида:

rule admin {

info = 192.168.6.200

ipfw = 190 195

startup {

exec = /sbin/ipfw add 190 allow ip from 192.168.6.200 to any via xl0

exec = /sbin/ipfw add 195 allow ip from any to 192.168.6.200 via xl1

exec = /sbin/ipfw add 197 allow ip from any to 192.168.6.200 via xl0

}

}

Обязательно задавать в поле info ip юзера, так как это поле заносится в базу и по нему происходит распознание имени.

Я надеюсь, тебе не надо объяснять, как админить mysql. Ниже привожу скрипт (ipastat.pl) с комментариями:

#!/usr/bin/perl -w

my ($mtime, $now, $nows, $user, $ip, $sum, @users, $mb, @ips, @mbs, $line, @sums, $users, $sums, $ips, $mbs, $query, $rule);

Содержание  Вперед на стр. 033-062-2