среда, 13 мая 2009 г.

Настройка прозрачного прокси-сервера Squid

Все команды выполнялись от прав пользователя root.
Настроил на работе сервер для предоставления доступа пользователем 2-х локальных сетей в интернет. И естественно, получилось так, что пользователь который первым поставил файл\файлы на закачку, забирал всю «ширину» канала себе, следовательно Интернет для остальных представлял собой жалкое зрелище: страницы долго открываются, часто происходит обрыв сессий и т.д. Поэтому было решено установить прозрачный прокси-сервер – Squid3 с редиректом – SquidGuard для ограничения доступа к нерабочим ресурсам, обрезания рекламы и т.д. Операции по установке и настройке данной связки я тут и опишу:
1. Устанавливаем Squid — 'apt-get install squid3'. После установки останавливаем его, ибо нужно сконфигурировать его под наши нужды - '/etc/init.d/squid3 stop'.
2. Устанавливаем редирект SquidGuard – 'apt-get install squidguard'.
3. Собственно редактируем файл прокси-сервера — '/etc/squid3/squid.conf', должно получится примерно следующее:
# минимальная конфигурация
# у меня в фале 'deny_inet_hosts1' хранятся IP адреса не имеющие доступа в интернет
# как оказалось сквид всеравно пробрасывал их в интернет, пришлось прикрутить
# этот список к Squid'у
acl bn1 src "/etc/deny_inet_hosts1"
# описываем сети
acl Net1 src 192.168.0.1
# а тут описываем привилегированных пользователей админов и начальство
acl Admins src 192.168.0.17 192.168.0.2 192.168.0.21 192.168.0.22 192.168.0.3 192.168.0.33 192.168.0.35
acl manager proto cache_object
# описываем локалхост
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
# описываем запрет к отвлекающим от работы сайтам
acl zapret dstdomain .vkontakte.ru .odnoklassniki.ru .my.mail.ru .blogs.mail.ru .horo.mail.ru .news.mail.ru .games.mail.ru .auto.mail.ru .map.mail.ru .rabota.mail.ru .travel.mail.ru .lady.mail.ru .deti.mail.ru .realty.mail.ru .video.mail.ru .cards.mail.ru .pogoda.mail.ru .afisha.mail.ru .mobile.mail.ru .soft.mail.ru .otvet.mail.ru .chat.mail.ru .sowbiz.mail.ru .torg.mail.ru .love.mail.ru .foto.mail.ru .content.mail.ru .odnoklasniki.ru .adobe.com .radio.tut.by .blog.tut.by .i.tut.by .update.icq.com
################# PORTS ##################
# Открываем нужные порты
acl SSL_ports port 443 563
#acl SSL_for_client_banks port 910 8443 4500
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 Jabber_ports port 5222 #jabber
acl Pop_ports port 110 #
acl Smtp_ports port 25 #
acl Icq_ports port 5190 #
# разрешаем соединение типа CONNECT для нужных протоколов
acl CONNECT method CONNECT
#http_access allow CONNECT Jabber_ports
http_access allow CONNECT Icq_ports
http_access allow CONNECT Pop_ports
http_access allow CONNECT Smtp_ports
############### ACCESS CONTROLL############
# назначаем права доступа
# пропускаем sqstat
http_access allow manager localhost
http_access deny manager
# запрещаем досуп к сайтам
http_access deny zapret
# зарубаем все порты кроме safe_ports
http_access deny !Safe_ports
# зарубаем конект кроме как к SSL
http_access deny CONNECT !SSL_ports
# блокирум IP адреса не имеющие доступа в интернет
http_access deny bn1
# разрешаем инет сетям
http_access allow Net1
icp_access deny all
htcp_access deny all
# админам выделяем всю ширину канала
# выделяем на все подсети максимальный канал (-1), каждому пользователю даем
# скорость максимум в 5 Кб\сек после того, как он скачает на максимальной
# скорости первые 300 Кб файла
delay_pools 2
delay_class 1 2
delay_parameters 1 -1/-1 -1/-1
delay_access 1 allow Admins
delay_access 1 deny all
delay_class 2 2
delay_parameters 2 -1/-1 5000/300000
delay_access 2 allow Net1
delay_access 2 deny all
http_access allow all
############### NETWORK OPTIONS #############
# настройка порта для прокси
http_port 3128 transparent
##### OPTIONS WHICH AFFECT THE NEIGHBOR SELECTION ALGORITHM #####
# pfghtoftv r'ibhjdfnm CGI-скрипты
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
########### MEMORY CACHE OPTIONS ###########
# размер ОЗУ под кэш (по default 8 Мв)
cache_mem 32 MB
# ############ DISK CACHE OPTIONS ###############
# Max размер объекта записываемого в кэш
maximum_object_size 16384 KB
# Место кэша и размер 50 Гб 16 директорий 1-го уровня 256 2-го
cache_dir ufs /var/spool/squid3/cache 50000 16 256
# Адрес пользователя ответственного за очистку переполненого кэша
#cache_mgr root@test.ru
# Пользователь от имени какого работает Squid
cache_effective_user proxy
# Разрешаем управлять кэшем с помощью cachemgr.cgi с паролем "passwd"
#cachemgr_passwd passwd all
################ LOGFILE OPTIONS ####################
# Лог доступа к кэшу
cache_access_log /var/logs/squid3/access.log
# Лог работы кэша
cache_log /var/logs/squid3/cache.log
# Лог работы менеджера кэша
cache_store_log none
# Ротация логов
logfile_rotate 10
#mime_table /etc/squid3/mime.conf
#pid_filename /var/run/squid3.pid
########## OPTIONS FOR FTP GATEWAYING ##############
# Под этим юзером ходим в Ftp
#ftp_user vasa@pupkin.ru
# Разрешаем пассивный режим работы FTP
ftp_passive on
ftp_sanitycheck on
ftp_list_width 32
########## OPTIONS FOR URL REWRITING ##################
# Путь до редиректора
#redirect_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf
# Кол-во одновременных запусков редиректов
#redirect_children 5
########### OPTIONS FOR TUNING THE CACHE ##############
# Оставляем как есть
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern (cgi-bin|\?) 0 0% 0
refresh_pattern . 0 20% 4320
############ ERROR PAGE OPTIONS ###############
# Отсюда берем файлы стандартных сообщений об ошибках
error_directory /usr/share/squid3/errors/Russian-koi8-r
# Если Squid уже скачал 60% файла, а пользователь отказался его забирать, то всеравно продолжить скачивание
quick_abort_pct 60
# Время жизни запросов завершившихся ошибкой "connection refused" "404 Not Found"
negative_ttl 1 minutes
# Включить отправку сообщений об ошибках
#email_err_data on
# кому писать
#<А hrеf="mаilto:%w%W" mcе_hrеf="mаilto:%w%W">%w
################# DNS OPTIONS ###################
dns_testnames server.ex
# Путь к файлу hosts
hosts_file /etc/hosts
# Время жизни успешного DNS запроса.
positive_dns_ttl 6 hours
# Время жизни DNS запроса с ошибкой
negative_dns_ttl 5 minutes
############## MISCELLANEOUS ######################
# Место откуда берутся страницы с ошибками, сюда же ложим и свои
coredump_dir /var/spool/squid3
# Поддержка нестандартных Http запросов
half_closed_clients on
# Включать ли IP адрес клиента в заголовок Http запроса
forwarded_for on
# Вкл. сбор статистики по каждому клиенту
client_db on
4. Создаем необходимые директории и назначаем права доступа пользователям.
'mkdir /var/spool/squid3/cache' – тут у меня будет лежать кэш
'mkdir /var/log/squid3' — тут у меня будут лежать логи
Теперь необходимо обеспечить доступ пользователя от имени которого будут осуществлять доступ Squid к этим папкам. Узнать это можно командой 'cat /etc/squid3/squid.conf | grep cache_effectiv', должно выдать что-то похожее на это:
cache_effective_user proxy
т.е. получается что Squid работает от имени пользователя — proxy. Разрешаем этому пользователю доступ к созданным папкам ' chown -R proxy /var/spool/squid3/cache /var/log/squid3'.
5. В директории /var/log/squid3 создаем иерархию директорий для хранения кэша – '/usr/sbin/squid3 -z'.
6. Вот так у меня настроен squidguard
# путь к базе
dbhome /var/lib/squidguard/db
# путь к логам
logdir /var/log/squid
# рабочее время
time workhours {
weekly mtwhf 09:00 - 18:00
}
# создаем группы
src admin {
ip 192.168.0.3 192.168.0.33
# user root foo bar
within workhours
}
src lan {
ip 192.168.0.2 192.168.0.4-192.168.0.32 192.168.0.34-192.168.0.254 192.165.15.2-192.165.15.254
}


dest porno {
domainlist porn/domains
urllist porn/urls
log /var/log/squid/porno.log
}
dest warez {
domainlist warez/domains
urllist warez/urls
log /var/log/squid/warez.log
}
#dest ads {
#domainlist ads/domains
#urllist ads/urls
#}
dest spy {
domainlist spyware/domains
urllist spyware/urls
log /var/log/squid/spawere.log
}
dest hack {
domainlist hacking/domains
urllist hacking/urls
log /var/log/squid/hacking.log
}
dest drag {
domainlist drugs/domains
#urllist drugs/urls
log /var/log/squid/narkota.log
}
# указываем правила
acl {
admin {
pass any
}

lan within workhours {
pass !porno !warez !spy !hack !drag all
}
#else {
# pass any
# }

default {
pass none
}
}
7. Запускаем Squid — '/etc/init.d/squid3 start' и проверяем лог — /var/log/squid3/cache.log, если все нормально должны получить что-то вида:
8. Создаем правило в iptables для перенаправления локального трафика с 80 порта на порт Squid'а — 3128:
/sbin/iptables -t nat -A PREROUTING -i eth1 -s 192.168.0.0/24 -p tcp -d 0.0.0.0/0 --dport 80 -j REDIRECT --to-port 3128

8 комментариев:

Анонимный комментирует...

чет залил именно ваш squid.conf не блокирует у меня сайты котоырй вы там прописали...

Анонимный комментирует...

вырвиглазно , читать нереально

Анонимный комментирует...

Получилось, спасибо.
Правда в конфигах несколько ошибок нужно выловить, прежде чем заработает :)

Анонимный комментирует...

Огласите ошибки пожалуйста. Так удобно было бы готовый конфиг в сети иметь.

Анонимный комментирует...

как понимаю вот про это имелось в виду.

root@proxy:/var/log/squid3# /usr/sbin/squid3 -z
2013/03/21 11:56:15| strtokFile: /etc/deny_inet_hosts1 not found
2013/03/21 11:56:15| Warning: empty ACL: acl bn1 src "/etc/deny_inet_hosts1"
2013/03/21 11:56:15| cache_cf.cc(363) parseOneConfigFile: squid.conf:134 unrecognized: 'dns_testnames'
WARNING: Cannot write log file: /var/logs/squid3/cache.log
/var/logs/squid3/cache.log: No such file or directory
messages will be sent to 'stderr'.

Руслан aka Dethroner комментирует...

забыл указать что этот файл создать нужно /etc/deny_inet_hosts1
подробно описано в статье - http://dethroner.blogspot.com/2012/10/squid.html на примере пункта 3, за одним исключением в 3 пункте разрешенные адреса, а тут запрещенные

днс у меня ссылался на собственный бинд описанный в статье - http://dethroner.blogspot.com/2009/04/dns-root_06.html

Cannot write log file: проверьте права доступа к папкам и попробуйте создать файл вручную

ps. Писал материал очень давно, всего не упомяну. Конструктивная критика приветствуется.

Анонимный комментирует...

Здравствуйте!
Взял ваш конфиг как основу, отловил пару ошибок (точно помню что ругается что не существует acl all) squid завелся вроде как... но как только делаю перенаправление запросов на порт 3128 перестают открываться сайты. Что это может быть?..

Анонимный комментирует...

только что нашел причину, на самом деле squid не стартовал т.к. в конфиге ошибка пути к логам. У вас оказан путь /var/logs