главная - Статьи - Linux, FreeBSD - Прокси-сервер Squid
Настройка Squid
Теги: Настройка прокси Squid Настройка сервера
Автор: erasha@bsdportal.ru
Данная статья описывает настройку прокси сервера SQUID версии 2.5.14 с использованием аудентификации по mac адресу с ограничением скорости закачки с помощью пулов задержки, анализа статистики лога с помощью sarg-2.2. А также в кратце описан процесс поднятия WWW сервера на основе apache-1.3.36 для удобства доступа до статистики полученной sarg. Для тех, кто торопиться, может помочь статья "Быстрая настройка Squid". А тех, кто считает, что все равно с быстрой настройки сюда же и вернуться, прошу читать дальше.
Настройка сервера FreeBSD с поддержкой NAT
Для начала надо пересобрать ядро с поддержкой DIVERT для NAT и ipfw.
Добавляем вот это в конфигурационный файл ядра:
options IPFIREWALL options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=100 options IPFIREWALL_FORWARD options IPFIREWALL_FORWARD_EXTENDED options IPDIVERT
пересобираем ядро и устанавливаем его. Затем в файл /etc/rc.conf добавляем
firewall_enable="YES" firewall_script="/etc/rc.ipfw1" natd_enable="YES" natd_interface="fxp0"
первая строка включает firewall ipfw, вторая указывает какой скрипт указания правил использовать при загрузке, третья включает NAT, чертвертая определяет на каком внешнем сетевом интерфейсе будет работать NAT. В моем случае внешний интерфейс fxp0.
потом создаем файл rc.ipfw1 и ставим ему безопасные права
#cd /etc #touch rc.ipfw1 #chmod 600 rc.ipfw1
с таким содержанием
#!/bin/sh fwcmd="/sbin/ipfw" ${fwcmd} -f flush # VAR if_inet="fxp0" # внешний сетевой интерфейс ip_inet="aaa.aaa.aaa.aaa" # ip внешнего сетового интерфейса net="bbb.bbb.b.b/24" # ваша подсетка # Local ${fwcmd} add allow all from any to any via lo0 ${fwcmd} add deny all from any to 127.0.0.0/8 ${fwcmd} add deny all from 127.0.0.0/8 to any # тут разрешаю SSH чтоб безбоязненно можно было удаленно # править правила которые идут дальше ${fwcmd} add allow tcp from any to any ssh ${fwcmd} add allow tcp from any ssh to any # anti spoofing #1 ${fwcmd} add deny all from any to 10.0.0.0/8 via ${if_inet} ${fwcmd} add deny all from any to 172.16.0.0/12 via ${if_inet} ${fwcmd} add deny all from any to 192.168.0.0/16 via ${if_inet} ${fwcmd} add deny all from any to 0.0.0.0/8 via ${if_inet} ${fwcmd} add deny all from any to 169.254.0.0/16 via ${if_inet} ${fwcmd} add deny all from any to 192.0.2.0/24 via ${if_inet} ${fwcmd} add deny all from any to 224.0.0.0/4 via ${if_inet} ${fwcmd} add deny all from any to 240.0.0.0/4 via ${if_inet} # NAT ${fwcmd} add divert 8668 ip from ${net} to any out via ${if_inet} ${fwcmd} add divert 8668 ip from any to ${ip_inet} in via ${if_inet} # anti spoofing #2 ${fwcmd} add deny all from 10.0.0.0/8 to any via ${if_inet} ${fwcmd} add deny all from 172.16.0.0/12 to any via ${if_inet} ${fwcmd} add deny all from 192.168.0.0/16 to any via ${if_inet} ${fwcmd} add deny all from 0.0.0.0/8 to any via ${if_inet} ${fwcmd} add deny all from 169.254.0.0/16 to any via ${if_inet} ${fwcmd} add deny all from 192.0.2.0/24 to any via ${if_inet} ${fwcmd} add deny all from 224.0.0.0/4 to any via ${if_inet} ${fwcmd} add deny all from 240.0.0.0/4 to any via ${if_inet} # все остальное разрешить (желательно только то что нужно =) ) ${fwcmd} add allow all from any to any
сразу отмечу для создания правил безопастности более индивидуально посетите хороший сайт http://ipfw.ism.kiev.ua/ посвященный настройки firewall ipfw и эти правила для aaa.aaa.aaa.aaa реального IP
Изменения вносить лучше в /etc/rc.conf и создание /etc/rc.ipfw1 до перезагрузки после установки пересобранного ядра.
Собственно настройка Squid
Устанавливаем Squid командами:
#cd /usr/ports/www/squid #make config
или так
cd /usr/ports/www/squid && make config
ставим галочки напротив
SQUID_DELAY_POOLS SQUID_ARP_ACL SQUID_RCNG
к уже установленным. Первая строка включает поддержку пулов задержки для ограничения скорости, вторая включает поддержку использования в ACL МАС адресов, третья указавает на создание загрузочного скрипта в rc.d . Нажимаем ОК. Потом делаем
#make install clean
Затем идем в /usr/local/etc/squid создаем файл squid.conf с безопасными правами
#touch squid.conf #chmod 600 squid.conf
или можно, как вариант, скопировать еще не настроенный конфигурационный файл Squid по умолчанию и его редактировать.
#cp ./squid.conf.default ./squid.conf
У меня squid.conf примерно имеет такое содержание:
http_port 3128 icp_port 3130 hierarchy_stoplist cgi-bin ? acl QUERY urlpath_regex cgi-bin ? no_cache deny QUERY cache_mem 32 MB maximum_object_size 2000 KB maximum_object_size_in_memory 1000 KB cache_dir ufs /usr/local/squid/cache 2000 16 256 auth_param basic children 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours auth_param basic casesensitive off refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern . 0 20% 4320 acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localnet src 192.168.0.0/24 acl localhost src 127.0.0.1/255.255.255.255 acl to_localhost dst 127.0.0.0/8 acl SSL_ports port 443 563 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 563 # https, snews 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 Icq_port port 5190 # icq acl Irc_port port 6667 # irc acl MSN_port port 1863 # msn messager acl CONNECT method CONNECT acl erasha arp XX:XX:XX:XX:XX:XX acl user1 arp XX:XX:XX:XX:XX:XX acl user2 arp XX:XX:XX:XX:XX:XX acl user3 arp XX:XX:XX:XX:XX:XX acl stop_files url_regex -i .mp3$ .vqf$ .rpm$ .avi$ .mpeg$ .rm$ .raw$ .wav$ .mov$ .ogg$ .exe$ .com$
acl StopWWW dstdomain "/usr/local/etc/squid/stopWWW.acl" http_access allow erasha http_access deny stop_files http_access deny StopWWW http_access allow user1 http_access allow user2 http_access allow user3 http_access allow CONNECT Icq_port http_access allow localnet Icq_port http_access allow CONNECT Irc_port http_access allow localnet Irc_port http_access allow CONNECT MSN_port http_access allow localnet MSN_port http_access allow manager localhost http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access deny all http_reply_access allow all icp_access allow all visible_hostname proxy icon_directory /usr/local/etc/squid/icons error_directory /usr/local/etc/squid/errors/Russian-koi8-r delay_pools 3 delay_class 1 2 delay_parameters 1 6000/2000 3000/2000 delay_access 1 allow user1 delay_access 1 deny all delay_class 2 2 delay_parameters 2 15000/3000 15000/3000 delay_access 2 allow user2 delay_access 2 deny all delay_class 3 2 delay_parameters 3 60000/3000 60000/3000 delay_access 3 allow user3 delay_access 3 deny all coredump_dir /usr/local/squid/cache
Файл настроек Squid изнутри
http_port 3128
указываем порт для запросов клиентов, можно задать 8080.
icp_port 3130
указываем номер порта Internet Cache Protocol (ICP) для открытия возможности использования кешей соседних squid прокси.
hierarchy_stoplist cgi-bin ?
Настроенный таким образом сервер Squid не будет кешировать динамически генерируемые страницы (поисковые сервера, некоторые другие серверы и чаты), а будет напрямую перенаправлять запрос серверу.
acl QUERY urlpath_regex cgi-bin ? no_cache deny QUERY
эти две строки примерно аналогичны предыдущей, но касательно кэша... то есть если каким-либо данные странички попали в кэш (ну например работал сквид без предыдущей строчки некоторое время), то они немедленно удаляются из кеша.
cache_mem 32 MB
настраиваем, сколько оперативной памяти сервер Squid может забрать под свои нужды. По умолчанию стоит 8 мегабайт, что хватит лишь при очень слабой загрузке.
maximum_object_size 2000 KB
максимальный размер объектов, которые будут сохранены на диск. По умолчанию стоит 4096 килобайт.
maximum_object_size_in_memory 1000 KB
максимальный размер объектов, которые будут сохранены в кэше. По умолчанию стоит 4096 килобайт.
cache_dir ufs /usr/local/squid/cache 2000 16 256
указывает сквиду, где сохранять кешируемые файлы. Указывает отдать под кеш 2000 мегабайт и создать 16 и 256 соответственно каталогов 1го и 2го уровня. Про каталоги сами все поймете, когда загляните в место, где у сквида кэш.
auth_param basic children 5
количество процессов авторизации запросов.
auth_param basic realm Squid proxy-caching web server
указываем надпись, которая будет выводиться с запросом авторизации.
auth_param basic credentialsttl 2 hours
указываем время хранения авторизации, в данном случае 2 часа.
auth_param basic casesensitive off
указываем, что регистр введенных данных роли не играет.
refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern . 0 20% 4320
в этих трех строках мы указываем сколько времени в минутах объект в кеше считается свежим и какой процент объектов оставлять с последнего обновления.
acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localnet src 192.168.0.0/24 acl localhost src 127.0.0.1/255.255.255.255 acl to_localhost dst 127.0.0.0/8 acl SSL_ports port 443 563 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 563 # https, snews 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 Icq_port port 5190 # icq acl Irc_port port 6667 # irc acl MSN_port port 1863 # msn messager acl CONNECT method CONNECT
Здесь с помощью acl мы задаем localhost, локальную сеть, порты на которые мы разрешим выходить программам через наш прокси. Также указываем manager протокол cache_object, используемого для управления и мониторинга кеша.
acl CONNECT method CONNECT
включает поддержку проброски соединения с помощью команды протокола CONNECT.
acl erasha arp XX:XX:XX:XX:XX:XX acl user1 arp XX:XX:XX:XX:XX:XX acl user2 arp XX:XX:XX:XX:XX:XX acl user3 arp XX:XX:XX:XX:XX:XX
с помощью acl...arp указываем МАС адреса сетевых карт пользователей, которым мы в дальнейшем разрешать/запрещать доступ к интернету. вместо XX:XX:XX:XX:XX:XX указываем МАС адрес сетевой карты компьютера пользователя. Скрипт для получения МАС адреса будет приведен в приложении.
acl stop_files url_regex -i .mp3$ .vqf$ .rpm$ .avi$ .mpeg$ .wav$ .mov$ .ogg$ .exe$ .com$
здесь мы указываем расширения файлов которые мы запретим для закачки.
acl StopWWW dstdomain "/usr/local/etc/squid/stopWWW.acl"
здесь указываем файл в котором указываем адреса сайтов на которые нельзя ходить юзерам. файл имеет такой вид
.zaycev.net .rmp.ru .berkova.net .sexmovies.ru .mp3real.ru .erovideo.ru .muzudar.ru
это как бы подборка сайтов sex содержания и с mp3, т.к. в stop_files мы не закрыли архивы, а на некоторых сайтах лежат mp3 с расширением например rar, и пользователи могут закачивать музыку потом меняя расширение у файлов, поэтому я решил запрещать сами сайты.
http_access allow erasha http_access deny stop_files http_access allow user1 http_access allow user2 http_access allow user3
Здесь мы разрешаем с помошь http_access allow доступ до интернета, а используя http_access deny запрещаем выкачивать stop_files с расширениями указанными выше. Обратите внимание что разрешение доступа до интернета для пользователя erasha стоит выше запрета на закачку stop_files. Это сделано для того чтобы на пользователя erasha не действовал запрет не закачку stop_files, а на остальных пользователей которым разрешен доступ до интернета указанным после запрета на stop_files этот запрет действует.
http_access allow CONNECT Icq_port http_access allow localnet Icq_port http_access allow CONNECT Irc_port http_access allow localnet Irc_port http_access allow CONNECT MSN_port http_access allow localnet MSN_port http_access allow manager localhost http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access deny all
В этих строках разрешаем использования метода CONNECT для локальной сети на Icq_port,Irc_port,MSN_port, разрешаем доступ maneger доступ до localhost. Запрещаем использование всех портов кроме Safe_ports, запрещаем метод CONNECT на все порты кроме SSL_ports, и в конце все запрещаем. Знак “!” используется как НЕ, т.е. если дословно http_access deny !Safe_ports запретить http доступ НЕ Safe_ports.
http_reply_access allow all
Разрешаем ответы на все запросы.
icp_access allow all
Разрешаем доступ до icp всем.
visible_hostname proxy
это имя будет упоминаться в сообщениях об ошибках.
icon_directory /usr/local/etc/squid/icons
Указываем католог с иконками
error_directory /usr/local/etc/squid/errors/Russian-koi8-r
Указываем католог с шаблонами страниц ошибок на нужном языке и в нужной кодировке, в нашем случае язык русский в Koi8-r кодировке
delay_pools 3 delay_class 1 2 delay_parameters 1 6000/2000 3000/2000 delay_access 1 allow user1 delay_access 1 deny all delay_class 2 2 delay_parameters 2 15000/3000 15000/3000 delay_access 2 allow user2 delay_access 2 deny all delay_class 3 2 delay_parameters 3 60000/3000 60000/3000 delay_access 3 allow user3 delay_access 3 deny all
Здесь мы создаем пулы задержки для ограничения по скорости пользоветелей. Пулы задержки делятся на три класса. Первый класс управляет одним потоком на всех кому резрешено использовать его. Используют когда достаточно задать скорость для всех без какого либо разграничения. Второй класс уже управляет общим потоком и управление потоком для каждого хоста из. Используется уже если нужно в сети распределить поток между хостами. Третий класс управляет общим потоком, потоком на всю подсеть и потоком для каждого хоста. Используется если есть необходимость распределить поток между подсетями и отдельными хостами в этих подсетях.
delay_pools 3
указываем сколько у нас будет всего пулов задержки, в нашем случае три.
delay_class 1 2
здесь указываем номер пула и его класс, т.е. пул номер один второго класса.
delay_parameters 1 6000/2000 3000/2000
здесь задаем параметры пула. Указаываем номер пула которому устанавливаем параметры, у нас №1, далее идет указание ограничения по скорости этого пула. 6000/2000 указывает что после закачки более 2000 байт установить скорость не выше 6000 байт/с, до 2000 байт закачка происходит без какого либо ограничения по скорости. исходя из того что у нас пул второго класса такое ограничение мы установили на общий поток, далее 3000/2000 указываем что каждому хосту после закачки более 2000 байт установить скорость 3000 байт.
вот как бы шаблон по которому думаю более нагладно разобраться
delay_parameters 3 total_rest/total_max - 1 класс delay_parameters 3 total_rest/total_max ind_rest/ind_max - 2 класс delay_parameters 3 total_rest/total_max net_rest/net_max ind_rest/ind_max - 3 класс
где total - на всех net - на подсеть ind - на отдельный адрес rest - скорость (в байт/сек) max - размер трафика при превышении которого устанавливается ограничение по скорости (в байтах)
еще если указать так
delay_parameters А -1/-1
то -1/-1 это указывает на отсутствие каких либо ограничений для пула А.
delay_access 1 allow user1
Разрешаем user1 успользовать пул номер 1.
delay_access 1 deny all
Запрещаем все остальным использовать пул номер 1.
Следующие пулы аналогичны первому по структуре.
coredump_dir /usr/local/squid/cache
Указываем куда сбрасывать core.
И на последок создадим swap директорию для squid
# /usr/local/sbin/squid -z
Добавим SQUID в автозагрузку (в /etc/rc.conf)
squid_enable="YES"
Запустим squid
# /usr/local/sbin/squid -D
Так вроде все с squid разобрались.
Теперь приступим к установке анализатора логов squid-a sarg -2.2
#cd /usr/ports/www/sarg #make install clean
или так
cd /usr/ports/www/sarg && make install clean
Затем идем в /usr/local/etc/sarg создаем файл sarg.conf с безопастными правилами
#touch sarg.conf #chmod 600 sarg.conf
или можно как вариант скопировать конфигурационный файл squid по умолчанию и его редактировать
#cp ./sarg.conf.default ./sarg.conf
у меня sarg.conf примерно имеет такое содержание
language Russian_koi8 access_log /usr/local/squid/logs/access.log graphs yes graph_days_bytes_bar_color orange title "МОЯ ОГРАНИЗАЦИЯ" font_face Tahoma,Verdana,Arial header_color darkblue header_bgcolor blanchedalmond font_size 10px header_font_size 10px title_font_size 11px background_color white text_color #000000 text_bgcolor blanchedalmond title_color green logo_image none logo_text_color #000000 background_image none output_dir /usr/local/sarg/squid-reports resolve_ip yes #lastlog 0 index yes overwrite_report no #output_email erasha@domain.ru max_elapsed 28800000 charset Koi8-r show_successful_message yes 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 #show_sarg_info yes #show_sarg_logo yes
разберем опции.
language Russian_koi8
Указываем язык который будет использоваться в отчётах
access_log /usr/local/squid/logs/access.log
Указываем где будет находиться лог squid который sarg будет анализировать
graphs yes graph_days_bytes_bar_color orange
Разрешаем формирование графиков
title "МОЯ ОГРАНИЗАЦИЯ"
Указываем загологок отчетов sarg
font_face Tahoma,Verdana,Arial header_color darkblue header_bgcolor blanchedalmond font_size 10px header_font_size 10px title_font_size 11px background_color white text_color #000000 text_bgcolor blanchedalmond title_color green logo_image none logo_text_color #000000 background_image none
Выше указываются размер,
output_dir /usr/local/sarg/squid-reports
Указываем где будут храниться отчёты
resolve_ip yes
разрешаем чтобы вместо ip компов sarg резолвил имена компов
#lastlog 0
параметр задает количество отчетов хранимых в каталоге, если он указан
index yes
создавать index-ный файл отчетов
overwrite_report no
Перезаписывать отчеты, здесь не перезаписываются а делаются еще один
#output_email erasha@domain.ru
можно при желании указать куда отправлять отчет, я это пока не использую
max_elapsed 28800000 charset Koi8-r
Кодировка надписей графика
show_successful_message yes
Показывать сообщение о удачном завершении анализа
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
Здесь указываются поля для статистики
#show_sarg_info yes #show_sarg_logo yes
Показать инфо по sarg и его лого, я пока отключил.
Так с настройкой анализатора логоф squid закончили.
Настройка веб-сервера для просмотра отчетов
Ставим www сервер для удобного просмотра отчетов sarg. Я выбрал Apache 1.3
#cd /usr/ports/www/apache13 #make install clean
или так
cd /usr/ports/www/apache13 && make install clean
потом делаем символьный линк
# ln - s /usr/local/sarg/squid-reports /usr/local/www
Единственное, в каталоге /usr/local/sarg/squid-reports пока не было сделано ни одного отчета. Я, используя Squid, открыл одну любую страницу, чтобы был хоть какой-то лог, потом запустил Sarg, он, анализируя лог, создавал отчет вместе с каталогами, а потом делал символьный линк и запускал Apache. Можно, конечно, каталоги сделать руками вот так:
#mkdir /usr/local/sarg/squid-reports #chmod 755 /usr/local/sarg/squid-reports
и надо создать пустой index.html для Apacha
#touch /usr/local/sarg/squid-reports/index.html #chmod 644 /usr/local/sarg/squid-reports/index.html
Далее идем в /usr/local/etc/apache
открываем на редактирование httpd.conf, идем на 330 строку правим
ServerAdmin you@your.address
например на
ServerAdmin erasha@domain.ru
т.е. указываем адрес куда apache будет отправлять письма со своими проблемами
далее на 355 строке указываем где лежат наши отчеты
DocumentRoot "/usr/local/www/squid-reports"
Для запуска при загрузки системы добавляем в /etc/rc.conf
apache_enable="YES"
и запускаем
/usr/local/etc/rc.d/apache.sh start
Так теперь можно проверить работают squid и apache у нас
#sockstat
смотрим на предмет наличия строк
www httpd XXX 16 tcp4 *:80 *:* squid squid XXX 12 tcp4 *:3128 *:*
Первая показывает что запущен apache, вторая что squid работает.
я пользуюсь маленьким скприптиком для получения mac адреса компа вот с таким содержанием
#!/bin/sh name=$1 ip=`ping -c1 $name | grep PING | awk '{print $3}' | sed 's/..$//' | sed 's/^(//'` ot=`arp -an|grep "($ip)"|awk '{print $4}'` echo $ot
я скриптик назвал mac.sh и пользую так
%mac.sh СетовоеИмяМашины_Или_IP ХХ:ХХ:ХХ:ХХ:ХХ:ХХ <-полученный МАС
если кто может предложить другой скрипт, поделитесь со мной, положу его в эту статью.
используя Cron собираю статистику с нарастающим итогом ежедневно и обнуляю итоги в начале каждого месяца
для этого добивил в /etc/crontab следующие строки
0 0 * * * erasha /usr/local/bin/sudo /usr/local/bin/sarg 15 0 1 * * root /usr/local/sbin/squid -k rotate
первая запускает sarg каждый день каждого месяца в 00:00 для подбивки итогов за период с первого числа месяца по текущий вторая делает ротацию логов squid, т.е. очищает текущий лог с переносом логов в архив. первую строку также можно сделать в таком виде
0 0 * * * root /usr/local/bin/sarg
Ну вроде все. Выражаю благодарность s1lv3r за внесенные исправления и подсказки . Также Grayich за указание на мои недочеты и ошибки. .
Да, еще, natd поднимаю для того что бы из вне нельзя было поднимать соединения с внутренней сеткой. Пробуйте, тестируйте, критикуйте и пишите мне на мыло erasha@bsdportal.ru или стучитесь в аську 144897928.
Автор: erasha@bsdportal.ru
Авторизуйтесь для добавления комментариев!