Etc.: Proxy сервер под Linux. Squid
Содержание
redirector - внешняя программа (небуфферизованный в/в), в цикле читает с stdin URL и пишет на stdout преобразованный URL (или пустую строку, если нет преобразований). Преобразование происходит после проверки ACL, но до проверки на присутствие в кеше. Формат входной строки (поля, разделенные пробелами):
URL
ip-address/fqdn (если fqdn нет, то "-")
ident ("-", если нет)
method (GET, POST, ...)
В качестве примера использования редиректора для уменьшения трафика в поставке приводится редиректор, производящий нормализацию URL (приведение к стандартному виду), что увеличивает вероятность попадания в кеш. А также редиректор преобразующий запросы на загрузку всяких там IE, Netscape и пр. с различных зеркал в запросы к локальному www-серверу (автор клянется, что это дает 15%). См. также про борьбу с баннерами.
Примеры redirectors:
Только не будем спорить о морали :) Но и в transparent режиме этого делать не надо. Поставьте себе локальный прокси и радуйтесь. Кстати, теми же методами можно бороться со счетчиками и порно.
Превращение банеров-картинок в рваные прямоугольники:
- Насобирать "вредителей" (в виде регулярных выражений)
- Заводим файлы в /usr/local/squid/etc:
- banners_path_regex - по одному регулярному выражению на строку
- banners_regex - по одному регулярному выражению на строку
- banners_exclusion (это строки, трактуемые в предыдущих файлах как баннеры, но их лучше не трогать - JavaScript всякие)
- В squid.conf
acl banners_path_regex urlpath_regex "/usr/local/squid/etc/banners_path_regex"
acl banners_regex url_regex "/usr/local/squid/etc/banners_regex"
acl banners_exclusion url_regex "/usr/local/squid/etc/banners_exclusion"
http_access deny banners_path_regex !banners_exclusion
http_access deny banners_regex !banners_exclusion
Замена рекламных банеров на пустое место. Если рваные прямоугольники оскорбляют эстетические чувства. Предполагается, что в исходных страницах заданы width и height, иначе страница поплывет (можно заменять банеры на картинки соответствующего размера, но это большой труд).
- Насобирать "вредителей" (в виде регулярных выражений)
- На своем http-сервере завести "заменитель" рекламных картинок void.gif
- Настраиваем redirector в squid.conf (если он уже используется, то добавить к старому; м.б. еще настроить redirector_access):
redirect_program /usr/local/squid/bin/banners.pl - banners.pl (perl выбран для простоты демонстрации):
#!/usr/bin/perl (или где perl живет)
$|=1;
while (<>) {
s@регулярное-выражение@http://www.nospam.org/nospam.gif@;
print;}
К сожалению, использование "http_access deny" для блокировки JavaScript программ не получается (броузер не показывает страницу совсем). Поэтому приходится заменять реальный скрипт через redirect (см. выше) на что-нибудь безобидное (и каждый случай обрабатывать отдельно :(. Например, если исходный скрипт открывал окно с рекламой (<script src=...>), то вместо него подсовываем
<html><head>
<script language="JavaScript"><!-- window.close(); //--></script>
</head><body></body></html>
вместо tx3 (если он встроен страницу с помощью SSI, то не поможет, да и зачем тогда его резать?):
document.write(" ");
Ссылки:
squidGuard позволяет фильтровать и переадресовывать запросы по именам доменов, URL и регулярным выражениям. Позволяет группировать пользователей по IP адресам с заданием различных правил для различных групп с указанием времени суток. Возможно задание списка "хороших" сайтов. Домены и URL могут храниться в текстовых файлах или в формате Berkeley DB. Не фильтрует содержимое запросов и встроенные скрипты. GPL. Можно использовать бесплатно в любых целях, кроме продажи. К сожалению не изменялся с 2001 года (хотя есть заплатки от последователей и последователей).
Устанавливаю из готового пакета (/usr/bin/squidGuard, /etc/squid/squidguard.conf, /etc/logrotate.d/squidguard, /var/log/squidguard/, /usr/share/doc/squidguard-1.2.0/), пакета с чёрным списком (/etc/squid/squidguard-blacklists.conf; /etc/logrotate.d/squidguard-blacklists; /etc/squid/local/bad/; /etc/squid/local/good/; /var/lib/squidguard/: ads/, adult/, aggressive/, audio-video/, drugs/, forums/, gambling/, hacking/, local, mail/, /proxy/, violence/, warez/). Из исходных текстов устанавливается обычным путём (./configure; make; make install), требуется Berkeley DB 2.x. После установки необходимо настроить /etc/squid/squidguard-blacklists.conf и просмотреть входящие в комплект чёрные списки. Настроить squid.conf:
redirector_bypass on
redirect_program /usr/bin/squidGuard -c /etc/squid/squidguard-blacklists.conf
acl squidGuard ...
redirector_access allow squidGuard
Опции squidGuard:
-d (вывод ошибок на stderr)
-c имя-файла-настроек
-t yyyy-mm-ddTHH:MM:SS (?)
-C имя-файла | all (преобразовать текстовый файл в .bd, не забыть указать "-c имя-файла-настроек")
-u (слить изменения из файлов .diff в .bd)
Файл настройки описывает поименованные группы интервалов времени (используется при описании группы клиентов), группы пользователей (по IP адресам), группы URL (ссылки на текстовые файлы и БД), группы правил переадресации и группы ACL. Комментарии начинаются с '#'; имеется большой список зарезервированных слов (в частности: anonymous, user, userlist); нельзя ссылаться на описания групп вперёд; описания групп начинаются с
тип-группы имя-группы {
и завершаются '}'. В начале файла указываются имена используемых файлов:
logdir имя-каталога (в этом каталоге будут лежать файлы squidGuard.error и squidGuard.log; имя-каталога также используется как базовое имя для имён файлов, описываемых в директиве log)
dbhome имя-каталога (имя-каталога используется как база для имён файлов, со списками доменов, выражений и URL
Описание интервала времени (имя типа: time) состоит из перечня спецификаций (каждое на отдельной строке, при перекрытии интервалы объединяются), следующих видов (вместо года, месяца или дня можно указать '*'):
weekly sunday [...] [HH:MM-HH:MM]
date YYYY-MM-DD [...] [HH:MM-HH:MM ...]
date YYYY-MM-DD-YYYY-MM-DD [HH:MM-HH:MM ...]
Описание группы клиентов (имя типа: source) состоит из перечня адресов клиентов в следующих форматах (файл содержит на каждой строке IP адрес без ключевого слова "ip"; использование доменов требует log_fqdn в squid.conf; имена пользователей определяются по протоколу ident; спецификации одного типа объединяются, разных типов - пересекаются; группы могут пересекаться - приоритет имеет первая по тексту; имя журнала берётся относительно logdir):
Описание группы клиентов может иметь условие по времени:
source имя-группы-клиентов [within|outside имя-интервала-времени] {
...
} else {
...
}
Описание группы URL (имя типа: destination) состоит из перечня URL в следующих форматах (спецификации любых типов объединяются; группы могут пересекаться - приоритет имеет первая в директиве pass; в списках необходимо использовать только строчные буквы; включение имени домена включает все хосты во всех поддоменах этого домена; при включении URL в список из него необходимо удалить "http://www.", ":8080" и завершающее имя или "/"; в строке списка URL можно в качестве второго поля указать новый URL для перенаправления (это работает быстрее, чем rewrite); использование регулярных выражений сильно замедляет работу; имя журнала берётся относительно logdir):
domainlist имя-файла
urllist имя-файла
expressionlist имя-файла
redirect [302:]URL
logfile имя-файла
Описание группы URL может иметь условие по времени:
destination имя-группы [within|outside имя-интервала-времени] {
...
} else {
...
}
Описание группы правил переадресации (имя типа: rewrite) состоит из перечня правил замены URL в следующих форматах
Описание группы правил переадресации может иметь условие по времени:
rewrite имя-группы [within|outside имя-интервала-времени] {
...
} else {
...
}
Описание группы ACL (ровно одна непоименованная группа) содержит для каждой группы пользователей правила поведения фильтра в формате
имя-группы-клиентов [within|outside имя-интервала-времени] {
pass [!]имя-группы-URL ...
[rewrite имя-группы-переадресации]
[redirect [301:|302:]новый-адрес]
} else {
...
}
Имеется специальная группа пользователей default, в которую входят пользователи, не вошедшие ни в одну из остальных групп или вошедшие в группу, не имеющую ACL; здесь же задаются правило переадресации для групп клиентов, не имеющих собственных правил переадресации.
Имеется следующие встроенные группы URL
any - соответствует любому URL (эквивалент ".*")
all - синоним any
none - эквивалент !any
in-addr - "^[^:/]+://[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}($|[:/])"
Директива redirect (если URL блокируется фильтром, то какой-нибудь redirect должен быть обязательно определён) позволяет производить подстановку переменных (в поставке имеется шаблон squidGuard.cgi для создания красивых страниц с объяснением):
Первый же сайт, на который я зашёл (rambler.ru), оказался в списках ads и adult.
Простейшие случаи иерархии. Основной squid с консервативными настройками и вспомогательный с агрессивными настройками (антибаннер ;).
Консервативный:
ICP выключен
никаких соседей
maximum_object_size побольше
большой объем кеша на диске
стандартные (почти) настройки refresh_pattern
transparent proxy
Агрессивный:
ICP выключен
cache_peer основной parent 3128 3130 no-query default # если не нашел объект в своем кеше, то обращаться к parent, а не к источнику
prefer_direct off
hierarchy_stoplist - пустой
maximum_object_size побольше
очень небольшой объем кеша на диске (пробовал поставить нулевой размер и cache_peer ... proxy-only, но возникают проблемы при обработке ошибок)
собственно агрессивная настройка:
Закрыть доступ к какой-то информации для клиентов
badobjects - это произвольное имя ACL; ERR_ACCESS_DENIED - имя файла в /usr/lib/squid/errors/English или в подобном месте, вместо этого файла можно поставить для каждой ситуации свой файл; воздействие http_access зависит от места, в которое его поставить; если squid получает от parent TCP_DENIED, то он лезет напрямую:
acl badobjects url_regex регулярное-выражение
http_access deny badobjects
deny_info ERR_ACCESS_DENIED badobjects
Шаблон для борьбы с RealPlayer
http://[^/]+/SmpDsBhgRl
Как удалить объект из кеша
В squid.conf:
acl PURGE method purge
acl localhost src 127.0.0.1
http_access allow purge localhost
http_access deny purge
Теперь для каждого удаляемого объекта: client -m PURGE URI
Далее >>>