10 окт 2011
Установка и насторйка свободной биллинговой системы Katrin в CentOs и Debian.
Dmitrius Категория: Web-Мастеру » Уроки
У нас вы можете скачать бесплатно Установка и насторйка свободной биллинговой системы Katrin в CentOs и Debian.

Данный материал предоставлен сайтом Skripter.info исключительно в ознакомительных целях. Администрация не несет ответственности за его содержимое.
Установка и насторйка свободной биллинговой системы Katrin в CentOs и Debian.


Свободная биллинговая система Katrin

Базовые модули написаны на языке Си, в качестве СУБД используется MySQL. Поддерживается сбор информации о трафике через netflow и ipcad организация работы пользователей через pppd и iptables (модули pppoe и radius в планах). Для разработки Web интерфейса задействован Python фреймоворк Django.

Из возможностей реализовано: Учет трафика по зонам; Действия тарифов по определенным дням недели; Зависимость цены от времени суток, выходных/праздничных дней и т.д.; Установление пропускной способности в тарифных планах.

Планируется: Тарификация по времени; Периодические отчисления (месячная и дневная абонплата); Изменение тарифного плана по расписанию; Создание месячных предоплаченых по трафику пакетов; Система предоплаченых карт.

Возможность учета трафика на платформах виртуализации OpenVz и Xen.

Поддерживаемые операционные системы из rpm и deb пакетов: ALT Linux, Debian, CentOs.

Установка в Debian 4-5-6 x86-x64.

Устанавливаем MySql.

apt-get update
sudo apt-get install mysql-server


Во время установки MySql от вас будет запрошен пароль для MySql.

Создаем базу mysql:

Далее конектимся к консоли MySql от имени супер пользователя root.

mysql -u root -p


после чего у вас будет запрошен пароль от MySql введите пароль.

Создадим базу командой.

create database katrin CHARSET=utf8;


Для выхода из консоли упаравления MySql введите команду:

exit


Устанавливаем необходимые пакеты для сборки и нормальной работы билинговой системы katrin.

sudo apt-get install libconfuse0 python-dateutil python-mysqldb python-django screen


Устанавливаем сенсор ipcad по средством которого мы будем учитывать весь трафик на сервере.

sudo apt-get install ipcad


либо из готового deb.пакета

wget https://katrin.distance.ru/downloads/debian/ipcad_3.7.3-1_amd64.deb

sudo dpkg -i ipcad_3.7.3-1_amd64.deb


Далее настраиваем конфиг ipcad.

IPCAD может получать информацию о трафике различными методами. Первым делом необходимо указать в /etc/ipcad.conf куда ipcad будет отправлять
netflow поток:
netflow export destination 127.0.0.1 9996;


По умолчанию - с помощью libpcap. При использовании этого метода в самом простом случае прописать интерфейс, на котором необходимо захватывать пакеты.
interface eth0;


Чтобы информация о трафике была наиболее точной, настраивать ipcad необходимо с ULOG. Для этого заменяем
"interface eth0;"
на
interface ulog group 3;


и настраиваем iptables чтобы необходимые пакеты попадали в ULOG, например:
sudo iptables -I FORWARD -j ULOG --ulog-nlgroup 3 --ulog-cprange 24 --ulog-qthreshold 50


вот пример готового конфига ipcad:
#
# Configuration file for ipcad - Cisco IP accounting simulator daemon.
# Copyright (c) 2001, 2002, 2003, 2004, 2005
#     Lev Walkin <vlm@lionet.info>.
#
# Please see ipcad.conf(5) for additional explanations.
# Please contact me if you have troubles configuring ipcad. My goal is to make
# initial configuration easier for new users, so your input is valuable.
#

##################
# GLOBAL OPTIONS #
##################

#
# Enable or disable capturing UDP and TCP port numbers, IP protocol and
# ICMP types for RSH output.
#
#     capture-ports {enable|disable};
#
# Enabling this will BREAK Cisco RSH output format compatibility,
# increase memory requirements and may slow down traffic processing.
# This option takes effect IMMEDIATELY, that is, it can be specified
# multiple times, even between interfaces configuration.
# This option has NO effect on NetFlow operation (NetFlow always captures
# port information).
#

capture-ports disable;

#
# Buffers to be used for transferring the data from the kernel,
# if applicable (BPF, ULOG).
# Using larger buffers may increase the performance but will
# affect responsiveness.
#
# buffers = <number>[{k|m}];
#
# Reasonable defaults are used if this parameter is not set.
#

## buffers = 64k;


#####################
# INTERFACE OPTIONS #
#####################

#
# interface <iface> [ promisc ] [ input-only ]
#            [ netflow-disable ] [ filter "<pcap_filter>" ];
# OR
# interface ulog group <group> [, group <group> ...]
#            [ netflow-disabled ];
# OR
# interface ipq [ netflow-disabled ];    # man libipq(3)
# OR
# interface {divert|tee} port <divert-port>            # man divert(4)
#            [ input-only ] [ netflow-disabled ];
# OR
# interface file <tcpdump-output.pcap> [ netflow-disabled ];
#
# Options meaning:
#
# promisc:
#     Put interface into promiscuous mode.
#     This enables listening for the packets which are not destined for
#     this host and thus ipcad will count and display all the traffic within
#     the local network. Note that the interface might be in promiscuous mode
#     for some other reason.
#
# input-only:
#     Use kernel feature of counting only incoming packets.
#
# netflow-sampled:     (DO NOT ENABLE THIS OPTION, unless you have to!)
#     If the NetFlow export mechanism is used, this option instructs
#    the interface to supply only one out of N packets to the NetFlow
#    accounting code, thus lowering the CPU requirements. The value of N
#    is configured explicitly in a NetFlow configuration section.
#    NOTE: This option is NOT used to enable NetFlow on the interface,
#    it just modifies the NetFlow behavior on this interface.
#    DO NOT ENABLE THIS OPTION, UNLESS YOU HAVE TO!
#
# netflow-disable:
#    By default, all interfaces are included into NetFlow accounting.
#    This option is used to disable NetFlow on a particular interface.
#
# filter:
#     Install a custom filter on packets instead of basic
#    IP protocol filter. Requires libpcap (even if BPF is being used).
#    May be employed to eliminate CPU overhead on passing unnecessary
#    data between the kernel and user space (by installing the filter
#    directly into the kernel).
#
# NOTES:
#  * "input-only" directive must be supported by kernel.
#    Probably, you were noticed about it during the compilation process
#    if it was not supported.
#    FreeBSD 3.x and elder kernels do not support this feature.
#  * ULOG packet source (interface ulog) is supported under
#    Linux >= 2.4.18-pre8.
#    You should configure iptables to dump the packet stream
#    into the appropriate group, i.e.:
#        iptables -A OUTPUT -j ULOG --ulog-nlgroup <group>
#    Given ULOG groups will be OR'ed together.
#  * A wildcard (*) may be specified as part of an interface name.
#
#interface eth0;
#interface ed1 promisc filter "ip and not dst net 192.168.0.0/16";
#interface sbni0 input-only netflow-disable;    # Disable NetFlow.
#interface ppp*;                # Dynamically pick up PPP interfaces.
interface ulog group 3;    # Use ULOG, do not disable NetFlow.
#interface ipq;                # Use Linux IPQ (libipq(3))
#interface tee port 123;            # Use BSD ipfw(8)'s tee.
#interface divert port 321 netflow-disable;    # Use ipfw(8)'s divert(4).

#
# aggregate <ip>/<masklen> strip <maskbits>;
#
# Aggregate addresses from the specified network (<ip>/<masklen>),
# by AND'ing with specified mask (<maskbits>).
#
#

#aggregate 192.168.0.0/16 strip 32; /* Don't aggregate internal range */
#aggregate 0.0.0.0/0 strip 24;    /* Aggregate external networks */

#
# aggregate <port_range_start>[-<port_range_end>] into <port>;
#
# Aggregate port numbers. Meaningful only if capture-ports is enabled.
#

aggregate 1024-65535    into 65535;    /* Aggregate wildly */
aggregate 3128-3128    into 3128;    /* Protect these ports */
aggregate 150-1023    into 1023;    /* General low range */


##########################
# NetFlow EXPORT OPTIONS #
##########################

#
# Enable Cisco NetFlow export method.
# NetFlow uses UDP to feed flow information to the receiver.
# If the destination is not specified, NetFlow is disabled.
#

netflow export destination 127.0.0.1 9996;
netflow export version 5;    # NetFlow export format version {1|5}
netflow timeout active 1;    # Timeout when flow is active, in minutes
netflow timeout inactive 5;    # Flow inactivity timeout, in seconds
netflow engine-type 73;        # v5 engine_type; 73='I' for "IPCAD"
netflow engine-id 1;        # Useful to differentiate multiple ipcads.

# The following option is enabled by the "netflow-sampled" interface flag.
#netflow sampling-mode packet-interval 10;   # 1 out of 10 packets accounted
# DO NOT ENABLE THIS UNLESS YOU KNOW WHAT ARE YOU DOING.

#
# NetFlow protocol exports an SNMP id instead of the interface name
# (i.e., "eth0", "ppp32"). The following statements options define
# mapping between the interface names and a set of "SNMP identifiers".
#
netflow ifclass eth mapto 0-99;        # i.e., "eth1"->1, "eth3"->3
netflow ifclass fxp mapto 0-99;        # i.e., "fxp4"->4, "fxp0"->0
netflow ifclass ppp mapto 100-199;    # i.e., "ppp32"->532, "ppp7"->507
netflow ifclass gre mapto 200-299;
netflow ifclass tun mapto 300-399;    # i.e., "tun0"->300

######################
# RSH SERVER OPTIONS #
######################

#
# Enable RSH Server:
#
#   rsh {enable|yes|on|disable|no|off} [at <listen_ip>];
#
# If "at <listen_ip>" omitted, rsh server listens on IP address 0.0.0.0,
# which may be undesirable.
#

rsh enable at 127.0.0.1;

#
# RSH access rules:
#
# rsh [<user>@]<host_addr> {admin|backup|[default]|view-only|deny};
#

rsh root@127.0.0.1 admin;    /* Can shutdown ipcad */
rsh staff@127.0.0.1 backup;    /* Can dump/restore/import accounting table */
rsh yourself@127.0.0.1;        /* Can view and modify accounting tables */
/* Note the order! */
rsh luser@127.0.0.1 deny;    /* Deny this user from even viewing tables */
rsh 127.0.0.1 view-only;    /* Other users can view current tables */

# Keep IP packet time to live reasonably low to avoid remote attacks.
# (The rsh client must reside no more than three hops away from the
# router running ipcad.)
rsh ttl = 3;

# Set rsh timeout for the same purpose.
rsh timeout = 30;

#
# Dump active IP accounting table to this file on exit and read on startup.
# (read about -s and -r options in ipcad(8) manual page)
# NOTE: This setting has no effect on NetFlow operation. The flow cache
#       contents are flushed to the collector upon ipcad termination.
#

dumpfile = ipcad.dump;    # The file is inside chroot(), see below...

#################
# OTHER OPTIONS #
#################

#
# Chroot to this directory before processing.
#
# Of course, you could disable chroot()'ing by commenting it out,
# but it is not recommended, so I left this confusing default
# to encourage you to change it.
#

#chroot = /adm/tmp;

#
# File to keep getpid() in it. ipcad will also hold a lock.
#
# WARNING: Pidfile is created AFTER chroot()'ing, so if you're using
# chroot statement above, make sure the path to the pidfile exists
# inside chrooted environment.
#

pidfile = /var/run/ipcad.pid;

#
# UID/GID privileges dropping
# Please note: RSH service will be UNAVAILABLE when uid is not zero.
# Use it only when you know what are you doing (i.e., NetFlow without RSH).
#
# uid = 65534;
# gid = 65534;

#
# Few useful settings.
#

#
# Memory usage limit for storing per-stream entries.
#
# memory_limit = <number>[{k|m|e}];
# Where k, m and g are for kilobytes, megabytes or table "entries".
#

memory_limit = 10m;



перезапускаем ipcad
/etc/init.d/ipcad restart



На этом все готово для установки katrin.

Ставим ядро.

wget https://katrin.distance.ru/downloads/debian/katrin_1.5.0-1_amd64.deb
sudo dpkg -i katrin_1.5.0-1_amd64.deb


после чего правим конфиг katrin
nano /etc/katrin/katrin.conf

а именно необходимо ввести имя бд и пароль от бд.
После чего не забываем сохранить изминения в файле.

Устанавливаем web-интерфейс из пакета:

wget https://katrin.distance.ru/downloads/debian/katrin-web_1.5.0-1_amd64.deb
sudo dpkg -i katrin-web_1.5.0-1_amd64.deb


в файле /var/www/katrin-web/settings.py настраиваем параметры доступа к базе данных а так-же раскоментируем необходимые модули например traf.

nano /var/www/katrin-web/settings.py


Конфиг для наглядности:

from settings_default import *

# Katrin-web specific settings
KATRIN_MODULES = (
    # Uncomment line with service, which you want see at web-interface
#    'user',        # User interface
    'traff',    # Traffic module
#    've',        # Rent virtual enviroment, based on OpenVZ
#    'tel',        # Tel module
)


# Database connect settings
DATABASE_NAME = 'katrin'
DATABASE_USER = 'root'
DATABASE_PASSWORD = '1111'
DATABASE_HOST = ''             # Set to empty string for localhost.
DATABASE_PORT = ''             # Set to empty string for default.

# Value Added Tax (in Russia NDS)
VAT_PERCENT = 18


#Traff service specific  settings
# Show stats without cost
WITHOUT_COST = False
# Lines per stat page
LINES_PER_STAT_PAGE = 100

# Amount ip in detail stat of traffic module
AMOUNT_IP = 25


# Django root urls schema
ROOT_URLS = ''

# Don't remove this
INSTALLED_APPS += KATRIN_MODULES


Cоздаем структуру базы данных:
cd /var/www/katrin-web/

./manage.py syncdb


Будет запрошен логин и пароль для суперпользователя - запомните. Это потребуется для входа в панель администрирования.

Далее выставим права на необходимые файлы:

chmod 755 /usr/bin/katrind
chmod 755 /usr/bin/katrin-dropd
chmod 755 /usr/bin/katrin-functions


Далее напишем скрипты для атоматической блокировки и разблокировки ip:

Для платформы виртуализации XEN:

nano /usr/bin/traff-ip-drop

и впишем туда

#!/bin/bash

. katrin-functions

function usage() {
    traff_usage
}

init_and_validate "$@"

if [ $abonent = "client" ]; then
    validate_ip "$ip"
    USER_IP=$ip
    NUM_RULES=`iptables -L KATRIN -v -n |grep $USER_IP|grep MARK|wc -l`

    if [ $NUM_RULES = 0 ]; then
        iptables -I KATRIN -s $USER_IP -j MARK --set-mark 2
        iptables -I KATRIN -d $USER_IP -j MARK --set-mark 2
    fi

    mailto_client "disabled"
else
    mailto_clientgroup "Traff" "disabled"
fi



Пишем скрипт разблокировки

nano /usr/bin/traff-ip-enable


#!/bin/bash

. katrin-functions

function usage() {
    traff_usage
}

init_and_validate "$@"

if [ $abonent = "client" ]; then
    validate_ip "$ip"
    USER_IP=$ip
    NUM_RULES=`iptables -L KATRIN -v -n |grep $USER_IP|grep MARK|wc -l`

    for i in `seq 1 $NUM_RULES`; do
        iptables -D KATRIN -s $USER_IP -j MARK --set-mark 2
        iptables -D KATRIN -d $USER_IP -j MARK --set-mark 2
    done
    mailto_client "enabled"
else
    mailto_clientgroup "Traff" "enabled"
fi


Далее делаем скриты исполняемыми.

chmod 755 /usr/bin/traff-ip-enable
chmod 755 /usr/bin/traff-ip-drop


теперь нам необходимо написать соответствующие правила iptables для katrin.
в своем примере буду использовать два диапазона ip адресов localnet - это будет внутрений и бесплатный трафик и inet внешний платный трафик.

Создадим файл со списокм внутрених и бесплатных ресурсов.

nano /root/localnet.txt


И впишем туда диапазоны ip адресов
1.0.0.0/8
82.209.192.0/18
86.57.128.0/17
93.84.0.0/15
178.120.0.0/13
194.158.192.0/19
194.226.120.0/22
194.226.124.0/23
193.232.248.0/22

после чего сохраняем данный файл.

Далее создадим файл с правилами iptables

nano /root/ip.sh


и впишем туда

#!/bin/bash
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
iptables -X

# Цепочка для помещений правил ANTISPOOF скриптом xen /etc/xen/scripts/vif-common.sh
# В данной версии скрипта антиспуфинг не задействован.
iptables -N ANTISPOOF

# MARKS:
# 2 - запрещенные katrin
# 7 - локальная сеть
# 8 - разрешенные katrin

# Маркируем локальные сети
ipset -L  localnets -n >/dev/null 2>&1 || ipset -N localnets nethash
ipset -F localnets
iptables -N LOCALNETS
for NET in `cat /root/localnet.txt`
do
    ipset -A localnets $NET
done
iptables -A LOCALNETS -m set --set localnets src -m set --set localnets dst -j MARK --set-mark 7


# Цепочка katrin в которой биллинг будет управлять доступом
iptables -N KATRIN


# Отправляем на проверку в LOCALNETS
iptables -A FORWARD -j LOCALNETS

# Если локальная сеть, то отправляем данные в ipcad через ULOG
iptables -A FORWARD -m mark --mark 7 -j ULOG --ulog-nlgroup 3 --ulog-cprange 24 --ulog-qthreshold 50

# Т.к. данные уже отправлены можем их разрешить
iptables -A FORWARD -m mark --mark 7 -j ACCEPT

# Весь остальной (не локальный трафик) отправляем на проверку правилами, которые добавлены katrin
# Предварительно помечаем пакеты как разрешенные
iptables -A FORWARD -j MARK --set-mark 8
iptables -A FORWARD -j KATRIN

# Запрещаем трафик запрещенный katrin
iptables -A FORWARD -m mark --mark 2 -j REJECT

# Записываем и разрешаем весь трафик, разрешенный katrin
iptables -A FORWARD -m mark --mark 8 -j ULOG --ulog-nlgroup 3 --ulog-cprange 24 --ulog-qthreshold 50
iptables -A FORWARD -m mark --mark 8 -j ACCEPT

# Если нужно учитывать входящий трафик с внешних хостов, когда клиент блокирован,
# то перенесите блокировку с mark 2 сюда.

iptables -P FORWARD DROP

# Выставляем все пользователям статус не заблокированных для того чтобы katrin-dropd
# заполнил цепочку KATRIN запрящающими правилами и обновил статусы в базе.
mysql -u root -p1111 katrin -e 'update accounts set blocked=0;'


Далее поместим данный скрипт в атозагрузку:

nano /etc/rc.local


и впишем туда

sh /root/ip.sh


так-же впишем сюда запуск web-интефейса:

cd /var/www/katrin-web/ && screen -d ./manage.py runserver 0.0.0.0:81


"-d" - означает что screen сразу "свернет" сессию.
сохраняем файл rc.local.

Для платформы виртуализации OpenVz

В своем примере буду использовать два диапазона ip адресов localnet - это будет внутрений и бесплатный трафик и inet внешний платный трафик.

Создадим файл со списокм внутрених и бесплатных ресурсов.

nano /root/localnet.txt


И впишем туда диапазоны ip адресов
1.0.0.0/8
82.209.192.0/18
86.57.128.0/17
93.84.0.0/15
178.120.0.0/13
194.158.192.0/19
194.226.120.0/22
194.226.124.0/23
193.232.248.0/22

после чего сохраняем данный файл.

Далее создадим файл с правилами iptables

nano /root/ip.sh


и впишем туда

#!/bin/bash
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
iptables -X

# Цепочка для помещений правил ANTISPOOF скриптом xen /etc/xen/scripts/vif-common.sh
# В данной версии скрипта антиспуфинг не задействован.
iptables -N ANTISPOOF
iptables -N KATRIN
iptables -F KATRIN
iptables -F FORWARD -t mangle

# MARKS:
# 2 - запрещенные katrin
# 7 - локальная сеть
# 8 - разрешенные katrin
# 5 - признак попадания SCR в локальные сети

# Маркируем локальные сети

for NET in `cat /root/localnet.txt`
do
    iptables -A FORWARD -t mangle -s $NET -j MARK --set-mark 5
done

for NET in `cat /root/localnet.txt`
do
    iptables -A FORWARD -t mangle -m mark --mark 5 -d $NET -j MARK --set-mark 7
done

# Если локальная сеть, то отправляем данные в ipcad через ULOG
iptables -A FORWARD -m mark --mark 7 -j ULOG --ulog-nlgroup 3 --ulog-cprange 24 --ulog-qthreshold 50

# Т.к. данные уже отправлены можем их разрешить
iptables -A FORWARD -m mark --mark 7 -j ACCEPT

iptables -A FORWARD -j KATRIN

# Записываем и разрешаем весь трафик, разрешенный katrin
iptables -A FORWARD -j ULOG --ulog-nlgroup 3 --ulog-cprange 24 --ulog-qthreshold 50
iptables -A FORWARD -j ACCEPT

iptables -P FORWARD DROP

# Выставляем все пользователям статус не заблокированных для того чтобы katrin-dropd
# заполнил цепочку KATRIN запрящающими правилами и обновил статусы в базе.
mysql -u root -p1111 katrin -e 'update accounts set blocked=0;'



Далее поместим данный скрипт в атозагрузку:

nano /etc/rc.local


и впишем туда

sh /root/ip.sh


так-же впишем сюда запуск web-интефейса:

cd /var/www/katrin-web/ && screen -d -m ./manage.py runserver 0.0.0.0:81


"-d" - означает что screen сразу "свернет" сессию.
сохраняем файл rc.local.

Далее напишем скрипты для атоматической блокировки и разблокировки ip:

nano /usr/bin/traff-ip-drop


#!/bin/bash
PATH=/root/bin:/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin

. katrin-functions

function usage() {
    traff_usage
}

init_and_validate "$@"

if [ $abonent = "client" ]; then
    validate_ip "$ip"
    USER_IP=$ip
    NUM_RULES=`iptables -L KATRIN -v -n |grep $USER_IP|grep REJECT|wc -l`

    if [ $NUM_RULES = 0 ]; then
        iptables -A KATRIN -s $USER_IP -j REJECT
        iptables -A KATRIN -d $USER_IP -j REJECT
    fi

    mailto_client "disabled"
else
    mailto_clientgroup "Traff" "disabled"
fi





nano /usr/bin/traff-ip-enable


#!/bin/bash
PATH=/root/bin:/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin

. katrin-functions

function usage() {
    traff_usage
}

init_and_validate "$@"

if [ $abonent = "client" ]; then
    validate_ip "$ip"
    USER_IP=$ip
    NUM_RULES=`iptables -L KATRIN -v -n |grep $USER_IP|grep REJECT|wc -l`

    for i in `seq 1 $NUM_RULES`; do
        iptables -D KATRIN -s $USER_IP -j REJECT
        iptables -D KATRIN -d $USER_IP -j REJECT
    done
    mailto_client "enabled"
else
    mailto_clientgroup "Traff" "enabled"
fi


Далее делаем скритпы исполняемыми:

chmod 755 /usr/bin/traff-ip-drop
chmod 755 /usr/bin/traff-ip-enable


сообственно с настройкой все.

Запускаем katrin командой:

katrind


Запускаем web-интерфейс:

Запускаем screen командой:

screen


Переходим в нужный каталог

cd /var/www/katrin-web/

./manage.py runserver 0.0.0.0:81


сворачиваем сесию screen сочитанием клавиш Ctrl+A+D.

На этом всё установка в debian завершена.

























Запуск web-сервера в режиме отладки:
sudo ./manage.py runserver 0.0.0.0:80
(если у вас 80-ый порт уже используется то нужно выполнять sudo ./manage.py runserver 0.0.0.0:81
Будет запрошен логин и пароль для суперпользователя - запомните. Это потребуется для входа в панель администрирования.
Страница пользователя https://server/ Раздел администратора https://server/admin

























Свободная биллинговая система Katrin

Базовые модули написаны на языке Си, в качестве СУБД используется MySQL. Поддерживается сбор информации о трафике через netflow и ipcad организация работы пользователей через pppd и iptables (модули pppoe и radius в планах). Для разработки Web интерфейса задействован Python фреймоворк Django.

Из возможностей реализовано: Учет трафика по зонам; Действия тарифов по определенным дням недели; Зависимость цены от времени суток, выходных/праздничных дней и т.д.; Установление пропускной способности в тарифных планах.

Планируется: Тарификация по времени; Периодические отчисления (месячная и дневная абонплата); Изменение тарифного плана по расписанию; Создание месячных предоплаченых по трафику пакетов; Система предоплаченых карт.

Возможность учета трафика на платформах виртуализации OpenVz и Xen.

Поддерживаемые операционные системы из rpm и deb пакетов: ALT Linux, Debian, CentOs.

Установка в Debian 4-5-6 x86-x64.

Устанавливаем MySql.

apt-get update
sudo apt-get install mysql-server


Во время установки MySql от вас будет запрошен пароль для MySql.

Создаем базу mysql:

Далее конектимся к консоли MySql от имени супер пользователя root.

mysql -u root -p


после чего у вас будет запрошен пароль от MySql введите пароль.

Создадим базу командой.

create database katrin CHARSET=utf8;


Для выхода из консоли упаравления MySql введите команду:

exit


Устанавливаем необходимые пакеты для сборки и нормальной работы билинговой системы katrin.

sudo apt-get install libconfuse0 python-dateutil python-mysqldb python-django screen


Устанавливаем сенсор ipcad по средством которого мы будем учитывать весь трафик на сервере.

sudo apt-get install ipcad


либо из готового deb.пакета

wget https://katrin.distance.ru/downloads/debian/ipcad_3.7.3-1_amd64.deb

sudo dpkg -i ipcad_3.7.3-1_amd64.deb


Далее настраиваем конфиг ipcad.

IPCAD может получать информацию о трафике различными методами. Первым делом необходимо указать в /etc/ipcad.conf куда ipcad будет отправлять
netflow поток:
netflow export destination 127.0.0.1 9996;


По умолчанию - с помощью libpcap. При использовании этого метода в самом простом случае прописать интерфейс, на котором необходимо захватывать пакеты.
interface eth0;


Чтобы информация о трафике была наиболее точной, настраивать ipcad необходимо с ULOG. Для этого заменяем
"interface eth0;"
на
interface ulog group 3;


и настраиваем iptables чтобы необходимые пакеты попадали в ULOG, например:
sudo iptables -I FORWARD -j ULOG --ulog-nlgroup 3 --ulog-cprange 24 --ulog-qthreshold 50


вот пример готового конфига ipcad:
#
# Configuration file for ipcad - Cisco IP accounting simulator daemon.
# Copyright (c) 2001, 2002, 2003, 2004, 2005
#     Lev Walkin <vlm@lionet.info>.
#
# Please see ipcad.conf(5) for additional explanations.
# Please contact me if you have troubles configuring ipcad. My goal is to make
# initial configuration easier for new users, so your input is valuable.
#

##################
# GLOBAL OPTIONS #
##################

#
# Enable or disable capturing UDP and TCP port numbers, IP protocol and
# ICMP types for RSH output.
#
#     capture-ports {enable|disable};
#
# Enabling this will BREAK Cisco RSH output format compatibility,
# increase memory requirements and may slow down traffic processing.
# This option takes effect IMMEDIATELY, that is, it can be specified
# multiple times, even between interfaces configuration.
# This option has NO effect on NetFlow operation (NetFlow always captures
# port information).
#

capture-ports disable;

#
# Buffers to be used for transferring the data from the kernel,
# if applicable (BPF, ULOG).
# Using larger buffers may increase the performance but will
# affect responsiveness.
#
# buffers = <number>[{k|m}];
#
# Reasonable defaults are used if this parameter is not set.
#

## buffers = 64k;


#####################
# INTERFACE OPTIONS #
#####################

#
# interface <iface> [ promisc ] [ input-only ]
#            [ netflow-disable ] [ filter "<pcap_filter>" ];
# OR
# interface ulog group <group> [, group <group> ...]
#            [ netflow-disabled ];
# OR
# interface ipq [ netflow-disabled ];    # man libipq(3)
# OR
# interface {divert|tee} port <divert-port>            # man divert(4)
#            [ input-only ] [ netflow-disabled ];
# OR
# interface file <tcpdump-output.pcap> [ netflow-disabled ];
#
# Options meaning:
#
# promisc:
#     Put interface into promiscuous mode.
#     This enables listening for the packets which are not destined for
#     this host and thus ipcad will count and display all the traffic within
#     the local network. Note that the interface might be in promiscuous mode
#     for some other reason.
#
# input-only:
#     Use kernel feature of counting only incoming packets.
#
# netflow-sampled:     (DO NOT ENABLE THIS OPTION, unless you have to!)
#     If the NetFlow export mechanism is used, this option instructs
#    the interface to supply only one out of N packets to the NetFlow
#    accounting code, thus lowering the CPU requirements. The value of N
#    is configured explicitly in a NetFlow configuration section.
#    NOTE: This option is NOT used to enable NetFlow on the interface,
#    it just modifies the NetFlow behavior on this interface.
#    DO NOT ENABLE THIS OPTION, UNLESS YOU HAVE TO!
#
# netflow-disable:
#    By default, all interfaces are included into NetFlow accounting.
#    This option is used to disable NetFlow on a particular interface.
#
# filter:
#     Install a custom filter on packets instead of basic
#    IP protocol filter. Requires libpcap (even if BPF is being used).
#    May be employed to eliminate CPU overhead on passing unnecessary
#    data between the kernel and user space (by installing the filter
#    directly into the kernel).
#
# NOTES:
#  * "input-only" directive must be supported by kernel.
#    Probably, you were noticed about it during the compilation process
#    if it was not supported.
#    FreeBSD 3.x and elder kernels do not support this feature.
#  * ULOG packet source (interface ulog) is supported under
#    Linux >= 2.4.18-pre8.
#    You should configure iptables to dump the packet stream
#    into the appropriate group, i.e.:
#        iptables -A OUTPUT -j ULOG --ulog-nlgroup <group>
#    Given ULOG groups will be OR'ed together.
#  * A wildcard (*) may be specified as part of an interface name.
#
#interface eth0;
#interface ed1 promisc filter "ip and not dst net 192.168.0.0/16";
#interface sbni0 input-only netflow-disable;    # Disable NetFlow.
#interface ppp*;                # Dynamically pick up PPP interfaces.
interface ulog group 3;    # Use ULOG, do not disable NetFlow.
#interface ipq;                # Use Linux IPQ (libipq(3))
#interface tee port 123;            # Use BSD ipfw(8)'s tee.
#interface divert port 321 netflow-disable;    # Use ipfw(8)'s divert(4).

#
# aggregate <ip>/<masklen> strip <maskbits>;
#
# Aggregate addresses from the specified network (<ip>/<masklen>),
# by AND'ing with specified mask (<maskbits>).
#
#

#aggregate 192.168.0.0/16 strip 32; /* Don't aggregate internal range */
#aggregate 0.0.0.0/0 strip 24;    /* Aggregate external networks */

#
# aggregate <port_range_start>[-<port_range_end>] into <port>;
#
# Aggregate port numbers. Meaningful only if capture-ports is enabled.
#

aggregate 1024-65535    into 65535;    /* Aggregate wildly */
aggregate 3128-3128    into 3128;    /* Protect these ports */
aggregate 150-1023    into 1023;    /* General low range */


##########################
# NetFlow EXPORT OPTIONS #
##########################

#
# Enable Cisco NetFlow export method.
# NetFlow uses UDP to feed flow information to the receiver.
# If the destination is not specified, NetFlow is disabled.
#

netflow export destination 127.0.0.1 9996;
netflow export version 5;    # NetFlow export format version {1|5}
netflow timeout active 1;    # Timeout when flow is active, in minutes
netflow timeout inactive 5;    # Flow inactivity timeout, in seconds
netflow engine-type 73;        # v5 engine_type; 73='I' for "IPCAD"
netflow engine-id 1;        # Useful to differentiate multiple ipcads.

# The following option is enabled by the "netflow-sampled" interface flag.
#netflow sampling-mode packet-interval 10;   # 1 out of 10 packets accounted
# DO NOT ENABLE THIS UNLESS YOU KNOW WHAT ARE YOU DOING.

#
# NetFlow protocol exports an SNMP id instead of the interface name
# (i.e., "eth0", "ppp32"). The following statements options define
# mapping between the interface names and a set of "SNMP identifiers".
#
netflow ifclass eth mapto 0-99;        # i.e., "eth1"->1, "eth3"->3
netflow ifclass fxp mapto 0-99;        # i.e., "fxp4"->4, "fxp0"->0
netflow ifclass ppp mapto 100-199;    # i.e., "ppp32"->532, "ppp7"->507
netflow ifclass gre mapto 200-299;
netflow ifclass tun mapto 300-399;    # i.e., "tun0"->300

######################
# RSH SERVER OPTIONS #
######################

#
# Enable RSH Server:
#
#   rsh {enable|yes|on|disable|no|off} [at <listen_ip>];
#
# If "at <listen_ip>" omitted, rsh server listens on IP address 0.0.0.0,
# which may be undesirable.
#

rsh enable at 127.0.0.1;

#
# RSH access rules:
#
# rsh [<user>@]<host_addr> {admin|backup|[default]|view-only|deny};
#

rsh root@127.0.0.1 admin;    /* Can shutdown ipcad */
rsh staff@127.0.0.1 backup;    /* Can dump/restore/import accounting table */
rsh yourself@127.0.0.1;        /* Can view and modify accounting tables */
/* Note the order! */
rsh luser@127.0.0.1 deny;    /* Deny this user from even viewing tables */
rsh 127.0.0.1 view-only;    /* Other users can view current tables */

# Keep IP packet time to live reasonably low to avoid remote attacks.
# (The rsh client must reside no more than three hops away from the
# router running ipcad.)
rsh ttl = 3;

# Set rsh timeout for the same purpose.
rsh timeout = 30;

#
# Dump active IP accounting table to this file on exit and read on startup.
# (read about -s and -r options in ipcad(8) manual page)
# NOTE: This setting has no effect on NetFlow operation. The flow cache
#       contents are flushed to the collector upon ipcad termination.
#

dumpfile = ipcad.dump;    # The file is inside chroot(), see below...

#################
# OTHER OPTIONS #
#################

#
# Chroot to this directory before processing.
#
# Of course, you could disable chroot()'ing by commenting it out,
# but it is not recommended, so I left this confusing default
# to encourage you to change it.
#

#chroot = /adm/tmp;

#
# File to keep getpid() in it. ipcad will also hold a lock.
#
# WARNING: Pidfile is created AFTER chroot()'ing, so if you're using
# chroot statement above, make sure the path to the pidfile exists
# inside chrooted environment.
#

pidfile = /var/run/ipcad.pid;

#
# UID/GID privileges dropping
# Please note: RSH service will be UNAVAILABLE when uid is not zero.
# Use it only when you know what are you doing (i.e., NetFlow without RSH).
#
# uid = 65534;
# gid = 65534;

#
# Few useful settings.
#

#
# Memory usage limit for storing per-stream entries.
#
# memory_limit = <number>[{k|m|e}];
# Where k, m and g are for kilobytes, megabytes or table "entries".
#

memory_limit = 10m;



перезапускаем ipcad
/etc/init.d/ipcad restart



На этом все готово для установки katrin.

Ставим ядро.

wget https://katrin.distance.ru/downloads/debian/katrin_1.5.0-1_amd64.deb
sudo dpkg -i katrin_1.5.0-1_amd64.deb


после чего правим конфиг katrin
nano /etc/katrin/katrin.conf

а именно необходимо ввести имя бд и пароль от бд.
После чего не забываем сохранить изминения в файле.

Устанавливаем web-интерфейс из пакета:

wget https://katrin.distance.ru/downloads/debian/katrin-web_1.5.0-1_amd64.deb
sudo dpkg -i katrin-web_1.5.0-1_amd64.deb


в файле /var/www/katrin-web/settings.py настраиваем параметры доступа к базе данных а так-же раскоментируем необходимые модули например traf.

nano /var/www/katrin-web/settings.py


Конфиг для наглядности:

from settings_default import *

# Katrin-web specific settings
KATRIN_MODULES = (
    # Uncomment line with service, which you want see at web-interface
#    'user',        # User interface
    'traff',    # Traffic module
#    've',        # Rent virtual enviroment, based on OpenVZ
#    'tel',        # Tel module
)


# Database connect settings
DATABASE_NAME = 'katrin'
DATABASE_USER = 'root'
DATABASE_PASSWORD = '1111'
DATABASE_HOST = ''             # Set to empty string for localhost.
DATABASE_PORT = ''             # Set to empty string for default.

# Value Added Tax (in Russia NDS)
VAT_PERCENT = 18


#Traff service specific  settings
# Show stats without cost
WITHOUT_COST = False
# Lines per stat page
LINES_PER_STAT_PAGE = 100

# Amount ip in detail stat of traffic module
AMOUNT_IP = 25


# Django root urls schema
ROOT_URLS = ''

# Don't remove this
INSTALLED_APPS += KATRIN_MODULES


Cоздаем структуру базы данных:
cd /var/www/katrin-web/

./manage.py syncdb


Будет запрошен логин и пароль для суперпользователя - запомните. Это потребуется для входа в панель администрирования.

Далее выставим права на необходимые файлы:

chmod 755 /usr/bin/katrind
chmod 755 /usr/bin/katrin-dropd
chmod 755 /usr/bin/katrin-functions


Далее напишем скрипты для атоматической блокировки и разблокировки ip:

Для платформы виртуализации XEN:

nano /usr/bin/traff-ip-drop

и впишем туда

#!/bin/bash

. katrin-functions

function usage() {
    traff_usage
}

init_and_validate "$@"

if [ $abonent = "client" ]; then
    validate_ip "$ip"
    USER_IP=$ip
    NUM_RULES=`iptables -L KATRIN -v -n |grep $USER_IP|grep MARK|wc -l`

    if [ $NUM_RULES = 0 ]; then
        iptables -I KATRIN -s $USER_IP -j MARK --set-mark 2
        iptables -I KATRIN -d $USER_IP -j MARK --set-mark 2
    fi

    mailto_client "disabled"
else
    mailto_clientgroup "Traff" "disabled"
fi



Пишем скрипт разблокировки

nano /usr/bin/traff-ip-enable


#!/bin/bash

. katrin-functions

function usage() {
    traff_usage
}

init_and_validate "$@"

if [ $abonent = "client" ]; then
    validate_ip "$ip"
    USER_IP=$ip
    NUM_RULES=`iptables -L KATRIN -v -n |grep $USER_IP|grep MARK|wc -l`

    for i in `seq 1 $NUM_RULES`; do
        iptables -D KATRIN -s $USER_IP -j MARK --set-mark 2
        iptables -D KATRIN -d $USER_IP -j MARK --set-mark 2
    done
    mailto_client "enabled"
else
    mailto_clientgroup "Traff" "enabled"
fi


Далее делаем скриты исполняемыми.

chmod 755 /usr/bin/traff-ip-enable
chmod 755 /usr/bin/traff-ip-drop


теперь нам необходимо написать соответствующие правила iptables для katrin.
в своем примере буду использовать два диапазона ip адресов localnet - это будет внутрений и бесплатный трафик и inet внешний платный трафик.

Создадим файл со списокм внутрених и бесплатных ресурсов.

nano /root/localnet.txt


И впишем туда диапазоны ip адресов
1.0.0.0/8
82.209.192.0/18
86.57.128.0/17
93.84.0.0/15
178.120.0.0/13
194.158.192.0/19
194.226.120.0/22
194.226.124.0/23
193.232.248.0/22

после чего сохраняем данный файл.

Далее создадим файл с правилами iptables

nano /root/ip.sh


и впишем туда

#!/bin/bash
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
iptables -X

# Цепочка для помещений правил ANTISPOOF скриптом xen /etc/xen/scripts/vif-common.sh
# В данной версии скрипта антиспуфинг не задействован.
iptables -N ANTISPOOF

# MARKS:
# 2 - запрещенные katrin
# 7 - локальная сеть
# 8 - разрешенные katrin

# Маркируем локальные сети
ipset -L  localnets -n >/dev/null 2>&1 || ipset -N localnets nethash
ipset -F localnets
iptables -N LOCALNETS
for NET in `cat /root/localnet.txt`
do
    ipset -A localnets $NET
done
iptables -A LOCALNETS -m set --set localnets src -m set --set localnets dst -j MARK --set-mark 7


# Цепочка katrin в которой биллинг будет управлять доступом
iptables -N KATRIN


# Отправляем на проверку в LOCALNETS
iptables -A FORWARD -j LOCALNETS

# Если локальная сеть, то отправляем данные в ipcad через ULOG
iptables -A FORWARD -m mark --mark 7 -j ULOG --ulog-nlgroup 3 --ulog-cprange 24 --ulog-qthreshold 50

# Т.к. данные уже отправлены можем их разрешить
iptables -A FORWARD -m mark --mark 7 -j ACCEPT

# Весь остальной (не локальный трафик) отправляем на проверку правилами, которые добавлены katrin
# Предварительно помечаем пакеты как разрешенные
iptables -A FORWARD -j MARK --set-mark 8
iptables -A FORWARD -j KATRIN

# Запрещаем трафик запрещенный katrin
iptables -A FORWARD -m mark --mark 2 -j REJECT

# Записываем и разрешаем весь трафик, разрешенный katrin
iptables -A FORWARD -m mark --mark 8 -j ULOG --ulog-nlgroup 3 --ulog-cprange 24 --ulog-qthreshold 50
iptables -A FORWARD -m mark --mark 8 -j ACCEPT

# Если нужно учитывать входящий трафик с внешних хостов, когда клиент блокирован,
# то перенесите блокировку с mark 2 сюда.

iptables -P FORWARD DROP

# Выставляем все пользователям статус не заблокированных для того чтобы katrin-dropd
# заполнил цепочку KATRIN запрящающими правилами и обновил статусы в базе.
mysql -u root -p1111 katrin -e 'update accounts set blocked=0;'


Далее поместим данный скрипт в атозагрузку:

nano /etc/rc.local


и впишем туда

sh /root/ip.sh


так-же впишем сюда запуск web-интефейса:

cd /var/www/katrin-web/ && screen -d -m ./manage.py runserver 0.0.0.0:81


"-d" - означает что screen сразу "свернет" сессию.
сохраняем файл rc.local.

Для платформы виртуализации OpenVz

В своем примере буду использовать два диапазона ip адресов localnet - это будет внутрений и бесплатный трафик и inet внешний платный трафик.

Создадим файл со списокм внутрених и бесплатных ресурсов.

nano /root/localnet.txt


И впишем туда диапазоны ip адресов
1.0.0.0/8
82.209.192.0/18
86.57.128.0/17
93.84.0.0/15
178.120.0.0/13
194.158.192.0/19
194.226.120.0/22
194.226.124.0/23
193.232.248.0/22

после чего сохраняем данный файл.

Далее создадим файл с правилами iptables

nano /root/ip.sh


и впишем туда

#!/bin/bash
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
iptables -X

# Цепочка для помещений правил ANTISPOOF скриптом xen /etc/xen/scripts/vif-common.sh
# В данной версии скрипта антиспуфинг не задействован.
iptables -N ANTISPOOF
iptables -N KATRIN
iptables -F KATRIN
iptables -F FORWARD -t mangle

# MARKS:
# 2 - запрещенные katrin
# 7 - локальная сеть
# 8 - разрешенные katrin
# 5 - признак попадания SCR в локальные сети

# Маркируем локальные сети

for NET in `cat /root/localnet.txt`
do
    iptables -A FORWARD -t mangle -s $NET -j MARK --set-mark 5
done

for NET in `cat /root/localnet.txt`
do
    iptables -A FORWARD -t mangle -m mark --mark 5 -d $NET -j MARK --set-mark 7
done

# Если локальная сеть, то отправляем данные в ipcad через ULOG
iptables -A FORWARD -m mark --mark 7 -j ULOG --ulog-nlgroup 3 --ulog-cprange 24 --ulog-qthreshold 50

# Т.к. данные уже отправлены можем их разрешить
iptables -A FORWARD -m mark --mark 7 -j ACCEPT

iptables -A FORWARD -j KATRIN

# Записываем и разрешаем весь трафик, разрешенный katrin
iptables -A FORWARD -j ULOG --ulog-nlgroup 3 --ulog-cprange 24 --ulog-qthreshold 50
iptables -A FORWARD -j ACCEPT

iptables -P FORWARD DROP

# Выставляем все пользователям статус не заблокированных для того чтобы katrin-dropd
# заполнил цепочку KATRIN запрящающими правилами и обновил статусы в базе.
mysql -u root -pubhjdrfhjvfy katrin -e 'update accounts set blocked=0;'



Далее поместим данный скрипт в атозагрузку:

nano /etc/rc.local


и впишем туда

sh /root/ip.sh


так-же впишем сюда запуск web-интефейса:

cd /var/www/katrin-web/ && screen -d ./manage.py runserver 0.0.0.0:81


"-d" - означает что screen сразу "свернет" сессию.
сохраняем файл rc.local.

Далее напишем скрипты для атоматической блокировки и разблокировки ip:

nano /usr/bin/traff-ip-drop


[code]#!/bin/bash
PATH=/root/bin:/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin

. katrin-functions

function usage() {
    traff_usage
}

i









Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
AlfaStriker | 4 ноября 2011 15:13

Написали что устанавливаете на CentOS, на написали только для Debian/Ubuntu.
Хотя конечно под CentOS по вашей статье тоже можно установить. Спасибо!

Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.