Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> главная —> Архив —> SQUID

Прокси-сервер SQUID

Автор: lissyara.


Статья передвинута в архив.
Обновлённая версия доступна по адресу http://www.lissyara.su/?id=1375

   Прокси-сервер - это программа которая выполняет роль "прокладки" между браузером пользователя и WWW сервером. Через него проходят все запросы пользователя по протоколу http и ответы серверов пользователю. Он может фильтровать проходящий траффик по тем или иным признакам, а так же разграничивать доступ к интернету по протоколу http (в случае если используется непрозрачный прокси-сервер).
   SQUID - пожалуй, самый лучший прокси под UNIX платформу. Есть сборки и для win32, но, на мой взгляд, это уже совсем не то :) Очень богатая функциональность:
— Поддержка протоколов HTTP, FTP, SSL, HTCP, CAPR
— Каскадирование серверов
— возможность прозраного проксирования
— поддержка протокола SNMP
— кэширование DNS-запросов
   Собираем, операционка - FreeBSD4.11. Обновляем дерево портов и приступаем:
/root/>cd /usr/ports/www/squid
/usr/ports/www/squid/>make && make install && make clean

Появляется синенькое окошко с кучей опций. Я выбрал:
SQUID_UNDERSCORES - разрешил запрещённый символ подчёркивания(_) в именах - мало ли идиотов в интернете...
SQUID_CHECK_HOSTNAMES - пусть проверяет имена.
SQUID_RCNG - стартовый скрипт squid
Он качает много-много патчей и собирается (впрочем, если выпустят новую версию - то патчей первое время не будет :)). После чего топаем в /usr/local/etc/squid и редактируем squid.conf до такого состояния (все настройки даны для прозрачного прокси-сервера, у "непрозрачного" будут отсутствовать пункты httpd_accel_*):
http_port 3128
icp_port 0
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
cache_mem 128 MB
maximum_object_size 8092 KB
maximum_object_size_in_memory 512 KB
cache_dir ufs /usr/local/squid/cache 2048 64 256
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
cache_mgr admin@my_domain.ru
visible_hostname mail.my_domain.ru
tcp_outgoing_address 222.222.222.222
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern .               0       20%     4320
redirect_program /usr/local/etc/squid/redirector.pl
redirect_children 10

acl     all             src             0.0.0.0/0.0.0.0
acl     allowed_sites   dstdomain       \
"/usr/local/my_doc_smb/squid/allowed_sites.conf"
acl     limited_IP      src             \
"/usr/local/my_doc_smb/squid/limited_IP.conf"
acl     localhost       src             127.0.0.0/8
acl     our_networks    src             192.168.0.0/24
#acl    denied_sites    dstdomain       \
#"/usr/local/my_doc_smb/squid/denied_ext.conf"
#http_access    deny    denied_sites
http_access     allow   allowed_sites
http_access     deny    limited_IP
http_access     allow   our_networks
http_access     allow   localhost
http_access     deny    all

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_uses_host_header on

coredump_dir /usr/local/squid/cache
pid_filename /usr/local/squid/logs/squid.pid

Это - самый минимум конфигурации, для прозрачного проксирования, и списков людей, которым можно посещать лишь малое количество сайтов (сайты описаны в файле allowed_sites.conf, а ip компов в файле limited_IP.conf), и списка сайтов на которые ходить нельзя никому (denied_ext.conf). Файлы выглядят примерно так:/usr/local/my_doc_smb/squid/allowed_sites.conf
www.yandex.ru
mail.yandex.ru
www.ya.ru
www.mail.ru

/usr/local/my_doc_smb/squid/limited_IP.conf
192.168.0.8
192.168.0.56
192.168.0.89

/usr/local/my_doc_smb/squid/denied_ext.conf
www.sex.com
www.tetki.ru
www.soska.ru
www.porewo.com

По остальным цифирькам:
cache_mem - сколько памяти под кэш потратит (реально в 2.5 раза больше зажрёт. Любит он оперативку. У меня в точно такой конфигурации занимает 297 мегов памяти, примерно через день - когда наберёт объектов в память)
maximum_object_size - максимальный размер объекта сохраняемый на диск (частенько неслушается и сохраняет обекты раза в 2-3 большие)
maximum_object_size_in_memory - максимальный размер объекта хранимого в оперативке
cache_dir - директория для кэша. Должна существовать и юзер от которого работает сквид должен иметь право писать в неё. Там же - ufs - тип файловой системы на которой расположена папка кэша, 2048 - максимальный размер кэша, 64 - число директорий первого уровня
256 - число директорий второго уровня (на директориях экономить не советую, сам столкнулся - кончились папки, но лимит по размеру кэша ещё не был достигнут, инет в итоге работает, но жутко тормозит. Как на модеме хреновеньком.... На 10-ти мегабитной-то линии....)
cache_access_log - местоположение файла логов доступа пользователей к инету - кто, куда, сколько.
cache_log - лог собственно сквида - результаты запусков-остановок, результаты работы с кэшем.
cache_store_log - лог что сохранено в кэше на диске
cache_mgr - е-майл администратора, выводится при ошибках или если доступ к странице запрещён.
visible_hostname - видимое снаружи имя хоста
tcp_outgoing_address - внешний адрес сервера
redirect_program - программа редиректор (занимается анализом запрашиваемых URL и может производить с ними какие-то действия, у меня раньше, таким макаром был прикручен антивирус на проверку входящего http-траффика, а щас висит скрипт срезающий порнуху, от антивиря пришлось отказаться - примерно 30-40% лишнего траффика было, т.к. сайты нынче в основном динамические...)
redirect_children - число процессов программы-редиректора
Затем идут ACL-ы, разрешающие или запрещающие пользование http и поддержка прозрачного проксирования. ACL denied_sites закомментирован, можно пользоваться им самим, но я предпочитаю натравить на него внешнюю программу-редиректор, тогда можно будет вносить в него не сайты целиком, а ключевые слова по которым будет резаться URL - типа sex, deffki, porewo.... Если в запросе будет такое слово (неважно, в середине пути, в имени сервера, или названии файла) то не такой адрес пользователя не пустят. Можно таким макаром зарезать всю графику, например, написать jpg, jpeg, png, gif и всё - графики больше нет :) Можно резать флэши, файлы с нежелательными расширениями, да что угодно....
Учтите, строки типа acl allowed_sites dstdomain "/usr/local/my_doc_smb/squid/allowed_sites.conf" - это одна строка, просто у меня в листинге конфига не влезло и я её так перенёс.
coredump_dir - директория куда будет писаться дамп программы в случае критической ошибки и последующего "выпадания в корку"
pid_filename - имя файла где хранится идентификатор запущенного squid`a
Файлы с запретами и разрешениями (/usr/local/my_doc_smb/squid/allowed_sites.conf,
/usr/local/my_doc_smb/squid/limited_IP.conf,
/usr/local/my_doc_smb/squid/denied_ext.conf) так странно лежат по причине, что из локалки у меня к ним открыт доступ по самбе, просто мне их так удобней редактировать :)
   Создаём файлы, папки и запускаем squid:
/usr/local/etc/squid/>mkdir -p my_doc_smb/squid
/usr/local/etc/squid/>mkdir -p mkdir /var/log/squid
/usr/local/etc/squid/>touch /usr/local/my_doc_smb/squid/allowed_sites.conf
/usr/local/etc/squid/>touch /usr/local/my_doc_smb/squid/limited_IP.conf
/usr/local/etc/squid/>touch /usr/local/my_doc_smb/squid/denied_ext.conf
/usr/local/etc/squid/>touch /usr/local/etc/squid/redirector.pl
/usr/local/etc/squid/>chmod +x redirector.pl
/usr/local/etc/squid/>chown -R squid:wheel /var/log/squid/
/usr/local/etc/squid/>echo 'squid_enable="YES"' >> /etc/rc.conf
/usr/local/etc/squid/>squid -z
2005/09/20 14:51:04| aclParseAclLine: WARNING: empty ACL: acl
2005/09/20 14:51:04| aclParseAclLine: WARNING: empty ACL: acl
2005/09/20 14:51:04| aclParseAclLine: WARNING: empty ACL: acl
2005/09/20 14:51:04| Creating Swap Directories

Всё нормально, не считая ругани на пустые файлы ACL. На это можно не обращать внимания, или забить туда какие-ньть адреса. Тогда он  ругаться перестанет.
   Вот содержимое файла /usr/local/etc/squid/redirector.pl
#!/usr/bin/perl

$0 = 'redirect' ;
$| = 1 ;

open (IN_FILE, "/usr/local/my_doc_smb/squid/denied_ext.conf") || die $!;
my @tmp_data = <IN_FILE>;
chomp @tmp_data;
push @banners, map { qr /\Q$_\E/ }  grep { ! /^\s*$/ } @tmp_data;
close IN_FILE;

while (<>) {
    ($url, $who, $ident, $method) = /^(\S+) (\S+) (\S+) (\S+)$/ ;
    $url = 'http://mail.my_domain.ru/zaglushka.jpg'
        if grep ($url=~/$_/i, @banners) ;
    print "$url $who $ident $method\n" ;
}

Это простенький перловый скрипт, перебирающий переданный ему URL на соответствие шаблонам лежащим в файле denied_ext.conf, и если они подходят, то вместо этого УРЛа он отдаёт другой - http://mail.my_domain.ru/zaglushka.jpg по которому лежит мелкий рисунок серого цвета (белый неудобно - у меня до кучи он баннеры режет и белые дыры на страницах не смотрятся вообще...)
   Ну, а теперь пристегните ремни, сейчас мы попробуем взлететь со всем этим хозяйством (копирайт из старого-старого анекдота):
/usr/local/etc/squid/>../rc.d/squid.sh start
Starting squid.
2005/09/20 15:28:35| aclParseAclLine: WARNING: empty ACL: acl allowed_sites
2005/09/20 15:28:35| aclParseAclLine: WARNING: empty ACL: acl limited_IP
2005/09/20 15:28:35| aclParseAclLine: WARNING: empty ACL: acl denied_sites
/usr/local/etc/squid/>ps -ax | grep squid
73072  ??  Ss     0:00.00 /usr/local/sbin/squid -D
73074  ??  D      0:04.75 (squid) -D (squid)
73087  p0  D+     0:00.00 grep squid
/usr/local/etc/squid/>ps -ax | grep perl
73075  ??  Is     0:00.03 redirect (perl)
73076  ??  Is     0:00.03 redirect (perl)
73077  ??  Is     0:00.03 redirect (perl)
73078  ??  Is     0:00.03 redirect (perl)
/usr/local/etc/squid/>sockstat | grep perl
squid    squid    73074   14 tcp4   127.0.0.1:3248        127.0.0.1:4480
squid    squid    73074   15 tcp4   127.0.0.1:3922        127.0.0.1:2536
squid    squid    73074   16 tcp4   127.0.0.1:2393        127.0.0.1:3906
squid    squid    73074   21 tcp4   *:3128                *:*
squid    squid    73074   22 udp4   *:3401                *:*
squid    squid    73072    4 dgram  syslogd[83]:3
squid    perl     73076    0 tcp4   127.0.0.1:4371        127.0.0.1:1506
squid    perl     73076    1 tcp4   127.0.0.1:4371        127.0.0.1:1506
squid    perl     73075    0 tcp4   127.0.0.1:1596        127.0.0.1:2215
squid    perl     73075    1 tcp4   127.0.0.1:1596        127.0.0.1:2215

Всё нормально. Добавляем правило в файрволл (ipfw), до divert natd:
fwd 127.0.0.1,3128 tcp from 192.168.0.0/24 to any 80 via fxp0

Где fxp0 - внешний интерфейс, и всё, можно работать. Если на ходу возникает необходимость переконфигурить squid то перезапускать необязательно, можно дать команду
/usr/local/etc/squid/>squid -k reconfigure

или
/usr/local/etc/squid/>killall -1 squid

этого вполне достаточно.
   Заполняйте файлы с разрешениями-запретами, и пользуйтесь. Клиентов настраивать не нужно - достаточно указать шлюзом по-умолчанию машину со squid - всё остальное сделает ipfw - перекинет пакеты на squid.
   Как проанализировать логи на предмет кто, куда и зачем шарился - смотрите тут.



размещено: 2005-09-20,
последнее обновление: 2007-11-08,
автор: lissyara


Roman, 2006-02-05 в 20:22:34

Почему если запретить сайт например www.ya.ru ( в denied_ext.conf)...то не пускает как и надо. А если в адресе ввести просто ya.ru (не www.ya.ru ) то ПУСКАЕТ ???

lissyara, 2006-02-05 в 20:58:25

он сравнивает всю строку. Т.е. если запретить ya.ru то не попадёшь ни на ya.ru ни на www.ya.ru....

vbs, 2006-03-10 в 9:31:57

Здоров, lis!
Спасибо большое, отличная статья! Пробую сделать все как ты говоришь, но что-то не идеть... Или руки у меня кривые, или что-то я незнаю... или...
Но, при запуске squid идет ругань на пустые ACL - что нормально, но и такие сообщения
2006/03/09 19:54:33| WARNING: '0.0.0.0/0.0.0.0' is a subnetwork of '0.0.0.0/0.0.0.0'
2006/03/09 19:54:33| WARNING: because of this '0.0.0.0/0.0.0.0' is ignored to keep splay tree searching predictable
2006/03/09 19:54:33| WARNING: You should probably remove '0.0.0.0/0.0.0.0' from the ACL named 'all'
2006/03/09 19:54:33| WARNING: '127.0.0.1' is a subnetwork of '127.0.0.0/255.0.0.0'
2006/03/09 19:54:33| WARNING: because of this '127.0.0.1' is ignored to keep splay tree searching predictable
2006/03/09 19:54:33| WARNING: You should probably remove '127.0.0.1' from the ACL named 'localhost'
*************************************************
Делаю ps -ax | grep perl
вижу с десяток строк типа
73075  ??  Is     0:00.03 redirect (perl)
73076  ??  Is     0:00.03 redirect (perl)
73077  ??  Is     0:00.03 redirect (perl)
Кстати, в статье по этой команде два одинаковых вывода - это опечатка, или все правильно?
Может подскажешь куда смотреть по поводу WARNING - потому как победить не удалось.


lissyara, 2006-03-10 в 9:40:52

1. За ошибку - пасиб. Там во втором случае sockstat, а не ps
2. Вопросы - в форум, ибо у тя явно не мой конфиг - потому не забудь его приложить...

W01and, 2006-05-23 в 18:20:42

а на эту строчку:
acl limited_IP src \"/usr/local/my_doc_smb/squid/limited_IP.conf"

squid тока у меня ругается?
decode_addr: Invalid IP address '\"'
squid.conf line 1890: acl limited_IP src \"/usr/local/ect/squid/limited_IP.conf"
aclParseIpData: Ignoring invalid IP acl entry: unknown first address '\"'
aclParseAclLine: WARNING: empty ACL: acl limited_IP src \"/usr/local/ect/squid/limited_IP.conf"

bonh, 2006-07-19 в 15:01:41

Ругается на строчу:
acl     limited_IP      src             \
"/usr/local/my_doc_smb/squid/limited_IP.conf"

в ней либо надо "\" убраль либо "src" заменить на "dstdomain"
тогда всё нормально

bonh, 2006-08-28 в 8:49:48

Хорошая статья всё просто и понятно :), для тех кто хочет более углублённоё изучить данный демон советуюю помимо данной статьи зайти на сайт http://squid.opennet.ru/ ;)

chinga, 2006-09-19 в 9:08:46

Вот хорошая статья для начинающих http://www.opennet.ru/base/net/squid_auth.txt.html
Как раз этого мне не хватало 2 недели назад

Max Yurchak, 2006-09-19 в 17:25:25

Всем привет, я кончно могу ошибаться но с таким правилом форварда
fwd 127.0.0.1,3128 tcp from 192.168.0.0/24 to any 80 via fxp0
у меня не заработало, а заработало вот с каким
fwd 192.168.0.1,3128 tcp from 192.168.0.0/24 to any 80 via fxp0

warwar, 2007-01-12 в 14:05:00

хотелось бы еще рассмотреть вопрос ограничения скорости скачивания файлов самим сквидом как для конкретного пользователя, так и для группы пользователей, причем как на интерфейсе локальной сети, так и на интерфейсе провайдера (возможно и неодного)

AlkB, 2007-02-11 в 12:31:29

Необходимо в squid.conf также добавить строку:
httpd_accel_with_proxy on # иначе при работе в режиме акселератора отключается кеширование
Если ее не добавить, то acl у мнея нормально не работал

lissyara, 2007-02-11 в 15:19:51

в 2.6 сменился формат конфига, все опции типа httpd_accel* более не применяются:
/usr/local/etc/rc.d/squid start
Starting squid.
2007/02/11 15:17:58| parseConfigFile: line 67 unrecognized: 'httpd_accel_host virtual'
2007/02/11 15:17:58| parseConfigFile: line 68 unrecognized: 'httpd_accel_port 80'
2007/02/11 15:17:58| parseConfigFile: line 69 unrecognized: 'httpd_accel_uses_host_header on'

Вместо них добавился параметр в такую строку:
http_port 3128 transparent

evil, 2007-03-19 в 19:12:05

vhost забыл

evil, 2007-03-19 в 19:13:01

http_port 3128 transparent vhost
у меня почему то без vhost отказался работать

Fox, 2007-03-27 в 9:16:38

фря 6.1, перл 5.8.8, сквид 2.6.стабле12
возникла проблема при передаче запроса из сквида в redirector.pl - не резал по шаблонам из denied_ext.conf. оттрассировав, понял - передаются не четыре праметра, а пять: 205.188.153.249:443 66.197.159.133/- - CONNECT - ($url, $who, $ident, $method) = ^(\S+) (\S+) (\S+) (\S+)$/ меняем на ($url, $who, $ident, $method, $hz) = /^(\S+) (\S+) (\S+) (\S+) (\S+)$/, соответсвенно и последний принт-вывод меняем. это так -из личного опыта.

senatum, 2007-06-10 в 14:38:59

Спасибо за старание :)

LMik, 2007-08-02 в 11:26:52

сразу завелось, сделал только наоборот - разрешил все сайты и скриптом проверка на запреты, ну и список разрешенных ипов.
+добавил для приятности
error_directory /usr/local/etc/squid/errors/Russian-1251

rserg, 2007-08-15 в 12:02:19

спасибо за статью!
насчет директории с ошибками, так лучше наверно всетаки юникод использовать :)
а вместо ручного редиректора
redirect_program /usr/local/etc/squid/redirector.pl
использовать squidGuard, где и свои ссылочки можна вносить и фильтрацию для отдельных пользователей и еще куча вкусностей и возможностей

Corvex, 2007-10-10 в 0:38:57

Мне думается, что правильнее указывать http_port int_IP:3128 где int_IP внутренний IP сервера (который смотрит на клиентов). Ибо если указать без IP адреса то сквид слушает на всех интерфейсах.

AlSt, 2007-11-02 в 16:53:16

как ограничивать сайты по отдельным словам:
acl acl_banner   url_regex -i "/usr/local/squid/etc/banner"
acl acl_nobanner url_regex -i "/usr/local/squid/etc/nobanner"
http_access allow acl_nobanner
http_access deny  acl_banner


и все - это заместо denied_sites
работает в 2.6 stable3

AYM, 2008-03-26 в 23:56:45

К сожалению остался за кадром вопрос о пользователе, от имени которго работает SQUID и о раздаче прав...

Andrey, 2008-11-23 в 8:02:39

Для squid 2.7 никто не напишет статейку, с приведением конфига с пулами? Буду оч. благодарен

Nick, 2009-06-02 в 19:17:05

Привет,
А как обстоит дело с https , pop, smtp, и др. траффом?  

lissyara, 2009-06-02 в 19:35:45

Явно лучше, чем со чтением вами документации

CTOPMbI4, 2009-07-12 в 14:39:31

 в конфиге нужно указать внешний ип адрес tcp_outgoing_address но у меня динамиком.
Как можно обойти?

CTOPMbI4, 2009-07-12 в 15:10:12

Как сделать авторизацию по логин пасс.?

Igor24, 2010-03-09 в 17:16:43

А что и где нужно поменять, если я к интернет подключаюсь  через  PPPoE ? Обычный шлюз я установил (достаточно было указать в rc.conf строчку gateway_enable=\"YES\", и прописать DNS провайдера). У всех интернет есть, но я хочу поставить прокси как тут описано. Фаервол встал отлично, все правила прописал. Сквид настроил как тут описано. Но инета теперь ни у кого нет. Видимо надо еще дополнительно писать про интерфейс tun0 (через которое и идет соединение с интернет) но как не знаю... Подскажите, пожалуйста!

Pavel, 2010-06-24 в 10:35:56

Народ а можно сделать сжатие картинок?

Артемка, 2010-11-23 в 17:29:26

В новых версиях не катит ужо )))
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_uses_host_header on

пользуемся http_port 3128 transparent например

remort, 2012-02-14 в 17:16:20

что то так и не освещена тема мультипроцессорности. а именно:
где гарантия что при запуске второго squid'а он не припишется к этому же ядру, на котором уже запущен первый процесс сквида? помоему выбор ядра ОС выбирает сама и в случайном порядке.

zaqwerw, 2012-08-10 в 22:13:02

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

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_uses_host_header on

на

http_port 3128 transparent

Дмитрий, 2013-07-08 в 0:14:15

А я пользуюсь бесплатным Zentyal и не парюсь с настройками. Он кстати хорошо русифицирован.

Spileton, 2015-03-30 в 16:52:29

http://libreportal.net/advice/Squid-NCSA.html
http://libreportal.net/advice/squid-IP-autorization.html
Настраивал Squid по этим двум статьям всё думал 2015 почему периодически squid3 дохнет и перестаёт запускаться. Разбираться было всё время лень... Просто всё заного настраивал. А тут полез и выяснил. Он не может достучаться до: /tmp/squid3-cache ... Кажется /tmp чистится вхлам после любого shutdown-а. А сам squid3 не создаёт эту директорию сам. В итоге он не может подняться. Может быть есть решение по-лучше?



 

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

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.083 секунд
Из них PHP: 28%; SQL: 72%; Число SQL-запросов: 63 шт.
У Вас отключено GZIP-сжатие в браузере. Размер страницы 63506