Squid это, наверное, самый известный и популярный open source кэширующий прокси сервер. Прокси сервер Squid поддерживает большое количество кэширующих протоколов (ICP, HTCP, CARP, WCCP), позволяет проксировать трафик протоколов HTTP, HTTPS, FTP и т.д. Squid легко масштабируется, его можно использовать для фильтрации контента и управления скоростью доступа к сайтам для разных категорий пользователей, он поддерживает аутентификацию пользователей (в том числе пользователей Active Directory через LDAP). В этой статье мы рассмотрим типовую установку прокси сервера Squid на Linux.
Установка прокси сервера Squid в Linux
Установите пакет Squid на хост с помощью вашего пакетного менеджера. В зависимости от версии Linux нужно выполните одну из следующих команд:
- Oracle, Rocky, CentOS или Red Hat Enterprise Linux:
dnf install -y squid
- SUSE Linux Enterprise Server:
zypper install squid
- Ubuntu или Debian:
apt-get install squid
Если вы хотите использовать аутентификацию пользователей в Squid, нужно дополнительно установить пакет:
- В RHEL/CentOS/Fedora:
dnf -y install httpd-tools
- В Debian/Ubuntu:
sudo apt install apache2-utils
Добавьте сервис Squid в автозагрузку Linux через systemd, запустите службу и проверьте статус:
systemctl enable squid
systemctl start squid
systemctl status squid
Чтобы ввести все опции, с которыми собран squid:
squid –v
Squid Cache: Version 4.15 Service Name: squid This binary uses OpenSSL 1.1.1k FIPS 25 Mar 2021. For legal restrictions on distribution see https://www.openssl.org/source/license.html configure options: '--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu' '--program-prefix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib64' '--libexecdir=/usr/libexec' '--localstatedir=/var' '--sharedstatedir=/var/lib' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--libexecdir=/usr/lib64/squid' '--datadir=/usr/share/squid' '--sysconfdir=/etc/squid' '--with-logdir=/var/log/squid' '--with-pidfile=/var/run/squid.pid' '--disable-dependency-tracking' '--enable-eui' '--enable-follow-x-forwarded-for' '--enable-auth' '--enable-auth-basic=DB,fake,getpwnam,LDAP,NCSA,PAM,POP3,RADIUS,SASL,SMB,SMB_LM' '--enable-auth-ntlm=SMB_LM,fake' '--enable-auth-digest=file,LDAP' '--enable-auth-negotiate=kerberos' '--enable-external-acl-helpers=LDAP_group,time_quota,session,unix_group,wbinfo_group,kerberos_ldap_group' '--enable-storeid-rewrite-helpers=file' '--enable-cache-digests' '--enable-cachemgr-hostname=localhost' '--enable-delay-pools' '--enable-epoll' '--enable-icap-client' '--enable-ident-lookups' '--enable-linux-netfilter' '--enable-removal-policies=heap,lru' '--enable-snmp' '--enable-ssl' '--enable-ssl-crtd' '--enable-storeio=aufs,diskd,ufs,rock' '--enable-diskio' '--enable-wccpv2' '--enable-esi' '--enable-ecap' '--with-aio' '--with-default-user=squid' '--with-dl' '--with-openssl' '--with-pthreads' '--disable-arch-native' '--disable-security-cert-validators' '--with-swapdir=/var/spool/squid' 'build_alias=x86_64-redhat-linux-gnu' 'host_alias=x86_64-redhat-linux-gnu' 'CFLAGS=-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' 'LDFLAGS=-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld' 'CXXFLAGS=-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' 'PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig'
Настройка кэширующего прокси сервера Squid
По умолчанию squid использует конфигурационный файл /etc/squid/squid.conf.
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.original
sudo chmod a-w /etc/squid/squid.conf.original
В дальнейшем мы сможете вернуться к оригинальному конфигурационному файлу или использовать его в качестве справочника директив.
Чтобы отредактировать конфигурационный файл squid, выполните:
sudo mcedit /etc/squid/squid.conf
В начале конфигурационного файла Squid задается список контроля доступа, определяющий IP адреса (подсети) клиентов, с которых разрешено подключаться к прокси-серверу.
Например, вы хотите разрешить доступ только из вашей локальной сети. Добавьте директиву:
acl localnet src 192.168.10.0/24
Остальные строки acl localnet можно закомментировать.
Чуть ниже в конфигурации указан директива, разрешающая доступ для этих сетей:
http_access allow localnet
По умолчанию Squid принимает подключения пользователей на порту 3128. Вы можете изменить этот порт в директиве http_port. Я повешу Squid на порт 4555:
http_port 4555
Если вы хотите использовать прокси сервер для кэширования, нужно настроить директорию для кэша:
cache_dir ufs /var/spool/squid 5120 32 256
- 5120 – размер кэша в МБ
- 32 – количество каталогов первого уровня для кэша, 256 – каталоги второго уровня
Чтобы создать на диске структуру папок под кэш squid, выполните команду:
squid -z
Для аутентификации пользователей на squid можно использовать простейшую basic аутентификацию. Сначала создайте файл для хранения пользователей и паролей:
sudo touch /etc/squid/passwd && sudo chown squid /etc/squid/passwd
Чтобы добавить пользователя в этот файл, выполните команду:
sudo htpasswd -c /etc/squid/passwd username1
При добавлении следующих пользователей указывать параметр -c не нужно.
Затем добавьте следующие строки в начало конфигурационного файла squid.conf:
#использовать basic auth и указать путь к файлу с паролями auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd # количество одновременных подключений auth_param basic children 5 auth_param basic realm Squid Basic Authentication # длительность сессии без повторного ввода логина и пароля auth_param basic credentialsttl 8 hours auth_param basic casesensitive off acl auth_users proxy_auth REQUIRED http_access allow auth_users
В разных дистрибутивах Linux путь к файлу basic_ncsa_auth может отличаться:
- /usr/lib64/squid/basic_ncsa_auth (Oracle Linux, RHEL, CentOS)
- /usr/lib/squid/basic_ncsa_auth (Debian, Ubuntu, Kali Linux)
auth_param basic program /usr/lib64/squid/basic_ldap_auth -R -b "dc=winitpro,dc=ru" -D "[email protected] " -w "<user password>" -f "sAMAccountName=%s" <AD domain controller IP address>
Недостаток Basic аутентификации в тои, что пароль передается в виде текста, зашифрованного с помощью Base64 (легко расшифровывается, см. пример в статье об отправке писем через telnet с аутентификацией). Поэтому для интеграции с Active Directory лучше использовать Kerberos аутентификацию в Squid. Если AD нет, можно настроить HTTP Digest аутентификацию в Squid. Но это уже за рамками этой статьи.
В конце конфигурационного файла с помощью директив http_access задаются разрешающие и запрещающие правила. Например, чтобы разрешить доступ только аутентифицированным пользователям:
http_access allow localhost http_access allow authenticated http_access deny all
В Squid можно заблокировать определенный сайты. Создайте файл со списком запрещенных сайтов:
sudo vi /etc/squid/blocked_sites
Добавьте в файл список сайтов, доступ к которым нужно запретить:
facebook.com twitter.com instagram.com
И добавьте такие строки в конфигурационный файл squid:
acl blocked_sites dstdomain "/etc/squid/blocked_sites" http_access deny blocked_sites
После внесения изменений в конфигурационный файл squid нужно проверить его на синтаксические ошибки:
sudo squid -k parse
Если ошибок нет, перечитайте конфигурацию squid для применения новых настроек (не нужно перезапускать демона):
sudo squid -k reconfigure
Разрешите в фаейрволе подключение к порту прокси сервера (в нашем примере это TCP 4555). Если у вас используется firewalld, добавьте разрешающее правило так:
firewall-cmd --zone=public --add-port=4555/tcp
firewall-cmd --reload
Если ваш Linux сервер расположен у внешнего провайдера (AWS, Azure, Oracle Cloud, и т.д.), не забудьте добавить разрешающее правило для порта 4555 в соответствующую Security Group.
Проверьте, что Squid слушает порт, указанный в директиве http_port:
netstat -tulnp
С помощью curl можно проверить доступность прокси сервера squid:
curl -x http://xx.xx.xx.xx:4555 -L http://google.com
Если появляется ошибка
authentication required/ Access Denied
, значит нужно передать имя пользователя и пароль для подключения к squid:
curl -x http://xx.xx.xx.xx:4555 --proxy-user proxyuser1:TGFTM0xDVjNm -I http://google.com
Для анализа логов squid в реальном времени используйте команду:
sudo tail -f /var/log/squid/access.log
Если браузер выводит ошибку
The proxy server is refusing connections
, а в логе access.log есть строка
TCP_DENIED/403 4041 CONNECT
, проверьте ваши ACL.
При успешной аутентификации пользователя в логе squid появится сообщение
TCP_TUNNEL/200 39 CONNECT winitpro.ru:443 proxyusername HIER_DIRECT/xx.xx.xx.xx
или
TCP_MISS/200
.
Не забудьте задать настройки прокси сервера в браузерах на компьютерах пользователей. Задайте IP адрес (имя) хоста squid и порт в настройках браузера. На компьютеры Windows можно распространить настройки прокси через GPO.