Свободная биллинговая система 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