Прозрачный HTTP и FTP прокси-сервер Squid с UTM (Linux)

Форум для размещения материалов по реализации различных схем использования ПО, решению частых проблем и предупреждению частых ошибок
Закрыто
Аватара пользователя
dalex
Сообщения: 1306
Зарегистрирован: Пт янв 21, 2005 11:54

Прозрачный HTTP и FTP прокси-сервер Squid с UTM (Linux)

Сообщение dalex »

Использование прозрачного (принудительного) прокси-сервера Squid (Linux with iptables) в связке с Netup UTM.

Версия – 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), которые качают в кучу потомков (до 8) и "забивают" канал.
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 для всех).
Последний раз редактировалось dalex Пн мар 23, 2009 14:48, всего редактировалось 1 раз.

Аватара пользователя
nops
Сообщения: 48
Зарегистрирован: Пн фев 09, 2009 13:05

Сообщение nops »

Статья хорошая, но для

Код: Выделить всё

Squid Cache: Version 2.6.STABLE6
эти настройки не подходят, пишет вот что:

Код: Выделить всё

2009/03/17 19:45:58| parseConfigFile: line 4328 unrecognized: 'httpd_accel_host virtual'
2009/03/17 19:45:58| parseConfigFile: line 4329 unrecognized: 'httpd_accel_port 80'
2009/03/17 19:45:58| parseConfigFile: line 4330 unrecognized: 'httpd_accel_with_proxy on'
2009/03/17 19:45:58| parseConfigFile: line 4331 unrecognized: 'httpd_accel_uses_host_header on'

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

Squid 2.6 и выше:

Код: Выделить всё

http_port 1.2.3.4:3128 transparent
Далее по статье.

Аватара пользователя
dalex
Сообщения: 1306
Зарегистрирован: Пт янв 21, 2005 11:54

Сообщение dalex »

поправил

Аватара пользователя
nops
Сообщения: 48
Зарегистрирован: Пн фев 09, 2009 13:05

Сообщение nops »

ух ты, к4акая полезная статейка! Спасибки, только ещё не пробовал. сейчас буду пробовать настраивать, только у меня в /etc/sysconfig/iptables прописано не

Код: Выделить всё

-A PREROUTING -d ! 192.168.0.0/16 -p tcp --dport 80 -j REDIRECT --to-port 3128
а

Код: Выделить всё

-I PREROUTING -s 192.168.0.0/255.255.255.0 -p tcp --dport 80 -j REDIRECT --to-ports 3128
и так же работает.

P.S. если честно, то только сейчас дошло. Ранее у меня всё работало просто через NAT, без прозрачного прокси, сейчас такая необходимость появилась. Заставить UTM включать и отключать пользователей не только в фаерволе, но и чтобы они не могли юзать через squid. Буду пробовать.

Аватара пользователя
nops
Сообщения: 48
Зарегистрирован: Пн фев 09, 2009 13:05

Сообщение nops »

Народ! Помагите.
Никак не могу заставить работать это дело, я про прозрачный прокси и не говорю.
Вообщем суть дела такова.

поставил, заработала, всё считает. ок. Пока всё гуд.
Удаляю из /etc/sysconfig/iptables строчки

Код: Выделить всё

-A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 80.x.x.x
отлично, в инет компы не выходят. далее что мне прописывать в "Настройки - правила фаервола"?
Как должны быть указаны правила, и что нужно поправить в rfw5.cfg чтобы UTM понимала, что правила нужно прописывать при помощи iptables

Заранее спасибо!

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

Вы уверены, что не выходят? Возьмите tcpdump и посмотрите. Выключить NAT - не лучший способ закрыть доступ. Обычно контроль доступа идет в цепочке FORWARD, и до кучи политику DROP вешают на эту цепочку. И если там прописано ходить таким-то, то они и будут ходить, все остальные отдыхают.

Аватара пользователя
nops
Сообщения: 48
Зарегистрирован: Пн фев 09, 2009 13:05

Сообщение nops »

у меня цепочка FORWARD не используется. Могу показать полный iptables. В принципе, я уже поднял тему viewtopic.php?t=6713 Давайте там обсудим, там выложен и iptables и уже есть некоторые подсказки, но что-то я не понимаю.
Заранее благодарен за помощь.

ZoomAll
Сообщения: 1
Зарегистрирован: Ср мар 17, 2010 12:28

Сообщение ZoomAll »

спасибо за статью, НО

Кто знает почему не получается запретить скачивание заданныйх расширений файлов по FTP?

squid.conf
http_port 192.168.1.1:3128
acl p80 port 80
acl p443 port 443
acl Frox src 192.168.1.1
acl jpg urlpath_regex -i \.jpg$.

http_access deny jpg

http_access allow Frox
http_access allow p80
http_access allow p443

http_access deny all
при таком конфиге через браузер ни одну ссылку не откроешь, где есть ".jpg"
а вот из-под ftp-клиента скачать файлы ".jpg" получается - качает сОбака

frox.conf
Listen 172.16.16.1
Port 2121

User nobody
Group nogroup

WorkingDir /tmp/frox
DontChroot Yes

PidFile /var/run/frox.pid

AllowNonASCII yes

CacheModule http
HTTPProxy 172.16.16.1:3128
MinCacheSize 0
CacheAll yes

DoNTP yes
NTPAddress 172.16.16.1:2121

MaxForks 10
MaxForksPerHost 3

LogLevel 20
LogFile /var/log/frox.log

ACL Allow 172.16.16.1/24 - *
причем до смешного в логе Squid пишет:
-1 application/octet-stream 17025/17025 GET ftp://h***@*.2*3.74.*/!/01.jpg;type=i
когда запрещено!


вот че с ним делать?
у кого-нить получилось запретить скачивать по фтп заданные типы файлов в связке frox+squid??
у меня не получается... помогите

Закрыто