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.
Не совсем понятно, зачем сейчас нужен прокси-сервер. Раньше был нужен для экономии трафика. Сейчас — неактуально. Единственное между клиентом и маршрутизатором нужен некий сервер, чтобы туда навернуть антивирус с разным набором (как минимум, это офисный контроль, где указаны зловредные сайты и чтобы сайты можно было добавлять самому). Как я понимаю, это может быть обычный сервер, без squid. Имхо, естественно.
Чтобы контролировать кто и куда ходил в инете. В маленькой компании может и не нужна эта информация, но в компании побольше уже нужны некоторые ограничения.
А есть нормальный GUI к Squid?
Был SAMS, но он не развивается и не поддерживается.
Нет, про другие системы не слышал
Здраствуйте! У меня через Squid не грузятся картинки в Instagram, инстаграм используют какие-то токены, а Squid их вроде как ломает… На главной странице картинки видны, но вот как только авторизовался на instagram (вошел в свой профиль), так ни одной картинки не видно! В squid.conf сделаны минимальные настройки. Может кто подскажет как быть, кто сталкивался?
Посмотрите в access.log логах squid информацию о подключениях к instagram. Какие там ошибки подключений.
Ну и вот еще в нашел, для ipv6 vps вполне возможно.
Squid proxy server is not working on youtube, instagram, facebook, google, twitter, etc
Found the solution: Check your squid config for dns_v4_first off and change it to dns_v4_first on. Restart squid and it should work now.
количество каталогов первого уровня для кэша-а что это значит?))
вы пробывали также настраивать запрет по ключевым слова?как это работает в жизни?
There are two arguments to cache_dir named as L1 and L2. Squid stores the cacheable objects in a hierarchical fashion in directories named so that it’ll be faster to lookup an object in the cache. The hierarchy is of two-levels, where L1 determines the number of directories at the first level and L2 determines the number of directories in each of the directories at the first level. We should set L1 and L2 high enough so that directories at the second level don’t have a huge number of files.
cache_dir aufs /squid_cache/ 51200 32 512
We have a cache directory /squid_cache/ with 50 GB of free space with the values of L1 and L2 as 32 and 512 respectively. So, if we assume the average size of a cached object to be 16 KB, there will be 51200×1024÷(32x512x16) = 200 cached objects in each of the directories at the second level, which is quite good.
На работе со сквидом такая проблема: при перестановке сервера (точнее — установке нового шлюза для доступа в инет) новый админ как-то так настроил squid, что на определенном этапе совершается перешифровывание трафика. Бухгалтерия работает в kontur.diadoc, там все шифрованное ключами/сертификатами с помощью CryptoPro. У шлюза доступа в инет — свой сертификат, которым он подписывает отправляемый трафик. При работе бухгалтерии при обмене документами с налоговой, кажется, на определенном этапе трафик отказывается ходить: войти в личный кабинет — дает, перейти в нужный раздел — дает. А вот скачать файл документов — не дает, не понимает. С техподдержкой Контура долго разбирались, на их стороне видно несоответствие сертификатов. То есть до определенного момента идет правильно подписанный трафик, а потом — «передподписанный» сертификатом нашего сервера. На этом в целом сошлись и техподдержка и наш админ. Но что делать, как перенастроить squid, чтобы этого не было — непонятно. И в squid-е ли в конечном итоге дело? Хотя весь https идет через него. Просто через старый сервер все работает, через новый — нет. Так уж вышло, что пока в строю остались оба сервера, есть возможность сравнивать результаты доступа. Правда, доступа к конфигу у меня нет.
Начините с логов squid. что он пишет, когда пользователь пытается скачать такой файл?
Подскажите, пожалуйста, как сделать такой Интернет-шлюз:
1. Должен работать на базе отечественных Linux: Alt, Astra или Redos.
2. Интернет-шлюз желателен в реестре отечественного ПО. Нет таких?
3. Возможность ставить свои черные списки для всех или избранных компьютеров локальной сети.
4. Возможность прикрутить к этому шлюзу список нежелательных сайтов от drweb или Касперского. Это требование сразу ограничивает выбор вариантов шлюза? У касперского или drweb-а под какие шлюзы есть такое прикручивание своих списков? Впрочем, на крайний случай, можно переложить эти списки со шлюза на компьютеры локальной сети (например, на агентов drweb или плагины для браузеров)
5. Прокси не обязательно.
6. NAT необязательно. NAT будет делать маршрутизатор Cisco (пока, по крайней мере).
7. Авторизация желательна, но необязательна.
Посмотрите в сторону Ideco, сертифицирован по требованиям к межсетевым экранам типа А, Б
4-го класса и системам обнаружения вторжений. В реестре он есть. Даже почтовый сервер вроде вернули в сборку.
Спасибо. Есть есть некий usergate, тоже можно попробовать.
Проверяю конфиг squid с помощью:
squid -k parse
получаю ошибку
2023/01/07 09:08:52| ACL not found: authenticated
2023/01/07 09:08:52| Not currently OK to rewrite swap log.
2023/01/07 09:08:52| FATAL: Bungled /etc/squid/squid.conf line 11: http_access allow authenticated
В вашем случае список доступа authenticated не создан, поэтому из конфига нужно убрать строку:
http_access allow authenticated
+1 замечание
В Debian и Ubuntu для запуска squid исползуется пользователь proxy, поэтому при создании каталога вместо:
sudo touch /etc/squid/passwd && sudo chown squid /etc/squid/passwd
нужно использовать:
touch /etc/squid/passwd && chown proxy:proxy /var/spool/squid/
Всем привет! Имеем старенький squid Version 3.5.8 на centOS, который благополучно работал до ноября месяца, сейчас начал глючить. На 4 ядерном процессоре забито только одно ядро на 100%, остальные норм. Просмотр лога командой tail -f /var/log/squid/cache.log вываливает одну и ту же ошибку
«2023/02/07 09:19:50 kid1| Error negotiating SSL connection on FD 435: (104) Connection reset by peer»
Просьба подсказать, если кто-то сталкивался с подобным.
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic casesensitive off
acl auth proxy_auth REQUIRED
acl group1 proxy_auth «/etc/squid/group1»
acl group2 proxy_auth «/etc/squid/group2»
acl group3 proxy_auth «/etc/squid/group3»
acl white-client src 10.0.10.35
acl blacklist dstdomain vk.com mail.yandex.ru worldskills.org
acl monitoring dstdomain srv-hq.company.prof
http_access allow group1
http_access allow group2 monitoring
http_access deny blacklist
http_access allow white-client
http_access deny group2
http_access deny group3
http_access deny !auth
http_access deny all
Добрый день.
У меня Squid блокирует некоторые программы и сайты.
Каком файле могу их добавить в исключение?
Установлен на Ubuntu 18 без GUI.
Не понял вопрос. Сквид блокирует программы на клиенте? как это выглядит?
В настройках сквида есть ограничения на сайты/пользователей?