Содержание
Задача
Создать полнофункциональный узел доступа к сети интернет на 2000 человек с авторизацией, системой приоритетов и фильтрацией нежелательного контента.
Установка
Необходимо установить пакеты Squid (прокси) и Apache2 (веб-сервер):
zypper in squid apache2
Настройка squid.conf
Далее мы рассмотрим параметры в таком же порядке, в котором они расположены в оригинальном squid.conf
Указываем серверу какой порт слушать и на каком интерфейсе:
http_port 192.0.2.1:8080
Кеши в памяти и на диске
Прокси сервер squid имеет 2 вида кеша: один хранится в RAM, другой - в HDD. В случае, когда есть дефицит пропускной способности внешнего канала и стоит задача экономии внешнего трафика, целесообразно по-максимуму использовать оба кеша. В случае же, когда внешний канал достаточно большой, ровно как и трафик, проходящий через прокси-сервер, стратегия настройки кеша будет другой.
Дефицит внешнего канала
Настроим кеш таким образом, чтобы максимально экономить трафик и, в общем случае, увеличить отзывчивость популярных ресурсов.
Поскольку на сервере установлено 2 Gb ОЗУ, ставим побольше объем кеша в памяти:
cache_mem 1024 MB
Увеличиваем максимальный размер файла, хранящегося в кеше на диске:
maximum_object_size 32768 KB
…и в ОЗУ:
maximum_object_size_in_memory 1024 KB
Настраиваем политику замещения файлов в памяти и дисковом кэше, мы используем сочетание LFUDA и GDSF http://www.hpl.hp.com/techreports/1999/HPL-1999-69.html http://www.hpl.hp.com/techreports/98/HPL-98-173.html
Политика GDSF оптимизирует скорость объектов, храня маленькие популярные объекты в кэше поэтому она имеет больше шансов на совпадение. Она достигает более низкой скорости, чем LFUDA, так как она исключает большие (возможно, популярные) объекты.
cache_replacement_policy heap LFUDA memory_replacement_policy heap GDSF
Мы используем дисковый кеш объемом 32 Гб:
cache_dir ufs /var/cache/squid 32000 128 256
Здесь вы можете задать каталоги, которые вы будете использовать. Вы должны уже mkreiserfs'd разделы каталога кэша, так что вам не придется долго думать над этими значениями. Во-первых, вам нужно будет использовать около 80% и менее каждого каталога кэша для веб-кэша. Если вы используете больше этого, вы начнете видеть небольшое снижение производительности. Помните, что размер кэша не так важен, как его скорость, так как для достижения максимальной эффективности кэш должен хранить траффик около недели. Вы также должны определить количество каталогов и подкаталогов. Формула для рассчёта:
x=Размер каталога кэша в KB (напр.: 6GB=~6,000,000KB) y=Средний размер объектов (просто используйте 13KB z=Количество каталогов в каталоге первого уровня. (((x / y) / 256) / 256) * 2 = # количество каталогов
Например, я использую 6GB каждого из моих 13GB дисков, так:
6,000,000 / 13 = 461538.5 / 256 = 1802.9 / 256 = 7 * 2 = 14
Таким образом моя cache_dir будет выглядеть так:
cache_dir 6000 14 256
Это действительно две важные вещи. Все остальное просто доработка. Возможно, вы захотите выключить хранения логов поскольку с ними всё равно не так много, что можно сделать:
Дефицит ресурсов сервера на быстром канале
В случае, если интернет-канал организации достаточно велик (десятки и сотни mbps) и суточный трафик составляет десятки и сотни Gb, стратегия настройки прокси-сервера в корне меняется, т.к. нет нужды экономить «мегабайты», но при этом необходимо сделать так, чтобы интернет, идущий через прокси, был быстрее, а не медленнее идущего напрямую. По результатам исследования компании IBM перемещение 7% наиболее востребованых данных на СХД с медленных носителей в быстрый кеш увеличивает общую отзывчивость системы на 80% и более. Воспользуемся этим же подходом для ускорения работы сети интернет.
cache_mem 5120 MB maximum_object_size_in_memory 512 KB memory_replacement_policy heap GDSF cache_dir null /tmp
Для начала максимально увеличиваем объем кеша в ОЗУ:
cache_mem 1536 MB
…и уменьшаем максимальный объем хранимых объектов:
maximum_object_size 512 KB maximum_object_size_in_memory 512 KB
Политику замещения файлов в кеше ОЗУ используем GDSF:
memory_replacement_policy heap GDSF
…и отключаем дисковый кеш совсем:
cache_dir null /tmp
Для чего это делается. По простому эмпирическому правилу (с форумов nag.ru) объем дискового кеша для эффективной работы д.б. не меньше, чем суточный объем трафика. При объеме дискового кеша в сотню-другую гигабайт возникает несколько проблем, а именно: кеш такого объема требует много ОЗУ (14 MB of memory per 1 GB on disk for 64-bit Squid) http://wiki.squid-cache.org/SquidFaq/SquidMemory Squid Web Proxy Wiki: SquidFaq/SquidMemory и высокоскоростной дисковой подсистемы на сервере, переваривающей много iops, что стоит денег. При этом в нашем случае было проверено экспериментально, что уменьшение объема кеша в 30 раз снижает эффективность кеширования всего в 1.5 раза.
В данной ситуации выигрышная стратегия заключается в полном отказе от кеша на жестком диске и максимальном увеличении объема ОЗУ и объема кеша в памяти на прокси сервере. Тюнинг кеша на небольшие файлы делается при этом для того, чтобы сократить задержки при их передаче и увеличить количество обслуживаемых кешем запросов. При наличии быстрого интернет-канала нет особой разницы, с какой скоростью передается файл объемом 100 Кб или 1 Мб, поэтому смысла кешировать большие файлы нет, а вот разница между получением 100 мелких файлов (оформление сайтов и проч.) через интернет или же из RAM-кеша по гигабитной сети видна на глаз, да и pps на маршрутизаторе экономится довольно неплохо.
Указываем программу для обработки URL'ов, она используется для борьбы с баннерами и будет подробно рассмотрена далее. Количество children указано большим для того, чтобы пользователи не испытывали некомфортных задержек при работе с сетью.
redirect_program /usr/local/bin/redirector redirect_children 50
Авторизация через LDAP (подробнее в следующем разделе):
auth_param basic program /usr/sbin/squid_ldap_auth -b "cn=example.com" ldap.example.com auth_param basic children 10 auth_param basic realm RSU proxy-server auth_param basic credentialsttl 2 minutes
Поскольку в дальнейшем мы используем ACL max_user_ip, выставляем следующий параметр:
authenticate_ip_ttl 5 minutes
Тюнинг http-заголовков для более эффективного кеширования статических файлов
refresh_pattern -i ^http://thumbs.ebay.com 2880 50% 43200 ignore-reload override-expire override-lastmod refresh_pattern -i ^http://include.ebaystatic.com 2880 50% 43200 ignore-reload override-expire override-lastmod refresh_pattern -i \.swf 2880 50% 43200 ignore-reload override-expire override-lastmod refresh_pattern -i \.(gif|jpe?g|png|ico|zip|rar|arj|lha|lzh|cab|exe|wm[afv]|divx|avi|flv|fmv|rlv|r[ma]|mpe?g|mp[234]|wav|mid|pdf|bz2| tgz|ppt|avc|klb|tar\.gz|tgz|tar\.bz2|tbz2)$ 2880 50% 43200 ignore-reload override-expire override-lastmod refresh_pattern -i \.(gif|jpe?g|png|ico|zip|rar|arj|lha|lzh|cab|exe|wm[afv]|divx|avi|r[ma]|mpe?g|mp[234]|wav|mid|pdf|bz2|tgz|ppt|avc| klb|tar\.gz|tgz|tar\.bz2|tbz2)$ 2880 50% 43200 override-expire override-lastmod # LiveJournal refresh_pattern livejournal\.com/userpic/ 3200 100% 43200 ignore-reload override-expire override-lastmod refresh_pattern stat\.livejournal\.com/ 3200 100% 43200 ignore-reload override-expire override-lastmod refresh_pattern userpic\.livejournal\.com/ 3200 100% 43200 ignore-reload override-expire override-lastmod refresh_pattern pics\.livejournal\.com/ 21600 100% 43200 ignore-reload override-expire override-lastmod # Fishki.net static content refresh_pattern ru\.fishki\.net/ 21600 100% 43200 ignore-reload override-expire override-lastmod refresh_pattern de\.fishki\.net/ 21600 100% 43200 ignore-reload override-expire override-lastmod # Photofile.ru refresh_pattern photofile\.ru/photo/ 21600 100% 43200 ignore-reload override-expire override-lastmod refresh_pattern -i mode=attach|MessagePart|/simg/ 600000 50% 1200000 refresh_pattern -i /top100\.cnt 43200 100% 43200 refresh_pattern -i /(counter|hit|erle\.cgi|bb\.cgi)$ 43200 100% 43200 # Macromedia/Adobe Flash player refresh_pattern macromedia.com/.*\.(cab|exe|zip)$ 43200 100% 43200 # Windows Update refresh_pattern windowsupdate.com/.*\.(cab|exe|zip|psf)$ 43200 100% 43200 refresh_pattern download.microsoft.com/.*\.(cab|exe|zip|psf)$ 43200 100% 43200 refresh_pattern -i \.(cgi|asp|php|fcgi|rbx|rhtml) 0 20% 60 # Google # google maps/earth/etc = min 7 days refresh_pattern -i google\.com/(flatfile|kh|mt)\? 10080 50% 43200 ignore-reload override-expire override-lastmod # VKontakte.ru refresh_pattern vkontakte.ru/.*\.(jpg|gif|flv|mp3)$ 43200 100% 43200 refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern \? 0 20% 4320 refresh_pattern . 5 20% 4320
ACL's
Разрешаем ICQ, Jabber и IRC:
acl SSL_ports port 443 563 5190 5222 5223 6667-7000
Создаем правило для доступа к сервисам windows update, поиска кодеков и активации windows
acl winupdate dstdomain .windowsupdate.com .update.microsoft.com .windowsupdate.microsoft.com .one.microsoft.com .genuine.microsoft.com .c.microsoft.com .codecs.microsoft.com
Правило для доступа к обновлениям mozilla
acl mozupdate dstdomain .addons.mozilla.org
Правило для ресурсов, к которым мы просто хотим дать свободный доступ
acl freeres dstdomain .fepo.ru
Указываем правила:
# Баннеры acl banners dstdomain "/etc/squid/hawk/banner.list" # Порно acl porno dstdomain "/etc/squid/hawk/porno.list" # Анонимайзеры acl anonymizer dstdomain "/etc/squid/hawk/anonymizer.list" # Службы знакомств acl love dstdomain "/etc/squid/hawk/love.list" # Он-лайн игры acl gamez dstdomain "/etc/squid/hawk/gamez.list" # Разнообразные "тяжелые"ресурсы, rapidshare, zaycev.net etc acl vari dstdomain "/etc/squid/hawk/vari.list" acl varihard dst "/etc/squid/hawk/varihard.list" # Жестко блокируемые ресурсы acl hardban dst "/etc/squid/hawk/hardban" # Подсети ICQ acl icqban dst "/etc/squid/hawk/icqban.list" # Mail.ru Agent acl mailaban dstdomain "/etc/squid/hawk/mailabandst.list" # Фишинговые сервера acl fishban dst "/etc/squid/hawk/fishban"
Список заблокированных ресурсов для учебных классов и Wi-Fi
acl classes_entertain dstdomain "/etc/squid/hawk/classesban.list" acl wifi_entertain dstdomain "/etc/squid/hawk/wifiban.list"
Запрещаем всем доступ к:
http_access deny all banners http_access deny all porno http_access deny all anonymizer http_access deny all hardban http_access deny all fishban http_access deny all mailaban http_access deny all gamez
Указываем собственные страницы, вдаваемые при запрещениях:
deny_info ERR_BLOCKED_BANNER banners deny_info ERR_BLOCKED_PORN porno deny_info ERR_BLOCKED_ANON anonymizer deny_info ERR_BLOCKED_PORN hardban deny_info ERR_BLOCKED_FISH fishban deny_info ERR_BLOCKED_GAMEZ gamez deny_info ERR_BLOCKED_CLASSES_ENT classes_entertain deny_info ERR_BLOCKED_CLASSES_ENT wifi_entertain deny_info ERR_BLOCKED_CLASSES_ENT icqban deny_info ERR_BLOCKED_CLASSES_ENT love deny_info ERR_BLOCKED_CLASSES_ENT mailaban deny_info ERR_BLOCKED_VARI vari deny_info ERR_BLOCKED_VARI varihard
Определяем рабочее время
acl work_day time M T W H F A 8:00-17:00
Определяем правило для определенных типов файлов по расширению
acl blockfiles urlpath_regex "/etc/squid/hawk/restfiles" deny_info ERR_BLOCKED_FILES blockfiles
Определяем свои сети как для исходящих, так и для входящих соединений
acl our_networks src 192.0.2.0/24 acl rspu_net dst 192.0.2.0/24 acl rspu_dns dstdomain .example.org
Определяем лимиты на одновременные подключения
acl connlim maxconn 10 acl connlim5 maxconn 5 acl connlim50 maxconn 50 deny_info ERR_MAXCONN connlim deny_info ERR_MAXCONN connlim5 deny_info ERR_MAXCONN connlim50
Определяем ip-адреса wi-fi сети
acl wi-fi src 198.51.100.0/24
Подключаем список особо отличившихся товарищей (список генерируется автоматически, см. раздел Работа с «качками»)
acl loaderz proxy_auth "/etc/squid/pools/auto_loaderz.pool"
Подключаем простых сотрудников
acl staff proxy_auth REQUIRED
Подключаем список учебных машин в классах
acl classes src "/etc/squid/pools/classes.pool"
Определяем правило, запрещающее одновременные подключения под одним аккаунтом более чем с одного ip-адреса
acl anticaesar max_user_ip -s 1 deny_info ERR_ANTICAESAR anticaesar
Порядок расположения access/deny имеет первостепенное значение!
Собираем правила, не требующие идентификации пользователей при помощи паролей
Запрещаем «чужакам» работать через наш сервер
http_access deny !our_networks
Разрешаем всем доступ к ранее определенным службам winupdate, mozilla update, свободным и локальным ресурсам
http_access allow winupdate http_access allow mozupdate http_access allow freeres http_access allow rspu_net http_access allow rspu_dns
Секция wi-fi
# Запрещаем более 50 одновременных подключений на машину http_access deny wi-fi connlim50 # Запрещаем ранее определенные ресурсы http_access deny wi-fi wifi_entertain # Запрещаем доступ в рабочее время определенным файлам и сайтам (чтобы не грузить канал) http_access deny wi-fi work_day blockfiles http_access deny wi-fi work_day vari http_access deny wi-fi work_day varihard # Разрешаем доступ http_access allow wi-fi
Секция учебных классов
# Запрещаем более 5 одновременных подключений на машину http_access deny classes connlim5 # Запрещаем ранее определенные ресурсы http_access deny classes classes_entertain # ...и Аську http_access deny classes icqban # ...и знакомства http_access deny classes love # ибо негоже во время занятий вместо того чтобы слушать преподавателя, # сидеть на одноклассниках и чатиттся до потери пульса # --- # Запрещаем доступ в рабочее время определенным файлам и сайтам (чтобы не грузить канал) http_access deny classes work_day blockfiles http_access deny classes work_day vari http_access deny classes work_day varihard # Разрешаем доступ http_access allow classes
Собираем правила, которым необходима идентификация пользователей при помощи паролей
Данные правила работают только если клиент не попал ни под одно из вышеперечисленных и система спросила у него пароль
Работа с «качками»
# Запрещаем "качкам" одновременный доступ с разных машин. http_access deny loaderz anticaesar # Запрещаем скачивать в рабочее время определенные типы файлов http_access deny loaderz work_day blockfiles # Запрет на более чем 10 одновременных соединений с клиента в рабочее время http_access deny loaderz work_day connlim # Запрет на более чем 5 одновременных соединений с клиента в нерабочее время # как раз тогда, когда по правилам откроются "тяжелые" сайты http_access deny loaderz !work_day connlim5 http_access deny loaderz work_day vari http_access deny loaderz work_day varihard # Разрешаем доступ http_access allow loaderz
Обычные пользователи Запрещаем более 50 одновременных подключений. На нормальной работе это не сказывается, а вот от всяких download master и проч., качающих в 100 и более одновременных потоков помогает хорошо.
http_access deny staff connlim50 http_access allow staff
И в конце стандартное правило запрета всех остальных
http_access deny all
Указываем, что squid не кеширует, а напямую общается с ранее определенными локальными ресурсами
always_direct allow rspu_net
Delay Pools
Данные параметры отвечают за шейпинг трафика
Указываем количество пулов
delay_pools 3
Определяем классы (про типы классов подробно написано в самом конфигурационном файле)
delay_class 1 2 delay_class 2 2 delay_class 3 3
Определяем кто к какому классу относится
delay_access 1 allow classes delay_access 1 deny all delay_access 2 allow loaderz delay_access 2 deny all delay_access 3 allow staff delay_access 3 deny all
Определяем итоговую скорость для пулов
# 128 kbit/sec на подсеть, 64k кажому delay_parameters 1 128000/128000 64000/64000 # 48 kbit на подсеть, 16k каждому delay_parameters 2 48000/48000 16000/16000 # В настоящее время лимиты сняты delay_parameters 3 -1/-1 -1/-1 -1/-1
Определение настроек
Автоматическое ([[WPAD|http://en.wikipedia.org/wiki/Web_Proxy_Autodiscovery_Protocol]])
В dns указываем cname на proxy:
proxy IN A 192.0.2.1 wpad IN CNAME proxy
Не забываем увеличить на 1 серийный номер зоны.
Для клиентских машин, игнорирующих dns-суффикс в запросе и ломящихся напрямую по адресу «wpad» делаем зону-заглушку:
$TTL 2d @ IN SOA ns.example.com. root.example.com. ( 2009011603 ; serial 3h ; refresh 1h ; retry 1w ; expiry 1d ) ; minimum wpad. IN NS ns.example.com. wpad. IN NS ns2.example.com. wpad. IN A 192.0.2.1
и подключаем ее в конфигурационном файле named.conf:
zone "wpad" in { file "master/wpad"; type master; allow-query { any; }; };
На dhcp-сервере в конфигурационном фале dhcpd.conf:
option wpad-curl code 252 = text ; option wpad-curl "http://proxy.example.com/wpad.dat\000" ;
В корень www-сервера нашей машины (для suse это /srv/www/htdocs/) кладем файл с именем следующего содержания:
wpad.dat
- wpad.dat
function FindProxyForURL(url, host) { if (shExpMatch(url,"*.example.com/*")) { return "DIRECT"; } if (isInNet(myIpAddress(), "192.0.2.0", "255.255.255.0")) { return "PROXY proxy.example.com:8080"; } else return "DIRECT"; }
Подробный синтаксис команд данного файла можно найти на сайте netscape.
Делаем символические ссылки (ln -s) для разных версий windows и разных вариантов глюков IE:
proxy.pa -> wpad.dat proxy.pac -> wpad.dat wpad.da -> wpad.dat wpad.js -> wpad.dat wpad.jvs -> wpad.dat wpad.pac -> wpad.dat
В конфигурационных файлах apache2 добавляем следующие строки:
/etc/apache2/mime.types
application/x-ns-proxy-autoconfig dat application/x-javascript-config pac
/etc/apache2/mod_mime-defaults.conf
AddType application/x-javascript-config .pac AddType application/x-ns-proxy-autoconfig .dat
Перезапускаем apache:
rcapache2 restart
Страница "заглушка"
На роутере (SLES 9) делаем следующее. В директории /srv/www создаем файл index.html с описанием настроек proxy-сервера.
В файле /etc/sysconfig/SuSEfirewall2 добавляем следующее:
FW_REDIRECT="наша_подсеть/маска,!подсеть_серверов/маска,tcp,80,80"
Теперь все запросы из локальной сети в интернет, идущие мимо прокси, будут попадать на страницу-заглушку с указаниями.
Пример страницы: http://gw.rsu.edu.ru/
Аутентификация пользователей
Доступ по ip-адресам/подсетям
В конфигурационном файле доавляем следующие строки:
acl classes src "/etc/squid/pools/classes.pool" http_access allow classes
Аутентификация через MySQL
Скрипт для basic-authentication:
- basic-auth.pl
#!/usr/bin/perl use DBI; use IO::Handle; $dbh = DBI->connect("DBI:mysql:db-name:example.com","db-user","db-pass"); while ($answer = <STDIN>) { chomp $answer; @personal = split(/ /, $answer); $sql = "select login from users where login='$personal[0]' and password='$personal[1]'"; $sth = $dbh->prepare($sql); $sth->execute or die "SQL Error: $DBI::errstr\n"; $result = $sth->fetchrow_array(); if ($result) { print "OK\n"; } else { print "ERR\n"; } IO::Handle::flush(STDOUT); }
squid.conf:
# (MySQL) auth_param basic program /usr/local/bin/squid_mysql_auth auth_param basic children 10 auth_param basic realm Example proxy-server auth_param basic credentialsttl 2 minutes
Аутентификация через LDAP
В нашем случае в качестве LDAP-сервера выступает Communigate Pro. В настойках:
Включаем Управление Пользователями через LDAP:
Пользователи → Центральный справочник
Управление Пользователями через LDAP: Включено
Проверка:
squid_ldap_auth -b "cn=domain.name" cgp.example.com
Должно выдавать OK/ERR на plaintext-строку «имя пароль»
В конфигурационном файле squid.conf:
# (CommuniGate LDAP) auth_param basic program /usr/sbin/squid_ldap_auth -b "cn=example.com" cgp.example.com auth_param basic children 10 auth_param basic realm Example proxy-server auth_param basic credentialsttl 2 minutes
Логи
В нашем случае мы используем ежедневную ротацию логов прокси сервера squid. В SLES это делается таким образом:
Правим файл /etc/logrotate.d/squid
, заменяем строчку (для секции access.log) size=+4096 на daily.
Правим файл /etc/sysconfig/cron
. По умолчанию скрипты logrotate запускаются через cron.daily, который в свою очередь стартует следующим образом:
# At which time cron.daily should start. Default is 15 minutes after booting # the system. Due the cron script runs only every 15 minutes, it will only # run on xx:00, xx:15, xx:30, xx:45, not at the accurate time you set.
Как видно нас такой вариант не устраивает, меняем:
DAILY_TIME="00:15"
SARG
Добавляем поддержку русского языка в кодировке UTF:
cd /etc/squid/sarg/languages iconv -f cp1251 -t utf-8 < Russian_cp1251 > Russian_utf8
Модифицируем конфигурационный файл: /etc/squid/sarg/sarg.conf
language Russian_utf8 output_dir /srv/www/htdocs/sarg resolve_ip yes exclude_users /etc/squid/sarg/stealth_users.txt overwrite_report yes records_without_userid ignore topsites_sort_order BYTES D usertab /etc/squid/sarg/users_list.txt displayed_values abbreviation
LightSquid
Ежемесячный отчет на почту пользователям и начальству
При использовании lightsquid сделать подобный функционал весьма просто:
/etc/cron.monthly/peruserstat
- peruserstat
#!/bin/bash export LANG=ru_RU.UTF-8 export LC_CTYPE="ru_RU.UTF-8" export LC_NUMERIC="ru_RU.UTF-8" export LC_TIME="ru_RU.UTF-8" export LC_COLLATE="ru_RU.UTF-8" export LC_MONETARY="ru_RU.UTF-8" export LC_MESSAGES="ru_RU.UTF-8" export LC_PAPER="ru_RU.UTF-8" export LC_NAME="ru_RU.UTF-8" export LC_ADDRESS="ru_RU.UTF-8" export LC_TELEPHONE="ru_RU.UTF-8" export LC_MEASUREMENT="ru_RU.UTF-8" export LC_IDENTIFICATION="ru_RU.UTF-8" YY=`date --date='1 day ago' "+%Y"` MM=`date --date='1 day ago' "+%m"` UL=`awk -F " " '{ print $1 ;}' < /srv/www/cgi-bin/light/realname.cfg` for i in $UL do w3m -dump -T text/html "http://localhost/cgi-perl/light/user_detail.cgi?year=$YY&month=$MM&user=$i&mode=month">/tmp/monthly/$i.txt echo "Пожалуйста ознакомьтесь с вложенным файлом. Желаем приятной работы!" | \ mail -r postmaster@example.com -a /tmp/monthly/$i.txt -s "[PROXY] Месячный отчет об использовании интернета" $i@example.com done # Отсылаем начальству список отличившихся за месяц ADMINS="admin1 admin2 boss" w3m -dump -T text/html "http://localhost/cgi-perl/light/month_detail.cgi?year=$YY&month=$MM">/tmp/monthly/topusers.txt for i in $ADMINS do echo "Пожалуйста ознакомьтесь с вложенным файлом. Список пользователей отсортирован по объему потребленного за месяц траффика. \ По всем вопросам можете обращаться по адресу mailto:admin@example.com Желаем приятной работы!" | \ mail -r admin@example.com -a /tmp/monthly/topusers.txt -s \ "[PROXY] Месячный отчет об общем использовании интернета пользователями" $i@example.com done rm /tmp/monthly/*.txt
Обратите внимание на экспорт переменных локали. Без этого сообщения отсылаться не будут.
Ручной анализ
Бывает небходимо проводить изыскания в промежутках времени, больших, чем файл логов, приходится просматривать архивы. Данный скрипт собирает из всех логов архива единый файл по какому-либо признаку для дальнейшей обработки:
- hm.sh
#!/bin/bash echo "Думаю: " echo "Result:" > spy-out.txt for i in `ls access.log-200808*.bz2` do echo -n "." #echo $i >> spy-out.txt #echo "---" >> spy-out.txt bunzip2 -d -c $i | grep "some_text_for_research" >> spy-out.txt done # Пример: Узнаем кто сколько раз посетил ресурс в условии # awk ' { print $8; }' < spy-out.txt | sort | uniq -c | sort -r -g # Пример: Узнаем сколько раз был посещен тот или иной ресурс # awk '{ print $7; }' < spy-out.txt| awk -F "/" '{ print $3; }'| sort | uniq -c | sort -r -g
Разности-полезности
Преобразовать timestamp'ы логов сквида в человеческий вид можно при помощи простенького скрипта на perl:
- tt.pl
#! /usr/bin/perl -p s/^\d+\.\d+/localtime $&/e;
Ограничители
В целях более равномерной загрузки канала используются следующие методы ограничения работы пользователей:
- фильтрация баннерной рекламы
- ограничение скачивания мультимедийных файлов по времени
- автоматическое вынесение активно качающих в особый спулер с ограниченными потоками и скоростью
Фильтрация нежелательных ресурсов
В случае, если через squid идет большой поток запросов, фильтрующие acl будут работать довольно медленно и целесообразно использовать другие методы фильтрации сайтов, например при помощи DNS.
В простейшем случае /etc/squid создаем подпапку hawk и кладем в нее следующий скрипт на bash, сортирующий списки по-алфавиту и попутно убирающий встреченные дубликаты:
- sorter.sh
#!/bin/bash for i in `ls *.list` do #sort $i | uniq > $i.s && mv $i.s $i cat $i | tr "[:upper:]" "[:lower:]" | sort | uniq > $i.s && mv $i.s $i done # Перегружаем сквид по желанию #rcsquid reload
При использовании блокировок сервиса OpenDNS, можно заменить его сообщения на свои:
* 208.69.32.136 - ip адрес, который можно подставить в porn.list, на него происходит перенаправление в случае обращения к порно-ресурсу * 208.69.32.133 - ip адрес, который можно подставить в fishban.list, на него происходит перенаправление в случае обращения к фишинговому ресурсу
Ссылки на использованные выше программы и списки.
Баннеры
Полный список можно взять в статье Списки заблокированных сайтов
- banner.list
.a.gismeteo.ru .ad.adriver.ru .ad.rambler.ru .adbrite.com .adbureau.net .ads.rabota.ru .ads.sixapart.com .ads.sup.com .adv.odnoklassniki.ru .banner.fishki.net .bannerbank.ru .banners.rambler.ru .bin-layer.de .binimage.de .counter.aport.ru .counter.list.ru .counter.rambler.ru .doubleclick.net .google-analytics.com .googlesyndication.com .hotlog.ru .layer-ads.de .linkexchange.ru .popunder.ru .smstraf.ru .tns-counter.ru .top.list.ru .trafficcash.ru .yadro.ru
«/usr/local/bin/redirector»
- redirector
#!/usr/bin/perl $0 = 'redirect' ; $| = 1 ; @banners = ('reklama\.ru/cgi-bin/banner/', 'anekdot\.ru/cgi-bin/banner/', 'banner\.ru/cgi/sites/', 'linkexchange\.ru/cgi-bin', 'bizlink\.ru/cgi-bin/irads\.cgi\?', 'bizlink\.ru/cgi-bin/cgiwrap/ar/irads\.cgi\?', 'ivd\.ru/bann/', 'include/banners/', 'rbc\.ru/bannerjvs/', 'vedomosti\.ru/var/bansrc/', 'inetinteractive\.com/banners/', 'cmpnet\.com/ads/', 'adfox\.ru/getCode', '\.nnm\.ru/rec/', 'shchulkin\.com/cgi-bin/', 'ryazan\.ru/banner/', 'tourprom\.ru/krutilka/images/banners/', 'rzn\.info/ads/', 'homeweek\.ru/img/banners/', 'lbn\.ru/cgi-bin/iframe/', 'poku\.ru/yxo/download\.php', 'shchulkin\.com/banner/', 'plus-msk\.ru/digits\.php', 'plus-msk\.ru/img/banners/', 'anub\.ru/img/ad/', 'newsland\.ru/public/upload/banner', 'newsland\.ru/public/img/banner', 'rfn\.ru/cgi-bin/iframe/', '7info\.ru/nb/', 'rp5\.ru/bnr/', 'rian\.ru/cgi-bin/iframe/', 'up\.spbland\.ru/ban', 'bash\.org\.ru/img/forex', 'joblist\.ru/banner/', 'yaplakal\.com/shum/ad/', 'winsov\.ru/img/banner', '\.topcto\.ru/cgi-bin/', 'spbland\.ru/bban/', 'rose\.ixbt\.com/banner/', 'territory\.ru/banners/', 'morepc\.ru/banners/', '/uploads/reklama/', 'rambler\.ru/top100/banner', 'sharereactor\.ru/banners/', '87\.242\.91\.5/adfox/', 'sotovik\.ru/images/banner/', 'webpark\.ru/banners/', 'ryazan\.ru/banners/', 'redtram\.com/fcbs/', 'rzn\.info/ads/', 'rusdoc\.ru/pictures/banners/', '/ssi/reklama/', 'mobbit\.info/adv/', 'nnm\.ru/ban/', 'isohunt\.com/a/banners/', 'fishki\.net/reklama/', 'sweb\.ru/ban/', 'exaccess\.ru/banners/', 'exaccess\.ru/asp/banner', 'overclockers\.ru/adimage', 'overclockers\.ru/images/banrz/', 'overclockers\.ru/partners/', 'overclockers\.ru/include/banners/', '7news\.ru/ad/', 'hmn\.ru/fban/', 'kinoafisha\.ru/advert/', 'territory\.ru/image/banners/', 'lyngsat.com/adverts/', 'kpnemo\.ru/media/rekl/', 'ivd\.ru/count\.xgi\?', 'glasnet\.ru/PHP/banners/extview\.phtml\?', 'r\.mail\.ru/[a-zA-Z0-9]+\.(gif|jpg|swf)', 'world-art\.ru/baner', 'pics\.rbc\.ru/img/banpics/', '195\.161\.119\.239/images/', 'www\.russianstory\.com/cgi-rs/showme\.cgi\?', 'www\.miklukho\.cadabra\.ru/cgi-bin/adsrc\.cgi\?', '\.ru-board\.com/temp/', '4smi\.ru/cgi-bin/iframe/', 'mnis\.ru/reklama/', 'binural\.ru/pictures/banner', 'pics\.rbc\.ru/rbcmill/img/', '120\.goodoo\.ru/cgi-bin/banner/', 'ban\.clk', '\.newsru\.com/banners/', 'az\.yandex\.ru/bshow', 'adv\.dll', 'images\.slashdot\.org/banner/', 'nnm\.ru/banner', 'nnm\.ru/bonga/show_banners\.php', '/REKLAMA/', '\.depositfiles\.com/img/adv/', '\.aldebaran\.ru/images/recl/', 'depositfiles\.com/ru/ads_popup_redirect\.php', 'it-territory\.ru/images/1/', '/res/adv/', 'imperz\.ru/im/ban/', 'prospero\.ru/cgi-bin/showban', '2photo\.ru/reklama/', 'static\.oper\.ru/data/rennabs/', 'ruspaidmails\.com/ads-manager/banner_store/', '217\.16\.26\.83/cgi-bin/iframe/', 'finbs\.ru/BannerSystem/', 'anekdotov\.net/show/uhi/', 'hpc\.ru/bans/', 'mbe\.ru/adrevolver/', '195\.54\.209\.142/cgi-bin/img\?', 'gameland\.ru/code/ads/', 'om\.ru/adrot/banners/', 'om\.ru/adrot/ad\.cgi', 'www\.ru/banner/', 'exec\.osp\.ru/BS/sb\.php3', 'images\.internet\.com/ads/', 'izrukvruki\.ru/banners/', 'vts\.tass\.ru/images/', 'osdn\.com/banner/', 'mediaplex\.com/ad/bn/', 'yandex\.ru/yabs-stub/', 'chat\.ru/_sys_img/', 'cgi-bin/banner/', 'networkdoc\.ru/partner/', 'stat\.aport\.ru/show\.pl', 'prospero\.ru/cgi-bin/showprog', 'subscribe\.ru/banner/', '/advert/images/', 'bpath\.com/gif\.cfm', 'anekdotov\.net/show', 'atas\.ru/show/', 'images\.rambler\.ru/upl/', 'images\.rambler\.ru/advert/', 'images\.go2net\.com/go2net/ads/', 'zdnet\.ru:80/banners/images/', 'zdnet\.ru/banners/images/', 'm2k\.ru/cgi-bin/', 'itc-ua\.com/viewban\.php', 'itc-ua\.com/vuho\.php', 'popular\.ru/image/', 'lib\.ru/KARTINKI/krutilka/', 'ixbt\.com/cgi-bin/show\.cgi', 'ixbt\.com/banner/', 'atlantic\.ru/banners/', 'russiantimes\.com/cgi-bin/ads/ads\.pl', 'translate\.ru/images/banners', '204\.198\.135\.79/RealMedia/ads', 'lenta\.ru:9000/krutilka', 'anekdot\.ru:8083/banner', 'aifnet\.ru/images/banners', 'anekdot\.ru/reklama', 'linuxtoday\.com/RealMedia/ads/', 'xakep\.ru/code/ads', 'linux\.ru/ads', 'linux\.org\.ru/adv/', 'netvertising\.com\.ua/i\.php', 'professia\.ru/img/ban', 'job\.ru/images/banners', 'by\.ru/ad', '194\.186\.36\.172:8080', '195\.92\.95\.5/impression', 'cgi-bin/banner', # price.ru 'price\.ru/images/price/adv/', # counters 'statistic\.ru/perl/banner/banner\.pl', 'index99\.kiev\.ua/cgi-bin/count', '195\.34\.34\.80/counter', '194\.67\.23\.251/counter', 'counter\.rambler\.ru/top100\.cnt\?', '217\.73\.192\.19/top100\.cnt?', 'one\.ru/cgi-bin/cnt\.cgi\?', 'infoart\.ru/cgi-bin/ihits/counter\.cgi\?', 'omsknet\.ru/resource/counting\.asp', 'ranker\.ru/scripts/rcounter\.dll', 'kmindex\.ru/cgi-bin/cgi2', 'linux\.ru\.net/counter\.ph', 'newmail\.ru/cgi-bin/ucount\.cgi', 'bigmir\.net/stat\.php', 'poseti\.com/cgi-bin/sys/poseti\.cgi', 'pocketpc\.com\.ua/cgi-bin/ppc/ppc\.cgi', 'yandex\.ru/cycounter' ); while (<>) { ($url, $who, $ident, $method) = /^(\S+) (\S+) (\S+) (\S+)$/ ; $url = 'http://www.rspu.ryazan.ru/1.gif' if grep ($url=~/$_/i, @banners) ; print "$url $who $ident $method\n" ; }
Порно
Полный список можно взять в статье Списки заблокированных сайтов «/etc/squid/hawk/porno.list»
- porno.list
.adulttraffic.ru .allnudestars.ru .cyberbabes.ru .dosug.nu .gay.ru .izvrashenec.ru .izvrat.info .met-art.com .moscowgay.ru .moshonka.ru .nudecelebs.ru .porno.ru .pornsms.ru .razvrat.biz .vpopku.com .xuk.ru
Анонимайзеры
Полный список можно взять в статье Списки заблокированных сайтов «/etc/squid/hawk/anonymizer.list»
- anonymizer.list
.anonymizer.com .anonymizer.ru .anonymouse.ws .httpproxy.info .proxygeek.com .proxyhero.com .stupidproxy.com .surf-anon.com .unblockthis.com
Службы знакомств
Полный список можно взять в статье Списки заблокированных сайтов «/etc/squid/hawk/love.list»
- love.list
.bibigon.ru .boct.org.ru .crazylove.ru .findyourdream.ru .flirt.ru .love-planet.ru .love.rambler.ru .love.ru .mamba.ru
Он-лайн игры
Полный список можно взять в статье Списки заблокированных сайтов «/etc/squid/hawk/gamez.list»
- gamez.list
.apeha.ru .arena.ru .bitefight.ru .carnage.ru .crazykings.ru .dowars.org .dozory.ru .dwar.ru .fantasyland.ru .games.mail.ru .ganjawars.ru .gdworld.ru .gop-stop.ru .haddan.ru .lineage.ru .motorwars.ru .neverlands.ru .postnuclear.ru .territory.ru .the-game.ru .zuki.mail.ru
Игры соц. сетей
Основная статья: Блокировка приложений в социальных сетях
Полный список можно взять в статье Списки заблокированных сайтов
Разнообразные "тяжелые"ресурсы, rapidshare, zaycev.net etc
«/etc/squid/hawk/vari.list»
- vari.list
.11mbit.de .11mbit.in .2shared.com .3mp3.ru .4shared.com .adorablebunnies.com .allfiles.ru .aqache.com .axifile.com .badongo.com .badongo.net .base.zaycev.net .best-mp3.ru .bestsharing.com .bigfileupload.com .bigfilez.com .bigupload.com .bonpoo.com .box.net .briefcase.yahoo.com .come2store.com .content-type.com .crazefiles.com .cyberupload.com .datenklo.net .depositfiles.com .divshare.com .dload.net.ru .dossya.com .dosyaekle.com .downloads.games.mail.ru .downloads.nevosoft.ru .downloads.winsov.ru .dropboks.com .dropload.com .dump.ru .dwar.ru .easy-share.com .easy-sharing.com .easyfilehost.com .egoshare.com .esnips.com .eufiles.com .f-forge.com .file-upload.net .file.raid.ru .file2all.com .file2share.biz .filebest.ru .filebuffer.net .filecache.de .filecloud.com .filecoast.com .filefactory.com .fileforwarding.com .filegone.com .filegu.ru .filehd.com .fileho.com .filehost.ro .filehoster.ru .filepost.ru .files.to .files.trubka.net .fileshare.in.ua .filespace.ru .filestock.ru .filesurf.ru .free-transfer.de .freefileupload.net .freespace.filefront.com .freeuploader.com .friendlyshare.de .ftp.intv.ru .ftp.predanie.ru .ftpz.us .fupload.com .getalbums.ru .getfile.biz .getupload.com .gigasize.com .hackz.nu .hellreapers.com .hemenpaylas.com .hotfile.ru .hyperupload.com .hyperupload.net .ibox.org.ua .icefile.net .ifolder.ru .internetfiles.org .ipload.ru .jumbofile.com .justupit.com .keepmyfile.com .letitbit.net .live-share.com .load.to .mailbigfile.com .mediafire.com .meetfile.com .megashares.com .megaupload.com .mihd.net .mnogomp3.net .momoshare.com .mooload.com .mp3ex.net .mp3real.ru .mp3shek.net .musicfond.com .muslib.ru .muzudar.ru .mysharebox.com .mytempdir.com .myupload.biz .netload.in .netload.us .nitroushosting.net .obmen.borges.ru .openfile.ru .openupload.com .orb-z.com .oreys.com .oxyshare.com .p-file.com .pesenki.ru .pirateshare.net .poku.ru .prouploads.com .putfile.com .qfile.de .quickdump.com .quickshareit.com .rapidfile.fr .rapidsafe.de .rapidshare.com .rapidshare.de .rapidshare.fr .rapidshare.ru .rapidsharing.com .rapidupload.com .recfile.com .refrozen.com .remx.ru .rghost.ru .s2.befile.ru .s2.lolo.ru .savefile.com .scambia.com .sceneworld.net .send-file.co.uk .sendmefile.com .sendover.com .sendspace.com .sexuploader.com .shara.by .share.am .share.dewil.ru .sharebigfile.com .sharefiles.ru .sharemania.ru .shareua.com .sharing.ru .simpleupload.de .slil.ru .snaggys.com .speedshare.org .speedyshare.com .spread-it.com .ssfiles.com .storeandserve.com .streamupload.com .supashare.com .supload.com .sweniger.de .takdata.com .theupload.com .theupload.info .transferbigfiles.com .tryor.com .turboshare.de .turboupload.com .ultrashare.de .ultrashare.net .up-file.com .up.li.ru .up.spbland.ru .updownloadserver.de .upitus.com .upload-file.net .upload.com.ua .upload.sc .upload2.com .upload2.net .uploaded.to .uploadfile.org .uploadfront.com .uploadhut.com .uploading.com .uploadport.com .uploadready.com .uploadsend.com .uploadtemple.com .uploadtown.com .uploadyourfiles.de .ushareit.com .webattach.mail.yandex.net .webfile.ru .webfilehost.com .weborama.ru .weekshare.com .wikiupload.com .willhostforfood.com .wyslijto.pl .xtrafile.com .yourfile.net .yourfile.org .yourfilehost.com .yourfilelink.com .yousendit.com .zhube.com .zippyvideos.com .zshare.net .zupload.com
«/etc/squid/hawk/varihard.list»
213.248.53.147 64.132.55.2 70.86.218.194 81.176.228.54 89.108.95.72
Жестко блокируемые ресурсы
«/etc/squid/hawk/hardban»
- hardban
80.240.210.196 81.177.17.74 87.242.72.62 69.22.135.239 216.195.35.111 69.22.132.77 69.22.135.128 63.217.31.62 76.9.5.67 38.119.121.228 88.85.81.30 208.72.170.72 208.122.223.2 208.122.223.4 62.129.129.0/24 80.77.113.31 64.72.118.35 193.138.224.216 69.31.115.196 208.72.170.66 208.69.32.136 87.242.76.77
Подсети ICQ
«/etc/squid/hawk/icqban.list»
152.163.159.0/24 152.163.208.0/24 194.186.55.0/24 194.67.23.0/24 205.188.0.0/16 61.12.161.0/24 61.12.174.0/24 61.12.51.0/24 64.12.0.0/16
Mail.ru Agent
«/etc/squid/hawk/mailabandst.list»
.exe.agent.mail.ru .mrim.mail.ru .mrim1.mail.ru .mrim10.mail.ru .mrim11.mail.ru .mrim12.mail.ru .mrim13.mail.ru .mrim14.mail.ru .mrim15.mail.ru .mrim16.mail.ru .mrim17.mail.ru .mrim18.mail.ru .mrim19.mail.ru .mrim2.mail.ru .mrim20.mail.ru .mrim21.mail.ru .mrim22.mail.ru .mrim23.mail.ru .mrim24.mail.ru .mrim25.mail.ru .mrim26.mail.ru .mrim27.mail.ru .mrim28.mail.ru .mrim29.mail.ru .mrim3.mail.ru .mrim30.mail.ru .mrim31.mail.ru .mrim4.mail.ru .mrim5.mail.ru .mrim6.mail.ru .mrim7.mail.ru .mrim8.mail.ru .mrim9.mail.ru
Фишинговые сервера
/etc/squid/hawk/fishban
208.69.32.133
Заблокированных ресурсов для учебных классов и Wi-Fi
«/etc/squid/hawk/classesban.list»
.689.ru .allnokia.ru .bash.org.ru .binmovie.ru .clipov.net .demonoid.com .depositfiles.com .dimonvideo.ru .dl.ibox.org.ua .dload.net.ru .dmp3.net .facebook.com .filepost.ru .fishki.net .flickr.com .ftp.intv.ru .games.mail.ru .gigasize.com .goroskop.ru .icq.com .icqproxy.org .ifolder.ru .jetune.ru .kpnemo.ru .letitbit.net .liveinternet.ru .login.oscar.aol.com .moikrug.ru .mp3.ru .mp3area.ru .mp3chudo.ru .mp3darom.ru .mp3ex.net .mp3real.ru .mp3share.ru .mp3shek.net .mp3valey.net .musicfond.com .musicmp3.spb.ru .muzmp3.net .muzudar.ru .mxwarez.net .myspace.com .myzuka.ru .netz.ru .nnm.ru .odnoklassniki.ru .onsmartphone.com .otpada.net .penreader.com .phazeddl.com .phazep2p.com .playhard.ru .poku.ru .qip.ru .quickshareit.com .rapidshare.com .rumusic.net .rutube.ru .s2.befile.ru .s2.lolo.ru .sentero.net .shara.by .share.dewil.ru .sharereactor.ru .skachivai.ru .smspricol.ru .symbiware.ru .torrents.ru .uploading.com .video.mail.ru .vision.rambler.ru .vkontakte.ru .weborama.ru .wzor.info .wzor.net .x-pirat.ru .xlifes.ru .youtube.com .zaycev.net .zetme.ru .ziza.ru .zshare.net .zvezdi.ru
«/etc/squid/hawk/wifiban.list»
.689.ru .binmovie.ru .clipov.net .demonoid.com .depositfiles.com .dimonvideo.ru .dl.ibox.org.ua .dload.net.ru .dmp3.net .filepost.ru .ftp.intv.ru .games.mail.ru .gigasize.com .goroskop.ru .ifolder.ru .jetune.ru .kpnemo.ru .letitbit.net .mp3.ru .mp3area.ru .mp3chudo.ru .mp3darom.ru .mp3ex.net .mp3real.ru .mp3shek.net .mp3valey.net .musicfond.com .musicmp3.spb.ru .muzmp3.net .muzudar.ru .mxwarez.net .myzuka.ru .netz.ru .nnm.ru .otpada.net .phazeddl.com .phazep2p.com .playhard.ru .poku.ru .qip.ru .quickshareit.com .rapidshare.com .rumusic.net .rutube.ru .s2.befile.ru .s2.lolo.ru .sentero.net .shara.by .share.dewil.ru .sharereactor.ru .skachivai.ru .smspricol.ru .symbiware.ru .torrents.ru .uploading.com .video.mail.ru .vision.rambler.ru .weborama.ru .wzor.info .wzor.net .x-pirat.ru .xlifes.ru .youtube.com .zaycev.net .zetme.ru .ziza.ru .zshare.net .zvezdi.ru
В более общем случае может возникнуть желание на редактирование черных списков через веб-интерфейс. Тогда структура каталогов будет несколько иная. Файлы *.list с правами 0666 кладем в /srv/www/htdocs/modbanlists/ и создаем символические ссылки в /etc/squid/hawk:
chmod 0666 *.list ln -s /srv/www/htdocs/modbanlists/*.list /etc/squid/hawk/
Написание веб-интерфейса для редактирования не представляет особой сложности.
Кладем скрипт в cron.hourly, следящий за изменением списков, сортирующий их по алфавиту, удаляющий дубликаты и перегружающий сквид при необходимости:
#!/bin/bash cd /srv/www/htdocs/modbanlists/ qfile="/var/tmp/squid_banlists_chekmodify.txt" qfileatime="$qfile.time" # Checking if any list was edited & modifying qfile for i in `ls *.list` do file="/srv/www/htdocs/modbanlists/$i" fileatime="/srv/www/htdocs/modbanlists/$i.time" logfile="/var/log/squid/watchdog.log" a="" b="" [ ! -f $fileatime ] && stat $file | grep Modify > $fileatime || : [ -f $fileatime ] && a="$(cat $fileatime)" || exit 1 b="$(stat $file | grep Modify)" if [ "$a" != "$b" ]; then echo "Sorting $i & removing duplines..." #sort $i | uniq > $i.s && mv $i.s $i cat $i | tr "[:upper:]" "[:lower:]" | sort | uniq > $i.s && mv $i.s $i echo "Modifying time for $i..." # update time stat $file | grep Modify > $fileatime chown wwwrun.www $i date > $qfile fi done # Checking qfile & reloading squid if needed file=$qfile fileatime=$qfileatime logfile="/var/log/squid/watchdog.log" [ ! -f $fileatime ] && stat $file | grep Modify > $fileatime || : [ -f $fileatime ] && a="$(cat $fileatime)" || exit 1 b="$(stat $file | grep Modify)" if [ "$a" != "$b" ]; then echo "Restarting server...." rcsquid reload # update time stat $file | grep Modify > $fileatime echo "----" >> $logfile date >> $logfile echo "Squid reloaded by banlists watchdog:" >> $logfile fi
Ограничители скачивания
правило для определенных типов файлов по расширению
/etc/squid/hawk/restfiles
\.[Aa][Vv][Ii]$ \.[Mm][Pp][Gg]$ \.[Mm][Pp][Ee][Gg]$ \.[Mm][Pp]3$ \.[Oo][Gg][Gg]$ \.[Ww][Mm][Aa]$ \.[Ww][Mm][Vv]$ \.3[Gg][Pp]$ \.[Ww][Aa][Vv]$ \.[Ii][Ss][Oo]$ \.[Mm][Oo][Vv]$ \.[Ff][Ll][Vv]$ \.[Ii][Ff][Ll][Vv]$
Работа с "качками"
Вариант 1: Sarg
Устанавливаем пакет [SARG|http://sarg.sourceforge.net/]. Rpm и src.rpm-пакеты для SuSE доступны по следующему адресу: http://sarg.sourceforge.net/suse.php
cd /usr/local/src wget "http://sarg.sourceforge.net/sarg-2.0.7-vhs.src.rpm" rpmbuild --rebuild sarg-2.0.7-vhs.src.rpm rpm -Uvh /usr/src/packages/RPMS/ppc64/sarg*
Идентификация черезмерно активных пользователей производится следующим образом:
/etc/sarg.conf
per_user_limit /etc/squid/sarg/auto_loaderz.pool 150
При генерации саргом отчетов в течении дня в текстовый файл попадают пользователи, скачавшие более 150 мб. Следует помнить, что sarg сам не различает временные интервалы, за которые считает объем, т.е. необходимо четко осознавать, за какой период выставляется ограничение и каким образом производить ротацию логов, чтобы добиться необходимого эффекта.
В нашем случае мониторинг активности включает в себя суточный интервал.
Модификация squid.conf включает себя отдельный пул для провинившихся с жесткими ограничениями количества одновременно используемых потоков (maxconn) и скорости (delay_pools)
Подключение и установку правил для пула «качков» необходимо проводить до работы остальных правил. /etc/squid/squid.conf
acl loaderz proxy_auth "/etc/squid/pools/auto_loaderz.pool"
Чтобы squid самостоятельно подхватывал изменения в файле auto_loaderz.pool а не при ручной перезагрузке, используется следующий скрипт:
/etc/cron.hourly/squid_reload
#!/bin/bash file="/etc/squid/sarg/auto_loaderz.pool" fileatime="/etc/squid/sarg/auto_loaderz.time" logfile="/var/log/squid/watchdog.log" a="" b="" [ ! -f $fileatime ] && stat $file | grep Modify > $fileatime || : [ -f $fileatime ] && a="$(cat $fileatime)" || exit 1 b="$(stat $file | grep Modify)" if [ "$a" != "$b" ]; then echo "Restart server...." rcsquid reload # update time stat $file | grep Modify > $fileatime echo "----" >> $logfile echo "Squid reloaded by loaderz watchdog:" >> $logfile date >> $logfile fi
Обнуление файла auto_loaderz.pool происходит раз в 2 недели.
Вариант 2: LightSquid
Скачиваем последнюю версию с сайта разработчика http://lightsquid.sourceforge.net, распаковываем ее в директорию /srv/www/cgi-bin/light/
tar xvfz /usr/local/src/lightsquid-1.7.1.tgz /srv/www/cgi-bin/light
Правим конфигурационный файл:
lightsquid.cfg
# Пути к файлам $cfgpath ="/srv/www/cgi-bin/light"; $tplpath ="/srv/www/cgi-bin/light/tpl"; $langpath ="/srv/www/cgi-bin/light/lang"; $reportpath ="/srv/www/cgi-bin/light/report"; $logpath ="/var/log/squid"; $ip2namepath ="/srv/www/cgi-bin/light/ip2name"; # Адреса и домены локальных ресурсов $skipurl = "\.our.lan|\.example\.com"; $lang ="ru-utf8"; # Не показываем колонку с группами $showgrouplink = 0; # выделяем особо превысивших лимит $showoversizelink = 1; # cсмотрим не только GET, но и PUT/POST статистику $showputpost = 1; # Сопоставляем реальные имена сотрудников с их логинами $userealname = 1; # Сколько мегабайт считать превышением траффика, для нас это 150 мб $perusertrafficlimit = 150*1024*1024;
Создаем файл
touch /usr/local/sbin/run_lightparse.sh
run_lightparse.sh
#!/bin/bash cd /srv/www/cgi-bin/light ./lightparser.pl
и помещаем его в cron. Мы используем обновление статистики раз в 15 минут: /etc/cron.d/lightparse
- /15 * * * * root /usr/local/sbin/run_lightparse > /dev/null
После запуска, отчеты LightSquid становятся доступны по адресу http://localhost/cgi-perl/light/index.cgi
Скрипт подсчета "качков"
Поскольку lightsquid не имеет нормального механизма сопряжения со squid при подсчете траффика, используем для этих целей следующий скрипт (обратите внимание на ip-адреса исключений):
#!/bin/bash # Лог сквида FI="/var/log/squid/access.log" # Временная директория с файлами качков FD="/tmp/traffe" # Лог-файл перезагрузок сквида FO="/var/log/squid/watchdog.log" # Лог файл для web-отчета FW="/srv/www/htdocs/auto_loaderz.txt" # ACL-файл для сквида FA="/etc/squid/sarg/auto_loaderz.pool" # Сколько мегабайт считать нормой для скачивания LIM="200" # Сколько дней держать качков в карантине DLIM="4" # Пользователи через пробел, whitelisted WHLIST="apetrov iivanov" # ---------------------------------- cd $FD echo "---" >> $FO awk -v trlim="$LIM" -v outd="$FD" 'BEGIN { print "none"; } { if(index($4,"TCP_MISS")!=0 && \ index($9,"192.0.2.")==0 && \ index($9,"198.51.100.")==0 && \ index($9,"203.0.113.")==0 && \ index($9,"NONE")==0 && \ ($6=="GET" || $6=="POST") && index($8,"-")==0) { w[$8]=w[$8]+$5; } } END { format = "%a %b %e %H:%M:%S %Z %Y"; current_time=strftime(format) for(i in w) { j=j+w[i]; if((w[i]/1048576)>trlim) { print i," ",current_time," ",(w[i]/1048576),"mbytes"; print i,"\t",current_time,"\t",(w[i]/1048576),"mbytes" > i; } } }' < $FI >> $FO rm $WHLIST cp $FA $FA.old find $FD \! -type d -mtime +$DLIM -exec rm {} \; echo "none" > $FA ls $FD >> $FA DI=`diff $FA $FA.old` if [ "$DI" != "" ] then echo " " >> $FO date >> $FO echo "Changes detected, reloading squid!" >> $FO rcsquid reload fi rm $FA.old echo "Пользователи с ограниченным доступом:" > $FW echo " " >> $FW ls | xargs cat >> $FW
Tips & tricks
Проверка работоспособности прокси-сервера и интернет канала
Scripts to check internet connection through http-proxy. Both of them should be placed to cronjob with different times - first with smth about 5 minutes & the second as you wish - it only sends mail regularly.
Основная статья: Internet connection checker
Skype и авторизация на прокси-сервере
Клиент Skype не может работать в связке с прокси-сервером, использующим авторизацию. Чтобы обойти это ограничение необходимо проделать небольшой трюк:
acl numeric_IPs url_regex ^(([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)|(\[([0-9af]+)?:([0-9af:]+)?:([0-9af+)?\])):443 acl Skype_UA browser ^skype^ http_access allow CONNECT localnet numeric_IPS Skype_UA
Ищем анонимайзеры в логе Squid
Найдем, к каким сайтам происходит наибольшее число обращений в текущем log-файле:
awk -F "/" '{ print $4; }' < /var/log/squid/access.log | sort | uniq -c | sort -n -r | head -n 20
или в архиве:
bunzip2 -c access.log-20100529.bz2 | awk -F "/" '{ print $4; }' | sort | uniq -c | sort -n -r | head -n 20
И внимательно смотрим на сайты из списка. Баннерные сети и анонимайзеры отлавливаются на раз.