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

Daniel Kiracofe

Перевод: Павел Гашев, SWSoft Pte Ltd.

Версия 1.0, 1 апреля 2000 года

Этот документ содержит в себе информацию, по установке прозрачного кэширующего HTTP-прокси-сервера, при помощи Linux и squid.


1. Введение

1.1. Комментарии

Комментарии к этому Мини-HOWTO могут быть направленны автору, Daniel Kiracofe, на [email protected].


1.2. Copyrights and Trademarks

Copyright 2000 by UnxSoft Ltd (www.unxsoft.com)

This manual may be reproduced in whole or in part, without fee, subject to the following restrictions:

  • The copyright notice above and this permission notice must be preserved complete on all complete or partial copies

  • Any translation or derived work must be approved by the author in writing before distribution.

  • If you distribute this work in part, instructions for obtaining the complete version of this manual must be included, and a means for obtaining a complete version provided.

  • Small portions may be reproduced as illustrations for reviews or quotes in other works without this permission notice if proper citation is given.

Exceptions to these rules may be granted for academic purposes: Write to the author and ask. These restrictions are here to protect us as authors, not to restrict you as learners and educators. Any source code (aside from the SGML this document was written in) in this document is placed under the GNU General Public License, available via anonymous FTP from the GNU archive.


1.3. Авторские права

Авторские права на русский перевод этого текста принадлежат © 2000 SWSoft Pte Ltd. Все права зарезервированы.

Этот документ является частью проекта Linux HOWTO.

Авторские права на документы Linux HOWTO принадлежат их авторам, если явно не указано иное. Документы Linux HOWTO, а также их переводы, могут быть воспроизведены и распространены полностью или частично на любом носителе, физическом или электронном, при условии сохранения этой заметки об авторских правах на всех копиях. Коммерческое распространение разрешается и поощряется; но, так или иначе, автор текста и автор перевода желали бы знать о таких дистрибутивах.

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

Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: или к координатору русского перевода Linux HOWTO компании SWSoft Pte Ltd. по адресу


1.4. #include <disclaimer.h>

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


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

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

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

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

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

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

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

Маршрутизаторы 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


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

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

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


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

Первое, что мы должны сделать - это убедиться в том, что настроено ядро. Если вы используете готовое ядро из вашего дистрибутива, прозрачный прокси может быть включен, а может быть и нет (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)


4. Установка 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.


5. Установка 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/.


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

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


7. Другие источники

Если вам нужна помощь, вы можете посмотреть squid-FAQ или список рассылки squid на www.squid-cache.org. Вы также можете написать мне по адресу [email protected], и, если позволит время, я попытаюсь ответить на ваши вопросы.