Наши
Сайдбары
   
IRC-канал
Linuxportal.ru
   
Импорт новостей
 
Вход Быстрая регистрация На главную

Поиск:
 
   БИБЛИОТЕКА
     Другие статьи этого раздела:
 

    Сеть
Другие разделы библиотеки:
   БИБЛИОТЕКА Сеть    
Автор статьи: Alexey Dmitriev
Дата: 30.07.2003

Прозрачное (принудительное) проксирование HTTP и FTP в FreeBSD и Linux с помощью Squid.

Версия – 0.9

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

Что мы собираемся сделать?
Мы сделаем так, чтобы пользователи находящиеся внутри сети, независимо от настроек клиента, не могли пройти мимо прокси-сервера, на котором стоит squid. В случае использования "обычного" прокси, клиент в программном обеспечении просмотра веб-страниц (обозревателе) должен указывать прокси-сервер и порт. Обозреватель выполняет запрос на прокси-сервер, который перенаправляет его к веб-серверу. Это все конечно хорошо, но иногда случаются ситуации, типа: - всем клиентам сети приходится настраиваться на прокси-сервер, хотят они этого или нет, - вы хотите, чтобы клиенты использовали прокси-сервер, но не хотите, чтобы они об этом знали, - вы хотите, чтобы клиенты использовали прокси-сервер, но не хотите настраивать сотни или тысячи веб-браузеров, - вы считаете статистику с помощью логов squid, и хотите, чтобы в логи попадало как можно больше информации.
На помощь вам приходит "прозрачный" прокси-сервер. Веб-запрос перехватывается прокси-сервером абсолютно прозрачно. Т.е. клиентское программное обеспечение думает, что работает с настоящим веб-сервером, хотя, на самом деле, работает с прокси-сервером.

Для того, чтобы HTTP-пакеты не пролетали мимо, нам нужно завернуть трафик с помощью firewall на squid.

для FreeBSD это включается приблизительно так:
01000 fwd 127.0.0.1,3128 tcp from 192.168.0.0/16 to any 80,8080,8101

для Linux с ядром 2.2 и файрволом на основе ipchains:
ipchains -A input -p TCP -d 127.0.0.1/32 www -j ACCEPT
ipchains -A input -p TCP -d 192.168.1.1/32 www -j ACCEPT
ipchains -A input -p TCP -d any/0 www -j REDIRECT 3128

Для Linux с ядром 2.4 или выше и файрволом на основе iptables:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -p tcp --dport 8081 -j REDIRECT --to-port 3128


В squid.conf нужно добавить:
http_port 3128 (стоит по умолчанию)
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

При этом принудительное проксирование будет работать, если ПРОКСИ-сервер стоит в качестве маршрутизатора. Если же нет, то следует на маршрутизаторе "развернуть" Веб-трафик на ПРОКСИ-сервер.

Для FreeBSD:
ipfw add 10 fwd 192.168.1.1 tcp from 10.128.0.0/16 to any 80,8080 out xmit lnc0
(192.168.1.1 - адрес ПРОКСИ-сервера)

Использование ПРОКСИ-сервера повышает уровень управляемости трафиком и позволяет разгружать канал за счет кеширования данных. Например с помощью ПРОКСИ-сервера можно запретить скачивать mp3 и mpeg файлы, что для корпоративной сети весьма актуально. Конечно после "постановки на учет" HTTP-трафика хочется также контролировать и FTP-трафик, тем более что по этому протоколу пересылаются большие файлы. Аналогично http-потокам, FTP-трафик не "развернуть" на ПРОКСИ-сервер. Однако существует специализированный сервер, который позволяет производить принудительное проксирование FTP-трафика и, что самое приятное, есть возможность использовать для доставки любой ПРОКСИ-сервер.

Называется этот проект frox и работает для ОС Linux и FreeBSD.

Практическое решение:
1. Собираем пакет
Для Linux frox был собран из исходников:
- Скачиваем frox с сайта разработчика (http://sourceforge.net/projects/frox/)
- Компилируем и инсталируем пакет
./configure --enable-http-cache --enable-local-cache --enable-virus-scan
make
make install
(такая сборка активирует модуль локального кеширования, кеширования через ПРОКСИ-сервер и модуль проверки на вирусы)

Для FreeBSD frox собирается аналогично или из системы портов:
cd /usr/ports/ftp/frox
make WITH_HTTP_CACHE=YES
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):

для Linux с ядром 2.2 и файрволом на основе ipchains:
ipchains -A input -p tcp -s LOCALNET -d 0/0 21 -j REDIRECT 2121

для Linux с ядром 2.4 или выше и файрволом на основе iptables:
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

для FreeBSD (эту команду можно записать в /etc/rc.local):
/sbin/ipfw add 100 fwd 10.128.1.1,2121 tcp from 10.128.0.0/16 to any 21 - важно не перепутать и не указать адрес 127.0.0.1,2121 - работать не будет, потому что frox слушает другой адрес (10.128.1.1).

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 кеширует только анонимные заходы.



Все статьи раздела "Сеть"
©"Linuxportal.Ru". Материалы сайта можно
использовать свободно при условии
сохранения этой свободы при дальнейшем
распространении, если явно не указано иное

Дизайн и программирование:

Поставьте
нашу кнопку:
Получить код кнопки
Linux Portal.ru ::: Линукс Портал.ру
Наш партнер: