Squid  (англ. squid — «кальмар») — программный пакет, реализующий функцию кэширующего прокси-сервера для протоколов HTTP, FTP, Gopher и (в случае соответствующих настроек) HTTPS. Разработан как программа с открытым исходным кодом (распространяется в соответствии с GNU GPL). Все запросы выполняет как один неблокируемый процесс ввода-вывода.

Используется в UNIX-подобных системах и в ОС семейства Windows NT. Имеет возможность взаимодействия с доменными службами путём аутентификации через LDAP, что позволяет использовать разграничения доступа к интернет ресурсам пользователей, которые имеют учётные записи на Windows Server, также позволяет организовать «нарезку» интернет трафика для различных пользователей.

Используется вместе с движками Mediawiki на wiki хостингах. Использование кэширующего прокси-сервера для сайтов становится выгодно примерно с 2000 посетителей в сутки.


Статья применима к:

  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)

  • Astra Linux Special Edition РУСБ.10015-16 исп. 1

  • Astra Linux Common Edition 2.12

При написании раздела "Авторизация через Kerberos" использованы материалы, предоставленные Романом Кисловым.

Установка пакета

Пакет squid входит в дистрибутивы Astra Linux, по умолчанию не устанавливается и может быть установлен либо с помощью графического менеджера пакетов, либо из командной строки командой:

sudo apt install squid

После установки сервис запускается автоматически, однако для работы требует настроек.

Первичная настройка службы

Конфигурация службы squid хранится в файле /etc/squid/squid.conf. Файл содержит обширные комментарии по настройке. Из важнейших параметров конфигурации можно отметить параметр http_port, задающий порт для подключения к proxy (по умолчанию — порт 3128). Этот порт может использоваться как для подключений HTTP, так и для подключений HTTPS.
Пример параметров, задаваемых по умолчанию:

acl localnet src 0.0.0.1-0.255.255.255	# RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8		# RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10		# RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16 	# RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12		# RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16		# RFC 1918 local private network (LAN)
acl localnet src fc00::/7       	# RFC 4193 local private network range
acl localnet src fe80::/10      	# RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
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
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
include /etc/squid/conf.d/*.conf
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern .		0	20%	4320

В приведенном примере доступ через proxy разрешен только локального компьютера: http_access allow localhost. Для разрешения доступа компьютерам, находящимся в локальной сети, нужно заменить  эту строку на строку http_access allow localnet.

После изменения параметров для вступления изменений в силу требуется перезапустить сервис. Это можно сделать стандартными командами:

sudo systemctl restart squid

Перезапуск сервиса занимает около 35 секунд.

ACL

Для управления доступом squid поддерживает работу со списками управления доступом (Access Control Lists, ACL). Примеры ACL:

# определить список портов
acl Safe_ports port 80 21 443 563 70 210 1025-65535 280 488 591 777

Пример применения ACL:

# запретить работу со всеми портами, кроме безопасных

http_access deny !Safe_ports

Пример блокировки определённых сайтов с помощью ACL:

acl blocksite1 dstdomain telegram.com
http_access deny blocksite1

Список ACL можно разместить во внешнем файле, например в файле /etc/squid/blockwebsites.lst:

acl blocksitelist dstdomain "/etc/squid/blockwebsites.lst"
http_access deny blocksitelist

При этом содержимое файла /etc/squid/blockwebsites.lst может быть:

google.com
telegram.com

Аналогично, можно блокировать адреса, содержащие ключевые слова:

acl blockkeyword1 url_regex telegram
acl blockkeyword2 url_regex google
http_access deny blockkeyword1
http_access deny blockkeyword2

Авторизация пользователей

Простая авторизация

В простейшем случае хранение паролей осуществляется в текстовом файле, содержащем учётные данные, закодированные в base64. Для обработки этого файла используется дополнительная программа /usr/lib/squid3/basic_ncsa_auth, проверяющая соответствие переданной комбинации "логин:пароль"  хранящимся в файле данными.

При этом на авторизованных пользователей распространяются любые правила контроля доступа, записанные в acl главного конфигурационного файла Squid.
Настройка конфигурации (файл паролей  /etc/squid/users ):


auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid/users
acl lan proxy_auth REQUIRED # создание списка доступа, в который включены все прошедшие аутентификацию пользователи
http_access allow lan # теперь пользователям списка lan разрешен доступ к интернету

Файл паролей для реализации можно создать с  помощью утилиты htpasswd, которая входит в состав пакета apache2-utils. Синтаксис команды для htpasswd следующий:

htpasswd [-c] /создаваемый/файл/паролей имя_пользователя
Параметр используется для создания нового файла, изменение существующего файла производится без этого параметра. Для созданного файла желательно установить права на чтение только пользователю и группе, от имени которой работает Squid:
chmod 440 /etc/squid/users
chown proxy:proxy /etc/squid/users


Авторизация через Kerberos

В данной главе рассматривается настройка авторизации пользователей через контроллер домена Контроллер ЕПП FreeIPA в Astra Linux. Предполагается, что имеется настроенный сервер (контроллер домена) FreeIPA с полным доменным именем (FQDN) ipa.ipadomain.ru, а сервер squid расположен на отдельной машине с полным доменным именем (FQDN) squid.ipadomain.ru, которая введена в домен.

  1. Зарегистрировать службу на контроллере домена. Имя службв состоит из ключевого слова HTTP, символа косой черты и полного доменного имени (FQDN). Например:

    HTTP/squid.ipadomain.ru

    Зарегистрировать сервис можно через WEB-интерфейс FreeIPA:

    "Идентификация" - "Службы" - "+ Добавить"

    или из командной строки, выполнив на контроллере домена команду

    sudo ipa service-add HTTP/squid.ipadomain.ru

  2. На сервере squid получить ключи службы, для чего на сервере squid выполнить команду

    sudo ipa-getkeytab -s ipa.ipadomain.ru -p HTTP/squid.ipadomain.ru -k /etc/squid/krb5.keytab

    где
    -s - имя сервера, от которого нужно получить ключи (ipa.ipadomain.ru);
    -p - имя службы, для которой нужно получить ключи (HTTP/squid.ipadomain.ru);
    -k - имя файла, в котором нужно сохранить полученные ключи (/etc/squid/krb5.keytab).

  3. Установить для созданного на предыдущем шаге файла с ключами права доступа:

    chown proxy:proxy /etc/squid/krb5.keytab
    chmod 640 /etc/squid/krb5.keytab

  4. Отредактировать файл конфигурации службы squid /etc/squid/squid.conf, закомментировав строки "#http_access allow localnet" и "#http_access allow localhost" и добавив после них строки для включения авторизации через Kerberos:

    ...
    #http_access allow localnet
    #http_access allow localhost
    auth_param negotiate program /usr/lib/squid/negotiate_kerberos_auth -k /etc/squid/krb5.keytab -d -s HTTP/squid.ipadomain.ru
    auth_param negotiate children 10
    auth_param negotiate keep_alive on
    acl auth proxy_auth REQUIRED
    http_access deny !auth
    http_access allow auth
    ...

  5. Обновить конфигурацию юнитов запуска системных служб командой

    sudo systemctl daemon-reload

  6. Перезапустить службу squid командой:

    sudo systemctl restart squid

Настройка клиентов

Если используется аутентификация Kerberos, то на клиентских компьютерах при указании настроек прокси в браузере необходимо использовать не IP-адрес прокси-сервера, а его полное доменное имя (FQDN),  в настоящем примере это squid.ipadomain.ru.

Файлы журналов и отладка

Журналы squid располагаются в каталоге /var/log/squid:

ФайлОписание

cache.log

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

access.log

Содержит подробную информацию о подключениях, пригодную для автоматического анализа.

Для мониторинга событий доступа через proxy можно использовать команду:
sudo tail -f /var/log/squid/access.log
Для проверки доступа через proxy можно использовать текстовый браузер links2, поддерживающий принудительное использование proxy. 
Для использования links2 необходимо установить одноименный пакет:
sudo apt install links2

Примеры вызова браузера с принудительным использованием proxy:
  • По протоколу https:
    links2 -only-proxies 1 -https-proxy <IP_адрес_proxy> https://ya.ru
  • По протоколу http:
    links2 -only-proxies 1 -http-proxy <IP_адрес_proxy> http://testca2012.cryptopro.ru/ui/
    Для примера использован web-сайт http://testca2012.cryptopro.ru/ui/, работающий по протоколу http.