Система простого билинга на Linux

Поясню зачем все это нужно и как это используется мной на практике. Используя на работе интернет, раздавая его на нужные машины, я наткнулся на то что во время отсутствия "правильного юзера", который как правило уходя куда-либо оставлял свой комп как попало, и этим сразу же пользовались "находчивые" юзеры которым инет не полагался. Меня это все достало!!! Я переговорил с директором, по поводу предоставления интернета всем под тотальным контролем, но только в рабочих целях. Это и натолкнула меня на написание локального билинга. С подробным отчетом: за год, месяц, день, а также с подробным отчетом с линками. И последующем объяснением пред директором, зачем ходили на porno.ru ну и т.д.
И так приступим,Нам понадобится:
AspLinux 12
perl с поддержкой DBI
php
mysql
apache
squid
pptpd
(В дистрибутив не входит нужно качать)
ppp
cron

Все выше перечисленное вы сможете найти на диске с дистрибутивом.
Вкратце принцип действия: имеем Linux-сервер с двумя интерфейсами
eth1 10.0.0.3 он же шлюз по умолчанию он же дверь во внешний мир
eth0 192.168.10.254 он смотрит в локалку
Билинг как бы разделен на части:

1) Авторизация при помощи VPN-сервера для этого служит pptpd. На этом этапе выдается юзеру IP-адрес который связывается с логином на момент подключения, надеюсь понятно зачем это нужно.
2) В iptables задаются правила, для каждого юзера, затем собирается статистика скриптом с iptables с последующем переносом в mysql (в мускул заносятся не только айпишники но и логины с датами и временем, а также объем трафика с каждого айпишника т.е. потом скриптом на пхп мы можем вывести любой вид статистики). Таким образом мы решаем вопрос с учетом объема трафика.
3) Для того бы проследить куда именно юзер ходил мы используем squid, но что бы юзер не заподозрил плохого мы делаем его прозрачным т.е. заворачиваем iptables-ом траф идущий на 80-ый порт на squid. Затем разбираем скриптом логи squid-а также с переносом их в mysql
4) Ну и собственно подымаем апачу для вывода статистики. Для этого нам и нужен php. С его помощью мы читаем из базы mysql и выводим в удобном виде на web-интерфейсе.(возможности select-а безграничны :))
И еще немного воды. Везде где бы я не смотрел в инете был либо разбор логов squid-a либо сбор статистики с iptables. В первом случае невозможно проследить трафик почты, и всего остального (squid кроме http ни чего не умеет), во втором не удастся ткнуть юзера мордой чтоб не ползал куда попало (линки взять неоткуда). Я решил слить все во едино и естественно отказаться от авторизации на сквиде в пользу VPN. Плюс я не стал использовать сложный скрипт для сбора статистики (ведь у меня он выполняется каждую минуту) а сливал все как есть, затем использовал php скрипт в котором и делал всю сложную обработку, для того что бы воспроизвести ее на экране в удобном для нас виде (статистику каждую минуту смотреть не будешь :)). Также я создаю правила, для каждого пользователя а не цепочки. И только потом на этапе вывода скрипта на экран я разбираю что кому принадлежит, а так как в базу у нас попадает логин то дело за малым. Поэтому свои наработку не считаю слизаной с чего либо, все писалось с собственных идей (покрайней мере на момент ее написания аналогов в интернете не нашел, если бы нашел то не писал бы :D). Не буду против если кто-то будет дорабатывать, изменять и использовать как ему вздумается в некоммерческий целях.
Теперь собственно сама установка с кратким пояснением. берем biling.tar.gz распаковываем его в коневую директорию. Устанавливаем pptpd-1.3.3-1.fc6.i386.rpm далее в директорию /etc копируем файл pptpd.conf, в директорию /etc/ppp копируем options.pptpd и chap-secrets на вопрос согласны ли вы заменить во всех случаях отвечаем "да". От описания файлов options.pptpd и pptpd.conf откажусь, много статей посвящено установке VPN-сервера, скажу лишь что нужно обратить внимание на 2 нижние строки в pptpd.conf
localIP 10.0.0.4-30
remoteIP 10.0.0.31-51

Я думаю что здесь все понятно. Уделим немного внимания файлу chap-secrets именно сюда мы прописываем пользователя.
test * 123 10.0.0.5
логин-"test" пароль-"123" и при подключении c этим логином и паролем при установке VPN-соединения ему будет присвоен адрес 10.0.0.5 Делаем service pptpd restart пробуем создать VPN-соединение в форточках, я думаю как это делается объяснять не нужно. Единственное что нужно будет сделать так это запустить созданное соединение Зайти Свойства->Безопасность и снять галку "Требуется шифрование" . Кого прикалывает можете покопаться и с шифрованием и прикрутить PPPoE суть также, развлекайтесь, а мне и так хорошо :). я думаю немного начинает проясняться :) Теперь давайте зайдем в директорию /biling и запустим user_IP тут же мы увидим что создался файл user_ip где прописаны соответствия логинов и IP-адресов. Это скрипт читает файл /etc/ppp/chap-secrets и создает user_ip просто для удобства использования.
Далее нам нужно создать базу, запускаем /biling/StatIP/Create_DBtraff этот скрипт создает базу dbtraff и таблицу TR_FW trafic forward сюда будет собираться информация с правил iptables при помощи скрипта ip2mysql Да чуть не забыл нужно выполнить echo 1 > /proc/sys/net/IPv4/ip_forward а лучше прописать эту строку в автозагрузку /etc/rc.d/rc.local т.о. мы разрешаем транзит пакетов через наш сервер. аналог IPEnableRouting в форточках. И наконец запустим /biling/StatIP/IPRuls сразу скажу что его надо запускать как тока вы произвели какие то манипуляции с пользывателями. Этот скрипт создает правило для iptables каждого айпишника прописанного в user_ip. Я думаю понятно что если юзера удалили или добавили, то и правило должно примениться.
Теперь идем в папку /biling/StatProxy. как и в первом случае создаем таблицу /biling/StatProxy/Create_DBtraff тут создается таблица proxy_access в которую скрипт access2mysql собирает расшифрованный лог /var/log/squid/access.log Запускаем ProxyRuls сдесь создаются правило по которому все пакеты идущие на 80-порт не принадлежащие локалке заворачиваются на squid. Его при манипуляциях с юзерами перезапускать ненужно. Теперь копируем squid.conf в /etc/squid на вопрос согласны ли вы заменить во всех случаях отвечаем "да". Делаем service squid restart.
Теперь давайте разархивируем traff.tar.gz в И вуаля с настройками почти покончено чтобы автоматизировать сбор статистики нам нужно скопировать crontab в /etc или если вы используете не AspLinux 12 или вы делали какие-нибудь изменения в crontab то поместите туда вот эти строки:
*/1 * * * * root /biling/user_IP
*/1 * * * * root /biling/StatProxy/access2mysql
*/1 * * * * root /biling/StatIP/ip2mysql
Т.о. мы говорим что каждую минуту нам нужно выполнять выше перечисленные файлы user_IP access2mysql IP2mysql Которые и занимаются сбором статистики и переводом ее в mysql.
Запускаем VPN-соединение на клиентской машине. Открываем ваш любимый браузер и загружаем любую страницу. Ждем минуту до исполнения скрипта. В любом браузере набираем строку вида http://192.168.10.254/traff/index.php Попадаем на страницу фильтра мы выбираем пользователя и временные интервалы и нажимаем кнопку в зависимости от того какой вид отчета мы хотим увидеть.
оставить сообщение в гостевой

Приложение с описанием файлов в директории /biling

/biling/StatIP
Create_DBtraff - создает таблицу
IP2mysql - перносит статистику c iptables в mysql
IPRuls - задает правила
List_IP - выводит на стандартный вывод содержимое таблицы
/biling/StatProxy
access2mysql - перносит статистику c лога сквида в mysql
Clear_proxy_access - очищает таблицу
Create_DBtraff- создает таблицу
Drop_Base - удаляет таблицу
ListProxy_access - выводит на стандартный вывод содержимое таблицы
ProxyRuls - задает правила
/biling
user_IP - файл соответствия IP-адресов и логинов
user_IP - скрипт для формирования файла user_IP из /etc/ppp/chap-secrets