9.3.3.
Настройка
кэша
От того, как вы настроите кэш, зависит удобство работы через прокси-сервер, поэтому я постараюсь показать все соответствующие директивы и подробно рассмотреть каждую из них:
cache_dir тип директория размер L1 L2 опции
— определяет парамет- ры директории, в которой будет храниться кэш. Основными для нас явля- ются тип
, директория и размер
. В большинстве случаев для типа приме- няется значение ufs
, но если вы используете асинхронный ввод/вывод
(я не советую, потому что это может вызвать проблемы в работе), то нужно установить aufs
Глава
9
302
Директорию нужно выбрать в самом большом разделе, чтобы информация не разобщалась по нескольким дискам. Если у вас используется один диск с
одним разделом, то расположение не имеет особого значения.
Размер директории по умолчанию равен 100 Мбайт. Этого достаточно для ускорения работы трех пользователей. Если в вашей сети много пользова- телей
, и у каждого свои вкусы (любимые сайты), то значение желательно увеличить
. Я использую не менее 1 Гбайт кэша. Выделенное пространство быстро исчезает, особенно если серверу разрешено кэшировать большие файлы
;
cache_mem n MB
— задает максимальный размер оперативной памяти, необходимый для программы. По умолчанию используется 8 Мбайт. Если настраиваемый компьютер решает только задачи прокси-сервера, то можно указать значение, равное разнице объемов оперативной памяти и
памяти, необходимой для ОС. Для ОС в текстовом режиме 64 Мбайт бу- дет более чем достаточно, и, например, если у вас ОЗУ 512 Мбайт, то
448 Мбайт можно отдать прокси-серверу: чем больше у него оперативной памяти
, тем быстрее он сможет отвечать на часто повторяемые запросы;
cache_swap_low n
— процент заполнения кэша. Когда размер кэша пре- вышает значение n
, сервер начинает чистить его, убирая устаревшие объ- екты
, пока размер не станет удовлетворять параметру;
cache_swap_high n
— процент заполнения кэша. Команда аналогична предыдущей
, но сервер начинает освобождать кэш более интенсивно. Это необходимо
, чтобы не возникла ситуация, когда кэш будет переполнен;
minimum_object_size n KB
— минимальный размер объекта, который по- падает в кэш. По умолчанию установлено значение 0, при котором порог отсутствует
;
maximum_object_size n KB
— максимальный размер объекта, который должен кэшироваться. По умолчанию стоит значение 4096 Кбайт, что со- ответствует
4 Мбайт. Для повышения производительности сервера необ- ходимо понизить это значение, но при этом может увеличиться расход трафика
. Если экономия трафика важнее производительности, то значение n
лучше увеличить;
maximum_object_size_in_memory n KB
— максимальный размер объекта в
памяти. По умолчанию установлено значение 8 Кбайт;
ipcache_size n
— размер кэша для хранения IP-адресов. По умолчанию используется значение 1024 Кбайт;
ipcache_low n и ipcache_high n
— соответственно минимальный и мак- симальный проценты заполнения кэша для IP-адресов;
ШлюзвИнтернет303
reference_age параметр
— время жизни объекта в кэше. Если объект пролежал дольше, то его можно удалять по старости. Рассмотрим не- сколько примеров использования директивы: reference_age 1 week reference_age 3.5 days reference_age 4 months reference_age 2.2 hours
По умолчанию используется значение в один год: reference_age 1 year
quick_abort_min n KB
— минимальный размер объекта, устанавливаю- щий при обрыве соединения необходимость закончить его скачивание и
полностью сохранить. Это позволяет сократить трафик и увеличить ско- рость работы в сети. Например, пользователь запустил на скачивание файл для проверки соединения и оборвал связь. Если сервер успел сохра- нить файл, то при повторной попытке не надо снова скачивать те же дан- ные
. Достаточно их взять из кэша. По умолчанию установлено значение
16
.
Чтобы отключить эту возможность, можно задать значение
-1
;
quick_abort_max n KB
— максимальный остаток объекта, при котором закачка будет прервана в случае обрыва соединения. По умолчанию уста- новлено значение
16
;
quick_abort_pct n
— параметр аналогичен quick_abort_min
, но в данном случае указывается процент уже полученной информации;
negative_ttl n minutes
— количество минут, которые нужно кэширо- вать негативный ответ сервера. Например, пользователь зашел на сервер и
получил ошибку, которая может быть временной, поэтому нельзя кэши- ровать ответ на длительный срок. Значение по умолчанию 5 минут. Если пользователь обратится по этому же адресу по истечении этого времени, то копия из кэша не будет использоваться, а произойдет новая попытка зайти на сайт;
positive_dns_ttl n hours
— время в часах, в течение которого нужно кэшировать положительный результат DNS-запроса. В этот промежуток времени при повторных обращениях к DNS IP-адрес будет взят из кэша.
По умолчанию используется значение 6 часов, в настоящее время его можно увеличить до 24 часов. Несколько лет назад IP-адреса имели тен- денцию очень часто меняться, поэтому приходилось ограничивать время жизни запросов. Сейчас большинство сайтов имеют статический адрес, который изменяется только при смене хостинга, а крупные порталы заре- зервировали себе собственные постоянные IP-адреса. Если вы не хотите
Глава
9
304
использовать кэширование IP-адресов, встроенное в squid, то можно уста- новить этот параметр в
0
;
negative_dns_ttl n minutes
— промежуток времени в минутах, в преде- лах которого нужно кэшировать негативный ответ DNS-сервера. Если по имени не найден IP-адрес, то, возможно, проблема с сервером имен, а не с
именем. Такие вопросы чаще всего решаются в течение 2—3 минут, по- этому отрицательный ответ не стоит держать в кэше дольше, иначе все это время клиенты не смогут обратиться к сайту. Я делаю этот параметр рав- ным
1 или 0, чтобы пользователи увидели нужный сайт сразу после устра- нения проблемы;
range_offset_limit n KB
— порядок передачи клиенту неполных данных.
Пользователь может запросить не весь файл, а лишь его часть. В этом слу- чае squid не может кэшировать такой файл, не скачав его целиком. Однако если запрошенная часть сильно смещена от начала файла, то это приведет к
большой задержке перед тем, как squid начнет возвращать что-либо кли- енту
. Для контроля над такими ситуациями и предусмотрен этот параметр: если смещение запрошенной части более параметра n
, то прокси-сервер запросит у сервера в Интернете лишь необходимую пользователю часть файла и не будет его кэшировать. Если указать значение
-1
, то squid будет всегда загружать весь файл и кэшировать его содержимое. Если же указать значение
0
(по умолчанию), то, напротив, squid будет скачивать лишь запрошенные части файлов и кэшировать их, лишь если запрошен весь файл.
9.3.4.
Журналы
В
конфигурационном файле есть несколько параметров, влияющих на работу прокси
-сервера с журналом (журналы легко читаются в любом текстовом редакторе
):
cache_access_log файл
— журнал, в котором сохраняется вся активность пользователей
, а именно, HTTP- и ICP-запросы. По умолчанию этот пара- метр равен /var/log/squid/access.log;
cache_log файл
— файл для хранения основной информации о кэше. По умолчанию используется /var/log/squid/cache.log;
cache_store_log файл
— журнал операций над объектами в кэше (убраны или помещены, на какое время). По умолчанию используется файл
/var/log/squid/store.log, но вы без проблем можете отключить этот журнал, указав в качестве значения none
, потому что утилит для анализа сохраняе-
Шлюз
в
Интернет
305
мых данных нет, да и вообще пользы в таких данных мало, а расходы на их сохранение присутствуют;
log_mime_hdrs параметр
— если в качестве параметра указано on
, то в
журнале access будут сохраняться заголовки MIME;
useragent_log
— журнал, в котором сохраняется поле
User-agent заго- ловков
HTTP. Смысла в этом поле нет, потому что его легко подделать, и
ничего полезного журнал не даст, поэтому по умолчанию он не исполь- зуется
В
разд. 12.5 мы будем говорить о журналах различных сервисов Linux, а
в разд. 12.5.4 мы подробно рассмотрим содержимое основного журнала squid — /var/log/squid/access.log.
9.3.5.
Разделение
кэша
Чтобы ваш сервер мог обмениваться запросами с другими squid-серверами, разделяя таким образом содержимое кэша, вы должны настроить соответст- вующий протокол. Для этого есть следующие директивы:
icp_port n
— номер порта, который будет использоваться для ICP- протокола
. По умолчанию используется значение 3130. Если указать 0, то протокол будет заблокирован;
htcp_port n
— номер порта, который будет использоваться для ICP- протокола
, работающего поверх TCP/IP. По умолчанию используется зна- чение
4827. Если указать 0, то протокол будет заблокирован;
cache_peer адрес тип http_порт icp_порт опции
— сервер, с которым можно обмениваться информацией. В качестве адреса указывается имя
(или адрес) сервера, с которым предполагается взаимодействие. Параметр http_порт определяет порт, на котором настроен HTTP-прокси, и соответ- ствует параметру http_port в файле конфигурации squid. Атрибут icp_порт определяет порт, на котором настроен протокол ICP, и соответ- ствует параметру icp_port в файле конфигурации squid удаленной систе- мы
. В качестве типа может указываться одно из следующих значений:
•
parent
— старший в иерархии;
•
sibling
— равнозначный;
•
multicast
— широковещательный.
Последний параметр опции может принимать много различных значений, поэтому мы его рассматривать не будем, чтобы не утяжелять книгу.
В
комментариях, содержащихся в конфигурационном файле, каждый па- раметр подробно описан;
Глава 9 306
icp_query_timeout n
— время ожидания в миллисекундах. Чаще всего прокси
-серверы расположены в локальной сети с высокой скоростью дос- тупа
, и ожидание более 2000 мс будет лишним. Иначе, если ответ не будет получен и придется обращаться в Интернет, пользователь ощутит боль- шую задержку;
cache_peer_domain хост домен
— разрешить для соседнего прокси- сервера
, расположенного по адресу хост
, работу только с указанными до- менами
. Например, следующая строка позволит обращаться к соседнему прокси
-серверу с адресом 192.168.2.20 (который должен быть описан ди- рективой cache_peer
) только за тем, что относится к домену
.com: cache_peer_domain 192.168.2.20 .com
Все остальные запросы не будут направляться на указанный соседний сервер
, чтобы не перегружать его лишней работой. С помощью этого па- раметра можно настроить в сети несколько прокси-серверов, где каждый будет отвечать за свой домен.
9.3.6. ДополнительныедирективыРассмотрим оставшиеся представляющие для нас ценность параметры, кото- рые я не смог отнести к определенным категориям:
redirect_rewrites_host_header параметр
— разрешение (
on
) или запрет
(
off
) на изменение поля
Host в заголовках запросов. Если изменение раз- решено
, то сервер работает в анонимном режиме, иначе — в прозрачном.
Анонимный режим требует дополнительных затрат, но позволяет исполь- зовать всего один IP-адрес для внешних соединений в сети любого разме- ра
. Прозрачный режим работает быстрее, но каждый компьютер должен иметь собственный IP-адрес, подходящий для работы с Интернетом;
redirector_access список
— перечень запросов, проходящих через пе- ренаправитель
(redirector). Перенаправитель — это небольшая программа, которая просматривает запрашиваемые URL и, возможно, заменяет их.
Этот механизм позволяет
реализовать довольно эффективный фильтр, за- прещающий
, например, просмотр порнографии. Более подробную инфор- мацию можно найти в
разд. 9.5.6 и в документации по squid. По умолча- нию перенаправителю отправляются все запросы;
cache_mgr email
— адрес E-mail, на который будет послано письмо в слу- чае возникновения проблем с работой прокси-сервера;
append_domain домен
— домен по умолчанию. Например, чаще всего пользо- ватели работают с адресами домена
.com. Вполне логичным будет указать в
директиве именно его (
append_domain .com
). Если пользователь введет ад- рес redhat, то squid сам добавит имя домена, и направит на сайт
redhat.com;
Шлюз
в
Интернет
307
smtp_port n
— номер порта, на котором нужно ожидать SMTP-запросы для отправки сообщений. Конечно же, SMTP — это такой протокол, кото- рый не требует кэширования, и работа через прокси-сервер не сэкономит трафик
, но возможность может оказаться полезной, если нельзя устанав- ливать шлюз, а разрешен только прокси-сервер;
offline_mode параметр
— режим работы. Если параметр равен on
, то squid будет взаимодействовать только с кэшем, и обращений к Интернету не будет
. Если запрашиваемой страницы в кэше нет, то пользователь увидит ошибку
. Чтобы squid мог обращаться к Интернету, необходимо устано- вить параметр off
(установлено по умолчанию).
9.4.
Права
доступа
к
squid
Это самая больная тема для любого администратора. Да, и в squid тоже есть права доступа, и они также описываются в конфигурационном файле
/etc/squid/squid.conf. Но мы рассматриваем права отдельно, потому что ос- новной упор делаем на безопасность. Именно поэтому этой теме отведен от- дельный раздел.
9.4.1.
Список
контроля
доступа
Первое
, с чем нам предстоит познакомиться, — это ACL (Access Control List, список контроля доступа), который предоставляет большие возможности для дальнейшей настройки прав доступа к сайтам. С помощью списка имен вы как бы группируете действия или пользователей. Используйте для этого сле- дующую директиву: acl имя тип параметр
У
данной директивы три параметра:
имя
— может быть любым, но лучше всего, если оно будет описывать вы- полняемые действия;
параметр
— задает шаблон или строку, смысл которой зависит от типа записи
(второй аргумент);
тип
— может принимать следующие значения: src
, dst
, srcdomain
, dstdomain
, url_pattern
, urlpath_pattern
, time
, port
, proto
, proxy_auth
, method
, browser
, user
. Рассмотрим основные типы, которые вам приго- дятся при формировании последнего параметра (шаблона):
•
src
— задаются IP-адреса пользователей;
•
dst
— указываются адреса серверов;
Глава
9
308
•
port
— определяется номер порта;
•
proto
— описывается список протоколов (через пробел);
•
method
— указывается используемый метод, например
POST
,
GET
и т. д.;
•
proxy_auth
— определяется список имен пользователей, значения разделяются пробелами. В качестве имени можно использовать
REQUIRED
, чтобы принимались любые действительные для сервера име- на
(
acl password proxy_auth REQUIRED
);
•
url_regex
— устанавливается URL или регулярное выражение для
URL;
•
time
— задается время в формате дни h1:m1-h2:m2
. С помощью такой записи можно ограничить доступ только определенными днями недели и
обусловленным временем. В качестве дней недели можно указывать:
S
— Sunday (воскресенье),
M
— Monday (понедельник),
T
— Tuesday
(вторник),
W
— Wednesday (среда),
H
— Thursday (четверг),
F
— Friday
(пятница),
A
— Saturday (суббота).
В
файле конфигурации уже описано несколько правил, которые готовы к ис- пользованию и в большинстве случаев не требуют вмешательства. Их вы мо- жете увидеть в листинге 9.1.
Листинг
9.1.
Список
acl-
правил
,
описанных
по
умолчанию
в
конфигурационном
файле
/etc/squid/squid.conf
acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl SSL_ports port 443 563 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 563 # https, snews acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT
ШлюзвИнтернет309 Это список прав доступа, необходимых для работы прокси-сервера.
Рассмотрим первую строку. Здесь задается ACL с именем all
. Так как ис- пользуется тип шаблона src
, то этому списку принадлежат пользователи, у
которых IP-адрес соответствует 0.0.0.0/0.0.0.0, то есть все пользователи.
Следующая строка создает ACL с именем manager
. Она определяет доступ к
протоколу, потому что тип записи proto
, а
последний параметр задает про- токол — cache_object
. И так далее.
Давайте попробуем задать свою запись ACL. Допустим, в вашей сети есть
10 компьютеров с адресами от 192.168.8.1 до 192.168.8.10 (маска подсети
255.255.255.0), которым разрешен доступ к Интернету. Значит, всем осталь- ным нужно запретить.
Уже при создании списка вы должны отталкиваться от идеи, что изначально доступ запрещен всем, и позволять только тем, кому это действительно нуж- но
. Итак, строка для всех у нас уже есть, и ее имя all
. Для списка из 10 ком- пьютеров создадим запись с именем
AllowUsers
, и ее описание будет сле- дующим
: acl AllowUsers src 192.168.8.1-192.168.8.10/255.255.255.0
Эта запись относится к типу src
, значит, сюда включаются все компьютеры с адресами
, указанными в качестве последнего параметра.
9.4.2. ОпределениеправПосле описания списков можно указать права доступа для каждого из них с помощью следующих команд:
http_access разрешение имя
— определяет права доступа по протоколу
HTTP. В качестве параметра разрешение можно указывать allow
(доступ разрешен
) или deny
(доступ запрещен). Последний аргумент имя
— это имя
ACL-записи. В следующем примере запрещается доступ по протоколу
HTTP всем пользователям, кроме указанных в ACL-записи
AllowUsers
: http_access deny all http_access allow AllowUsers
Указав права доступа для списка
AllowUsers
, мы одной строкой даем раз- решение для всех компьютеров, входящих в данный ACL. Таким образом, нет необходимости прописывать права каждому компьютеру в отдельно- сти
. Это значительно облегчает жизнь администраторов в больших сетях.
В
предыдущем примере (
см. разд. 9.4.1) мы описали список
AllowUsers как список компьютеров с IP-адресами из диапазона 192.168.8.1—
192.168.8.10. Если к прокси-серверу обратится компьютер с другим адре- сом
, то в доступе будет отказано;
Глава
9
310
icp_access разрешение имя
— описывает разрешение доступа к прокси- серверу по протоколу ICP. По умолчанию доступ запрещен для всех: icp_access deny all
miss_access разрешение имя
— описывает разрешение на получение от- вета
MISSES. В следующем примере только локальным пользователям дано право получать ответ MISSES, а все остальные могут принимать только
HITS: acl localclients src 172.16.0.0/16 miss_access allow localclients miss_access deny !localclients
9.4.3.
Аутентификация
Защита по IP-адресу не гарантирует от его подделки злоумышленником.
К
тому же, остается вероятность, что кто-то получит физический доступ к
компьютеру, имеющему доступ во всемирную сеть, и сделает нечто нераз- решенное
Мне довелось работать в фирме, где каждому сотруднику было разрешено скачивать из сети определенное количество мегабайт. Проверка проходила через
IP-адрес, и при превышении лимита руководство требовало от работ- ника покрыть расходы за сверхнормативный трафик. Это нормальная ситуа- ция
, потому что работодатель не должен оплачивать бессмысленные прогулки сотрудника в Интернете. На работу приходят, чтобы выполнять свои обязан- ности
, а не подыскивать обои для собственного компьютера.
Однажды у некоторых работников оказалось большое превышение трафика.
Вроде бы ничего удивительного, но настораживало то, что эти товарищи бы- ли в отпуске. Кто-то подделывал чужой адрес и использовал служебный Ин- тернет в своих целях.
Чтобы вы не столкнулись с подобной ситуацией, необходимо привязываться не только к IP-адресу, но и строить дополнительную защиту через проверку имени пользователя и пароля. Для аутентификации необходимо определить следующие директивы:
authenticate_program программа файл
— задает программу аутентифи- кации
(по умолчанию не используется) и файл паролей. Если вы хотите использовать традиционную программу аутентификации, то можно ука- зать следующую строку: authenticate_program /usr/lib/squid/ncsa_auth /usr/etc/passwd
Путь к программе ncsa_auth в вашей системе может отличаться.
Чтобы использовать возможности аутентификации прокси-сервера, у вас должна присутствовать хотя бы одна ACL-запись типа proxy_auth
;
ШлюзвИнтернет311
authenticate_children n
— определяет количество параллельно рабо- тающих процессов аутентификации. Один процесс не может производить проверку нескольких клиентов, поэтому
если один пользователь проходит аутентификацию, то другие не смогут получить доступ к Интернету через сервер squid;
authenticate_ttl n hour
— срок (в часах) хранения в кэше результата аутентификации
. В течение этого времени пользователь может работать без повторной проверки. По умолчанию установлен 1 час, но если введен неправильный пароль, то запись удаляется из кэша;
authenticate_ip_ttl 0 second
— связывает IP-адрес с аутентификаци- ей
. Необходимо установить
0
, чтобы пользователи не могли воспользо- ваться одним и тем же паролем с разных IP-адресов. Некоторые пользо- ватели считают, что можно делиться паролем с друзьями, но не стоит им это разрешать, потому что за раздачу паролей должен отвечать только администратор
Если в вашей сети есть dialup-пользователи, подключающиеся с помощью модема
, то это значение можно увеличить до 60 секунд, чтобы при разры- ве связи была возможность перезвонить. Но обычно при dialup- подключении используются динамические IP-адреса, которые выдаются при каждом соединении, и нет гарантии, что после повторного звонка ад- рес сохранится;
authenticate_ip_ttl_is_strict параметр
— если параметр равен on
, то доступ с других IP-адресов запрещен, пока время, указанное в
authenticate_ip_ttl
, не выйдет.
ВН И МА Н И Е! Аутентификация не работает
, если squid настроен на работу в
прозрачном режиме
9.5. Замечанияпоработе squid Сейчас нам предстоит немного поговорить о некоторых вопросах безопасно- сти сервиса squid и дополнительных возможностях, которые могут ускорить работу в Интернете.
9.5.1. БезопасностьсервисаКогда я впервые знакомился с документацией на squid, то мне очень понравились следующие два параметра: cache_effective_user и cache_effective_group
Если squid запущен от имени администратора root, то идентификаторы поль-
Глава
9
312
зователя и группы будут заменены на указанные в этих параметрах. По умол- чанию установлено значение идентификатора squid и для пользователя, и для группы
: cache_effective_user squid cache_effective_group squid
Таким образом, squid не будет работать с правами root, и при попытке сде- лать это сервис сам понизит свои права до squid. Не стоит вмешиваться. Сер- вису squid не имеет смысла давать большего, потому что ему достаточно прав только на работу с директорией кэша.
9.5.2.
Ускорение
сайта
Сервис squid может ускорить работу определенного сайта, функционируя как httpd-акселератор. Для этого необходимо указать как минимум три парамет- ра
: адрес ускоряемого сервера, который надо кэшировать, его порт и атрибу- ты сервера, который надо ускорять. Это делается с помощью следующих директив
:
httpd_accel_host адрес
— адрес реального сервера;
httpd_accel_port порт
— порт WEB-сервера. Чаще всего это порт по умолчанию
(он равен 80), если не указан другой;
httpd_accel_uses_host_header параметр
— заголовок HTTP включает в
себя поле Host. Сервер squid не проверяет Host, и это может оказаться большой дырой в безопасности. Разработчики рекомендуют отключать эту директиву
, указав в качестве параметра значение off
. Включать ее необ- ходимо
, если squid работает в прозрачном режиме;
httpd_accel_with_proxy параметр
— флаг использования кэширования страницы для дополнительного повышения скорости (
on
/
off
).
9.5.3.
Маленький
секрет
User Agent
Многие статистические системы не учитывают или не пускают к себе поль- зователей
, запросы которых содержат пустое значение в поле User Agent.
Именно так определяется, что вы работаете через прокси-сервер.
Опять случай из собственной практики. Я снова вспоминаю фирму, где мне пришлось работать 4 года, и защита была организована по IP-адресу. Мой отдел занимался автоматизацией производства, и в нем работали электрон- щики
, а я был единственный программист и администратор в одном лице.
Доступ в Интернет был разрешен только мне, начальнику отдела и его замес- тителю
. Через несколько часов доступ имели все сотрудники отдела. Как это
ШлюзвИнтернет313 произошло
? Решение очень простое — я поставил на свой компьютер про- кси
-сервер, к которому могли подключаться без аутентификации мои сослу- живцы
, а он уже переправлял эти запросы корпоративному прокси-серверу.
Так как все
запросы шли от меня, то главный прокси-сервер не возражал.
На первый взгляд решение идеальное, но тут есть один изъян. Да, это поле
User Agent, которое становится пустым при прохождении пакетов через мой squid-сервис. Но поле можно задать вручную в конфигурационном файле.
Для этого существует директива fake_user_agent
. Например, следующая строка может эмулировать запросы, как будто они идут от браузера Netscape: fake_user_agent Netscape/1.0 (CP/M; 8-bit)
9.5.4. ЗащитасетиСервис squid может быть как средством защиты сети, так и орудием проник- новения хакера в сеть. Чтобы внешние пользователи не могли задействовать прокси
-сервер для подключения к компьютерам локальной сети, необходимо добавить в конфигурационный файл следующие строки: tcp_incoming_address внутренний_адрес tcp_outgiong_address внешний_адрес udp_incoming_address внутренний_адрес udp_outgiong_address внешний_адрес
В
данном случае внутренний_адрес
— это адрес компьютера с установлен- ным squid, сетевое соединение которого направлено на вашу локальную сеть, а
внешний_адрес
— это адрес сетевого соединения, направленного в Интер- нет
. Если неправильно указать адреса, то хакер сможет подключаться к ком- пьютерам локальной сети, находясь за ее пределами. Вот пример ошибочного конфигурирования squid-сервиса: tcp_incoming_address внешний_адрес tcp_outgiong_address внутренний_адрес udp_incoming_address внешний_адрес udp_outgiong_address внутренний_адрес
9.5.5. БорьбасбаннерамиивсплывающимиокнамиВ
фирме, где я работал, появился новый сотрудник, и в первую неделю мы ощутили увеличение трафика. Это бывает со всеми, потому что любой новый пользователь
Интернета начинает смотреть все страницы подряд. Со време- нем интерес стихает, и трафик понижается.
Глава
9
314
Мы уже говорили о том, что на любом сайте бóльшую часть трафика отнима- ет графика. В большинстве браузеров отображение картинок можно отклю- чить
, но после этого путешествие будет не очень удобным. Некоторые сайты без графики теряют информативность, и с ними сложнее работать, поэтому отказаться совсем от этого режима невозможно.
Но есть графика, которая надоедает, раздражает и не несет полезной инфор- мации
, а главное, от нее можно избавиться. Я говорю про баннеры. Давайте рассмотрим
, как их можно отключить еще на уровне прокси-сервера. Для этого сначала добавим в файл squid.conf следующие правила: acl banners_regex url_regex "/usr/etc/banners_regex" acl banners_path_regex urlpath_regex "/usr/etc/banners_path_regex" acl banners_exclusion url_regex "/usr/etc/banners_exclusion"
Первая строка создает ACL-список с именем banners_regex типа url_regex
, который позволяет сравнивать полный URL-адрес. В последнем параметре определен файл /usr/etc/banners_regex, в котором будут указываться нужные адреса
. Нас интересуют URL баннерных систем, и вы можете поместить их в
этот файл.
Вторая строка создает ACL-список с именем banners_path_regex типа urlpath_regex
. В последнем параметре снова указан файл /usr/etc/banners_ path_regex, в котором вы должны описывать пути URL, которые впоследст- вии мы запретим.
Третья строка схожа с первой, но имеет имя banners_exclusion и связана с
файлом /usr/etc/banners_exclusion. В первых двух файлах вы должны описывать пути или шаблоны, по которым потом будут обрезаться баннеры.
Но бывают случаи, когда можно промахнуться и отсечь вполне полезную информацию
. Если найден ошибочный путь, то его можно записать в этот файл
, и баннер будет загружен.
Теперь добавляем еще две строки после описания ACL-записей: http_access deny banners_path_regex !banners_exclusion http_access deny banners_regex !banners_exclusion
Обе директивы имеют один и тот же смысл — запрещается загрузка по адресам
, прописанным в списке banners_path_regex или banners_regex
, если адрес не входит в исключение, описанное в файле ACL-списка banners_exclusion
Рассмотрим фрагмент содержимого файла /usr/etc/banners_regex:
^http://members\.tripod\.com/adm/popup/.+html
^http://www\.geocities\.com/ad_container/pop\.html
ШлюзвИнтернет315 Напоминаю
, что в этом файле находятся URL-пути для сравнения, и все ад- реса
, которые им соответствуют, будут отфильтрованы.
Шаблону из первой строки соответствует
, например
, адрес
http://members.tripod.com/adm/popup/popup.html, так что он не будет за- гружен
. Так просто. И пользователи больше не увидят всплывающие окна с
сайта tripod.com. Если вы знакомы с регулярными выражениями, то сможе- те создать подобные записи для любой баннерной системы и обрезать самые замысловатые пути надоедливых картинок. Я не буду затрагивать регуляр- ные выражения, потому что это тема такая большая, что
требует отдельной книгиПри борьбе с баннерами будьте готовы, что "обрезание" не всегда помогает, всплывающие окна могут снова появиться через определенное время. Это связано с тем, что баннеры — просто реклама, и позволяют зарабатывать деньги на существование сайта. Особо одаренные администраторы ищут лю- бые возможные пути для того, чтобы ваша система не смогла избавиться от рекламы
. Для этого постоянно изменяются адреса, чтобы регулярное выра- жение не сработало.
9.5.6. ПодменабаннераПока что мы запретили загрузку баннеров или всплывающих окон. Но после этого
WEB-страницы перестанут быть привлекательными. Чтобы этого не произошло
, можно заменять баннеры на свои картинки, которые хранятся на сервере
, и отпадет необходимость грузить их из Интернета.
Для решения этой задачи очень хорошо подходит перенаправитель (redirector).
Для сервиса squid это внешняя программа, которая подменяет адреса.
Например
, если сайту необходимо загрузить баннер, и ваша программа смог- ла определить такую попытку, то redirector подменит адрес и вместо баннера загрузит то, что укажете вы.
Есть только одна проблема — в ОС нет, и не может быть готовой программы.
Ее необходимо написать. Для этого подойдет любой язык программирования, а
я покажу вам пример, реализованный на языке Perl. Если вы умеете про- граммировать на этом языке, то способ с redirector понравится вам больше, чем простой запрет через ACL.
Пример классической программы redirector можно увидеть в листинге 9.2.
Я
постарался максимально упростить его, чтобы вам легче было адаптиро- вать сценарий под свои задачи.
Глава
9
316
Листинг__9.2._Сценарий_на_языке__Perl_для_подмены_баннеров_и_закрытия_всплывающих'>Листинг
9.2.
Сценарий
на
языке
Perl
для
подмены
баннеров
и
закрытия
всплывающих
окон
#!/usr/bin/perl
$| = 1;
# Укажите URL на вашем WEB-сервере, где лежат картинки
$YOURSITE = 'http://yourserver.com/squid';
$LOG = '/usr/etc/redirectlog';
$LAZY_WRITE = 1; if ($LOG) { open LOG, ">> $LOG"; unless ($LAZY_WRITE)
{ select LOG ;
$| = 1 ; select STDOUT;
}
}
@b468_60 = qw ( www\.sitename\.com/cgi/
# Добавьте сюда описания URL-адресов с баннерами
# размером 468х60
);
@b100_100= qw ( www\.sitename\.com/cgi/
# Добавьте сюда описания URL-адресов с баннерами
# размером 100х100
);
@various = qw ( www\.sitename\.com/cgi/
# Добавьте сюда описания URL-адресов с нестандартными
# размерами баннера
);
Шлюз
в
Интернет
317
@popup_window = qw (
^http://members\.tripod\.com/adm/popup/.+html
^http://www\.geocities\.com/ad_container/pop\.html
^http://www\.geocities\.com/toto\?
# Добавьте сюда описания URL-адресов, с которых
# выскакивают всплывающие окна
);
# Описание расположения картинок
$b468_60 = "$YOURSITE/468_60.gif";
$b100_100 = "$YOURSITE/100_100.gif";
$various = "$YOURSITE/empty.gif";
$closewindow = "$YOURSITE/close.htm"; while (<>)
{
($url, $who, $ident, $method) = /^(\S+) (\S+) (\S+) (\S+)$/;
$prev = $url;
# Проверка баннера 468x60
$url = $b468_60 if grep $url = m%$_%, @b468_60;
# Проверка баннера 100x100
$url = $b100_100 if grep $url = m%$_%, @b100_100;
# Проверка баннера произвольного размера
$url = $various if grep $url = m%$_%, @various;
# Всплывающее окно
$url = $closewindow if grep $url = m%$_%, @popup_window;
# Отдельный сайт, не внесенный в список в начале файла
$url = "$YOURSITE/empty.gif" if $url = m%hitbox\.com/Hitbox\?%; if ($LOG and $url ne $prev)
{ my ($sec, $min, $hour, $mday, $mon, $year) = localtime; printf LOG "%2d.%02d.%2d %2d:%02d:%04d: %s\r\n",
Глава 9 318 $mday, $mon + 1, $year + 1900, $hour, $min, $sec,
"$who $prev > $url";
} print "$url $who $ident $method\n";
} close LOG if $LOG;
Сохраните эту программу в файле
/usr/etc/redirector и установите для squid права на его исполнение. После этого добавьте в файл squid.conf следующую строку
: redirect_program /usr/local/etc/squid/redirector
Чтобы эта программа заработала, создайте на своем WEB-сервере файлы со следующими именами:
468_60.gif — картинка размером 468×60;
100_100.gif — картинка размером 100×100;
empty.gif — картинка, которая будет заменять нестандартные баннеры.
Лучше всего ее сделать размером 1×1 пиксел, чтобы она не испортила ди- зайн сайта;
close.htm — файл HTML, который будет закрывать всплывающие окна.
В
нем нужно поместить всего лишь функцию, которая будет закрывать окно
. Для этого используется функция JavaScript window.close()
. Пример содержимого файла показан в листинге 9.3.
Все эти файлы должны лежать на WEB-сервере в одной директории. Не за- будьте в сценарии (в переменной
$YOURSITE
) указать правильный путь к это- му каталогу.
Я
постарался снабдить код в листинге 9.2 комментариями. Если у вас есть опыт программирования на Perl, то дальнейшие действия вы выполните без проблем
Листинг 9.3. Пример JavaScript-файла, закрывающеговсплывающееокно