Установка и настройка прокси сервера Squid в Linux

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 в linux

Если вы хотите использовать аутентификацию пользователей в 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

systemctl status squid - running

Чтобы ввести все опции, с которыми собран 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

Затем добавьте следующие строки в начало конфигурационного файла 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)

squid.conf конфигурационный файл squid

Можно реализовать аутентификацию в AD с помощью basic auth:

auth_param basic program /usr/lib64/squid/basic_ldap_auth -R -b "dc=winitpro,dc=ru" -D "squid_srv@winitpro.ru " -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 с помощью curl

Для анализа логов 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.


Предыдущая статья Следующая статья


Комментариев: 8 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)