|
|
www.lissyara.su
—> статьи
—> FreeBSD
—> подсчёт трафика
—> АСУТ - система учета трафика
АСУТ - система учета трафика
Автор: arksu.
После длительного перерыва решил обновить статью, материал того заслуживает (имхо), первая статья тут.
ВВЕДЕНИЕ
Нужна была достойная система способная считать ВЕСЬ трафик, масштабируемая, написанная на "легком" для освоения языке программированя чтобы можно было ее затачивать под свои нужды, а нужды эти появляются как ни крути в любой компании и в любом месте. Под словом ВЕСЬ понимается трафик проходящий и через прокси, и тот который мы натим (т.к. не всегда есть возможность все завернуть на прокси, взять теже самые клиент банки). Итак что мы хотим иметь мы знаем, теперь начнем искать что уже есть и выбирать подходящее нам (желательно Open Source)
Что я нашел:
  SAMS,
  NETAMS,
  SARG,
  IPACCT,
  UTM,
  Traffic Inspector,
  StarGazer,
  и многие многие другие
Сравнив эти и другие системы я для себя ничего подходяещего не нашел, и решил ни много ни мало сделать "свое". Признаюсь по началу было немного страшновато лепить "нечто свое" когда на свете уже много подобных систем, очень не хотелось изобретать велосипед. Но по мере продвижения работы и знакомства с другими система все более крепла уверенность в том что это действительно нужно и не только мне.
ЦЕЛИ
Мы хотим чтобы система делала следующее:
1. Учет трафика SQUID с привязкой к конкретному человеку.
2. Учет проходящих пакетов через роутер, раскидывание их по типам протоколов (которые мы сами описываем), пример: есть 2 фтп сервера, и нам нужно чтобы трафик с обоих писался как "ftp_company", создаем правило: (src="12.12.12.12" AND (port=21 OR port>49999)) OR (src="23.23.23.23" AND (port=21 OR port>49999)), после этого весь трафик подпадающий под правило будет виден как "ftp_company".
3. Авторизация пользователей в системе, возможность работы с AD Windows.
4. Запретить любые соединения от неавторизованных пользователей в том числе и через прокси (чтобы корректно считать трафик).
5. Удобная админка с разграничением прав. Чтобы НЕ администратор мог зайти и посмотреть отчеты по трафику и чтобы мог или не мог видеть в этих отчетах трафик администратора ;)
6. Допустим у нас большая филиальная сеть, и есть пользователи которые мигрируют - нужно сделать возможность оперативного добавления пользователей в удаленные системы.
7. Работа со статическими адресами без использования авторизатора.
8. Гибкие отчеты по трафику в любом разрезе за любой период времени
9. Хранение всех логов работы
10. Хранение информации по трафику за любой период времени без замедления работы системы (будь то информация за год за 2 года, чтобы ее объем не сказывался на скорости формирования отчетов).
11. Общая простота конфигурирования и настройки системы, отсутствие центрального звена без которого не сможет работать вся система.
ОПИСАНИЕ СИСТЕМЫ
Скажу сразу - я не буду описывать пошагово всю настройку системы, предполагается что эту статью читают люди знакомые с FreeBSD и другими UNIX системами. Если надо поставить какой то модуль я не буду описывать как это делается, если надо поставить сервер БД, запустить его и поставить пароль на root - я не буду все это описывать. Цель статьи - описать систему учета трафика и то как ее сконфигурировать. Информацию о том как поставить и заставить работать то или иное приложение можете найти на этом же сайте или в интернете.
Система написана модульно, без привязки к конкретной ОС, можно заставить работать хоть на Linux, хоть на Solaris, хоть даже на Windows.
Фактически вся система - это набор скриптов, таблиц в БД и правил для работы с другими сервисами.
ВЫБОР ИНСТРУМЕНТОВ
С целями определились, определимся с инструментами:
Прокси: SQUID, в принципе ничто не мешает использовать любой другой прокси сервер. Вся архитектура системы продумана так что она состоит из кубиков, каждый модуль выполняет строго свою определенную функцию и для того чтобы привязать другой прокси сервер ничто не мешает исправить код который парсит его логи.
Пакетный учет трафика: ng_ipacct, работа на уровне ядра, высокое быстродействие, безглючность, простота парсинга логов. Больше добавить нечего.
Язык программирования системы: PHP, думаю не стоит говорить о том сколько сейчас людей кодит на этом языке, сколько дополнительный расширений существует, и насколько легко при его помощи создавать веб странички. Возможность работы в CLI (командная строка). Вся система написана на нем, бОльшая часть это веб странички, ядро - один шелл скрипт для парсинга логов и реконфигурирования сервисов.
База данных: MySQL, быстрая, удобная, бесплатная =). Ну и фактически стандарт "де факто" для таких систем - проблем с переносимостью не будет.
Файрволл: pf, простой синтаксис, работа на уровне ядра, простейший нат и редирект портов.
Планировщик задач: fcron, минимальное разрешение времени 1 секунда, понадобилось реконфигурировать систему через каждые 10 секунд, т.е. чтобы задержка между входом пользователя в систему и применением его правил не превышала 10 секунд. Стандартный cron с этой задачей справиться не смог.
УСТАНОВКА И НАСТРОЙКА МОДУЛЕЙ
Ядро
Нам нужно ядро с поддержкой NETGRAPH, добавляем опции:
options NETGRAPH # собственно сам нетграф
options NETGRAPH_ETHER # нода для работы с физическими интерфейсами
options NETGRAPH_SOCKET # нода для работы ngctl (создание сокета для подключения ngctl)
options NETGRAPH_TEE # нода для дублирования трафика
device pf # PF OpenBSD packet-filter firewall
options ALTQ # необходимая оцпя для сборки pf (работа с очередями)
| ng_ipacct
Ставим ng_ipacct из портов
/usr/ports/net-mgmt/ng_ipacct
| правим конфиг /usr/local/etc/ng_ipacct.conf
ng_ipacct_interfaces="iface0"
ng_ipacct_modules_load="YES"
ng_ipacct_modules_list="ng_ipacct"
ng_ipacct_default_ether_start='
mkpeer %%iface%%: tee lower right
name %%iface%%:lower %%iface%%_tee
connect %%iface%%: lower upper left
mkpeer %%iface%%_tee: ipacct right2left %%iface%%_in
name %%iface%%_tee:right2left %%iface%%_ip_acct
connect %%iface%%_tee: %%iface%%_ip_acct: left2right %%iface%%_out
'
ng_ipacct_default_ether_stop='
shutdown %%iface%%_ip_acct:
shutdown %%iface%%_tee:
shutdown %%iface%%:
'
ng_ipacct_iface0_dlt="EN10MB" # required line; see ipacctctl(8)
ng_ipacct_iface0_threshold="10000" # '5000' by default
ng_ipacct_iface0_verbose="yes" # 'yes' by default
ng_ipacct_iface0_start=${ng_ipacct_default_ether_start}
ng_ipacct_iface0_stop=${ng_ipacct_default_ether_stop}
ng_ipacct_iface0_checkpoint_script="/var/asut/ipacct.sh iface0"
| В котором внимательно исправляем iface0 на свой внутренний (тот который смотрит в локалку) интерфейс маршрутизатора. Можно указать несколько интерфейсов если локалок несколько.
cat /var/asut/ipacct.sh
#!/bin/sh
IPACCTCTL="/usr/local/sbin/ipacctctl"
IFACE=$1
DIR=/var/asut/ipacct
NAME="ng_ipacct.log"
$IPACCTCTL ${IFACE}_ip_acct:$IFACE checkpoint
$IPACCTCTL ${IFACE}_ip_acct:$IFACE show >> $DIR/$NAME
$IPACCTCTL ${IFACE}_ip_acct:$IFACE clear
/usr/bin/tail -1 $DIR/$NAME | /usr/bin/fgrep exceed
| этот скрипт заставляет ng_ipacct сбросить собранную статистику в файл лога
Включаем:
echo 'ng_ipacct_enable="YES"' >> /etc/rc.conf
| squid
ставим из портов
cd /usr/ports/www/squid
make install clean
| правим конфиг /usr/local/etc/squid/squid.conf
http_port 111.111.111.111:3128
error_directory /usr/local/etc/squid/errors/Russian-1251
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
cache_mem 16 MB
ftp_user anonymous@aaa.com
acl all src 0.0.0.0/0.0.0.0
acl icq url_regex "/var/asut/squid_conf/icq_servers"
# USERS
acl allow_all src "/var/asut/squid_conf/allow_all"
acl normal src "/var/asut/squid_conf/allow_normal"
acl work src "/var/asut/squid_conf/allow_work"
acl mail_services_adr src "/var/asut/squid_conf/allow_mail_services"
acl exe_allow src "/var/asut/squid_conf/allow_exe"
acl allow_job_services src "/var/asut/squid_conf/allow_job_services"
acl allow_admins_access src "/var/asut/squid_conf/allow_admins_access"
acl allow_nod32 src "/var/asut/squid_conf/allow_nod32_http_update"
# URL GROUPS
acl notwork url_regex "/var/asut/squid_conf/notwork"
acl banner url_regex "/var/asut/squid_conf/banner"
acl banks url_regex "/var/asut/squid_conf/banks"
acl true_work url_regex "/var/asut/squid_conf/true_work"
acl bigfiles url_regex \.avi$ \.mpeg$ \.mpg$ \.exe$ \.mov$ \.iso$ \.nrg$ \.mpe$ \.mp3$ \.wmv$
acl mail_services_url url_regex "/var/asut/squid_conf/mail_services"
acl exe_files url_regex \.exe$
acl job_services url_regex "/var/asut/squid_conf/job_services"
acl admins url_regex "/var/asut/squid_conf/admins"
acl nod32 url_regex "/var/asut/squid_conf/nod32"
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563 8420
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https, snews
acl Safe_ports port 49000-65535 # ftp ports
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports
##################################################################
http_access deny icq all
http_access allow exe_files exe_allow
http_access deny exe_files all
http_access allow nod32 allow_nod32
http_access allow admins allow_admins_access
http_access allow job_services allow_job_services
http_access allow true_work all
http_access allow allow_all
http_access deny banner all
http_access allow normal
http_access deny bigfiles all
http_access allow mail_services_url mail_services_adr
http_access deny notwork all
http_access allow work
##################################################################
http_access allow localhost
http_access deny all
icp_access allow all
access_log /usr/local/squid/logs/access.log squid
| 111.111.111.111 - внутренний адрес нашего маршрутизатора на котором будет работать наш прокси сервер.
Сильно описывать конфиг не буду. Приведен простейший конфиг. Возможностей для донастройки МОРЕ. Использованы правила на основе ACL которые читают айпи адреса из файлов, которые заполняет наш скрипт реконфигурирования.
Включаем
echo 'squid_enable="YES"' >> /etc/rc.conf
| создаем кэш
fcron
Ставим из портов
cd /usr/ports/sysutils/fcron
make install clean
| Правим кронтаб
fcrontab -u root -e
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
@nolog,lavg5(1.5) 5 /usr/libexec/atrun
# Rotate log files every hour, if necessary.
%nolog,hourly * newsyslog
#
# Perform daily/weekly/monthly maintenance.
%daily,serial * * periodic daily
%weekly,serial * * periodic weekly
%monthly,serial * * * periodic monthly
#
# Adjust the time zone if the CMOS clock keeps local time, as opposed to
# UTC time. See adjkerntz(8) for details.
1,31 0-5 * * * root adjkerntz -a
* * * * * root /usr/local/bin/pfstat -q -d /var/log/pfstat/pfstat -c /etc/pfstat.conf
*/5 * * * * root /usr/local/bin/pfstat -p -d /var/log/pfstat/pfstat -c /etc/pfstat.conf
1 0 * * * root /var/asut/squid_repare > /dev/null 2>&1
@ 10s /var/asut/reconfigure.php > /dev/null 2>&1
| Включаем, выключаем
/etc/rc.d/cron stop
echo 'cron_enable="NO"' >> /etc/rc.conf
echo 'fcron_enable="YES"' >> /etc/rc.conf
| pfstat
Небольшая утилитка которая формирует графические отчеты о работе pf
Ставим из портов
cd /usr/ports/sysutils/pfstat
make install clean
| правим конфиг /etc/pfstat.conf
collect 1 = interface "iface1" pass bytes in ipv4 diff
collect 2 = interface "iface1" pass bytes out ipv4 diff
collect 3 = interface "iface1" block bytes in ipv4 diff
collect 4 = interface "iface1" block bytes out ipv4 diff
image "/var/asut/www/pfstat/hour_ext.jpg" {
from 300 minutes to now
width 980 height 300
left
graph 1 bps "in" "bits/s" color 0 192 0 filled,
graph 2 bps "out" "bits/s" color 0 0 255
right
graph 3 "block in" "p/s" color 255 0 0,
graph 4 "block out" "p/s" color 192 192 0
}
image "/var/asut/www/pfstat/day_ext.jpg" {
from 1 days to now
width 980 height 300
left
graph 1 bps "in" "bits/s" color 0 192 0 filled,
graph 2 bps "out" "bits/s" color 0 0 255
right
graph 3 "block in" "p/s" color 255 0 0,
graph 4 "block out" "p/s" color 192 192 0
}
collect 9 = global states inserts diff
collect 10 = global states removals diff
collect 11 = global states searches diff
image "/var/asut/www/pfstat/pfstat-states.jpg" {
from 1 days to now
width 980 height 300
left
graph 9 "inserts" "states/s" color 0 192 0 filled,
graph 10 "removals" "states/s" color 0 0 255
right
graph 11 "searches" "states/s" color 255 0 0
}
collect 15 = global counters match diff
collect 17 = global counters fragment diff
collect 22 = global counters congestion diff
collect 23 = global counters ip-option diff
collect 24 = global counters proto-cksum diff
collect 25 = global counters state-mismatch diff
image "/var/asut/www/pfstat/pfstat-errors.jpg" {
from 1 days to now
width 980 height 300
left
graph 17 "frag" "/s" color 192 0 192,
graph 22 "cong" "/s" color 0 192 192,
graph 23 "iopt" "/s" color 0 0 255,
graph 24 "csum" "/s" color 192 192 0,
graph 25 "mism" "/s" color 255 0 0
right
graph 15 "match" "/s" color 0 192 0
}
| Где iface1 - внешний интерфейс нашего роутера.
Создаем каталог куда будут писатся логи работы pf
nginx
Ставим из портов
cd /usr/ports/www/nginx-devel/
make install clean
| Правим конфиг /usr/local/etc/nginx/nginx.conf
user nobody;
worker_processes 20;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 3000;
gzip on;
server {
listen 80;
server_name localhost;
location / {
root /usr/local/www/nginx;
index index.php index.html index.htm;
}
location /index.php {
root /usr/local/www/nginx;
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/nginx/$fastcgi_script_name;
include fastcgi_params;
}
#=====================================================
# MET SERVER
location ~* /met/.*\.php$ {
root /var/asut;
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/asut/$fastcgi_script_name;
include fastcgi_params;
}
location ~* /met/ {
root /var/asut;
index index.php index.html index.htm;
}
#=====================================================
# WWW ASUT
location ~* /www/.*\.php$ {
root /var/asut;
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/asut/$fastcgi_script_name;
include fastcgi_params;
}
location ~* /www/ {
root /var/asut;
index index.php index.html index.htm;
}
#===================================================
# PHPMYADMIN
location ~* /phpmyadmin/.*\.php$ {
root /usr/local/www;
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www$fastcgi_script_name;
include fastcgi_params;
}
location ~* /phpmyadmin/ {
root /usr/local/www;
index index.php index.html index.htm;
}
#==============================================
}
}
| Каталог MET используется на одном сервере - если у вас развитая филиальная сеть. В этом каталоге центральная админка с центральной базой пользователей, на серверах филиалов этот каталог НЕ нужен. В ней и нужно заводить новых юзеров и импортировать их в филиалы. Если же сервер всего один оставляем этот каталог и настраиваем импорт всего в 1 филиал.
Опять же - конфиг простейший, на звание гуру по nginx не претендую =), да и задачи у нашей системы не те да и нагрузки не те.
php-fpm
cd /usr/ports/lang
wget http://php-fpm.anight.org/downloads/freebsd-port/php-5.2.8-fpm-0.5.10.tar.gz
tar -xf php-5.2.8-fpm-0.5.10.tar.gz
cd /usr/ports/lang/php5-fpm
make install clean
| Качаем порт, ставим порт. Версия старовата (на момент написания статьи автор php-fpm прекратил его поддержку, а жаль проект нужный...), есть попытки коммюнити сделать новый порт под фрю и даже успешные, но нормальной и безглючной сборки под фрю с последней версией php5.2.x (на момент написания статьи) нету
Правим конфиг /usr/local/etc/php-fpm.conf
Находим вот эту строку и меняем ее
<value name="listen_address">/tmp/php-fpm.sock</value>
| Раскомментируем параметры пользователя
Unix user of processes
<value name="user">nobody</value>
Unix group of processes
<value name="group">nobody</value>
|
echo 'php_fpm_enable="YES"' >> /etc/rc.conf
/usr/local/etc/rc.d/php-fpm start
| php5-extensions
cd /usr/ports/lang/php5-extensions
make install clean
| Выбрать нужные расширения:
gd
mysql
mbstring
mcrypt
pdo
| Все остальное по дефолту
eaccelerator
cd /usr/ports/www/eaccelerator
make install clean
| правим конфиг php (доп. доки) /usr/local/etc/php.ini
добавляем в конец:
zend_extension="/usr/local/lib/php/20060613/eaccelerator.so"
eaccelerator.shm_size="32"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="1800"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
|
mkdir /tmp/eaccelerator
chmod 777 /tmp/eaccelerator
| mysql
выжимка из /etc/make.conf
PORTSDIR?=/usr/ports
.if ${.CURDIR} == ${PORTSDIR}/databases/mysql51-server
BUILD_OPTIMIZED=yes
BUILD_STATIC=yes
WITH_CHARSET=utf8
WITH_COLLATION=cp1251_bin
WITH_PROC_SCOPE_PTH=yes
.endif
.if ${.CURDIR} == ${PORTSDIR}/databases/mysql51-client
BUILD_OPTIMIZED=yes
BUILD_STATIC=yes
WITH_CHARSET=utf8
WITH_COLLATION=utf8_bin
.endif
| создаем конфиг файл /etc/my.cnf
[client]
socket = /tmp/mysql.sock
default-character-set=cp1251
[mysqld]
default-character-set=cp1251
init-connect='SET NAMES cp1251'
port = 3306
socket = /tmp/mysql.sock
skip-locking
set-variable = max_connections=300
set-variable = max_user_connections=300
set-variable = max_connect_errors=999999
thread_stack = 2M
thread_cache_size = 4
thread_concurrency = 4
skip-federated
key_buffer_size = 64M
max_allowed_packet = 2M
table_cache = 1024
tmp_table_size = 32M
read_rnd_buffer_size = 32M
net_buffer_length = 2M
query-cache-type = 1
query-cache-size = 32M
query_alloc_block_size = 8192
query_cache_min_res_unit = 4096
server-id = 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[isamchk]
key_buffer = 8M
sort_buffer_size = 8M
[myisamchk]
key_buffer = 32M
sort_buffer_size = 32M
read_buffer = 32M
write_buffer = 32M
[mysqlhotcopy]
interactive-timeout
| Опять же на гуру по мускулу не претендую, рад буду выслушать коснтруктивную критику по конфигу. Файл взят с рабочего сервера.
Ставим, запускаем
cd /usr/ports/databases/mysql51-server
make install clean
echo 'mysql_enable="YES"' >> /etc/rc.conf
/usr/local/etc/rc.d/mysql-server start
mysqladmin -u root password 'pass'
| phpmyadmin
cd /usr/ports/databases/phpmyadmin
make install clean
mv /usr/local/www/phpMyAdmin /usr/local/www/phpmyadmin
| поставили, исправили имя каталога =)
named
Авторизатор всегда соединяется с сервером "master.asut", нам нужно создать зону master.asut на нашем роутере и настроить всех клиентов чтобы они искали через него эту запись
Правим /etc/namedb/named.conf
zone "master.asut" {
type master;
file "master/master.asut";
};
| Содержимое файла /etc/namedb/master/master.asut
$ORIGIN ASUT.
$TTL 14400 ; 4 hour
MASTER IN SOA ns1.master.asut. ark.ark.su. (
2009052201 ; serial
600 ; refresh (10 minutes)
300 ; retry (5 minutes)
2592000 ; expire (4 weeks 2 days)
600 ; minimum (10 minutes)
)
$ORIGIN MASTER.ASUT.
NS ns1.master.asut.
@ A 111.111.111.111
wpad A 111.111.111.111
NS1 A 111.111.111.111
| Благодаря этому решению наш авторизатор будет работать везде без изменения кода =)
Надо просто чтобы он смог найти адрес master.asut, а по адресу http://master.asut/www/auth.php был скрипт авторизации
настройка базы данных
скрипты
скрипт для сброса кеша /var/asut/squid_repare
#!/bin/sh
/usr/local/etc/rc.d/squid stop
rm -fr /usr/local/squid/cache/
/usr/local/sbin/squid -z
/usr/local/etc/rc.d/squid start
| ЭПИЛОГ
статья в процессе написания....
Ссылка на обсуждение: http://forum.lissyara.su/viewtopic.php?f=14&t=18073.
размещено: 2009-05-22,
последнее обновление: 2009-05-22,
автор: arksu
|
|
|
|
2014-07-27, lissyara
gmirror
Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9
Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
2011-11-20, BlackCat
Разъём на WiFi-карту
Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
2011-09-14, manefesto
Настройка git+gitosis
Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
|