Инструменты пользователя

Инструменты сайта


unix:squid-tuning

Задача

Создать полнофункциональный узел доступа к сети интернет на 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

И внимательно смотрим на сайты из списка. Баннерные сети и анонимайзеры отлавливаются на раз.

Cсылки
unix/squid-tuning.txt · Последнее изменение: 2011/12/21 16:04 (внешнее изменение)