The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Обзор mathopd, 3proxy, sqlite и систем для учета трафика. (web httpd mathopd proxy sqlite traffic ipacctd)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: 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.>

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Ваш комментарий
Имя:         
E-Mail:      
Заголовок:
Текст:





  Закладки на сайте
  Проследить за страницей
Created 1996-2017 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
Hosting by Ihor