четверг, 15 июля 2010 г.

Squid 3.1.0.13, PF. Transparent proxy on FreeBSD.

Squid — программный пакет, реализующий функцию кэширующего прокси-сервера для протоколов HTTP, FTP, Gopher и (в случае соответствующих настроек) HTTPS. Разработан сообществом как программа с открытым исходным кодом (распространяется в соответствии с GNU GPL). Все запросы выполняет как один неблокируемый процесс ввода/вывода.

Используется в UNIX-like системах и в ОС семейства Windows NT. Имеет возможность взаимодействия с Active Directory Windows Server путём аутентификации через LDAP, что позволяет использовать разграничения доступа к интернет ресурсам пользователей, которые имеют учётные записи на Windows Server, также позволяет организовать «нарезку» интернет трафика для различных пользователей.


Итак начнём!

Все манипуляции проводились на:

FreeBSD xx.xxx.ru 8.0-RELEASE-p3 FreeBSD 8.0-RELEASE-p3 #1: Mon Jul 12 07:16:57 UTC 2010 root@xx.xxx.ru:/usr/obj/usr/src/sys/GENERIC i386

Установка и настройка squid:


# cd /usr/ports/www/squid31

# make config

В разделе опций я выбрал:

[X] SQUID_DELAY_POOLS Enable delay pools  - Добавляет возможность ограничения скорости.

[X] SQUID_PF Enable transparent proxying with PF - Добавляет возможность использовать прозрачный прокси с фаерволом PF. Если вы используйте IPFW то вам достаточно изменить эту опцию на [X] SQUID_IPFW

Далее делаем

# make install clean

по окончании установки начинаем конфигурировать наш прокси.

Конфиг находится по адресу /usr/local/etc/squid/squid.conf

В версии squid`a 3.1 конфигурационный файл достаточно скуден, поэтому мы будем дописывать в него необходимое.

Ниже приведен мой конфиг:

acl manager proto cache_object

acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8

acl wifi_net src 192.168.9.0/24

acl SSL_ports port 443
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 CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

http_access allow wifi_net
http_access allow localhost
http_access deny all

http_port 127.0.0.1:3128 transparent

hierarchy_stoplist cgi-bin ?
coredump_dir /usr/local/squid/cache

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320

visible_hostname your_hostname
via off
forwarded_for off
cache_mem 256 MB
maximum_object_size_in_memory 512 KB
cache_dir ufs /usr/local/squid/cache 2048 256 512
cache_mgr your_contacts

Каждый параметр расписывать не буду. Укажу только ключевые!

http_port 127.0.0.1:3128 transparent -Указывается интерфейс и порт на котором будет сидеть squid и принимать запросы. Слово transparent говорит нам о том что прокси прозрачный.

acl wifi_net src 192.168.9.0/24 - Тут я указал acl моей локальной сети. Вы можете обозвать свою как угодно, я назвал wifi_net, так как у меня сеть беспроводная

http_access allow wifi_net - Разрешаю доступ машинам моей подсети к прокси-серверу. Дописывать данный параметр нужно обязательно перед http_access deny all.

После манипуляций с конфигом создаем своп директории командой

# squid -z

Если все выполнилось без ошибок то идем дальше!

В /etc/rc.conf дописываем строку

squid_enable="YES"

И пробуем запустить

# /usr/local/etc/rc.d/squid start

Если ошибок нет, проверяем

# ps ax | grep squid

Должен быть вывод вроде этого:

59469 ?? Is 0:00.00 /usr/local/sbin/squid
59471 ?? S 0:09.18 (squid) (squid)

Проверим порт:

#sockstat | grep 3128

Должны получить:

squid squid 59471 14 tcp4 127.0.0.1:3128 *:*

На этом конфигурирование squid`a закончено. Вы можете ознакомиться с документацией на официальном сайте http://www.squid-cache.org/ для дополнительного конфигурирования прокси.

Теперь нам нужно завернуть весь HTTP трафик с пользователей на наш проксик.

Я использую в качестве фаервола PF. Конфигурационный файл находится по адресу /etc/pf.conf. В него перед секцией NAT добавляем:

rdr on $wlan_if inet proto tcp from $wlan_net to any port www -> $proxy_if $proxy_port

где $wlan_if, $wlan_net, $proxy_if, $proxy port мои переменные интерфейсов и сетей, вам соответственно нужно подставить свои, если конечно они у вас определены!

Обновляем правила фаервола

# pfctl -f /etc/pf.conf

Если вы все сделали правильно то в /usr/local/squid/logs/access.log должны писаться сообщения о том кто куда ходит!

Статья написана грубо и примитивно, не вдаваясь в подробности. В дальнейшем напишу о том как настроить delay pools для ограничения трафика, как запретить пользователя лазить где попало и  расскажу про различные веб-морды для просмотра статистики посещений!