The OpenNET Project / Index page

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

Создаём шлюз с системой учёта трафика на слабом компьютере (traffic freebsd gateway squid proxy arp mac limit ipcad ipfw)


<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>
Ключевые слова: traffic, freebsd, gateway, squid, proxy, arp, mac, limit, ipcad, ipfw,  (найти похожие документы)
From: Николай Емашев Date: Mon, 25 May 2009 17:02:14 +0000 (UTC) Subject: Создаём шлюз с системой учёта трафика на слабом компьютере Материал предоставлен редакцией журнала Системный администратор. Опубликовано в журнале "Системный администратор" N 3 2009 Как поставить и настроить шлюз для небольшой сети на основе FreeBSD. Вводные данные Собственно, что мы имеем: * локальная сеть из 60 машин, из которых только 15-20 нужно выпускать в Интернет; * старенький компьютер (процессор Celeron 1100 МГц, 256 Мб RAM, 30 Гб HDD, хотя стабильно работало на процессоре PII 300 МГц, только сеть не более 9-10 машин). Задачи: * организовать доступ в Интернет для 20 машин из сети; * вести детальную статистику по трафику; * отключать пользователя при превышении лимита; * настроить доступ по MAC-адресу; * резать рекламу и нежелательные сайты для сокращения расходов трафика. Теперь все по порядку. Ввиду слабенького оборудования ставить будем FreeBSD. Многие, конечно, скажут, что для такого железа может и Gentoo пойти, но, на мой взгляд, FreeBSD является более гибкой в этом отношении. Итак, приступим... Установка и настройка Как установить систему, я объяснять не буду, это не должно вызывать вопросов, скажу лишь, что для логов нужно выделять размер побольше. Если с этим сложности - handbook вам в помощь. Если вы выдержали установку, приступаем к настройке сети. Первым делом поставим веб-сервер и PHP - пригодятся для сбора статистики. Возможно, придется поставить PHP5 EXTENSIONS. Ставим прокси-сервер SQUID: # cd /usr/ports/www/squid/ По умолчанию ставится версия 2.7, другие версии находятся на каталог выше. Далее даем команду: # make install clean Выбираем опции: SQUID_DELAY_POOLS Enable delay pools - ограничение пользователям скорости канала. SQUID_FOLLOW_XFF Follow X-Forwarded-For headers - разрешить изменение http-заголовков. Может понадобиться, если вы захотите скрыть от общественности свой прокси-сервер. Все остальное можно оставить как есть. Замечание: чтобы впоследствии было меньше проблем с настройкой учетных записей пользователей, будем делать прозрачный прокси. Так, установили, теперь поставим статистику (кто какие сайты посещал, какой объем данных скачал и т. п.). Выбирать скрипт для сбора статистики - дело каждого. Их достаточное количество, но, по моему мнению, заслуживают внимания только LightSquid и Free-SA. Расскажу вкратце о них. LightSquid Запуская программу, мы получаем следующие отчёты: * Количество соединений и скачанных байт в день, в месяц и в год по каждому пользователю, для группы и для прокси-сервера в целом. * Популярные сайты дня, месяца и года. В этом отчёте приятно порадовала возможность сортировки списка по количеству запросов либо по объёму данных. * Таблица времени доступа пользователей к сайтам, то есть время активности в Интернете. * Отчёт о "больших" скачанных файлах. Также хочется отметить удобный интерфейс. Интерфейс LightSquid Из недостатков можно отметить низкую скорость обработки логов и, как было замечено на многих форумах, плохую работу с большими логами Squid, что приводит порой к неправильному подсчету. Эту проблему мы исправим позже - будем делать ротацию логов. Free-SA Написан на языке Си, по функциональности и назначению похож на LightSquid. Главное отличие - скорость формирования отчетов от 7 до 20 раз выше по сравнению с LightSquid (7х - для 50 Мб файла access.log, 20x - для 1 Гб). Присутствуют дополнительные отчеты (в том числе для оценки эффективности сервера), изменяемые "на лету" темы оформления, имеется поддержка различных форматов файлов журналов (Squid, CLF, Postfix, Qmail, CGP). Доступен в портах. Сайт - http://free-sa.sourceforge.net Может осуществлять: * контроль расхода трафика по пользователям; * контроль выполнения политик безопасности (в части доступа к ресурсам Интернета); * оценку эффективности работы серверов. Но о Free-SA поговорим в следующий раз, пока рассмотрим вопрос о сборе статистики, имея слабый компьютер. Я не говорю, что эта программа будет плохо работать, но LightSquid по своей функциональности устраивает меня больше. Эти программы локализованы, могут предоставлять отчеты в графическом виде, поддерживают шаблоны. Их можно использовать вместе, но, по-моему, это так же, как велосипеду поставить дополнительные колеса... Я остановился на Light Squid - для небольшой сети это, пожалуй, самый оптимальный вариант, и скрипты для лимита по трафику также будут под эту статистику. Работа с LightSquid По установке вопросов обычно не возникает, ежели возникнут - скажу словами Фоменко: "Если руки золотые, то не важно, откуда они растут" - обращайтесь к документации. # /usr/ports/www/lightsquid # make install clean Приступим к настройке. Для начала в httpd.conf добавим alias, чтобы можно было обратиться к нему из браузера: Alias /statistica "/usr/local/www/lightsquid" <Directory "/usr/local/www/lightsquid"> AddHandler cgi-script .cgi AllowOverride All </Directory> Позже статистику можно посмотреть, набрав в браузере: http://your_server/statistica. Далее необходимо немножко подправить конфигурационный файл: /usr/local/etc/lightsquid/lightsquid.cfg. Он небольшой, основное внимание следует обратить на следующие строки: $logpath ="/usr/local/squid/logs/"; Каталог, в котором находятся логи прокси-сервера. $skipurl = "get.theon.ru|91\.144\.144\.|penzadom.ru"; Домены и IP, с которых не будет собираться статистика - у меня это внутренние ресурсы провайдера, где не идет учет трафика. На работе - служебные сайты. $lang ="ru-koi8"; Язык в кодировке koi8, если поставить "$lang ="ru"", то будет в windows-1251. У меня в koi8, потому что я редактирую списки пользователей через консоль, которая в этой самой кодировке. Если выбрать потом "ru", то получатся крякозяблы. $templatename ="ric"; Html-шаблон можно будет скачать на сайте журнала [2]www.samag.ru в разделе "Исходный код". Стандартный не очень блещет красотой дизайнерской мысли: $bigfilelimit = 20*1024*1024; Какие файлы будем считать большими - у меня 20 Мб. $perusertrafficlimit = 300*1024*1024; Лимит трафика в день на пользователя, его, конечно, не отключат, но в статистике он будет выделен как враг народа, определенным цветом. Так что можно знать - кто в рабочее время больше всего расхищает трафик. В папке /usr/local/etc/lightsquid находятся настройки групп пользователей, так как у нас сеть небольшая, то их мы не будем затрагивать. Внесем изменения только в realname.cfg. Формат записи такой - "IP-адрес имя", например: 192.168.2.7 Есин Виктор 192.168.2.8 Калинин Владимир Статистику теперь можно получать, запуская скрипт /usr/local/www/lightsquid/lightparser.pl, что не очень удобно, поэтому его следует добавить в задания cron (команда "crontab -e"), но об этом чуть позже. Настройка коллектора для сбора трафика, идущего в обход прокси-сервера Прокси-сервер со статистикой теперь есть (далее сделаем его прозрачным). Как известно, в лог попадает в основном http-трафик, но как быть с той категорией пользователей, которые могут и с других сервисов (ftp, jabber, почта, ssh-трафик и т. п.) тонны данных скачать?! Некоторое время я бился над этой проблемой, пока... как-то вечером гугля в Интернете в поисках очередной программы, улучшившей бы мне жизнь, не наткнулся на ipcad ([3]http://lionet.info/ipcad). Вкратце - он сможет посчитать трафик, идущий в обход прокси, и записать его в логи Squid. Программа имеется в портах - /usr/ports/net-mgmt/ipcad. Помимо ipcad есть еще много коллекторов, но пересборка ядра, куча ненужных перловых скриптов, web-gui с базой MySQL и несколько убитых банок пива меня как-то не вдохновили. Поэтому пойдем по пути наименьшего сопротивления. После установки коллектора добавим его в автозагрузку: # echo 'ipcad_enable="YES"' " /etc/rc.conf Теперь правим конфигурационный файл /usr/local/etc/ipcad.conf capture-ports enable; // Интерфейс заменить на свой interface rl0 filter "ip and dst net 192.168.2.0/24 and not src net 192.168.2.0/24"; // Считаем все адреса aggregate 0.0.0.0/0 strip 32; // Теперь укажем, какие порты как отображать aggregate 1-19 into 65535; aggregate 20-21 into 21; aggregate 22-23 into 22; aggregate 25 into 25; aggregate 24 into 65535; aggregate 26-79 into 65535; aggregate 80-81 into 0; aggregate 82-109 into 65535; aggregate 110 into 110; aggregate 111-442 into 65535; aggregate 443 into 443; aggregate 444-3127 into 65535; aggregate 3128 into 0; aggregate 3129-65535 into 65535; // Настройки rsh-сервера, с помощью которого будет просматриваться статистика rsh enable at 127.0.0.1; rsh root@127.0.0.1 admin; rsh root@127.0.0.1 backup; rsh root@127.0.0.1; rsh 127.0.0.1 view-only; rsh ttl = 3; rsh timeout = 30; chroot = /var/log/ipcad; dumpfile = ipcad.dump; pidfile = ipcad.pid; Скрипт для запуска назовем ipcad.sh и разместим в /usr/local/scripts. Для удобства строки пронумерованы: 1. #!/bin/sh 2. # Диапазон адресов локальной cети, указываем подсеть 3. net="192.168.2" 4. ttime=`/usr/bin/rsh localhost sh ip acco|grep 'Accounting data saved'|awk '{print ($4)}'` 5. /usr/bin/rsh localhost clear ip accounting 6. /usr/bin/rsh localhost show ip accounting checkpoint|grep $net|awk / -v vtime=$ttime '{print (vtime".000",1,$2,"TCP_MISS/200",$4,"CONNECT",$1":"$5,"-","DIRECT/"$1,"-")}' \ "/usr/local/squid/logs/access.log Делаем прокси-сервер прозрачным и настраиваем брандмауэр. Так, определимся с брандмауэром, для этого нужно пересобрать ядро с опциями: options IPFIREWALL # Логгинг пакетов, если в правиле написано `log` options IPFIREWALL_VERBOSE # Защита от атак типа флудинга options IPFIREWALL_VERBOSE_LIMIT=50 # Перенаправление пакетов options IPFIREWALL_FORWARD # Трансляция адресов options IPDIVERT # Разрешающее последнее правило, что делает брандмауэр открытым # (на случай каких-либо ошибок в конфигурационных скриптах) options IPFIREWALL_DEFAULT_TO_ACCEPT Нам брандмауэр понадобится в основном для настройки прозрачного прокси, доступ остальных пользователей к серверу будет контролироваться по MAC-адресам сетевых карт. Если хотите защитить свой сервер от атак извне (хотя маловероятно для обычного шлюза на несколько машин, другое дело сервер в крупной компании, но чем черт не шутит), можно воспользоваться готовым конфигурационным файлом. Взять можно здесь: http://www.lissyara.su/?id=1127. Если не хочется возиться со всеми настройками, подойдет и такой: # Сбросим список ipfw -q -f flush # Установим префикс команды для набора правил cmd="ipfw add" # squid # Разрешаем исходящий трафик с сервера $cmd 50 allow all from me to any # Разрешаем входящий трафик к серверу $cmd 50 allow all from any to me # Делаем прозрачный прокси $cmd 100 fwd 127.0.0.1,3128 tcp from 192.168.2.0/24 to any 80 Чтобы брандмауэр нормально выполнял эти правила, их нужно поместить в файл. К примеру, в /usr/local/scripts/firewall.sh, сделать его исполняемым: chmod 755 /usr/local/scripts/firewall.sh и прописать загрузку в /etc/rc.conf: firewall_enable="YES" firewall_script="/usr/local/scripts/firewall.sh" Хотя он у меня лежит в /usr/local/etc/firewall.sh, но это кому как удобнее. Контроль доступа к серверу по MAC-адресам Следующим этапом нужно сделать доступ к нашему шлюзу только избранным, которые потом и кровью выбивали у начальства старенький Celeron ну или приносили пиво админу, когда он пытался заставить его нормально работать. Делать это будем при помощи arp. Вкратце - это программа, которая сопоставляет IP-адреса с их физическими адресами. Как ею пользоваться и с чем применять, я рассказывать не буду - это дело отдельной статьи, тут укажу лишь последовательность действий с объяснением конфигурационного файла. Если нужно что-то еще, то поможет man arp, если с английским плохо - поиск по [5]opennet.ru. Используем команду: # arp -an | awk -v OFS="\t" '{print(substr($2, 2, length($2)-2), $4)}' > /usr/local/etc/mac_control Результат ее выполнения запишет файл mac_control, в котором с IP-адресами будут сопоставляться их физические адреса. (Если все машины в сети включены или хотябы те, которые нам нужны.) Далее немного подправим его руками - удалим IP, которым знать о существовании нашего сервера совсем не обязательно. Если адреса нужного компьютера не оказалось в списке, достаточно пропинговать его, затем посмотреть на вывод команды "arp -a". Очистим arp-таблицу и заполним ее из нашего файла: # arp -d -a # arp -f /usr/local/etc/mac_control Но каждый раз это проделывать как-то не по-нашему, так что, погуглив, я набрел на скрипт автозапуска. Создадим такой файл - /usr/local/etc/rc.d/staticarp.sh и сделаем его исполняемым: #!/bin/sh # Static ARP-table loader # http://www.opennet.ru/base/net/arp_fix_bsd.txt.html # Сергей Супрунов amsand@yandex.ru. case $1 in start) arp -d -a > /dev/null arp -f /usr/local/etc/mac_control > /dev/null echo 'Static ARP-table is loaded' ;; stop) arp -d -a > /dev/null echo 'Static ARP-table is unloaded' ;; restart) arp -d -a > /dev/null arp -f /usr/local/etc/mac_control > /dev/null echo 'Static ARP-table is reloaded' ;; status) arp -an ;; *) echo "Usage: `basename $0` {start|stop|restart|status}" >&2 ;; esac exit 0 Сейчас нужно сделать так, чтобы другие компьютеры вообще не замечали наш сервер, для этого в rc.conf пропишем для локальной cети: ifconfig_rl0="inet 192.168.x.x netmask 255.255.255.0 staticarp" где rl0 - внутренний интерфейс. То есть сервер не будет делать arp-запросы на этом интерфейсе, и те компьютеры, которые не окажутся в файле, видеть его не смогут. Теперь остальным будет трудновато достучаться до нашего шлюза. Если только пытать не будут. Настройка прокси-сервера Многие тут же скажут: почему бы еще не установить squidGuard или rejik3? Я, конечно, не против этого, скорее даже за, но запускать все это на старенькой машине не решился. Если хотите - в Сети полно статей на эту тему, все решается добавлением пары строк в конфигурационный файл прокси-сервера. Я же опишу, как сделать редиректы средствами самого Squid. Следующй этап - правка squid.conf. Вы спросите, почему сейчас, а не в начале статьи? Потому что не совсем удобно после установки определенного софта каждый раз приводить его куски. К тому же многие новички боятся настраивать Squid, посмотрев на конфигурационный файл, а он ни много ни мало несколько десятков страниц А4. Все это потому, что в нем находятся примеры настроек и man. Поэтому вот мой рабочий конфигурационный файл с подробными комментариями: # СЕТЕВЫЕ ОПЦИИ # Указываем, на каком порту будет крутиться наш прокси и делаем его прозрачным http_port 3128 transparent # Указываем, какие url не кэшировать, а отправлять запросы напрямую acl QUERY urlpath_regex cgi-bin \? cmd dst dk?st.cmd no_cache deny QUERY # РАЗМЕРЫ КЭША И ПАМЯТЬ # Объем занимаемой памяти cache_mem 23 MB # При достижении данного уровня заполнения кэша - в процентах, # начинается ускоренный процесс удаления старых объектов cache_swap_high 95 # Процесс удаления старых объектов заканчивается, если достигнут данный уровень cache_swap_low 90 # Максимальный и минимальный объект в кэше maximum_object_size 1096 KB minimum_object_size 37 KB # Максимальный объект в памяти maximum_object_size_in_memory 1024 KB # ЛОГ-ФАЙЛЫ И ПАПКИ С КЭШЕМ # Расположение папки с кэшем и его размер (в данном случае 400 Мб) cache_dir ufs /usr/local/squid/cache 400 16 256 # Формат логов logformat squid %ts.%03tu %6tr %>a %Ss/%03Hs %<st %rm %ru %un %Sh/%<A %mt logformat squidmime %ts.%03tu %6tr %>a %Ss/%03Hs %<st %rm %ru %un %Sh/%<A %mt [%>h] [%<h] logformat common %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st %Ss:%Sh logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh # Папка с логами access_log /usr/local/squid/logs/access.log squid cache_log /usr/local/squid/logs/cache.log cache_store_log /usr/local/squid/logs/store.log # Ротация логов (не забудьте добавить задание в cron) logfile_rotate 1 # НАСТРОЙКИ ДЛЯ ВНЕШНИХ ПРОГРАММ # Под каким анонимным пользователем заходить на ftp ftp_user anonimous@mail.ru # Ширина листинга ftp ftp_list_width 64 # Пассивный или активный режимы ftp_passive off hosts_file /etc/hosts # ТОНКАЯ НАСТРОЙКА КЭША # Используется для определения устаревания объекта в кэше # (подробнее о значениях можно узнать здесь - http://www.bog.pp.ru/work/squid.html) refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern . 0 20% 4320 # Некоторые негативные ответы тоже кэшируются - connection refused и 404 not found - ttl # задает их время жизни в кэше negative_ttl 5 minutes positive_dns_ttl 15 hours negative_dns_ttl 1 minute # КОНТРОЛЬ ДОСТУПА # ------------------------------------------------------- #acl password proxy_auth REQUIRED acl fileupload req_mime_type -i ^multipart/form-data$ acl javascript rep_mime_type -i ^application/x-javascript$ # Обозначаем диапазоны адресов: acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl to_localhost dst 127.0.0.0/8 # К каким портам разрешать доступ acl SSL_ports port 443 563 5223 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 5190 # icq acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl Safe_ports port 5222 # jabber acl Safe_ports port 1025-65535 # unregistered ports acl CONNECT method CONNECT # Only allow cachemgr access from localhost http_access allow manager localhost http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_reply_access allow all icp_access allow all # АДМИНСКИЕ ПАРАМЕТРЫ # Почтовый адрес, на который будет послано письмо, если в Squid возникнут проблемы cache_mgr schmel@xak-faq.info # Если запустить Squid от имени root, то поменять UID на указанный cache_effective_user squid # Не показывать версию Squid httpd_suppress_version_string on # Отображаемое имя хоста visible_hostname unknown # Память для пулов, можете поставить свое значение, в зависимости от мощности машины # memory_pools on # memory_pools_limit 25 MB # Скрываем, что идем через прокси forwarded_for off header_access Via deny all # Сбор статистики о клиентах client_db on coredump_dir /usr/local/squid/cache ## НАСТРОЙКА ПУЛОВ И ДОСТУПА К ОПРЕДЕЛЕННЫМ САЙТАМ## # В этом файле записываются url, которым мы не будем резатьскорость # (чаще - это внутренние ресурсы провайдера) acl provider url_regex -i "/usr/local/etc/squid/acl/provider" # Белый список acl good_url url_regex "/usr/local/etc/squid/acl/good_url" # Список слов, запрещенных в url acl bad_urlpath urlpath_regex "/usr/local/etc/squid/acl/bad_urlpath" # Список запрещенных сайтов acl bad_url url_regex "/usr/local/etc/squid/acl/bad_url" # Список сайтов с клубничкой acl porno_url url_regex "/usr/local/etc/squid/acl/porno_url" # Рекламные сайты acl banner_url url_regex "/usr/local/etc/squid/acl/banner_url" # Все вышеперечисленные файлы можно брать из баз rejik или SquidGuard # Доступ к локальному веб-серверу (для статистики и ошибок) acl web_server_users src 192.168.2.0/24 acl web_server src 192.168.2.1 http_access allow good_url http_access allow provider ## ЗАПРЕТ ДОСТУПА И ОШИБКИ ## http_access deny bad_urlpath !good_url http_access deny bad_url !good_url http_access deny porno_url !good_url http_access deny banner_url !good_url # Поставим редирект на прозрачную картинку deny_info http://192.168.2.1/squid/rek/1x1.gif bad_urlpath deny_info http://192.168.2.1/squid/rek/1x1.gif bad_url deny_info http://192.168.2.1/squid/rek/1x1.gif banner_url deny_info http://192.168.2.1/squid/rek/1x1.gif porno_url ## ДЕЛИМ КАНАЛ НА ВСЕХ ПОЛЬЗОВАТЕЛЕЙ ## # В этом файле IP-адрес тех, кому разрешим доступ acl InternetUsers src "/usr/local/etc/squid/acl/InternetUsers" # Админу отдельный пул, без ограничений acl admin src 192.168.2.3 # В этом файле сайты, доступные всем разрешенным, даже тем, кто попал в бан-лист acl no_quota url_regex -i "/usr/local/etc/squid/acl/no_quota_url" # Список пользователей, превысивших лимит трафика и попавших в бан-лист acl banusers src "/usr/local/etc/squid/acl/user_deny" # Дневное время acl day time 08:00-23:59 ## ДЕЛИМ КАНАЛ В ДНЕВНОЕ ВРЕМЯ ## # Количество пулов - 2 (дневной и ночной) delay_pools 2 # Класс пула 2й delay_class 1 2 # Первые 300 Кб закачиваются на максимальной скорости, потом скорость не более 18 Кб\с delay_parameters 1 -1/-1 18000/300000 # Сайты в provider и пользователь admin обходят эти ограничения delay_access 1 allow InternetUsers day !provider !admin delay_access 1 deny all ## НОЧНОЙ ДОСТУП ## # Здесь снимаем ограничения на скорость скачивания delay_class 2 2 delay_parameters 2 -1/-1 -1/-1 delay_access 2 allow !day InternetUsers !admin delay_access 2 deny all # А здесь - наоборот, режем до минимума тем, кто решил закачку на ночь поставить #delay_class 2 2 # Первые 50 Кб - на максимальной скорости, далее не более 4 Кб\с #delay_parameters 2 -1/-1 4000/50000 #delay_access 2 allow !day InternetUsers !admin #delay_access 2 deny all # --------------------------- http_access allow admin # Разрешим пользователям внутренней сети доступ к веб-серверу, для # отображения статистики и ошибок http_access allow web_server_users web_server # Блокировка пользователей, которые превысили лимит (файл user-deny), # и разрешение доступа только к тем IP и сайтам, которые перечислены в файле # no_quota_url http_access allow InternetUsers !banusers http_access allow no_quota banusers http_access deny banusers all http_access deny all # Cоздадим файл ERR_DENIED. Представляет собой html-страницу с грозными заявлениями о вреде расхищения # корпоративного трафика. Поместить в папку с другими ошибками (например /usr/local/etc/squid/errors/Russian-1251) deny_info ERR_DENIED all ## РЕДИРЕКТОР ## # Если вы все-таки решили установить rejik #url_rewrite_program /usr/local/rejik/redirector /usr/local/rejik/redirector.conf #url_rewrite_children 15 # Директория с ошибками error_directory /usr/local/etc/squid/errors/Russian-1251 Отключение пользователей, превысивших лимит Создадим скрипт отключения пользователей, превысивших квоту на трафик. Статистика будет сниматься с LightSquid (конфигурационный файл и скрипты взяты с opennet.ru). В /etc/squid создадим папку traf_limit и в ней создадим два файла: traf_limit.pl #!/usr/bin/perl # Довесок на LightSquid Project (c) 2004-2005 Sergey Erokhin aka ESL # Скрипт создает файл user_deny для ограничения Интернета по трафику # Автор: Иван Лонин loninia@apksouz.ru 2008 год use File::Basename; # Не очень хорошо напрямую писать путь к конфигурационному файлу, но не # хотелось sh-файл для сron делать require "/etc/squid/traf_limit/config"; #($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)= localtime(time); @dat=localtime(time); $year =1900+$dat[5]; $month=1 + $dat[4]; $filter="$year$month"; #print "$log_path/$filter*\n"; @daylist=glob("$log_path/$filter*"); foreach $daypath (sort @daylist) { open FF,"<$daypath/.total"; $totaluser=<FF>;chomp $totaluser;$totaluser=~s/^user: //; $totalsize=<FF>;chomp $totalsize;$totalsize=~s/^size: //; while (<FF>) { ($user,$size,$hit)=split; $h{$user}{size}+=$size; $h{$user}{hit}+=$hit; } close FF; } # $cummulative=0; open RES,">$res_file"; print RES "# файл содержит пользователей, превысивших квоту.\n # автоматически переписывается скриптом traf_limit.pl\ndolzhen_bit_odin_user\n"; foreach $user (sort {$h{$b}{size}<=>$h{$a}{size}} keys %h) { $all4user=$h{$user}{size}/1024/1024; if ($vip_user{$user}{size} > 0) { $limit=$vip_user{$user}{size}; }else{ $limit=$all_limit; } if ($all4user >= $limit) { print RES "$user\n"; # print "$h{$user}{size}\n"; }; } И конфигурационный файл для скрипта traf_limit.pl - /etc/squid/traf_limit/config: #!/usr/bin/perl # путь к логам lightsquid $log_path="/www/lightsquid/report"; # Файл, в который пишутся пользователи, превысившие лимит $res_file="/usr/local/etc/squid/acl/user_deny"; # Лимит трафика в мегабайтах $all_limit=1500; # Привилегированные пользователи с повышенным или пониженным # лимитом для каждого пользователя строка формата: #$vip_user={<имя_пользователя}{size}=<лимит_в_мегабайтах>; $user1="192.168.2.3"; $vip_user{user1}{size}=7000; Назначим файлам права на запуск: # chmod 775 /etc/squid/traf_limit/config # chmod 775 /etc/squid/traf_limit/traf_limit.pl Следует отметить, что пользователя, превысившего лимит, отключат только после того, как выполнится скрипт. Так что, если вам дорог каждый мегабайт, следует почаще снимать статистику и запускать traf_limit.pl. Но чем чаще это проделывать, тем выше нагрузка на сервер. Хотя если мощность позволяет, то почему бы и не попробовать. Также отмечу, что скрипт работает на текущую дату. Так что его запуск вечером категорически не рекомендуется (первого числа будут использоваться данные за прошлый месяц). Запись всех заданий в планировщик Наконец-то все установили и настроили, осталось связать все это вместе. Вот то, что должно быть записано в заданиях cron: # crontab -e # В 4:55 сбрасывать трафик из коллектора ipcad в логи прокси-сервер 55 04 * * * /usr/local/scripts/ipcad.sh # В 5:05 снимать статистику LightSquid 05 05 * * * /usr/local/www/lightsquid/lightparser.pl # В 5:15 запускать скрипт лимита по трафику 15 05 * * * /usr/local/etc/squid/traf_limit/traf_limit.pl # 5:25 производить ротацию логов 25 05 * * * /usr/local/sbin/squid -k rotate # Запуск скрипта, удаляющего старые логи 35 05 * * * /usr/local/scripts/rmsquidlogs.sh Содержимое скрипта /usr/local/scripts/rmsquidlogs.sh: #!/bin/sh rm /usr/local/squid/logs/access.log.0 rm /usr/local/squid/logs/cache.log.0 rm /usr/local/squid/logs/store.log.0 Вот в принципе и все. Шлюз настроен, трафик считается, начальство довольно, и все это на стареньком селерончике.

<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>

Обсуждение [ Линейный режим | Показать все | RSS ]
 
  • 1.1, Дмитрий, 15:32, 26/05/2009 [ответить] [смотреть все]
  • +/
    Ничего се старенькое железко, у меня тоже самое на Pent-120, 24мб RAM, FreeBSD 4.2, еще стоит mpd и racoon
     
  • 1.2, Лера, 15:43, 26/05/2009 [ответить] [смотреть все]
  • +/
    А я кое-что новое для себя почерпнул. Спасибо автору!
     
  • 1.3, Незнайка, 16:18, 26/05/2009 [ответить] [смотреть все]
  • +/
    в статье указаны ссылки, в частности на www.samag.ru, я не нашел там шаблона для lightsquid
     
  • 1.4, Zl0, 17:47, 26/05/2009 [ответить] [смотреть все]
  • +/
    Сборная солянка, все это по отдельности уже было и не раз..
     
  • 1.6, Vladimir, 19:41, 26/05/2009 [ответить] [смотреть все]
  • +/
    >>  где rl0 - внутренний интерфейс. То есть сервер не будет делать  arp-запросы на этом интерфейсе, и те компьютеры, которые не окажутся в файле, видеть его не смогут.

    Но в таком случае на каждом клиенте надо прописать статически mac адрес шлюза.

     
  • 1.7, Pavel, 21:21, 26/05/2009 [ответить] [смотреть все]  
  • +/
    Все новое, хорошо позабытое(да и не совсем) старое. (с) хзкто
     
  • 1.8, igor, 06:56, 27/05/2009 [ответить] [смотреть все]  
  • +/
    Про лимиты. Помнится давным-давно, когда еще не было безлимитных тарифов, столкнулся с такой проблемой. Если юзер начнет тянуть файл гига на четрые то пока он его не докачает или не начнется докачка, вследствие обрыва соединения, информация о скаченном объеме в логах сквида не отобразится. Поэтому при ограничении трафика, допустим 1,5 гб, лимиты сработают уже только при многократном их превышении. Наблюдательные юзеры чем успешно и пользовались. При оставшемся трафике несколько мегов ставили на закачку в один поток что-нибудь объемное мегов на 700 и если канал до сервера хороший файл успешно закачивался  Может сейчас этой проблемы в сквиде и не существет, тогда я ее решил с помощью ipastat для ipfw. Считает каждый пакетик который идет через файервол и лимиты срабатывают на ура практически в реальном времени.
     
  • 1.9, Andrew, 10:14, 27/05/2009 [ответить] [смотреть все]  
  • +/
    Статья хорошая, но все это можно сделать на базе FreeNAS, тем более у него удобная веб-морда
     
  • 1.10, Andrew, 11:40, 27/05/2009 [ответить] [смотреть все]  
  • +/
    Прошу прощения не FreeNas, a pfsense http://www.pfsense.org :)
     
  • 1.11, Vladimir, 15:09, 27/05/2009 [ответить] [смотреть все]  
  • +/
    eBox если не на фряхе делать
    а если не на фряхи то можно FreeSCO попробовать
     
  • 1.12, OneROFL, 15:26, 27/05/2009 [ответить] [смотреть все]  
  • +/
    Ставишь SAMS и все.
     
  • 1.13, Sergey, 15:17, 29/07/2009 [ответить] [смотреть все]  
  • +/
    Добрый день.
    Подскажите, а та статистика, которую ipcad кладет в access.log squida как обрабатывается lightsquidom???
    Не происходит ли удвоение трафике по 80 порту???
     
     
  • 2.14, Незнайка, 15:20, 29/07/2009 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    ipcad учитывает всеь трафик проходящий через интерфейс, и складывает он его в др... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.15, Sergey, 15:36, 29/07/2009 [^] [ответить] [смотреть все]  
  • +/
    так по статье ipcad из dump-файла перекладывает статистику именно в access log, ... весь текст скрыт [показать]
     
  • 1.16, Незнайка, 15:43, 29/07/2009 [ответить] [смотреть все]  
  • +/
    по идее дважды трафик посчитается только для прокси сервера
     
     
  • 2.17, Sergey, 15:46, 29/07/2009 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    И как бы от этого избавиться Возникает вопрос ... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.18, Незнайка, 16:02, 29/07/2009 [^] [ответить] [смотреть все]  
  • +/
    не считать трафик в ипкаде для прокси... весь текст скрыт [показать]
     
     
  • 4.19, Sergey, 16:19, 29/07/2009 [^] [ответить] [смотреть все]  
  • +/
    А есть пример???
    чего то я не нашел на просторах интернета как это сделать!


     
     
  • 5.20, Незнайка, 16:25, 29/07/2009 [^] [ответить] [смотреть все]  
  • +/
    например в анализаторе логов добавить прокси в список хостов, с которых не надо считать трафик, ну или анализировать трафик от ipcad чем-то другим, например Netflow analyzer.
    Т. е. у тебя будет трафик от прокси с указанием урлов - кто куда ходи и что качал, и статистика по всему трафику, но только третьего/четвертого уровня. т.е. кто откуда и порты, но не имена файлов.
     
     
  • 6.21, Sergey, 16:28, 29/07/2009 [^] [ответить] [смотреть все]  
  • +/
    видимо придется пользоваться просто двумя разными анализаторами...
    хотя хотелось бы все в один объеденить!


     
     
  • 7.22, Незнайка, 16:32, 29/07/2009 [^] [ответить] [смотреть все]  
  • +/
    >видимо придется пользоваться просто двумя разными анализаторами...
    >хотя хотелось бы все в один объеденить!

    если не нужна подробная статистика, вроде того: тот-то юзер качал файл supermusic.mp3, а другой megasoftina.exe, то можешь оставить тока ipcad. он тебе покажет с какого ипа и с какого порта качали.

     
     
  • 8.23, Sergey, 17:23, 29/07/2009 [^] [ответить] [смотреть все]  
  • +/
    так вот ведь хотелось бы и подробно, и весь трафик остальной учесть!

     
     
  • 9.28, Aleksey, 18:34, 25/05/2012 [^] [ответить] [смотреть все]  
  • +/
    чтобы ipcad не писал в сквидовский лог 80 порт, надо добавть в ipcad.conf

    and not src port 80

    т.е. строчка где определяем за какой карточкой будем следить будет выглядеть

    interface em0 filter "ip and dst net 192.168.0.0/24 and not src net 192.168.0.0/24 and not src port 80";

     
  • 1.24, mac, 16:34, 21/08/2009 [ответить] [смотреть все]  
  • +/
    достаточно просто добавить исключение для 0го порта в настройках lightsquid
     
  • 1.25, Undel, 12:11, 07/09/2009 [ответить] [смотреть все]  
  • +/
    А можно ограничивать трафик пользователям не по IP-адресам, а по доменным учеткам?
     
  • 1.26, mac, 14:55, 06/10/2009 [ответить] [смотреть все]  
  • +/
    по доменным - можно...на сайте lissyara.su - есть парочка статей на эту тему
     
  • 1.27, neurobomman, 12:27, 24/10/2009 [ответить] [смотреть все]  
  • +/
    мда уж... с NetAMS все гораздо гораздо проще
     

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





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