9.5.3. Маленький секрет User Agent
Многие статистические системы не учитывают или не пускают к себе пользователей, запросы которых содержат пустое значение в поле User Agent. Именно так определяется, что вы работаете через proxy.
Опять случай из собственной практики. Я снова вспоминаю фирму, где мне пришлось работать 4 года, и защита была организована по IP-адресу. Мой отдел занимался автоматизацией производства, и в нем работали электронщики, а я был единственный программист и администратор в одном лице. Доступ в Интернет был разрешен только мне, начальнику отдела и его заместителю. Через несколько часов доступ имели все сотрудники отдела. Как это произошло? Решение очень простое — я поставил на свой компьютер прокси-сервер, к которому могли подключаться без аутентификации мои сослуживцы, а он уже переправлял эти запросы корпоративному proxy. Так как все запросы шли от меня, то главный proxy ничего не заметил.
На первый взгляд решение идеальное, но тут есть один изъян. Да, это поле 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_outgoing_address внешний_адрес
udp_incoming_address внутренний_адрес
udp_outgoing_address внешний_адрес
В данном случае внутренний_адрес — это адрес компьютера с установленным squid, сетевое соединение которого направлено на вашу локальную сеть, а внешний_адрес — это адрес сетевого соединения, направленного в Интернет. Если неправильно указать адреса, то хакер сможет подключаться к компьютерам локальной сети, находясь за ее пределами. Вот пример ошибочного конфигурирования squid-сервиса:
tcp_incoming_address внешний_адрес
tcp_outgoing_address внутренний_адрес
udp_incoming_address внешний_адрес
udp_outgoing_address внутренний_адрес
9.5.5. Борьба с баннерами и всплывающими окнами
В фирме, где я работал, появился новый сотрудник, и в первую неделю мы ощутили увеличение трафика. Это бывает со всеми, потому что любой новый пользователь Интернета начинает смотреть все страницы подряд. Со временем интерес стихает, и трафик понижается.
Мы уже говорили о том, что на любом сайте большую часть трафика отнимает графика. В большинстве браузеров отображение картинок можно отключить, но после этого путешествие будет не очень удобным. Некоторые сайты без графики теряют информативность, и с ними сложнее работать, поэтому отказаться совсем от этого режима невозможно.
Но есть графика, которая надоедает, раздражает и не несет полезной информации, а главное, от нее можно избавиться. Я говорю про баннеры. Давайте рассмотрим, как их можно отключить еще на уровне прокси-сервера. Для этого сначала добавим в файл squid.conf следующие правила:
acl banners_regex url_regex "/usr/etc/banners_regex"
acl banners_path_regex urlpath_regex "/usr/etc/banners_j?ath_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
Напоминаю, что в этом файле находятся 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.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-адресов с баннерами
# размером 468x60
);
@b100_100 = qw (
www.sitename.com/cgi/
# Добавьте сюда описания URL-адресов с баннерами
# размером 100x100
);
@various = qw (
www.sitename.com/cgi/
# Добавьте сюда описания URL-адресов с нестандартными
# размерами баннера
};
@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