Установка и настройка прокси-сервера на основе Squid во FreeBSD

Данная статья описывает установку и настройку прокси сервера на основе squid-2.5.14 с использованием аудентификации по mac адресу с ограничением скорости закачки с помощью пулов задержки, анализа статистики лога с помощью sarg-2.2. А также в кратце описан процесс поднятия WWW сервера на основе apache-1.3.36 для удобства доступа до статистики полученной sarg.

Для начала надо пересобрать ядро с поддержкой 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

#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

Разберем конфигурационный файл.

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

сколько оперативной памяти сквид может забрать под свои нужды. По умолчанию стоит 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.

http://bozza.ru/?c=127&p=content

Обновлено: 12.03.2015