Вперед Назад Содержание

15. Редиректоры

15.1 Что такое редиректор?

Squid имеет возможность переписывать запрашиваемые URL. Squid может быть сконфигурирован так, чтобы пропускать входящие URL через процесс редиректора выполняемого как внешний процесс (подобно dnsserver), который возвращает новый URL или пустую строку, обозначающую отсутствие изменений.

Редиректор - это НЕ ЯВЛЯЕТСЯ стандартной частью пакета Squid. Однако ниже представлено несколько его образцов, которые также можно найти в директории "contrib/" дистрибутива. Так как потребности у всех разные, каждый администратор может использовать его по собственному усмотрению.

15.2 Почему используют редиректор?

Редиректор предоставляет администратору контроль за передвижениями пользователей. Использование редиректора в сочетании с прозрачным проксированием дает простой, но эффективный контроль, над доступом к порно.

15.3 Как это работает?

Программа-редиректор должна читать URL-лы (один на строку) со стандартного входа и записывать измененные URL-лы или пустые строки на стандартный выход. Заметьте, что программа-редиректор не может использовать буферизированный I/O. Squid дописывает дополнительную информацию после URL, которую редиректор может использовать для принятия решения. Входящая строка состоит из 4-х полей:

        URL ip-address/fqdn ident method

15.4 А примеры имеются ?

Простой и очень быстрый редиректор, называемый SQUIRM - хороший выбор для начала, он использует библиотеку regex lib для проверки совпадения шаблона.

Также см. jesred.

Следующий скрипт на Perl может использоваться как шаблон при написании собственного редиректора:

        #!/usr/local/bin/perl
        $|=1;
        while (<>) {
                s@http://fromhost.com@http://tohost.org@;
                print;
        }

15.5 Can I use the redirector to return HTTP redirect messages?

Обычно возможности редиректора используются для подмены запрошенных URL-лов. Squid прозрачно запрашивает новые URL. Однако в некторых ситуациях может потребоваться возвращать клиенту сообщения о перенаправлении HTTP "301" или "302". Это возможно начиная с версии Squid 1.1.19.

Просто измените вашу программу-редиректор, чтобы она подставляла "301:" или "302:" перед новым URL. К примеру, следующий скрипт может использоваться для направления внешнего клиента к внутреннему документу на секьюрном Web-сервер:

#!/usr/local/bin/perl
$|=1;
        while (<>) {
                @X = split;
                $url = $X[0];
                if ($url =~ /^http:\/\/internal\.foo\.com/) {
                        $url =~ s/^http/https/;
                        $url =~ s/internal/secure/;
                        print "302:$url\n";
                } else {
                        print "$url\n";
                }
        }

Please see sections 10.3.2 and 10.3.3 of RFC 2068 for an explanation of the 301 and 302 HTTP reply codes.

15.6 FATAL: All redirectors have exited!

Процесс редиректора никогда не должен заканчиваться (прекращать выполнение). Если вы видите сообщение ``All redirectories have exited'', это скорее всего значит, что в вашем редиреторе есть баг. Возможно не хватает памяти или есть ошибка при обращении к ней. Если хотите, можете протестировать ваш редиректор вне сквида с большими входящими списками, взятыми к примеру из вашего access.log . Также проверьте файл coredump вашего редиректора.

15.7 Редиректор не срабатывает при повторной отработке IDENT

Я добавил редиректор, состоящий из

#! /bin/sh
/usr/bin/tee /tmp/squid.log
и многие из прошедших через редиректор запросов не имеют имени пользователя в поле ident.

Squid не приостанавливает обработку запроса с целью дождаться результатов работы ident, пока вы не используете ACL-ы типа ident. Т.е. скорее всего, что ident недоступен во время вызова редиректора, но он будет доступен в то время, когда обработка запроса будет закончена и записана в access.log.

Если вы хотите блокировать запросы ожидающие отработки ident, попробуйте нечто подобное:

acl foo ident REQUIRED
http_access allow foo


Вперед Назад Содержание