вторник, 29 марта 2011 г.

Linux: настройка прозрачного прокси-сервера squid 3

Прозрачный прокси-сервер имеет один очень большой плюс: не нужно настраивать компьютеры пользователей в сети для подключения к интернету. Также это удобно для тех, кто работает за одним ноутбуком дома и на работе. Squid будет также настроен с ограничениями скорости для разных групп. Настройка осуществляется на Debian 5 Lenny.
Для работы прозрачного прокси-сервера нужно будет также настроить iptables. Также для обрезки рекламы и закрытия ненужных и нежелательных ресурсов squid настроен вместе с редиректором squidGuard. О настройке редиректора будет рассказано в другой статье.
Настройка squid3

Устанавливаем squid3 из репозитариев:
apt-get install squid3
Squid потянет за собой зависимости. Соглашаемся с их установкой. Устанавливается версия 3.0.STABLE8. Файл конфигурации находится в папке /etc/squid3. Открываем его текстовым редактором:
nano /etc/squid3/squid.conf
Очищаем этот файл и начинаем заполнять его своими параметрами.
http_port 8080 transparent
#Указывает порт, который будет слушать squid. В данном случае это 8080. transparent означает, что прокси будет работать в прозрачном режиме
visible_hostname proxy
#Имя, видимое в сети
#cache_peer 192.168.8.1 parent 80 3130 no-query default
#Этот параметр указывает родительский (вышестоящий) прокси-сервер для работы squid. В моем случае такого нет, поэтому он закомментирован
hierarchy_stoplist cgi-bin ?
#Параметр hierarchy_stoplist указывает слова, при нахождении которых в URL squid'у не надо брать страницы из кэша
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
#Эти два параметра говорят, что прокси не нужно брать страницы с запросами из кэша
cache_mem 80 MB
#Указывает сколько squid может взять оперативной памяти для своих нужд. Обычно он использует памяти в три раза больше указанной в этом параметре. В основном squid из памяти будет брать наиболее часто посещаемые страницы
negative_ttl 1 seconds
#Время жизни страниц с ошибками. По умолчанию это значение равно 5 minutes (5 минут). В нашем случае это значение равно одной секунде
access_log /var/log/squid3/access.log
#Место хранения лог-файла с результатами доступа к страницам интернета
error_directory /usr/share/squid3/errors/Russian-koi8-r
#Путь хранения сообщений об ошибках для пользователей

#auth_param basic children 50
#Количество запускаемых процессов проверки авторизации при настройке squid в этом режиме
#auth_param basic program /usr/lib/squid3/ncsa_auth /etc/squid3/conf/passwd
#Путь к программе авторизации (/usr/lib/squid3/ncsa_auth) и путь к файлу с именами пользователей и паролями (/etc/squid3/conf/passwd)
#auth_param basic realm Helo, User! Welcome *** proxy-caching! Please enter name and password.
#Сообщение, которое видят пользователи во время авторизации (Helo, User! Welcome *** proxy-caching! Please enter name and password.)
#Эти три параметра в данном случае не используются (в прозрачном режиме squid не может быть настроен на авторизацию). Они остались от предыдущего варианта настройки
Добавляем в squid параметры для работы редиректора
redirect_program /usr/bin/squidGuard
#Путь для запуска редиректора squidGuard
redirect_children 40
#Количество запукаемых процессов редиректора. Слишком большое значение для маленькой сети выставлять не стоит. В моем случае интернет нужен приблизительно 150 компьютерам
redirector_bypass on
#В случае ошибки редиректора или при занятости всех его процессов пускать запросы в обход squidGuard
Подробно о настройке редиректора написано ниже. Создаем списки пользователей:
#acl sysadmin proxy_auth "/var/lib/squidguard/db/user/sysadmin"
#acl nachalnik proxy_auth "/var/lib/squidguard/db/user/nachalnik"
#acl users proxy_auth "/var/lib/squidguard/db/user/users"
#acl ban proxy_auth "/var/lib/squidguard/db/user/ban"
#acl password proxy_auth REQUIRED

#Эти параметры также остались от предыдущего варианта настройки squid'а с авторизацией. У меня они не используются, хотя могут кому-нибудь быть полезными

acl server src "/etc/squid3/acl/server"
#Параметр acl создает список ip-адресов под названием server, который будет находится в /etc/squid3/acl/server. src обозначает, что эта группа состоит из ip-адресов. Этот текстовый файл содержит только одну строку 192.168.8.0-192.168.8.10
acl user src "/etc/squid3/acl/user"
#Список ip-адресов под названием user, который будет находится в /etc/squid3/acl/user с содержанием 192.168.10.0-192.168.14.254
acl nachalnik src "/etc/squid3/acl/nachalnik"
#Список ip-адресов под названием nachalnik, находящийся в /etc/squid3/acl/nachalnik, который содержит 192.168.15.0-192.168.15.254
Прикручиваем ограничение скорости. Делается это при помощи так называемых пулов. С версии 2.6 в squid используется пять классов пулов, в предыдущих три. Для данной настройки я использовал только первый и второй класс пулов.
delay_pools 3
#Общее число пулов

delay_class 1 1
#Задает название и класс пула. Первая единица это название пула, вторая - класс пула
delay_parameters 1 -1/-1
#Опция задает параметры определенного пула. В данном случае 1 это название пула, для которого будет задаваться скорость, а -1/-1 означает, что скорость интернета неограничена
delay_access 1 allow nachalnik
#Параметр разрешает использовать пул 1 списку nachalnik. allow означает разрешение
delay_access 1 deny all
#Запрещает использование пула 1 всем остальным спискам доступа. deny означает запрет

delay_class 2 2
#Задает название и класс пула. Первая двойка это название пула, а вторая - класс пула
delay_parameters 2 -1/-1 32000/512000
#Опция задает параметры второго пула. -1/-1 означает, что для сети в целом, указанной в файле /etc/squid3/acl/user, ограничений на скорость никаких нет, 32000/512000 задает ограничение отдельному компьютеру: первые 512000 байт потока качаются на максимальной скорости, а для объема, превышающего это значение, скорость падает до 32000 байт
delay_access 2 allow user
#Разрешает использование второго пула группе user
delay_access 2 deny all
#Запрещает использование второго пула всем остальным спискам доступа

delay_class 3 1
#Задает третий пул первого класса
delay_parameters 3 32000/32000
#Задает ограничение скорости третьему пулу в 32000 байт
delay_access 3 allow server
#Разрешает использование пула 3 для списка доступа server
delay_access 3 deny all
#Запрещает использование третьего пула всем остальным группам

http_access allow server
http_access allow user
http_access allow nachalnik

#Разрешаем использование интернета группам server, user и nachalnik. allow означает разрешение
Далее следуют строки из стандартной конфигурации. Они необходимы для корректной работы различных методов доступа, протоколов и портов.
acl FTP proto FTP
#Создаем список протокола FTP под названием FTP (первое FTP это название списка, а второе название протокола, входящего в этот список)
acl manager proto cache_object
#Создаем список под названием manager для кэшированных объектов cache_object
acl localhost src 127.0.0.1/255.255.255.255
#Список внутренних интерфейсов под названием localhost
acl SSL_ports port 443 563 5190
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

#Список портов под названием Safe_ports
acl CONNECT method CONNECT
#Список метода CONNECT с таким же названием

always_direct allow FTP
always_direct allow SSL_Ports

#Параметр always_direct определяет какие и чьи запросы будут идти всегда напрямую в интернет по спискам acl. В нашем случае это разрешено (allow) спискам FTP и SSL_Ports

http_access allow manager localhost
#Разрешаем (allow) список manager для списка localhost
http_access deny manager
#Запрещаем (deny) список manager
# Deny requests to unknown ports
http_access deny !Safe_ports
#Запрещаем использование всех портов кроме тех, которые обозначены в Safe_ports. Восклицательный знак означает "кроме"
# Deny CONNECT to other than SSL ports
http_access allow CONNECT !SSL_ports
#Разрешаем использование метода CONNECT кроме портов, обозначенных в SSL_ports
http_access allow localhost
#Разрешаем внутренние интерфейсы
http_access deny all
#Запрещаем использование интернета для всего и вся, не указанных в наших списках
Очень важно помнить, что в squid имеет значение порядок строк. Например это означает, что сначала для списков нужно применять разрешения, а только потом запрещения, или, что сначала нужно создать списки доступа (acl) и только потом применять к ним различные запрещающие или разрешающие правила. Также запрет всегда имеет преимущество над разрешением правила.


Настройка iptables для прозрачного squid


Для того чтобы заработал прозрачный прокси у клиентов в настройках сетевой карты в поле Шлюз должен стоять ip-адрес этого прокси-сервера. Он у меня 192.168.8.3, а на сервере в iptables нужно настроить перенаправление запросов с 80-го порта на тот порт, который слушает squid. В моем случае это порт 8080. Он был указан в конфиге squid в параметре http_port 8080 transparent. Для этого нужно в терминале прописать следующие строки:
iptables -t nat -A PREROUTING -s 192.168.8.3 -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.8.3:8080
iptables -t nat -A POSTROUTING -j MASQUERADE
Чтобы при перезагрузке компьютера правила фаервола iptables применялись сами, нужно добавить их в автозагрузку. Для этого создадим текстовый файл с этими правилами и с правами на исполнение следующего вида и добавим его в автозагрузку:
#! /bin/bash
iptables -F
iptables -t nat -F
iptables -t nat -A PREROUTING -s 192.168.8.3 -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.8.3:8080
iptables -t nat -A POSTROUTING -j MASQUERADE

В итоге мы получаем хорошо настроенный прозрачный прокси-сервер с ограничением скорости для различных групп. О настройке squidGuard будет рассказано позже.

2 комментария:

  1. Здравствуйте, отличная статья, думаю нужно знать некоторые полезные команды при настройке squid:
    после редактирования конфига обязательно используйте вот эту команду: squid -k parse, она проверит файл на наличие синтаксических ошибок. Для того, чтобы squid применил внесенные в конфиг изменения без перезапуска самого "себя")), т.е просто перечитал свой конфиг и применил изменения, делаем так:

    squid -k reconfigure.

    Я кстати написал о том, как я настраивал squid на работы с AD вот ссылка http://www.artcom-ufa.ru/posts/2012/07/28/nastroika-squid

    ОтветитьУдалить
  2. -t nat -A PREROUTING -j ACCEPT
    молодец - садись 2

    ОтветитьУдалить