| | |
|
Etc.: Proxy сервер под Linux. Squid
Содержание
Настройка прав доступа в squid.conf: - acl all src 0.0.0.0/0.0.0.0
- acl localhost src 127.0.0.1/255.255.255.255
- acl manager proto cache_object
- acl managerhost src 1.2.3.4/255.255.255.255
- http_access allow manager localhost
- http_access allow manager managerhost
- http_access deny manager
- http_access allow all
- cachemgr_passwd пароль команда
Управление squid с помощью программы client: /usr/local/squid/bin/client cache_object://localhost/команда Управление squid с помощью cachemgr.cgi (лично я не пробовал и другим не советую): - cachemgr.cgi в /usr/local/squid/cgi-bin
- конфигурация Apache
- ScriptAlias /Squid/cgi-bin/ /usr/local/squid/cgi-bin/
- ограничение доступа по адресу хоста
<Location /Squid/cgi-bin/cachemgr.cgi>
order deny,allow
deny from all
allow 1.2.3.4
</Location>
- ограничение доступа по паролю
<Location /Squid/cgi-bin/cachemgr.cgi>
AuthUserFile /path/to/password/file
AuthGroupFile /dev/null
AuthName User/Password Required
AuthType Basic
require user cachemanager
</Location>
Требования к памяти: - 72 байта на каждый объект
- Disk buffers for reading and writing
- Network I/O buffers
- IP Cache contents
- FQDN Cache contents
- Netdb ICMP measurement database
- Per-request state information, including full request and reply headers
- Miscellaneous statistics collection
- "Hot objects" which are kept entirely in memory
Причем большая часть используемой памяти не должна свопироваться (иначе работает безумно медленно). Например, при кеше в 7 ГБ (800 тысяч объектов) требуется 128 МБ оперативной памяти. При восстановлении оглавления кеша (после аварийной перезагрузки) требуется удвоенный объем. Как уменьшить потребности: - попробовать GNU malloc или dlmalloc (./configure --enable-dlmalloc)
- уменьшить cache_mem (пока не появятся сообщения в cache.log)
- memory_pools off
- уменьшить размер кеша (cache_swap) - единственный существенный способ
Squid поддерживает размер кеша между low и high, регулярно запуская процедуру удаления объектов (чем ближе мы к high, тем агрессивнее очистка). Вместо удаления можно использовать очистку файлов (truncate) пока хватает inode. Удаление производится асинхронно внешней программой unlinkd. Если объект тянется в данный момент, то он не удаляется. Если объект "отрицательно кеширован", то он удаляется. Если объект частный, то он удаляется. Алгоритмы замешения: - LRU. Если время с последнего использования объекта больше некой границы (threshold), то объект удаляется. Граница динамически вычисляется на основе заполненности кеша и low/high маркеров (начальное/максимальное значение задается в squid.conf). При стабилизации размера кеша граница представляет время полного заполнения (замещения) кеша в текущих условиях (типичное значение от 1 до 10 дней; если меньше 3 дней, то рекомендуется увеличить кеш).
- GDSF. Стремится удержать маленькие полулярные объекты (растет hitrate, падает byterate).
- LFUDA. hitrate падает, byterate - растет.
Сравнение алгоритмов проводится в Кешируемость объектов в зависимости от кода возврата HTTP:
Caching Code
Successful 2xx
c 200 OK
201 Created
202 Accepted
c 203 Non-Authoriative Information *
E 204 No Content
205 Reset Content *
? 206 Partial Content *
Redirection 3xx
C 300 Multiple Choices
C 301 Moved Permanently
t 302 Moved Temporarily
- 303 See Other *
- 304 Not Modified
E 305 Use Proxy (proxy redirect) *
Client Error 4xx
E 400 Bad Request
- 401 Unauthorized
402 Payment Required *
E 403 Forbidden
E 404 Not Found
E 405 Method Not Allowed *
406 Not Acceptable *
- 407 Proxy Authentication Required *
408 Request Timeout *
409 Confict *
C 410 Gone *
411 Length Required *
412 Precondition Failed *
413 Request Entity To Large *
E 414 Request-URI Too Long *
415 Unsupported Media Type
Server Error 5xx
E 500 Internal Server Error
E 501 Not Implemented
E 502 Bad Gateway
E 503 Service Unavailable
E 504 Gateway Timeout *
505 HTTP Version Not Supported *
Notes:
* HTTP 1.1
c Cached unless a query response without expiry information
C Cached
E Negatively cached if no expiry headers
t Cached only if expiry information
- Not cached
Unless other said, the response code is not cached.
Кешируемость в зависимости от заголовков: Responses with Cache-Control: Private are NOT cachable. Responses with Cache-Control: No-Cache are NOT cachable. Responses with Cache-Control: No-Store are NOT cachable. Responses for requests with an Authorization header are cachable ONLY if the reponse includes Cache-Control: Public. Responses with Vary headers are NOT cachable because Squid does not yet support Vary features.
Пул - набор групп ведер определенного класса. Группа ведер - часть пула, привязанная к хосту, сети или одно на всех. Ведро - ограниченная емкость, в которую с ограниченной скоростью вливается внешний трафик, и из которой он раздается клиенту. Если ведро заполняется полностью, то запросы к серверу останавливаются, если пустеет, то увеличиваются (а клиент ждет). Определены 3 класса пулов: одно ведро на всех из этого класса одно общее ведро и 255 отдельных для каждого хоста из C-сетки 255 ведер для каждой сетки (класс B) и отдельное для каждого хоста
Пример конфигурации:
delay_pools 3 # 3 delay pools
delay_class 1 1 # pool 1 is class 1
delay_class 2 1 # pool 2 is class 1
delay_class 3 3 # pool 3 is class 3
delay_access 1 allow staff
delay_access 1 deny all
delay_access 2 allow students
delay_access 2 deny all
delay_access 3 allow college
delay_access 3 deny all
delay_parameters 1 640000/640000
delay_parameters 2 64000/64000
delay_parameters 3 64000/64000 32000/64000 6400/32000
# total_rest/total_max net_rest/net_max ind_rest/ind_max
где
total - на всех
net - на подсеть
ind - на отдельный адрес
rest - скорость заполнения (байт/сек)
max - объем ведра (байт)
Ограничение для модемных клиентов, чтобы squid не подкачивал файл пока клиент еще не считал предыдущую порцию.
acl clients src адреса
delay_pools 1
delay_class 1 2
delay_access 1 allow clients
delay_access 1 deny all
delay_parameters 1 -1/-1 8000/4000
Прижать любителей MP3:
acl multimedia urlpath_regex -i \.mp3$ \.mpeg$ \.avi$ \.mov$
delay_pools 1
delay_class 1 1
delay_access 1 allow multimedia
delay_access 1 deny all
delay_parameters 1 16000/64000
quick abort д.б. установлен маленьким чтобы объект не качался на полной скорости после отпадения клиента (нет клиента для запроса - нет ограничений). В процессе участвуют маршрутизатор, Linux и Squid: http-пакеты, бегущие мимо, должны отлавливаться маршрутизатором и переадресовываться на proxy-сервер. Как понять, что это http-пакет? Будем считать, что все пакеты, направленные на tcp/80, являются запросами на HTTP. Возникал вопрос: а может кешировать и другие порты? После обработки статистики (большой объем - 422MB, в ситуации с добровольным использованием proxy) выяснилось, что всего обращений было 3120260, из них HTTP - 92%. Из них на нестандартные порты - 2.3% (3128 - 0.05%, 8000 - 0.09%, 8001 - 0.13%, 8080 - 1.06%, 8081 - 0.15%, 8100 - 0.11%, 8101 - 0.46%). Я не вижу смысла бороться за 1%, разве что найду готовое решение ;) Proxy-сервер уже стоит на пути этих пакетов (например, squid установлен на маршрутизаторе или firewall). Cisco отлавливает такие пакеты и с помощью route-map перенаправляет их на proxy-сервер.
ОС proxy-сервера должна принимать эти пакеты, как родные, и перенаправлять к squid linux 2.2. конфигурация ядра: CONFIG_EXPERIMENTAL=y # включен и так CONFIG_NET=y # само собой CONFIG_FIREWALL=y # чтобы иметь возможность тонко управлять маршрутизацией (несовместим с FAST_SWITCHING) # CONFIG_IP_ALIAS is not set # у меня включено и вроде работает (при нехватке ОП зависает драйвер eth0, если ALIAS выключить, то прикладная программа) CONFIG_INET=y # включен и так # CONFIG_IP_MULTICAST is not set # а почему нельзя? CONFIG_IP_FIREWALL=y # чтобы иметь возможность тонко управлять IP-маршрутизацией CONFIG_IP_MASQUERADE=y # а необходимо ли это для transparent proxy? CONFIG_IP_TRANSPARENT_PROXY=y CONFIG_IP_ROUTER=y # необязательно, но может ускорить обработку пакетов при загрузке включать ip_forward, ip_always_defrag (вставить в загрузочные скрипты: /etc/rc.d/init.d/network) echo 1 > /proc/sys/net/ipv4/ip_forward # ядро д.б. сконфигурировано поддержкой /proc и sysctl) echo 1 > /proc/sys/net/ipv4/ip_always_defrag # в ядре 2.2.12 указывается во время конфигурации ipchains (ipfwadm в ядре 2.2 работать не будет) ipchains -A input -p TCP -d 127.0.0.1/32 www -j ACCEPT ipchains -A input -p TCP -d адрес-хоста/32 www -j ACCEPT ipchains -A input -p TCP -d 0/0 www -j REDIRECT 3128 дополнительные правила для firewall и др.
squid д.б. скомпилирован так, чтобы он принимал эти пакеты, как родные. squid д.б. сконфигурирован так, чтобы обрабатывать эти пакеты соответствующим образом. http_port 3128 # redirect д.б. на этот порт httpd_accel_host virtual # имитирует акселератор http-сервера, но не совсе нормально httpd_accel_port 80 # а если перенаправляли не только 80 порт? httpd_accel_with_proxy on # иначе при работе в режиме акселератора отключается кеширование httpd_accel_uses_host_header on # иначе виртуальные домены будут неправильно кешироваться (см. замечание про безопасность)
Проблема. дырка в firewall: запрос приходит на прокси-сервер, который от своего имени (уже изнутри) лезет куда не надо. Ссылки: В комплекте поставки идут access-extract.pl, (увеличено MaxEntries до ...) получающая на стандартный ввод журнал access.log выдающая на стандартный выво промежуточный результат, и access-summary.pl (убрал выдачу ICP, которой у меня нет, за счет чего увеличил ширину колонки с именами хостов; в xsort изменил сортировку с COUNT на BYTES), делающая из него красивый отчет. Внутри используется squid-logs.pl. Его надо расширить новыми суффиксами имен файлов (bmp - Image; rm, mid, mp3 - Audio; pl, cgi, shtml, php, php3, phtml, asp, dll - Dynamic; rpm, cab, avc - Bundle; css - HTML; koi - Text; js - Software). За день получается 60МБ в access.log, поэтому у меня не хватает терпения дождаться результатов работы других процедур из комплекта. Формат access.log (запись делается, когда клиент закрывает socket; для наших 300 тысяч запросов в день получается 60 MB в день!): timestamp (unix time in ms) elapsed (ms), если клиент "ушел, не попрощавшись", то здесь будет время потраченное на обнаружение данного факта, а не время реального обслуживания (иногда более получаса на маленький файл) client IP address type/HTTP reply code, где type: TCP_HIT (верная копия объекта нашлась в кеше) TCP_MEM_HIT TCP_NEGATIVE_HIT TCP_MISS (запрашиваемый объект не был в кеше) TCP_EXPIRED (объект был в кеше, но старый) TCP_CLIENT_REFRESH (клиент запросил reload - no-cache pragma) TCP_REFRESH_HIT (объект в кеше был старым, был сделан IMS-запрос к источнику и тот вернул "304 Not Modified") TCP_REFRESH_MISS (объект в кеше был старым, был сделан IMS-запрос к источнику и тот вернул обновленное содержание) TCP_IMS_HIT (клиент выдал IMS-запрос, объект оказался в кеше и свежим) TCP_IMS_MISS (клиент выдал IMS-запрос для просроченного объекта) TCP_REF_FAIL_HIT (объект в кеше староват, но запросить новую копию не удалось) TCP_SWAPFAIL (объект д.б. в кеше, но не смогли извлечь) TCP_DENIED UDP_... ERR_CLIENT_ABORT ERR_NO_CLIENTS ERR_READ_ERROR ERR_CONNECT_FAIL ERR_...
size (bytes to client) method (GET, POST, ...) URL ident ("-", если недоступен) hierarhy data/Hostname DEAD_NEIGHTBOR DEAD_PARENT LOCAL_IP_DIRECT FIRST_PARENT_MISS FIRST_UP_PARENT PARENT_HIT (UDP-запрос к parent вернулся с подтверждением) SINGLE_PARENT PARENT_UDP_HIT_OBJECT (объект оказался у parent и поместился в UDP-ответе) DIRECT (объект был запрошен с оригинального сервера) ...
тип содержимого (MIME тип/подтип)
Формат store.log: time (unix format with ms) action HTTP reply code HTTP Date: reply header HTTP Last-Modified: reply header HTTP Expires: reply header HTTP Content-Type: reply header HTTP Content-Length: reply header реально полученное число байт (если не совпадает с предыдущим числом, объект не хранится) HTTP метод (GET, POST, ...) ключ доступа (обычно URL, частные объекты еще и последовательный номер и метод)
Еще можно собирать useragent.log, все HTTP-заголовки и отладочную информацию. Я собираю только access.log и этого очень много. Время в журналах записывается в Unix-формате (число милисекунд с 1 января 1970 года), что неудобно. Преобразовать в человеческий формат можно, например, с помощью gawk: awk '{print strftime("%Y%m%d%H%M%S",$1), $2, $3, $4, $5, $6, $7, $8, $9, $10, $11}' (printlog.sh) или perl: s/^\d+\.\d+/localtime $&/e; Частота обращений к объектам извлекается из access.log с помощью (url_freq.sh) awk '{print $7}' | sort | awk -f /usr/local/bin/count.awk | sort -nr +1 или без учета anchor и query-частей URL (url_freq_noq.sh) awk '{print $7}' | awk -F'?' '{print $1}' | awk -F';' '{print $1}' | awk -F'#' '{print $1}' | sort | awk -f /usr/local/bin/count.awk | sort -rn +1 Squid не умеет работать с файлами, превышающими 2 ГБ, так что журналы надо регулярно чистить. SARG (ранее sqmgrlog) - Squid Analysis Report Generator. Отчёты создаются в формате html (по умолчанию - в /var/www/html), для графиков используется библиотека gd. Установка пакета sarg-2.2-1.el4.rf.i386.rpm на CentOS 4.3 (требуется пакет gd, отчёты складываются в /var/www/sarg, настройка доступа для apache в /etc/httpd/conf.d/sarg.conf). Конфигурационный файл /etc/sarg/sarg.conf (символ '#' - начало комментария, каждый параметр на отдельной строке): language Russian_UTF-8 # language Russian_koi8 access_log имя-файла (журнал access.log) graphs yes graph_days_bytes_bar_color blue|green|yellow|orange|brown|red прочие настройки оформления графики (шрифт, цвет, размер, текст) #password none temporary_dir /tmp output_dir /var/www/sarg/ONE-SHOT output_email email-адрес (отчёт посылается по e-mail вместо создания графиков) resolve_ip yes (преобразовывать IP адреса в имена) user_ip yes (использовать в отчёте IP адреса вместо идентификаторов пользователей) topuser_sort_field {USER | CONNECT | BYTES | TIME} {reverse | normal} (тип сортировки отчёта TopUser) user_sort_field {USER | CONNECT | BYTES | TIME} {reverse | normal} (тип сортировки отчёта User) exclude_users {имя-файла | none | indexonly} (файл содержит имена пользователей, которых не надо включать в отчёт) exclude_hosts {имя-файла | none | indexonly} (файл содержит адреса хостов и сетей, которые не надо включать в отчёт: например, 192.168.10.0) useragent_log none (отчёт по UserAgent) date_format {e | u } (e - dd/mm/yy, u - mm/dd/yy) per_user_limit имя-файла число-МБ (записывать в файл идентификаторы пользователей, превысивших указанный лимит) lastlog число-сохраняемых-отчётов (0 - без ограничений) remove_temp_files yes index { yes | no | only } (создавать index.html) index_tree { date | file } overwrite_report no (перезаписывать отчёт, если отчёт за указанный день уже существует) records_without_userid {ignore | ip | everybody } (что делать, если в строке журнала нет идентификатора пользователя; ignore - пропускать строку, ip - записывать ip, everybody - вместо userid записывать строку "everybody" ) use_comma {no | yes} (использовать запятую вместо десятичной точки) mail_utility mail (какую программу использовать для посылки отчёта по почте) topsites_num 100 (сколько сайтов включить в отчёт о самых популярных сайтах) topsites_sort_order {CONNECT | BYTES} {D | A} (тип сортировки отчёта о самых популярных сайтах) index_sort_order {D | A} (тип сортировки индекса) exclude_codes имя-файла (/etc/sarg/exclude_codes, исключить записи с указанными кодами) report_type перечень-отчётов-через-пробел topusers (для самых "прожорливых" пользователей выводится имя пользователя (IP адрес), имена сайтов, число байт и т.д.) topsites (для самых популярных сайтов выводится имя сайта, число соединений и загруженных байт) sites_users (для каждого сайта перечисляется список заходивших на него пользователей) users_sites (кто и куда ходил) date_time (потребление трафика почасовое и посуточное) denied (denied.log, куда пользователей не пустили: время, userid, IP-адрес, URL) auth_failures (ошибки аутентификации) site_user_time_date (sites, dates, times and bytes report) downloads (download.log: для каждого загруженного файла выводится время, userid, IP-адрес, URL; см. download_suffix)
usertab имя-файла (none; файл содержит соответствие между userid/IP и реальным именем) long_url no (вставлять в отчёт полный URL (не советую) или только имя сайта) date_time_by { bytes | elap } (включать в почасовой отчёт байты или потраченное время) charset Koi8-r (а для Russian_UFT-8?) user_invalid_char "&/" (символы, недопустимые в userid) include_users "список:пользователей:через:двоеточие" (включать в отчёт только указанных пользователей) exclude_string "список:строк:через:двоеточие" (не включать в отчёт строки журнала, содержащие указанные строки) show_successful_message {yes | no} show_read_statistics yes (помогает скоротать время в ожидании завершения отчёта) topuser_fields NUM DATE_TIME USERID CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE user_report_fields CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE topuser_num 0 (0 - без ограничений; сколько пользователей включить в отчёт о самых популярных сайтах) site_user_time_date_type { table | list } (отчёт site_user_time_date в виде таблицы или списка) datafile имя-файла (сохранить отчёт в виде файла для дальнейшей обработки) datafile_delimiter ";" datafile_fields user;date;time;url;connect;bytes;in_cache;out_cache;elapsed datafile_url {ip | name} weekdays 0-6 (какие дни недели помещать в отчёт) hours 0-23 (какие часы помещать в отчёт) dansguardian* и squidguard* show_sarg_info yes (выводить сылку на сайт автора в каждом отчёте) show_sarg_logo yes parsed_output_log none (имя каталога для сохранения полуобработанных данных) parsed_output_log_compress /bin/gzip displayed_values { bytes | abbreviation} authfail_report_limit строк (10) denied_report_limit строк (10) siteusers_report_limit строк (0) squidguard_report_limit строк (10) dansguardian_report_limit строк (10) user_report_limit строк (10) www_document_root, block_it - для общения со squidGuard и ACL external_css_file /var/www/sarg/sarg.css download_suffix "zip,arj,bzip,gz,ace,doc,iso,adt,bin,cab,com,dot,drv$,lha,lzh,mdb,mso,ppt,rtf,src,shs,sys,exe,dll,mp3,avi,mpg,mpeg" ulimit максимальное-число-открытых-файлов ntlm_user_format { username | domainname+username }
Ключи запуска sarg: -a имя-или-IP-адрес (ограничить отчёт указанным клиентом) -b имя-файла (отчёт по UserAgent) -c имя-файла (список исключений) -d дд/мм/гггг-дд/мм/гггг (ограничить интервалом дат) -e email-адрес (кому послать отчёт) -e stdout (выдать отчёт на стандартный вывод) -f имя-конфигурационного-файла -g формат-даты-в-отчёте (e - dd/mm/yy, u - mm/dd/yy) -i (формировать отчёт по пользователям и IP адресам) -l имя-журнала-squid (можно указывать несколько раз, но в порядке возрастания даты; понимает сжатые файлы, но разжимает их в файл и забывает удалить) -n (преобразовывать IP адреса в имена) -o имя-каталога (куда записывать отчёты) -p (использовать в отчёте IP адреса вместо идентификаторов пользователей) -s имя-сайта (ограничить отчёт указанным сайтом) -t ЧЧ:ММ:СС (ограничить отчёт по времени суток) -u имя-пользователя (ограничить отчёт указанным пользователем) -w имя-католога-для-временных-файлов -x (отладочная печать на stdout; на неё действует language и charset) -z (?)
Практика - программа глючная и медленная, точнее очень глючная (sites_users содержит какую-то ерунду; забывает удалять и закрывать файлы - требуется ulimit 60000; не все графики создаются) и очень медленная (полный месячный отчёт - 180 GB трафика - обрабатывается в течение 2 часов). Сбор суммарной информации по использованию трафика пользователями за последний месяц:
time nice -19 sarg -d $(date --date "1 month ago" +%d/%m/%Y)-$(date --date "1 day ago" +%d/%m/%Y) \
-x -z -l /squid/logs/access.log.5.gz ...
где /etc/sarg/sarg.conf содержит
graphs no
resolve_ip no
user_ip yes
topuser_sort_field BYTES reverse
user_sort_field BYTES reverse
index yes
overwrite_report yes
records_without_userid ip
report_type topusers
usertab /etc/sarg/usertab
privacy no
exclude_string имя-своего-домена
topuser_fields NUM DATE_TIME USERID CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE
user_report_fields CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE
topuser_num 0
displayed_values bytes
user_report_limit 0
ulimit 60000
Сбор информацию куда ходил конкретный пользователь (10 самых "прожорливых" пользователей) за последний месяц (15 минут CPU):
time nice -19 sarg -f /etc/sarg/sarg.top10user.conf \
-d $(date --date "1 month ago" +%d/%m/%Y)-$(date --date "1 day ago" +%d/%m/%Y) \
[-a IP-адрес] -x -z -l /squid/logs/access.log.5.gz ...
где /etc/sarg/sarg.top10user.conf содержит
graphs no
user_ip yes
topuser_sort_field BYTES reverse
user_sort_field BYTES reverse
records_without_userid ip
report_type topusers users_sites
usertab /etc/sarg/usertab
privacy no
exclude_string имя-своего-домена
topuser_fields NUM DATE_TIME USERID CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE
user_report_fields CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE
topuser_num 10
displayed_values bytes
user_report_limit 10
ulimit 60000
LightSquid - набор скриптов на perl для анализа журналов, не требует СУБД. Ссылки:
Далее >>>
|
|
|