Ключевые слова:web, httpd, mathopd, proxy, sqlite, traffic, ipacctd, (найти похожие документы)
From: Кирилл Лопухов <kirill@sfugntu.bashnet.ru.>
Date: Mon, 20 Sep 2004 18:21:07 +0000 (UTC)
Subject: Обзор mathopd, 3proxy, sqlite и систем для учета трафика.
Оригинал: http://www.linux.str.ru/articles/admutils.shtml
Крохотные полезняшки администратора ...
В этой заметке хотелось бы немножко рассказать о программках
достоинством которых можно считать соотношение таких качеств как
компактность, простота и скорость работы. Представленные ниже
программы легко работают даже на очень
слабых машинах с небольшим объемом оперативной памяти. Что позволяет
их использовать их в роутерах с flash памятью вместо HDD и различных
встраиваемых системах. ( установку и настройку программ необходимо
делать от пользователя root )
mathopd
Первым о ком хочется сказать это очень маленький HTTP сервер mathopd
можно взять с сайта http://www.mathopd.org/ . Несмотря на то, что
размер архива с исходными тестами всего 58 кб, эта крошка может в
некоторых места легко заменит такого заслуженного трудягу www - цеха
как apache!
К особенностям данного сервера можно отнести то, что он в своей
работе не использует fork и thread :) (модель FSM), а если быть
точнее использует fork только для CGI интерфейса. Также в сервер
включены встроенные списки доступа по ip адресам при этом отпадает
необходимость использования tcpwraper, поддержка виртуальных хостов,
можно назначить любою программу интерпретатор на любое расширение
фалов, что позволяет запускать php скрипты или другие CGI скрипты
написанные на любом интерпретирующем языке. И главное достоинство
этого сервера в том, что он оптимизирован для раздачи"тяжелого"
контента.
Установка и настройка
# wget http://www.mathopd.org/dist/mathopd-1.5p3.tar.gz
# tar -xvzf mathopd-1.5p3.tar.gz
# cd mathopd-1.5p3
# make
# make install
# mkdir /usr/local/www/logs
# mkdir /usr/local/www/data
# mkdir /usr/local/www/cgi
# chown nobody:nogroup /usr/local/www/logs
Далее приведу небольшой пример конфигурационного файла mathopd.cfg с
комментариями, который необходимо разместить в каталоге
/usr/local/etc/
-----------mathopd.cfg--------------
Umask 026
Tuning {
NumConnections 64
BufSize 12288
InputBufSize 2048
ScriptBufSize 4096
NumHeaders 100
Timeout 60
ScriptTimeout 60
}
# пользователь от которого запускается процесс сервера
User nobody
PIDFile /usr/local/www/logs/mathopd.pid
# лог файл доступа к ресурсам сервера
Log /usr/local/www/logs/mlog.%Y%m%d
ErrorLog /usr/local/www/logs/errorlog
# описание формата лог файла
LogFormat {
Ctime
RemoteUser
RemoteAddress
RemotePort
ServerName
Method
URI
QueryString
Version
Status
ContentLength
BytesRead
BytesWritten
}
LogGMT On
Control {
# запуск скриптов под пользователем
# которому они принадлежат
RunScriptsAsOwner On
# лог файл ошибок которые могли возникнуть
# в ходе выполнения CGI скриптов
ChildLog /usr/local/www/logs/childlog
Types {
text/html { html }
text/plain { txt }
image/gif { gif }
image/jpeg { jpg }
text/css { css }
application/octet-stream { * }
}
Specials {
Dump { /dump }
# с каким расширение файлы будут считаться исполняемыми
CGI { cgi }
Imagemap { map }
# с каким расширение файлы будут считаться перенаправляющими
Redirect { url }
}
# назначение интерпретатора для php скриптов
# данный сервер не поддерживает работу php
# в качестве модуля по этому для каждого клиента
# будет порождаться свой отдельный php процесс :-)
External {
/usr/local/bin/php { php php4 }
}
# определяем какие файлы в директориях считать индексными
IndexNames { index.html index.htm index.php redirect.url }
}
Server {
# номер порта на котором будет получать запросы сервер
Port 80
Virtual {
# доступ для всех хостов к файловой области
# /usr/local/www/data
# (простейший случай настройки с одним хостом )
AnyHost
# директива Host позволит создать несколько виртуальных
# хостов и для каждого из них определить свою файловую область
# напимер : Host www5.my.com
Control {
Alias /
Location /usr/local/www/data
}
Control {
# спец. директория для CGI скриптов
Alias /cgi
Location /usr/local/www/cgi
Specials {
CGI { * }
}
}
# директория пользователей
Control {
Alias /~
Location public_html
UserDirectory On
# ограничиваем доступ к области "/~" (по IP адреса)
Access {
Deny 0/0
Allow 127.0.0.1/32
Allow 192.168.0.0/24
}
}
# специальные ограничения для каталога пользователя root
Control {
Alias /~root
Location /nosuchdirectory
}
# организуем доступ к директории /usr/local/www/protected
# по имени и паролю
# mathopd поддерживает формат файла с пользователями и
# паролями такой же как в apache :)
Control {
Alias /protected
Location /usr/local/www/protected
Realm "Protected Area"
UserFile /home/www/htpasswd
}
# создаем область для раздачи всяких разных файлов :)
Control {
# в mathopd отсутствует внутренние средства
# для автоматической индексации директории
# но есть возможность подключить любой скрипт
# для вывода файлов и директорий в любом удобном
# для вас виде (пример такого скрипта приведен
# ниже в статье)
AutoIndexCommand /usr/local/www/cgi/dir_cgi.cgi
Alias /file
Location /usr/local/www/data/file
}
# пример перенаправления запроса из области secure
# на порт SSL сервера my.host.com
Control {
Alias /secure
Location https://my.host.com
}
}
}
----------- dir_cmd.cgi --------------
#!/usr/bin/awk -f
BEGIN {
fcmd="ls -l";
printf "Content-Type: text/html\n\n <html>\n<body>\n <pre>\n";
while(x=(fcmd|getline))
{ if( NF == 9) {
printf "%20s %s %-2s %s <a href=\"%s\">%s</a>\n",$5,$6,$7,$8,$9,$9; }
}
close(fcmd);
printf "</pre></body></html>\n";
}
После того как мы создали конфигурационный файл сервера , запускаем
его командой:
/usr/local/sbin/mathopd -f /usr/local/etc/mathopd.cfg
3proxy
Довольно часто перед системным администратором встает задача
предоставить доступ к Internet ресурсам группе пользователей
(небольшой офис,Internet кафе). Данную задачу можно решить несколькими
способами, это настройка на Internet шлюзе:
а) proxy сервера
b) службы NAT (трансляция сетевых адресов)
c) раздать каждому пользователю реальный IP адрес
Давайте рассмотрим первый самый простой способ подключения, это proxy
сервер традиционно для таких целей применяется популярный proxy
Squid, но не всегда бывает необходимость в столь тяжеловатой
программе :), да и в squid отсутствует такие иногда необходимые вещи
как SOCKS4/5 сервер, TCP/UP порт маппинг. Поэтому вторым номером
хочется представить вашему вниманию PROXY сервер, по названием
"3proxy" адрес сайта http://www.security.nnov.ru/soft/3proxy/
разработанный нашим программистом из г. Нижний Новгород. Одним из
главных его достоинств мне кажется это компактность и высокая
переносимость. Код сервера написан так, что легко компилируется как
для Win9x/2000/XP так и для Linux и FreeBSD.
Сервер поддерживает следующие возможности:
1. HTTP(S) proxy
2. FTP over HTTP proxy
3. SOCKS4/5 proxy
4. POP3 proxy
5. TCP & UDP маппинг портов
6. листы доступа к различным службам и адресам
7. ограничение пропускной способности канала каждого пользователя
(чтобы пользователь не съел весь канал
качая кучу файлов в несколько потоков :) )
8. ограничение трафика пользователя на день, неделю и месяц
9. ведение журналов через ODBC (по моему такого нет ни в одном proxy)
и syslog и т.д
10. авторизацию пользователей ко всем proxy службам по имени и паролю
или по ip адресам
К недостаткам можно отнести это отсутствие кэширования информации :-|.
Но в с последнее время Inernet контент становится все более
динамическим (то есть не поддающийся кэшированию) и может быть для
кого то экономия в 25%
трафика за счет его кэширования не будет столь критична. Для тех кому
же критична, автор предлагает пока использовать цепочку из 2х серверов
и в качестве кэша такие сервера как wwwoffle или им подобные, либо
ждать появления поддержки кеша в 3proxy :)
Установка
# wget http://www.security.nnov.ru/soft/3proxy/current/3proxy.tgz
# tar -xvzf 3proxy.tgz
# cd 3proxy
# make -f Makefile.unix
# mkdir /usr/local/3proxy
# mkdir /usr/local/3proxy/logs
# mkdir /usr/local/3proxy/stat
# copy 3proxy /usr/local/3proxy
# copy 3proxy.cfg.sample /usr/local/3proxy/3proxy.cfg
# chown -R nobody:nogroup /usr/local/3proxy
Далее приведу небольшой пример конфигурационного файла 3proxy.cfg с
комментариями, более подробную информацию по конфигурированию можно
найти файле 3proxy.cfg.sample или в
HowTo http://www.security.nnov.ru/soft/3proxy/howtor.asp
и FAQ http://www.security.nnov.ru/soft/3proxy/faqr.asp
-------------3proxy.cfg-------------
# ВНИМАНИЕ !! не должны быть пробелов
# перед любыми опциями конфигурации !!
# ip адрес DNS сервера провайдера или локального
nserver 127.0.0.1
timeouts 1 5 30 60 180 1800 15 60
# создаем двух пользователей vasia и petia
# и назначаем им пароли 24555 , 14656 и 45455 соответственно
users vasia:CL:24555
users petia:CL:14656
users vova:CL:45455
# лог файл со списком запросов пользователей
# будет создаваться каждый день новый
log /usr/local/3proxy/logs/3proxy.log D
logformat "%d-%m-%Y %H:%M:%S %U %C:%c %R:%r %O %I %T"
# внешний интерфейс
# (через который будут уходить запросы от сервера)
external 0.0.0.0
# ip адрес интерфейса на котором будут приниматься
# запросы от клиентов
internal 172.16.0.1
# устанавливаем тип авторизации по имени и паролю
auth strong
# разрешаем доступ к портам 80,8080-8088
allow * * * 80,8080-8088
# расскоментировать секцию parent если у вас есть прокси верхнего
# уровня и заменить ip,порт,имя пользователя и пароль на свои занчения
# parent 1000 http 192.168.0.1 8080 username passwd
# allow *
# запускаем службу HTTP proxy на порту (3128 и
# -n c отключенной NTLM авторизацией)
proxy -p3128 -n
# ограничиваем толшину канала для каждого
# пользователя vasia и petia в 20000 bps
# а для vova 10000 bps
bandlimin 20000 vasia,petia
bandlimin 10000 vova
# запускаем сервер от пользователя nobody
# (возможно в вашей ОС uid и gid пользователя nobody
# будут другими для их определения воспользуйтесь коммандой id nobody)
setgid 65534
setuid 65534
После того как мы создали конфигурационный файл сервера , запускаем
3proxy командой:
/usr/local/3proxy/3proxy /usr/local/3proxy/3proxy.cfg
sqlite
Базы данных в работе администратора играют не последнюю роль, с
помошью ихможно делать различные вещи облегчающие поддержку серверов
например: ведение и анализ логов, создание динамического наполнения
сайта, ведение
базы писем (см. проект dbmail). На просторах Internet стандартом
де-факто считается mysql сервер. зарекомендовавший себя как очень
легкий быстрый и простой sql сервер.
Но сегодня я хочу представить вашему вниманию еще один маленький и
легкий sql движок. Его можно было бы назвать младшим братиком mysql,
настолько он легок и мал по размерам, это sqlite официальный сайт
http://www.sqlite.org.
Фактически sqlite нельзя назвать в полной мере сервером потому, что
он таковым и не является :). Он из себя представляет динамическую
библиотеку libsqlite.a (или в OC windows sqlite.dll ) и программу
управления базой данных sqlite (или в OC windows sqlite.exe).
Может работать как под ОС win9x/2000/XP так и под различными Unix, в
sqlite реализованы транзакции и триггеры чего нет в mysql, обладает
очень простым API , к нему написан ODBC драйвер
(http://www.ch-werner.de/sqliteodbc/), может применяться во
встраиваемых промышленных (embedеd) системах. В версии 5 PHP стал
официально поддерживать данную базу.
Установка
# wget http://www.sqlite.org/sqlite-2.8.14.tar.gz
# tar -xvzf sqlite-2.8.14.tar.gz
# cd sqlite-2.8.14
# ./configure
# make
# make install
Создание базы
После ввода следующей команды с консоли будет создана пустая база
(если ее еще небыло ) с именем test.db и вы попадете с командный режим
программы управления sqlite, в котором можно вводить любые SQL
команды:
# sqlite test.db
SQLite version 2.8.14
Enter ".help" for instructions
sqlite>
Запросы к базе можно так же выполнять в пакетном режиме например,
следующей командой создадим таблицу "t1" c полем "field"
# sqlite test.db "create table t1 (field1 char(20));"
Или же брать последовательность sql команд (разделенных ";" точкой с
запятой и символом новой строки) из за ране сформированного файла
# sqlite test.db < file.sql
Считаем трафик в FreeBSD и Linux...
Для учета трафика существует множество программ перечислим некоторые
из них и попробуем описать особенности их работы:
ipacctd - (способы сбора статистики: divert, user level) (FreeBSD)
ftp://ftp.wuppy.net.ru/pub/FreeBSD/local/ipacctd/
Демон для акаунтинга трафика, использует tee или divert socket для
получения ip пакетов. Главное отличие (преимущество) данной программы
от всех других систем учета заключается в том, что можно строить очень
гибкую систему учета в рамках насколько позволяет гибкость самих
правил ipfw. К недостаткам же можно отнести то, что она работает на
user level, в результате чего возрастает нагрузка на процессор за счет
переключения контекста.
Изначально ipacctd всю статистику накапливает у себя в памяти (в хеш -
таблице), получить статистику можно, послав сигал SIGHUP демону
(killall -SIGHUP ipacctd) при этом он запишет всю статистику в файл
(опция -f /var/log/ipacct.%Y_%m_%d ) и очистит хеш-таблицу в памяти,
также начиная с версии 1.43 статистику можно получить с помощью
команды:
cat /tmp/ipacct/ipacct.<port>
и дальше уже передать через pipe статистику другой программе или
скрипту для последующей обработки (например поместить данные в базу
sqlite) ipacctd должен быть запущен с опцией -s и утилита cat должна
поддерживать работу с unix socket.
Период в который нужно снимать статистику дабы не произошла утеря
пакетов случае переполнения хеш - таблицы зависит от загрузки канала и
определяется администратором.
Cтатистика может выдаваться в двух видах в зависимости
от опций -v с которыми запущен демон:
ip_from ip_to bytes packets [when_time] (обычный режим)
или
ip_from s_port ip_to d_port proto bytes packets [when_time]
(расширенный режим)
-----------------------ipfw.sh--------------------------
# установка правил для трансляции адресов NAT
# и правила для учета тарафика (xl0 внешний интерфейс)
/sbin/ipfw add divert natd all from any to 213.x.x.x in via xl0
/sbin/ipfw add divert 10000 all from any to 192.168.0.0/24 in via xl0
/sbin/ipfw add divert 10000 all from 192.168.0.0/24 to any out via xl0
/sbin/ipfw add divert natd all from 192.168.0.0/24 to any out via xl0
----------------/var/log/ipacct.%Y_%m_%d-------------------
...
194.87.13.37 192.168.0.41 27597 39
192.168.0.83 213.24.96.234 219 3
192.168.0.83 213.24.96.233 219 3
192.168.0.39 192.168.46.4 600 10
192.168.0.39 192.168.46.3 600 10
192.168.0.88 207.46.106.198 1655 39
207.46.106.198 192.168.0.88 1575 37
192.168.0.88 207.46.104.20 883 15
207.46.104.20 192.168.0.88 1180 18
192.168.0.88 207.46.107.112 500 9
207.46.107.112 192.168.0.88 579 10
192.168.0.88 207.46.107.30 1640 28
207.46.107.30 192.168.0.88 2445 34
...
--------------------------------------------------------
--------------------------stat.sh-----------------------
#!/bin/sh
# acct file format
# ip_from ip_to bytes packets [when_time] (обычный режим)
awk 'BEGIN {OFMT="%10.0f"; }
{
if ($1 ~ "192\\.168\\.0")
{ ip[$1]=$1; out_b[$1] += $3; all_out_b += $3 };
if ($2 ~ "192\\.168\\.0")
{ ip[$2]=$2; in_b[$2] += $3; all_in_b += $3 };
}
END {
for (name in ip)
{
out_kb = out_b[name]/1024;
in_kb = in_b[name]/1024;
all_out_kb = all_out_b/1024
all_in_kb = all_in_b/1024
printf "%-15s\t%5d Kb.In\t%7d Kb.Out\t%8d Kb.Sum\n",
name, in_kb, out_kb,in_kb+out_kb;
}
printf "%-15s\t%5d Kb.In\t%7d Kb.Out\t%8d Kb.Sum\n",
"all", all_in_kb, all_out_kb,all_in_kb+all_out_kb;
}' $1 | sort -rnk 6
ng_ipacct - (способы сбора статистики: NETGRAPH, kernel level)
(FreeBSD)
ftp://ftp.wuppy.net.ru/pub/FreeBSD/local/kernel/ng_ipacct/
Демон для акаунтинга трафика, использует NETGRAPH для получения ip
пакетов. Эта программа является логическим продолжением ipacctd.
Преимущество данной программы заключается в том, что она подгружается
и работает как модуль ядра в результате чего удается избежать
накладных расходов при переключени контекста тем самым снизив
нагрузку на процессор. Снимать статистику можно, как с конкретного
интерфейса, а так же и использовать правила ipfw tee (как и в
ipacctd)
ipcad - ( способы сбора статистики: BPF, libpcap, divert, tee or Linux
ULOG & IPQ user level)
(FreeBSD, OpenBSD, Linux, MacOS X/Darwin )
http://ipcad.sourceforge.net/
После выхода версии 3.5.0 данная программа может легко заменить все
выше перечисленные, так как она обладает всеми возможными способами
сбора трафика при этом может работать как на linux так и на freebsd.
В ней в отличии от други присутствует очень нужная вещ для удаленного
сбора статистики , это rsh сервер , имеет CISCO совместимый формат
вывода статистики. Единственны не достаток это то, что она работает в
user-level и возможно на больших потоках (10 мбит) информации может
сильнее нагружать процессор чем ng_ipacct, но так как процессоры
становятся все быстрее то это можно считать малой ценой за такую
хорошую переносимость между платформами.
Выше приведенный скрипт stat.sh может быть легко адаптирован к формату
ipcad.
Все условия по частоте сбора информации о трафике такие же как и для
ipacctd!!
ipa - (способы сбора статистики: count rule ipfw,pf,ipfilter)
(FreeBSD, OpenBSD,NetBSD, Linux)
http://ipa-system.sourceforge.net/
Демон для акаунтинга трафика, для сбора информации о трафике
использует счетчики в правилах ipfw.
К достоинствам данной программы можно отнести то, что в ней встроена
поддержка ведение собственной базы данных где храниться вся
накопленная статистика и существует возможность закрепить выполнение
любых команд за определенными событиями (такими как превышение лимита
отведенного пользователю), что позволяет легко сделать автоматическое
блокирование использования пользователем различных ресурсов сети.
К недостаткам. Данная программа в отличии от выше перечисленных не
обладает возможностью предоставить подробную таблицу с ip адресами и
портами куда обращался конкретный пользователь.
Всего наилучшего в этом лучшем из миров.
Автор: Кирилл Лопухов <kirill@sfugntu.bashnet.ru.>