Мы поддерживаем версии SQUID старше 3.0. Для активации ICAP в squid необходимо внести в конфиг следующие строки:
squid.conf
icap_enable on
icap_send_client_ip on
icap_preview_enable on
icap_preview_size 4096
icap_service_failure_limit -1
icap_service service_req reqmod_precache 0 icap://INTERFACE_IP:1344/reqmod
adaptation_access service_req allow all
где:
INTERFACE_IP – ip-адрес ICAP-сервера Cyber Guard. Эта настройка позволит контролировать нашему ICAP трафик, проходящий через squid (в том числе ssl, если его перехват настроен);
reqmod - используется для пересылки на ICAP исходящего трафика;
respmod - используется для пересылки на ICAP входящего трафика (переработанной версией ICAP в CyberGuard не поддерживается, т.к. смысла нет);
Режимы precache и postcache отличаются порядком получения данных. Postcache (~в версии 3.4 не реализован!~) - ICAP получает данные уже помещенные в кэш SQUID, precache - данные запрашиваются у оригинального сервера. Немного инфы по этому поводу;
reqmod_precache 0 - число означает способ обработки ошибки. 0 - если ICAP не сможет обработать трафик, то соединение будет сброшено, 1 - трафик будет проигнорирован ICAP и запрос выполнится (сокращенное использование команды bypass);
icap_service_failure_limit нужна на загруженных серверах squid. Опция отключает контроль колчества ошибок и временное отключение icap;
Прокси сервер Squid может работать в 2 режимах: классический прокси и прозрачный. Классический способ требует настройки на софте (браузерах и др.) IP и порта прокси, в тоже время прозрачный прокси не требует дополнительной настройки на клиентах, весь трафик направляется на шлюз в чистом виде. Эти режимы настраиваются по разному в конфиге и фаерволе сервера.
Настройка режима классического прокси сервера с работой через порт 3128:
Дефолтный конфиг уже рассчитан на этот режим и все что нужно, это заполнить списки доступа acl. Привожу рабочий конфиг с небольшими комментариями.
squid.conf
#
# Recommended minimum configuration:
#
# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
visible_hostname lnx-sqd.contoso.local
acl localnet src 192.168.70.0/24
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
acl CONNECT method CONNECT
#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports
# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports
# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager
# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on “localhost” is a local user
#http_access deny to_localhost
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost
# And finally deny all other access to this proxy
http_access deny all
http_port 3128
# Uncomment and adjust the following to add a disk cache directory.
cache_dir ufs /var/spool/squid 100 16 256
# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid
icap_enable on
icap_preview_enable on
icap_preview_size 4096
icap_service_failure_limit -1
icap_send_client_ip on
icap_service service_req reqmod_precache 0 icap://192.168.70.2:1344/req_mod
adaptation_access service_req allow all
#
# Add any of your own refresh_pattern entries above these.
#
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
Это рабочий конфиг squid на порт 3128 с активированным ICAP. Жирным выделеные 2 строчки, которые необходимо скорректировать под себя.
acl localnet src 192.168.70.0/24 - этот acl содержит диапазон сети контролируемой локальной сети и обозначает его как localnet. Далее в настройках списков контроля доступа можно использовать это обозначение.
http_port 3128 - указывает серверу порт и интерфейс для прослушки (если интерфейс не указан, то слушает все доступные).
icap_preview_enable on - включает режим предпросмотра (будет браться только первые N байт из post запроса для анализа содержимого и принятия решения о действии согласно acl)
icap_preview_size 4096 - размер загружаемого блока для предпросмотра
Этого конфига достаточно для функционирования ICAP в классическом режиме и контроле НЕ шифрованного трафика через ICAP системой Cyber Guard.
Настройка прозрачного режима работы прокси сервера через порт 3128.
В этом режиме трафик от клиентов идет на 80 и 443 порт, но squid слушает только свой 3128 порт. Поэтому необходимо сделать перенаправление трафика с портов 80/443 на порт 3128. Привожу необходимые правила для iptables:
iptables
*filter
-A INPUT -p tcp –dport 80 -j ACCEPT
-A INPUT -p tcp –dport 3128 -j ACCEPT
*nat
-A PREROUTING -s source_ip -p tcp –dport 80 -j REDIRECT –to-port 3128
Первые 2 правила разрешают входящий трафик на сервер для нужных портов, 4 правило редиректит нужный трафик на порт 3128.
source_ip - адрес клиента или сети (192.168.1.0/24), использующий прокси;
А так же нужна 1 строчка в конфиге, активирующая прозрачный режим:
http_port 3128 intercept
В версиях squid до 3.1 вместо intercept будет transparent. На версии 3.4 работает одинаково intercept/transparent.
Настройка перехвата SSL трафика, проходящего через Squid.
Необходимо заметить, что никакой дополнительной настройки и поддержки ICAP для перехвата шифрованного трафика не нужно, все делается самим squid, и, если конфиг верный, трафик будет расшифровываться и подаваться в раскрытом виде на ICAP сервер CG.
Необходимые строки конфига для активации режима перехвата SSL:
squid.conf
http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl/squid.pem key=/etc/squid/ssl/squid.key
sslproxy_flags DONT_VERIFY_PEER
sslproxy_cert_error allow all
always_direct allow all
ssl_bump client-first all
ssl_bump server-first all
sslcrtd_program /usr/lib64/squid/ssl_crtd -s /usr/share/squid/ssl_db -M 4MB
sslcrtd_children 5
Первая строка содержит путь к корневому сертификату УЦ и его закрытому ключу, его необходимо генерировать самому (самоподписанный) или указывать расположение своего собственного. Наверняка еще важны права на на них, потому лучше сразу ставить 400. Важное замечание: этот сертификат УЦ (но не ключ!) должен быть добавлен в доверенные центры сертификации на клиентских компьютерах - это позволит избежать уведомления пользователя о не доверенном сертификате и сайты будут работать корректно (без этого многие сайты рассыпаются).
Строка
sslcrtd_program /usr/lib64/squid/ssl_crtd -s /usr/share/squid/ssl_db -M 4MB
указывает расположение утилиты по генерации сертов, в разных дистрибутивах будет разный путь, потому лучше искать ее поиском и указывать верный путь. Во второй части указывается папка для хранения сгенерированных сертификатов при перехвате. Ее можно создать в любом месте (если не создалась при установке), главное обеспечить ей необходимые права для доступа squid (squid:squid) , если демон работает от юзера nobody (что рекомедуется), то права nobody:xxx
Последовательность действий для генерирования сертификата и базы сертификатов:
- генерация самоподписанного сертификата и ключа УЦ:
# mkdir /etc/squid/ssl && cd /etc/squid/ssl && chown -R squid:squid /etc/squid/ssl
# openssl genrsa -out /etc/squid/ssl/squid.key
# openssl req -new -key /etc/squid/ssl/squid.key -out /etc/squid/ssl/squid.csr
# openssl x509 -req -days 3650 -in /etc/squid/ssl/squid.csr -signkey /etc/squid/ssl/squid.key -out /etc/squid/ssl/squid.pem
- создаем папку и базу для сертификатов
# /usr/lib64/squid/ssl_crtd -c -s /usr/share/squid/ssl_db && chown -R squid:squid /usr/share/squid/ssl_db
Указанные действия действительны для CentOS, в других дистрибутивах некоторые директории могут отсутствовать и придется действовать по обстоятельствам.
Со стороны Squid это все необходимое, теперь нужно настроить пере направление трафика с 443 на порт прокси:
iptables
*filter
-A INPUT -p tcp –dport 80 -j ACCEPT
-A INPUT -p tcp –dport 443 -j ACCEPT
-A INPUT -p tcp –dport 3128 -j ACCEPT
-A INPUT -p tcp –dport 3129 -j ACCEPT
*nat
-A PREROUTING -s 192.168.70.13 -p tcp –dport 80 -j REDIRECT –to-port 3128
-A PREROUTING -s 192.168.70.13 -p tcp –dport 443 -j REDIRECT –to-port 3128
Как бонус некоторые оптимизационные параметры для squid (по сравнению с дефолтным конфигом работа значительно ускорилась):
squid.conf Развернуть исходный код
cache_replacement_policy heap LFUDA
cache_swap_low 90
cache_swap_high 95
maximum_object_size_in_memory 50 KB
cache_mem 100 MB
logfile_rotate 10
memory_pools off
maximum_object_size 50 MB
quick_abort_min 0 KB
quick_abort_max 0 KB
log_icp_queries off
client_db off
buffered_logs on
half_closed_clients off
Данная настройка позволит перехватывать системе Cyber Guard весь HTTP/HTTPS трафик прокси сервера через свой ICAP.
Прокси сервер Squid не является SOCKS прокси и нет смысла заворачивать на него отличный от http трафик.