Версия – 1.01
В этой статье я не претендую на авторство, скорее это попытка систематизировать и обобщить сведения, которые находятся у разных источников и создать маленькое руководство, которое поможет избежать длительного серфинга в Сети.
Так как в своих отчетах NetUp UTM не производит преобразование ip-адресов в доменные имена, то их просмотр становится неудобным. Для того чтобы определить куда ходил пользователь, необходимо проделать кучу манипуляций.
Для того, чтобы упростить эту процедуру можно воспользоваться услугами прокси-сервера и его лога.
Так как в стандартной ситуации большую часть трафика занимает http, то картина, взятая из лога squid будет претендовать на объективность.
Мы сделаем так, чтобы пользователи находящиеся внутри сети, независимо от настроек клиента, не могли пройти мимо прокси-сервера, на котором стоит squid. В случае использования "обычного" прокси, клиент в программном обеспечении просмотра веб-страниц (обозревателе) должен указывать прокси-сервер и порт. Обозреватель выполняет запрос на прокси-сервер, который перенаправляет его к веб-серверу. Это все конечно хорошо, но иногда случаются ситуации, типа: - всем клиентам сети приходится настраиваться на прокси-сервер, хотят они этого или нет, - вы хотите, чтобы клиенты использовали прокси-сервер, но не хотите, чтобы они об этом знали, - вы хотите, чтобы клиенты использовали прокси-сервер, но не хотите настраивать сотни или тысячи веб-браузеров, - вы считаете статистику с помощью логов squid, и хотите, чтобы в логи попадало как можно больше информации.
На помощь вам приходит "прозрачный" прокси-сервер. Веб-запрос перехватывается прокси-сервером абсолютно прозрачно. Т.е. клиентское программное обеспечение думает, что работает с настоящим веб-сервером, хотя, на самом деле, работает с прокси-сервером.
Для того, чтобы HTTP-пакеты не пролетали мимо, нам нужно завернуть трафик с помощью firewall на squid.
Для Linux с ядром 2.4 или выше и файрволом на основе iptables:
iptables -t nat -A PREROUTING -d ! 192.168.0.0/16 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -d ! 192.168.0.0/16 -p tcp --dport 8080 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -d ! 192.168.0.0/16 -p tcp --dport 443 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -d ! 192.168.0.0/16 -p tcp --dport 8081 -j REDIRECT --to-port 3128
Ключ -d ! 192.168.0.0/16 введен для того чтобы исключить перенаправление на сквид запросов к локальным веб серверам.
(в стандартной ситуации достаточно портов 80 (http) и 443 (https)).
В squid.conf (для squid версий ниже 2.6) нужно добавить:
http_port 3128 (стоит по умолчанию)
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
Для squid 2.6 и выше:
Достаточно в строку http_port добавить тег "transparent"
http_port 1.2.3.4:3128 transparent
При этом принудительное проксирование будет работать, если ПРОКСИ-сервер стоит в качестве маршрутизатора. Если же нет, то следует на маршрутизаторе "развернуть" Веб-трафик на ПРОКСИ-сервер.
Использование ПРОКСИ-сервера повышает уровень управляемости трафиком и позволяет разгружать канал за счет кеширования данных. Например с помощью ПРОКСИ-сервера можно запретить скачивать mp3 и mpeg файлы, что для корпоративной сети весьма актуально. Конечно после "постановки на учет" HTTP-трафика хочется также контролировать и FTP-трафик, тем более что по этому протоколу пересылаются большие файлы. Аналогично http-потокам, FTP-трафик не "развернуть" на ПРОКСИ-сервер. Однако существует специализированный сервер, который позволяет производить принудительное проксирование FTP-трафика и, что самое приятное, есть возможность использовать для доставки любой ПРОКСИ-сервер.
Называется этот проект frox и работает для ОС Linux и FreeBSD.
Практическое решение:
1. Собираем пакет.
- Скачиваем frox с сайта разработчика
- Компилируем и инсталируем пакет
./configure --enable-http-cache --enable-local-cache --enable-virus-scan
make
make install
(такая сборка активирует модуль локального кеширования, кеширования через ПРОКСИ-сервер и модуль проверки на вирусы).
2. Настраиваем конфигурационный файл пакета
Конфигурационный файл пакета frox.conf по умолчанию располагается в каталоге (/usr/local/etc/). Он достаточно прост и содержит всего несколько ключевых параметров, а также снабжен подробными комментариями.
Listen 10.128.1.1 - указываем IP интерфейс, на котором будет работать frox (как правило, интерфейс локальной сети).
Port 2121 - номер порта, на котором frox принимает соединения
#BindToDevice eth0 - только для Linux можно указать интерфейс, на котором будет работать frox
# FromInetd yes - frox можно запускать из демона inetd
В этом случае нужно добавить в /etc/inetd.conf:
frox stream tcp nowait nobody /usr/local/sbin/frox frox
и в /etc/services
frox 2121/tcp
нужно указать пользователя и группу, под которыми будет работать frox. Это должен быть пользователь с минимальными привилегиями.
User nobody
Group nogroup
WorkingDir /tmp/frox - указываем рабочий каталог программы. Важно дать права пользователю nobody на полный доступ к каталогу.
(mkdir /tmp/frox; chown nobody /tmp/frox; chmod 700 /tmp/frox)
LogLevel 20 - лучше указать 20 - для максимальной информативности
LogFile /var/log/frox.log - лог-файл
MaxForks 10 - максимальное число процессов frox (число одновременных FTP-соединений через frox).
MaxForksPerHost 4 - максимальное количество соединений с одного IP. Другими словами, максимальное число одновременных сессий от одного пользователя. Действенный метод борьбы с разного рода "качалками" (типа reget), которые качают в кучу потомков (до

CacheModule http - активизируем модуль, работающий через http ПРОКСИ-сервер.
HTTPProxy 10.128.7.11:3128 - указываем адрес ПРОКСИ-сервера и порт.
MinCacheSize 5 - указываем минимальный размер файла, который будет запрашиваться через ПРОКСИ-сервер (здесь поставлен размер 5кб, чтобы практически все файлы шли через ПРОКСИ)
Указываем сети, которым можно пользоваться сервисом.
ACL Allow 10.128.0.0/16 - *
ACL Allow 10.5.0.0/16 - *
Другие параметры и подробные комментарии можно изучить из документации и из комментариев в самом конфигурационном файле.
3. Настраиваем форвардинг FTP-пакетов на порт frox.
- Для Linux (эту команду можно записать в /etc/rc.d/rc.local):
iptables -t nat -A PREROUTING -p tcp -s LOCALNET --dport 21 -j REDIRECT --to 2121
или iptables -A FORWARD -p tcp --dport 21 -j REDIRECT --to-port 2121
4. Настраиваем SQUID.
Нужно дать права в ПРОКСИ-сервере на доступ frox. Самое замечательное, что тут же можно и ограничить доступ (например файлы mp3 и т.п.).
Например, вот как можно ограничить закачку подобных файлов и разрешить закачку всех остальных.
squid.conf
acl mp3 urlpath_regex -i \.mp3$
acl wav urlpath_regex -i \.wav$
acl avi urlpath_regex -i \.avi$
acl mpeg urlpath_regex -i \.mpeg$
acl froxserver src 10.128.1.1
http_access deny avi
http_access deny wav
http_access deny mp3
http_access deny mpeg
http_allow froxserver
5. Запускаем правила файрволла, frox (/usr/local/sbin/frox или из inetd), squid.
С небольшой долей вероятности все запустится и будет работать.
Первое что нужно посмотреть - регистрирует ли frox FTP-сессии.
>tail -f /var/log/frox.log
Fri Jan 17 18:44:28 2003 frox[82826] Connect from 10.128.92.2
Fri Jan 17 18:44:28 2003 frox[82826] ... to 65.24.133.64(dhcp065-024-133-064.columbus.rr.com)
Если таких записей нет, то форвардинг на порт 2121 не работает.
Нужно также посмотреть в лог-файл ПРОКСИ-сервера, скачивает ли он по запросу frox файлы:
1042580618.892 11022 10.128.1.1 TCP_MISS/200 7488 GET
ftp://128.100.1.32/pub/mes/gifs/sev-zap.gif - DIRECT/128.100.1.32 image/gif
Если таких записей нет, то frox не связывается с SQUID.
В противном случае - все работает. Остается настроить ротацию логов frox и насладиться кешированными запросами к ФТП-серверам и запретами на скачивание музыки и фильмов.
Примечания:
Frox кеширует только анонимные заходы.
6. После всего сделанного мы получили работающую связку. Но необходимо еще сделать так, чтобы пользователь при отключении от Интернета в NetUp UTM лишался и возможности пользоваться прокси-сервером, иначе выставив в настройках адрес и порт прокси, пользователь сможет выходить в Интернет.
Для этого надо в iptables добавить строчку, запрещающую по умолчанию доступ к squid:
iptables –A INPUT –s ваша_локальная_сеть –p tcp –dport 3128 –j DROP.
Теперь никто из вашей локальной сети не может подключиться к squid.
В настройках правил firewall в администраторском интерфейсе NetUp UTM необходимо добавить для пользователей дополнительное правило для включения:
iptables -I INPUT -p tcp -m tcp --dport 3128 -s UIP -j ACCEPT
и правило для выключения:
iptables -D INPUT -p tcp -m tcp --dport 3128 -s UIP -j ACCEPT
Далее Мы скачиваем sarg (Squid Analysis Report Generator) здесь http://sarg.sourceforge.net/sarg.php, настраиваем его на обработку лога squid и получаем ежедневные, еженедельные или ежемесячные отчеты о трафике пользователей.
Все это применимо в основном для пользователей имеющих постоянный ip адрес.
Можно в cron добавить скрипт, который выдирает логины и ip адреса из базы UTM и заносит их в /etc/hosts. Таким образом мы получаем в отчете sarg не ip, а логины что удобнее. Можно этот скрипт направить не на /etc/hosts а на другой файл, который указать в конфиге sarg.
В начале с помощью echo Добавляем то что нужно.
#!/bin/bash
echo '127.0.0.1 localhost.localdomain localhost' >/tmp/hosts
echo '' >>/tmp/hosts
echo "#local users" >>/tmp/hosts
/usr/bin/mysql -u root --password="password" -e "select inet_ntoa(4294967295 & ip_groups.ip), users.login\
from users, users_accounts,accounts,service_links,iptraffic_service_links,ip_groups where \
(users.id=users_accounts.uid) and (users_accounts.account_id=accounts.id) and \
(accounts.id=service_links.account_id) and (iptraffic_service_links.id=service_links.id) and \
(ip_groups.ip_group_id=iptraffic_service_links.ip_group_id) and users.is_deleted=0 and \
accounts.is_deleted=0 and service_links.is_deleted=0 and ip_groups.is_deleted=0;" UTM5 >>/tmp/hosts
rm -f /etc/hosts
cp -r /tmp/hosts /etc/hosts
rm -f /tmp/hosts
Вариант решения вопроса если пользователь пропишет в настройках своего браузера явно адрес прокси - трафик будет локальным, предложенный mds
пишем
$IPTABLES -t mangle -A PREROUTING -s $IP_RANGE -d ! 192.168.0.0/16 -p tcp --dport 80 -j MARK --set-mark 1
в UTM добавляем правило
-I INPUT -p tcp --dport 3128 -m mark --mark=1 -j ACCEPT
(не забыть в конце добавить правило запрещающее вход на порт 3128 для всех).