Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> программы —> squid+sams+sqstat

Пилим squid и sams в примерах и задачках. Установка SqStat.

Автор: gonzo111.


  • Вступление
  • ACL
  • Мои ACL в SAMS
  • Запрещаем закачку файлов больше определенного размера
  • Запрещаем выгрузку файлов больше определенного размера
  • Режем порты на примере борьбы с торентами
  • Нарезаем скорость. Пример №1
  • Нарезаем скорость. Пример №2
  • Установка SqStat (Новое!)


      Вступление
    Хочу еще раз сказать спасибо Лисяре за этот замечательный сайт и спасибо создателям sams за полезную софтину.
    Установив sams я начал радоваться жизни и весело тыкать мышкой в вэб интерфейсе.Но к хорошему быстро привыкаешь и его становится мало. Хотелось резать все и всем :))
    Вопрос как быть с возможной с утечкой информации через инет тоже беспокоил начальство.
    Примечание: Статья писалась скорее как-бы шпаргалка для самого себя, статья не претендует на правильность и это моя первая статья, так что прошу сильно ногами не пинать.
    Итак поехали.
    Имеем  
    web00# uname -a
    FreeBSD web00 7.2-RELEASE-p3 FreeBSD 7.2-RELEASE-p3 #0: 
    Fri Sep  4 10:42:46 EEST 2009  i386
    web00# squid -v
    Squid Cache: Version 2.7.STABLE7
    SAMS v. 1.0.4 
    



        ACL

    Сперва небольшая шпаргалка по ACL:
    acl aclname port 80 70 21 - ACL, описывающий порты. Вместо простого перечисления можно указать диапазон, например 1-1024.
    acl aclname proto HTTP FTP - ACL, описывающий протокол, по которому клиент желает сделать запрос на сервер.
    acl ftp url_regex -i ^ftp:// - использовать регулярки для отлова содержимого адресной строки.
    "-i"  игнорирует разницу между заглавн и строчными буквами
    acl aclname method GET POST - метод, которым передаются данные клиента серверу.
    acl aclname time [day-abbrevs] [h1:m1-h2:m2] - ACL, описывающий время.
    Коды дней недели определяются так: S - Sunday - Воскресенье, M - Monday - Понедельник, T - Tuesday - Вторник, W - Wednesday - Среда, H - Thursday - Четверг, F - Friday - Пятница, A - Saturday - Суббота. Ну а вместо h1:m1 и h2:m2 вставляется время.
    acl worktime time MTWHF 08:00-17:00 описывает рабочее время с понедельника по пятницу, с 8 утра до 5
    вечера.
    acl weekday time SA описывает целиком субботу с воскресеньем, а
    acl evening time 17:00-23:59 описывает время до полуночи. Если необходимо описать всю ночь, то приходится
    заводить два ACL- первый с вечера до полуночи, а второй с полуночи до утра.


        Мои ACL в SAMS

    Типичные ACL самса имеют вид
    #  TAG: acl
    acl _sams_default src "/usr/local/etc/squid/default.sams"
    acl _sams_4901c4f49225b src "/usr/local/etc/squid/4901c4f49225b.sams"
    acl _sams_490f01a78f0ab src "/usr/local/etc/squid/490f01a78f0ab.sams"
    acl _sams_4ae16240c2a17 src "/usr/local/etc/squid/4ae16240c2a17.sams"
    

    если пытаться что то ваять используя их, то будет большая вероятность что при следующем реконфиге самса вы свои строки больше не увидите, да и читать их не удобно, потому напишем свои и о чудо Самс их не тронет.
    # Мои ACL
    acl sams_default src "/usr/local/etc/squid/default.sams"
    acl sams_menegeri src "/usr/local/etc/squid/4901c4f49225b.sams"
    acl sams_Buhi src "/usr/local/etc/squid/490f01a78f0ab.sams" \
     "/usr/local/etc/squid/4ae16240c2a17.sams"
    #sams_default будут админские/шефские IP, остальные менегеры и бухи
    
    # это пригодится нам потом
    acl ftp_port port 21 20
    acl work_time time 08:00-17:00
    # ночь можно определять как !work_time или вот так
    acl night_time1 time 17:00-23:59
    acl night_time2 time 00:00-08:00
    

    Интересно что в нашу acl sams_Buhi будет входить несколько списков (шаблонов) самса.
    (Не забывайте создавать свои, анологичные ACL, по мере создания новых шаблонов в админке со списком IP, в самс. Также учитывайте в своих правилах, когда какой то IP вы перенесли в вэб админке в другой список.)







        Запрещаем закачку файлов больше определенного размера

    Запретим каждой группе превышать свой размер скачиваемого файла, себе ставим побольше :), а остальным кто не в группе (например вновь прибывшим) режем по максимуму. Можно вместо deny писать allow, но результат у меня получался не такой как мне хотелось.
    #--------------------- ------------------ ------------------- 
    # Запрещаем закачку файла больше определенного размера,
    # остальным как доктор прописал
    reply_body_max_size  410000 deny sams_menegeri
    reply_body_max_size  1400000 deny sams_Buhi
    reply_body_max_size  11001001000 deny sams_default
    reply_body_max_size 1000 deny all
    #====================================================================
    

    Размер указывается в байтах. В реальности будет резать с небольшой погрешностью из-за служебной информации файла или еще чего-то там еще. Пишем внутрифирменную инструкцию, что все файлы большого размера качать запрещено. А если очень надо, то кидать ссылку на почту админу и приходить с пивом/кофем забирать. Админ качнет когда у него будет время :)  
    Можно делать исключения разрешив качать с определенных адресов, поместим в НАЧАЛЕ списка например:
    acl auto_update dstdomain .eset.com
    acl alkar_download dstdomain .alkar.net
    reply_body_max_size  20000410000 deny eset.com
    reply_body_max_size  20000410000 deny alkar_download sams_Buhi
    

    Сперва разрешит качать большие файлы обновлений нода всем. Разрешит качать больше юзерам sams_Buhi с поддоменов .alkar.net (не забудте точку).
    Пойдем дальше...


        Запрещаем выгрузку(upload) файлов больше определенного размера

    Данный пример показывает как это можно реализовать
    # размер загаловка меньше 90 кб
    acl upload_limit1 req_header Content-Length [0-9]{6,}
    # размер загаловка меньше приблиз 900 кб
    acl upload_limit2 req_header Content-Length [0-9]{7,}
    # проверяется метод post
    acl upload_method method post
    http_access deny sams_Buhi upload_method upload_limit1
    http_access deny sams_ip upload_method upload_limit2
    .................
    ...................
    #наши правила пишем ДО правил самса, ниже идут его правила,
    
    #  TAG: http_access
    http_access allow _sams_default..
    http_access allow _sams_4901c4f49225b  !_sams_4909e12d54f8f.
    
    # в конце обязательно должно быть 
    http_access deny all
    

    Принцип работы основан на регулярках где [0-9]{6,} означает 6 цыфер от 0 до 9. Рекомендую сильно мало не ставить, иначе большой текст на на вэб формах (например, форумах) оно тоже будет тоже резать.
    При желании можно блеснуть умом и придумать что то более заумное(жду ваших предложений).
    В инете видел еще такое решение, оно мне не подошло.. для полного запрета выгрузки на  html формах
    acl fileupload req_mime_type -i ^multipart/form-data$
    



          Режем порты на примере борьбы с торентами.

    Вышеперечисленные правила могут не сработать если юзер будет качать/раздавать из торентов. Дело в том, что
    согласно этому протоколу, закачка будет мелкими кусочками по 16,32...4096 kb (смотря как задал размер то кто создавал торрент файл). Вот такая вот засада...Чешем репу и думаем что делать.... Активность торрента вычисляется в логах по коннектам к многочисленным хостам (как правило не имеющим статистического адреса) в широком диапазоне портов. Как вариант решения проблемы можно, глянув логи, бить такого юзера линейкой по голове...Глянем, что еще можно сделать...
    Первое что приходит в голову порезать левые порты для такой категории юзеров:

    acl Safe_ports port 80	# http
    acl Safe_ports port 443	# https
    acl Safe_ports123 port 21	# ftp
    acl Safe_ports123 port 70	# gopher
    acl Safe_ports123 port 210	# wais
    acl Safe_ports123 port 1025-65535	# unregistered ports
    acl Safe_ports123 port 280	# http-mgmt
    acl Safe_ports123 port 488	# gss-http
    acl Safe_ports123 port 591	# filemaker
    acl Safe_ports123 port 777	# multiling http
    
    # режем нашим юзерам почти все порты кроме http,ssl
    http_access deny sams_Buhi !Safe_ports
    http_access deny sams_ip !Safe_ports
    # ну или наоборот режем только наиболее страшные порты
    #http_access deny  sams_Buhi Safe_ports123
    #http_access deny  sams_ip Safe_ports123
    
    
    #  TAG: http_access
    http_access allow _sams_default
    http_access allow _sams_4901c4f49225b  !_sams_4909e12d54f8f
    http_access allow _sams_490f01a78f0ab  !_sams_4909e12d54f8f
    
    # Всем остальным, кто не моих правилах и правилам, 
    # самса тоже режем порты 
    #(остальным самс разрешил доступ притом по всем портам).
    # хотя по идее эта строка бесполезна, тк уже всех перечислили 
    # и есть правило http_access deny all
    http_access deny !Safe_ports
    

    Обратите внимание- строки надо ставить ПЕРЕД #  TAG: http_access, иначе после реконфига, самс их поставит после своих строк и ничего не будет работать, так как предыдущие правила самса разрешат полный доступ по портам.
    Более гуманный способ это порезать скорость на левых портах об этом расскажу ниже.
    Есть еще такой вариант, может кому пригодится - резать для сети порты, только еще и запросы по методу CONNECT
    acl block_soft_ports port 6660-6669
    acl CONNECT method CONNECT
    acl net src 192.168.0.0/255.255.255.0
    http_access deny CONNECT block_soft_ports net
    




        Нарезаем скорость. Пример №1

    Как известно в вэб интерфейсе Самса можно менять скорость.После реконфига самс уже за нас все прописует в squid.conf , попытаемся понять что там
    # самс находит этот тэг и добавляет при реконфиге свое, 
    # в начало, удаляя ваши строки :)))
    #  TAG: delay_class
    # описует скока будет труб
    delay_pools 6
    # для каждого номера трубы (1-6) задаем ее тип  
    # самс использует 2 тип труб, в которой можно задать 
    #скорость на всю группу  и на отдельного товарища в ней 
    delay_class 1 2
    delay_class 2 2
    delay_class 3 2
    delay_class 4 2
    delay_class 5 2
    # указываем кто попадет в трубу, тут аналог с http_access с тем 
    # отличием что указывать можно по одному ACL,
    # несколько ACL задается списком, но сработает тот, 
    # кто первый попадет под условие. 
    # комбинация из двух и более не пашет, сработает только первый ACL
    # номер трубы___разрешить/запретить___acl
    delay_access 1 allow _sams_4901c4f49225b
    # как и в http_access, в конце все остальное,запрещаем для каждого номера трубы
    delay_access 1 deny all
    # и наконец, задаем параметры нарезки - 
    #номер трубы_ограничения на группу_ограничения на клиента
    delay_parameters 1 100000/100000 70000/70000
    	# остальное по аналогу для 2 трубы
    delay_access 2 allow _sams_4909909c6f0fa
    delay_access 2 deny all
    delay_parameters 2 200100/200100 15100/15100 
    
    
    delay_parameters 2 200100/200100 15100/2300100 # эту строку с решеткой
    # самс не удалит
    

    Объясню как это работает.
    В первую трубу 2 класса попадет некий перечень IP клиентов.
    (acl _sams_4901c4f49225b src "/usr/local/etc/squid/4901c4f49225b.sams). Для всей группы скорость будет 100000 байт/с и 70000 байт/с для каждого в отдельности. Второе число после слеша задает размер буфера в который влазит файл(файлы), а первое число это и есть скорость ограничения. Можно указать "100000/100000 -1/-1", тогда будет без ограничения на клиента и скорость будет упираться в ограничение группы.
    При одинаковых числах файлы приходят в буфер и уходят.
    Во второй трубе группа имеет постоянное ограничение на 200100 байт/с, а у клиента при превышении размера файла 2300100 байт (2,1 мб) (который не влезет в буфер), скорость резко упадет до 15100 байт/с. Если после закачки большого файла дальше пойдут мелкие, то спустя некоторое время (по моим наблюдениям около 15-40 сек) скорость снова подымится и упрется в ограничение на группу. Как менять время восстановления скорости, я пока не нашел, жду ваших советов. 2,1 Мб в принципе хватает для просмотра без тормозов страниц с новостями, в которых много картинок. В примере параметры второй трубы указаны два раза, второй пример я дописал руками и наличие в конце решетки защищает его от удаления самсом, и как ни странно именно это значение применится в итоге.


        Нарезаем скорость. Пример №2

    Если хочется сделать что то более сложное, то придется все-таки отказаться от услуг самса (да и еще к сожалению строки delay_access с решеткой на конце сквид не понимает думая что там будет ACL). Делается это так, В вэб интерфейсе -Настройки Самс-"Включить ограничение скорости доступа пользователей (delaypool)" убрать галку. Можно не беспокоиться, если ее вернуть, то прежние числа скорости снова появятся. Скопируем правила самса и подрихтуем. Глянем, что я тут начудил:
    #  TAG: delay_class
    delay_pools 7
    delay_class 1 2
    delay_class 2 2
    delay_class 3 2
    delay_class 4 2
    delay_class 5 2
    
    delay_access 1 allow _sams_4901c4f49225b
    delay_access 1 deny all
    delay_parameters 1 100000/100000 70000/70000
    delay_access 2 allow _sams_4909909c6f0fa
    delay_access 2 deny all
    delay_parameters 2 524288/524288 999288/999288
    delay_access 3 allow _sams_490f01a78f0ab
    delay_access 3 deny all
    delay_parameters 3 28000/28000 14000/14000
    
    # ночной трафик и трафик с левых портов 
    для этих товарищей будет в отдельной трубе
    delay_access 4 deny !work_time
    delay_access 4 deny Safe_ports123
    delay_access 4 allow sams_menegeri
    delay_access 4 deny all
    delay_parameters 4 200100/200100 15100/2300100
    
    # ночной трафик и трафик с левых портов для 
    этих товарищей будет в отдельной трубе
    delay_access 5 deny !work_time
    delay_access 5 deny Safe_ports123
    delay_access 5 allow _sams_default
    delay_access 5 deny all
    delay_parameters 5 2000100/2000100 40100/2300100
    

    #
    #delay_class 6 2 
    # у остальных запрещаем этому типу трафа попадать в этот тип трубы
    # надо учесть, что на деле юзер будет хавать общий траф из двух(!) труб
    delay_access 6 allow !work_time
    delay_parameters 6 28000/28000 14000/230011 # fgg
    delay_access 6 deny all
    
    delay_class 7 2 
    # у остальных запрещаем этому типу трафа попадать в этот тип трубы
    # надо учесть, что на деле юзер будет хавать общий траф из двух(!) труб
    delay_access 7 allow Safe_ports123
    delay_parameters 7 211000/211000 101000/230011 # fgg
    delay_access 7 deny all
    

    Пользователи из трубы 1,2,3 будут на одинаковой скорости зимой и летом.
    Для пользователей списка sams_menegeri и _sams_default обычный траф будет в трубах 4 и 5, а другой траф для них пойдет ночью в трубу 6, а траф по другим портам в трубу 7.
    В принципе получилось довольно заумно, если можно сделать как-то попроще, то с радостью перепишу по-другому. Насколько упадет скорость сквида под очень большой нагрузкой не проверял,но у себя в конторе я разницы не заметил.
    *****************************************
    Забавно, что в этом примере, или если взять попроще пример (ниже),
    если написать вместо труб 6 и 7 вот такую 6 трубу ,то траф к клиенту пойдет из двух труб-
    -часть по портам 80,443 будет идти по трубе 4(5)
    -часть по остальным портам или ночью по трубе 6
    #delay_class 6 2 
    delay_access 7 allow Safe_ports123
    delay_access 6 allow !work_time
    delay_parameters 6 28000/28000 14000/230011 
    delay_access 6 deny all
    

    так что надо учесть, что суммарная скорость приходящего трафа будет больше.

    Таким образом, можно сильно урезать работу торентов и прочего софта по левым портам. Не забываем, что есть еще acl по протоколу, так что вариантов много, как испортить юзерам сладкую жизнь, надеюсь эти примеры итак уже некисло это обеспечат... :))

    Конец ...:)))  


    Ccылки на доп литературу:
    http://forum.lissyara.su/viewtopic.php?f=3&t=20393 (для начинающих приблизительный пример конфига с русскими комментами)
    http://linuxnews.ru/docs/squid.html (основы по ACL)
    http://www.kernel-panic.it/openbsd/proxy/proxy3.html (ACL посложнее)


    ppps.

    Установка SqStat.
    SqStat это скрипт на пыхе мониторинга того кто и на какой скорости качает через сквид в реальном времени.Официальный сайт. Скриншот.
    При условии что у меня в squid.conf аутентификация ncsa и редиректор sams
    auth_param basic program /usr/local/libexec/squid/ncsa_auth 
    /usr/local/etc/squid/ncsa.sams
    url_rewrite_program /usr/local/bin/samsredir
    

    Ставим
    portinstall sqstat или portmaster www/sqstat
    

    Рихтуем httpd.conf
    Alias /sqstat "/usr/local/share/sqstat/"
        <Directory /usr/local/share/sqstat/>
            DirectoryIndex sqstat.php
            Order deny,allow
            Allow from 10.0.0.22/32
        </Directory>
    

    config.inc.php
    $squidhost[0]="127.0.0.1";
    $cachemgr_passwd[0]="pass123";
    

    squid.conf
    acl localhost src 127.0.0.1/32
    acl manager proto cache_object
    # без этой стороки постоянно писало ошибку аутентификации
    cachemgr_passwd pass123
    http_access allow manager localhost
    http_access deny manager
    # для работы с редиректором самса
    redirector_access deny localhost
    
    # не писать в логи о manager (access.log)
    log_access deny localhost 
    # не писать в лог cache.log кучу записей -"CACHEMGR: 
    #cachemgr@10.0.0.2 requesting 'active_requests"
    debug_options ALL!cachemgr,1
    
    # ниже не к теме sqstat, а просто для себя
    #       ненужные записи в огромной таблице cache size=0
    #       http://sams.nixdev.net/ticket/439
    acl connect_method method connect 
    acl admin src 10.0.0.77/32
    # часть трафа не учтется(!)
    log_access deny admin connect_method 
    

    Если squid слушает на одном определенном ip, то можно вместо 127.0.0.1 его указать.

    В пыхе не силен, допиливание:
    -время в 12 часовом формате, но хочеться что было 24
    /usr/local/share/sqstat/sqstat.class.php
    строка 209,столбец 212 
    date("h:i:s d/m/Y")
    заменить на
    date("H:i:s d/m/Y")
    

    -вместо Kбайт/с хочется Кбит/с
    Поиск с заменой KB/s на Kb/s (в 4 местах) и умножить на 8 (в 3 местах):
    строка 253
    $curr_speed = ($con['bytes'] - $was_size) / 1024*8 / $delta;
    строка 256
    $curr_speed = $con['bytes'] / 1024*8;
    строка 315
    $avg_speed = $con['bytes'] / 1024*8;
    

    _________________________________
    столкнулся недавно с проблемой, что нарезка баннеров регулярками (Перенаправление запроса) резала нужный сайт(addons.mozilla.org), добавление в раздел Доступ разрешен не помогало.
    Нашел в манах что можно делать исключения в регулярках вместо ^(ad.|k5ads.) написал
    ^((?!addons)ad.|k5ads.)



    размещено: 2010-01-23,
    последнее обновление: 2010-06-11,
    автор: gonzo111


    razor, 2010-01-25 в 9:13:32

    могу посоветовать еще рассмотреть порты для риалтайм мониторинга происходящего.
    открыл для себя недавно sqstat. много симпотней чем squidview

    grey, 2010-01-28 в 10:10:00

    интересно....попробую применить

    gonzo111, 2010-01-28 в 11:01:27

    фичи и баги-
    Контролируем мгновенную загруженность канала SQUID
    http://www.permlug.org/node/5369

    Ошибка 2010 года в 1.0.4
    http://sams.perm.ru/index.php?option=com_content&task=view&id=32&Itemid=1

    baloon, 2010-02-04 в 13:43:16

    Посоветуйте, как порезать скорость на одноклассников и др. соцсети, а остальное чтобы нормально работало?

    По логике что-то в духе:

    acl soc url_regex odnoklassniki
    acl soc url_regex vkontakte

    delay_pools 2
    delay_class 1 2
    delay_class 2 2

    delay_parameters 1 1000/1000 700/100
    delay_parameters 2 256000/256000 128000/128000

    delay_access 1 allow soc
    delay_access 1 deny

    delay_access 2 allow !soc
    delay_access 2 deny




    gonzo111, 2010-02-05 в 11:03:24


    Для вопросов есть форум!

    vovan, 2010-02-18 в 17:07:33

    ух! сам такими задачами заморачиваюсь периодически, а тут статья появилась, значит я не одинок, значит я не извращенец :)

    Andr, 2010-03-26 в 7:53:51

    >Нашел в манах что можно делать исключения в регулярках >вместо ^(ads.|ad.|adserver.|k5ads.) написал
    >^(ads.|(?!addons)ad.|adserver.|k5ads.)

    Вообще-то точка обозначает ЛЮБОЙ символ если слэшем не экранирована :)
    Правильно вот так: ^(ads\.|ad\.|adserver\.|k5ads\.)

    gonzo111, 2010-04-05 в 16:06:57

    Andr дык мне и нужнен было любой символ, нафига мне просто точки в конце

    azx987sa не буду из вредности, я специально и не указывал :)
    сложность догадатся будет только у "студента"

    Time, 2010-12-04 в 17:05:21

    Почему не подписаны где лежат какие конфиги?
    config.inc.php еле отрыл

    mediamag, 2010-12-05 в 14:29:28

    Существуют ли подобный мониторинг закачки с локальных хостов для ipfw ?

    Федор, 2012-01-19 в 12:38:23

    ??????????????? ЛАЖА ?????????????????
    acl auto_update dstdomain .eset.com
    acl alkar_download dstdomain .alkar.net
    reply_body_max_size  20000410000 deny eset.com
    reply_body_max_size  20000410000 deny alkar_download sams_Buhi
    Сперва разрешит качать большие файлы обновлений нода всем. Разрешит качать больше юзерам sams_Buhi с поддоменов .alkar.net (не забудте точку).
    ??????????????? ЛАЖА ?????????????????

    Константин Брызгалов, 2014-02-28 в 17:37:36

    в squid 3.3 изменилися вывод

    peer теперь remote
    me теперь local

    Вследствие чего вылазит ошибка

    undefined index: peer

    Строки в файле /sqstat.class.php:
                                           if(substr($v,0,5)=="peer:") $parsed["con"][$connection]["peer"]=substr($v,6);
                                           if(substr($v,0,3)=="me:") $parsed["con"][$connection]["me"]=substr($v,4);

    надо заменить на
                                           if(substr($v,0,7)=="remote:") $parsed["con"][$connection]["peer"]=substr($v,6);
                                           if(substr($v,0,6)=="local:") $parsed["con"][$connection]["me"]=substr($v,4);




  •  

      Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
      Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

    © lissyara 2006-10-24 08:47 MSK

    Время генерации страницы 0.0583 секунд
    Из них PHP: 36%; SQL: 64%; Число SQL-запросов: 77 шт.
    У Вас отключено GZIP-сжатие в браузере. Размер страницы 65194