понедельник, 7 марта 2011 г.

Простая статистика трафика по ip, биллинг основанный на iptables

Для работы этого скрипта необходим установленный web-сервер с php и cron.

У меня этот скрипт крутится на роутере wl500gp с прошивкой Олега, поэтому все настройки буду писать применительно к этой прошивке. Но сам скрипт может быть легко перенесен на большой linux.

Для чего этот скрипт:
Этот скрипт предназначен только для подсчета трафика. Также в нем существует возможность автоматически отключать интернет пользователям, которые превысили лимит трафика за месяц.

Настройка подсчета трафика

1. Создаем директории и необходимые файлы 

touch /usr/local/sbin/lst/ip_piring.lst
touch /usr/local/sbin/makestat
touch /usr/local/sbin/makefilter
chmod +x /usr/local/sbin/makestat
chmod +x /usr/local/sbin/makefilter

Распаковываем содержимое statistic.zip в DocumentRoot lighttpd (/opt/share/www/)

2. Создаем таблицу пользователей  
touch /usr/local/etc/ethers
В этот файл (/usr/local/etc/ethers) вписываем MAC и IP адреса пользователей для которых хотим открыть доступ к интернету и считать статистику
Пример:
00:00:1c:1c:1a:00 192.168.1.2
00:00:11:11:11:00 192.168.1.11
00:00:1a:1a:1a:00 192.168.1.15
После последнего пользователя необходимо ставить перевод строки.
3. Создаем файл с пиринговыми сетями провайдера
У моего провайдера есть пиринговые зоны для которых я хочу отдельно считать статистику
В файл /usr/local/sbin/lst/ip_piring.lst пишем пиринговые зоны провайдера.
Мой файл выглядит так (провайдер Домолинк-Тамбов):

78.132.128.0/17
213.135.128.0/19
193.203.60.0/22
93.186.96.0/20
193.33.62.0/23
91.202.20.0/22
193.34.12.0/22
82.179.144.0/20
195.19.96.0/19
178.75.64.0/18

4. Редактируем crontab
Добавляем строчку

4-59/5 * * * * root cd /opt/share/www/statistic/ &&  /opt/bin/php ./billing.php > /dev/null 2>&1
Будьте внимательны: если у вас имя пользователя отличается от root и DocumentRoot отличается от /opt/share/www/, то пропишите свои значения.

5. Редактируем файл /usr/local/sbin/post-firewall (запускается всякий раз, когда роутер изменяет правила маршрутизации и файерволла)
Добавляем в него:
#!/bin/sh
/usr/local/sbin/makefilter
- ограничение доступа в интернет по mac и ip.
Фильтр работает независимо от того подключен или не подключен у вас к роутеру жесткий диск/флешка.

6. Добавляем цепочки для подсчетата трафика:
В файл /usr/local/sbin/post-boot добавим строчки:
#!/bin/sh
/usr/local/sbin/makestat

7. Редактируем файлы /usr/local/sbin/makestat и /usr/local/sbin/makefilter
Содержимое файлов можно взять тут.

Делаем файлы исполняемыми
chmod +x /usr/local/sbin/post-firewall
chmod +x /usr/local/sbin/post-boot
и сохраняем изменения
flashfs save && flashfs commit && flashfs enable
Можно запустить подсчет трафика не перезагружая роутер запустив:
/usr/local/sbin/makefilter
/usr/local/sbin/makestat

Дополнительно
Если у вас не безлимитный трафик, и необходимо отключать интернет пользователям при достижении определенного лимита внешнего трафика, делаем следующие:

Разархивируйте limit.php (из архива limit.zip) в каталог со статистикой (/opt/share/www/statistic/).
В каталоге billing (/opt/share/www/statistic/billing) создайте файл limit
с таким форматом
1)ip-адрес пользователя; 2)лимит входящего трафика; 3)лимит исходящего трафика; 4)суммарный лимит трафика.
все лимиты задаются в мегабайтах
например:
192.168.100.97 1750 275 2010
Все лимиты задаются целыми числами.
пользователю дано 1750МБ входящего, 275МБ исходящего трафик и 2010МБ суммарного трафика (входящий+исходящий). При достижении пользователем хотя бы одного из ограничений он будет отключен.
В этот файл можно не вписывать всех пользователей, если мы не хотим задавать для них лимит.

+ Необходимо настроить кроны:
В кронтаб добавить:

*/5 * * * * root cd /opt/share/www/statistic/ &&  /opt/bin/php ./limit.php > /dev/null 2>&1
1 0 1 * * root /user/local/sbin/makefilter
Будьте внимательны: если у вас имя пользователя отличается от root и DocumentRoot отличается от /opt/share/www/, то пропишите свои значения.
Первого числа каждого месяца все пользователи, заблокированные по лимиту трафика, будут разблокированы.

Немного о работе скрипта:
Статистику смотрим http://192.168.1.1:8081/statistic/ или там где у вас находится роутер и настроен web-сервер.
Скрипт считает весь трафик проходящий через роутер к пользователям прописанным в /usr/local/etc/ethers и внешний трафик самого роутера.

World - внешний трафик (Интернет).
City - пиринговый трафик (заданный в файле ip_piring.lst).

DELTA - трафик за последние 5 минут.

Содержимое страниц обновляется раз в 5 минут.

Подсчет статистики за новый месяц будет начнется "с чистого листа". Статистику за прошлые месяцы работы скрипта можно будет посмотреть по адресу http://192.168.1.1:8081/statistic/2010-08.html - август 2010 года (аналогично другие месяцы).

Выглядит это все дело вот таким образом:
 

4 комментария:

  1. Добрый день, хочу внедрить Ваш скрипт в организации, задача просто раздавать wi-fi только определённым людям, на Ubuntu 10.04 server не должно возникнуть особых сложностей? Это похоже то чего я очень долго искал.

    ОтветитьУдалить
  2. Не должно. Скрипт предназначен для подсчёта трафика при раздаче интернета с помощью nat.
    В скриптах создания цепочек (makestat и makefilter) нужно будет указать ваши сетевые интерфейсы за место ppp0, br0. И соответственно нужно поменять команды в crontab указав свои пути для скриптов.

    ОтветитьУдалить
  3. А для не NAT, можно как-то переделать? Просто для форвардинга на шлюзе? Схема такая:

    Люди - Шлюз - DMZ - Шлюз+NAT (FreeBSD).

    Пока бы на форвардинге бы не отказался подсичтать, и ещё вопрос: как считаете адекватное решение в целом пользовать iptables + log на 30 мегабитном канале при 100 юзерах? Точно считать будет?

    ОтветитьУдалить
  4. На FreeBSD работать не будет. Т.к. скрипт берет статистику парся данные iptables.
    На фряхе ipfw.

    ОтветитьУдалить