Прозрачный Прокси-сервер при помощи Squid

#include <disclaimer.h>

Никаких гарантий, явных и не явных, и т.д. и т.п. и др.

Обзор "прозрачного" прокси

Зачем это надо?

В случае использования "обычного" прокси, клиент в программном обеспечении просмотра веб-страниц (обозревателе) должен указывать прокси-сервер и порт. Обозреватель выполняет запрос на прокси-сервер, который перенаправляет его к веб-серверу. Это все конечно хорошо, но иногда случаются ситуации, типа

Всем клиентам сети приходится настраиваться на прокси-сервер, хотят они этого или нет.

Вы хотите, чтобы клиенты использовали прокси-сервер, но не хотите, чтобы они об этом знали.

Вы хотите, чтобы клиенты использовали прокси-сервер, но не хотите настраивать сотни или тысячи веб-браузеров.

На помощь вам приходит "прозрачный" прокси-сервер. Веб-запрос перехватывается прокси-сервером абсолютно прозрачно. Т.е. клиентское программное обеспечение думает, что работает с настоящим веб-сервером, хотя, на самом деле, работает с прокси-сервером.

Маршрутизаторы Cisco поддерживают прозрачный прокси. Но, (к вашему большому удивлению) Linux тоже может быть маршрутизатором и поддерживать прозрачный прокси, перенаправляя TCP-соединения на локальные порты. Кроме того, наш прокси-сервер может знать все последствия этого перенаправления, и не делать его. Таким образом у нас есть два пути:

Первый. Если ваш прокси-сервер не может быть прозрачным, вы можете использовать маленький сервер transproxy, который все сделает за вас. transproxy написал John Saunders, и он доступен на ftp://ftp.nlc.net.au/pub/linux/www/ или на вашем местном зеркале metalab. Далее в этом тексте мы не будем обращаться к transproxy.

Более "чистый" путь - взять веб-прокси-сервер, который сам поддерживает прозрачность. Один из них, на который мы хотим обратить внимание - это squid. Squid - это кэширующий прокси-сервер с открытыми исходными текстами (Open Source) для систем Unix. Его можно найти на www.squid-cache.org

Область действия этого документа

Этот документ уделяет внимание squid версии 2.3 и ядру версии 2.2 - наиболее стабильным текущим версиям на момент, когда пишется этот текст (Март 2000). Однако это работает и на более ранних версиях squid 2.0 и ядрах 2.1 и выше. Если вам нужна информация о старых версиях, некоторые ранние документы доступны на www.unxsoft.com.

Если у вас ядро 2.3, вам нужно использовать netfilter вместо ipchains. Тем не менее, если вы используете разрабатывающееся ядро, вы должны сами разобраться с netfilter на основе предусмотренной документации. Если нет, вам не надо использовать разрабатывающееся ядро (поверьте мне на слово). Как только выйдет ядро 2.4, этот документ будет изменен согласно утилите netfilter.

Настройка ядра

Первое, что мы должны сделать - это убедиться в том, что настроено ядро. Если вы используете готовое ядро из вашего дистрибутива, прозрачный прокси может быть включен, а может быть и нет (IIRC в RH 6.1, но не ссылайтесь на меня). Если вы не уверены, лучше пропустите этот раздел, и, если в следующем разделе команды дают ошибку, это значит, что у вас не настроено ядро.

Если ваше ядро не настроено на прозрачный прокси, вам нужно его пересобрать. Пересборка ядра - это сложный процесс (по крайней мере сначала) и он не описывается в данном документе. Читайте Kernel-HOWTO.

Следующие опции, которые вам нужно включить (замечу: ни одна из них не может быть собрана, как модуль):

Sysctl support

TCP/IP networking

IP: firewalling

IP: always defragment

IP: transparent proxy support

/proc filesystem support

Как только у вас будет запущено новое ядро, вам, возможно, надо будет включить пересылку IP-пакетов (forwarding), который позволяет вашему компьютеру работать в качестве маршрутизатора. По умолчанию эта опция выключена, и должна включаться каждый раз в процессе загрузки. Кроме того, это может сделать только root. Тем не менее, в вашем дистрибутиве это может делаться автоматически. Проверьте это, сделав "cat /proc/sys/net/ipv4/ip_forward". Если вы видите "1" - все нормально. Иначе, выполните "echo '1' >/proc/sys/net/ipv4/ip_forward'' и добавьте эту команду в скрипт загрузки в /etc/rc.d/.(Примечание переводчика: В некоторых дистрибутивах, например в RedHat, это делается путем установки переменной FORWARD_IPV4 в true в файле /etc/sysconfig/network)

Установка squid

Теперь нам нужно запустить squid. Скачайте последнюю версию исходных текстов с www.squid-cache.com. Убедитесь в том, что это СТАБИЛЬНАЯ (STABLE) версия, а не разрабатываемая (DEVEL). В данный момент, когда пишется этот текст, последняя версия была squid-2.3.STABLE1.tar.gz.

Разархивируйте архив ("tar -xzf <filename>"). Запустите скрипт автоконфигурации ("./configure"), скомпилируйте ("make") и установите squid ("make install").

Теперь нам нужно отредактировать файл squid.conf (по умолчанию он находится в /usr/local/squid/etc/squid.conf). В нем много комментариев, и, на самом деле, самая лучшая документация по squid находится в файле squid.conf. После того, как все запустилось и работает, вы должны вернуться в этот файл и настроить одну вещь. Найдите следующие опции, раскомментируйте их, и присвойте им соответствующие значения:

httpd_accel_host virtual

httpd_accel_port 80

httpd_accel_with_proxy on httpd_accel_uses_host_header on

И наконец, найдите директиву http_access. Значение по умолчанию скорее всего будет установлено в "http_access deny all". Это запрещает всем использовать squid. Вы можете изменить это на "http_access allow all", но как только это заработает, вам возможно нужно будет прочитать об ACL (Access Control List) и установить доступ к squid только пользователям вашей сети. Это может показаться глупым, но вы должны ввести некоторые ограничения в доступе к squid. Люди, находящиеся за фильтрующим firewall (таким как порно-фильтр или фильтры для стран, язык которых вы не понимаете) часто "садятся" на открытый прокси и засоряют канал.

Создайте структуру каталогов, запустив "squid -z" (если вы установили squid в первый раз).

Теперь, запустите squid, используя скрипт RunCache, находящийся в каталоге /usr/local/squid/bin/. Если он запустился, вам нужно настроить обозреватель на использование в качестве прокси-сервера вашей машины и порта 3128 (если вы не меняли порт по умолчанию) и попробовать squid в качестве обычного прокси-сервера.

За дополнительной информацией обращайтесь к squid FAQ на www.squid-cache.org.

Установка ipchains

ipchains поставляется почти с каждым последним дистрибутивом (основанном на ядре 2.2). Тем не менее, если у вас нет ipchains, вы можете взять его по адресу ftp://ftp.rustcorp.com/ipchains/. ipchains - очень мощная программа и мы лишь слегка коснемся ее возможностей. За дополнительной информацией обращайтесь к http://www.rustcorp.com/linux/ipchains/HOWTO.html.

Чтобы установить правила, нам нужно знать две вещи: IP адрес сервера (я например использую 192.168.1.1) и номер порта, на котором запущен squid (я использую значение по умолчанию - 3128).

Во-первых, вам нужно разрешить прохождение пакетов, направленных к вашему веб-серверу. Причем надо указать как интерфейс loopback, так и сетевой интерфейс. Вам нужно это сделать даже в том случае, если у вас нет собственного веб-сервера, т.к. отсутствие этих правил приведет бесконечному зацикливанию пакетов, если прокси попытается соединиться с самим собой. Используйте следующие команды:

ipchains -A input -p TCP -d 127.0.0.1/32 www -j ACCEPT

ipchains -A input -p TCP -d 192.168.1.1/32 www -j ACCEPT

А это заклинание включает прозрачный прокси:

ipchains -A input -p TCP -d any/0 www -j REDIRECT 3128

Вы можете добавить эти команды к соответствующему скрипту загрузки в каталоге /etc/rc.d/.

Ставим их вместе

Если все было сделано правильно, пойдите на другую машину, укажите ей в качестве шлюза вашу машину и выйдите в Интернет. Чтобы убедится, что запросы обрабатываются именно прокси-сервером, а не напрямую, проверьте содержимое журнала /usr/local/squid/logs/access.log