Сервер в кармане, или просто о сложном!

главная -

Прозрачный Squid

Теги: Настройка прокси

Зачем нужен прозрачный Squid

Для начала представим, что у нас есть обычная сеть, выходящая в интернет через один шлюз (прокси-сервер Squid установлен здесь же). Предположим, IP-адрес шлюза 192.168.1.1. Все остальные компьютеры в сети получают настройки IP по DHCP. Компьютеры в сети разные, Windows XP/7, Ubuntu, да моло ли еще какие. За всеми не углядишь. Но мы должны считать трафик, ускоряя при этом доступ в интерент, должны контролировать (хотя бы от "дурака") доступ в интернет и пр. Squid обладает широкими возможностями по логированию, ограничению доступа и пр. Поэтому нам нужно, чтобы все компьютеры в сети не могли миновать нашего прокси-сервера Squid. Поэтому нам надо в любом случае направить (завернуть, пробросить) запрос клиентских компьютеров только через прокси-сервер Squid.

Настройка переадресации портов

При обращении клиентов локальной сети к внешним сайтам Squid должен прозрачно для клиента перехватить запрос и обработать его согласно своим правилам - решить, какой контент отдать, логировать ли активность пользователя, можно ли вообще этому пользователю выходить в интернет. Наша задача - сделать так, чтобы на самом клиенте не надо было бы делать никаких настроек броузеров. Клиент просто подключился к локальной сети и уже работает через наш прокси-сервер и НИКАК иначе. Т.е. даже если кто-либо захочет обойти наш прокси, без хитростей ему уже не обойтись.

Переадресация портов в FreeBSD

Если на нашем шлюзе установлена FreeBSD и брандмауэр по-умолчанию - IPFW, то для выполнения этой задачи мы должны на шлюзе установить переадресацию (проброс) портов:

# Redirect to local proxy
/sbin/ipfw add 0170 fwd 127.0.0.1,3128 tcp from 192.168.1.0/24 to any 80

где:

  • 0170 - номер правила (в вашем случае может быть любой).
  • fwd 127.0.0.1,3128 - куда будем направлять пакеты, - в нашем случае нашему любимому Squid, запущенному на порту 3128 на шлюзе, - ...
  • from 192.168.1.0/24 - ... отправленные компьютерами локальной сети...
  • to any 80 - ... на какой-либо сайт в интернете

Теперь внимание! Это правило нужно добавить ДО того, как правила NAT (Network Address Translation) получат этот запрос. Объясню немного неакадемично: что делает NAT? В нашем случае NAT изменяет адрес источника (заменяет локальный IP клиента на внешний IP шлюза и запоминает, от какого внутреннего клиента был запрос. Для того, чтобы Squid обработал запрос от клиента, ему не нужно ничего преобразовывать - он и сам с этим справится. Поэтому Squid должен получить пакет в первозданном виде и сам решить, что делать дальше.

К тому же NAT и Squid - все-таки разные вещи, и пакет, адресованный, скажем к 2.3.4.5:80, не содержит информации, как попасть в Squid (на порт 3128 шлюза). И пакет будет обрабатываться только средствами NAT. Squid пакет так и не увидит. Поэтому наша задача - просто отдать Squid-у тот пакет, который отправил броузер пользователя. Объясню на примере части конфига ipfw:

cmd="ipfw -q add"
$skip="skipto 5000"
pif="xl1" #внешний интерфейс 
...

# Redirect to local proxy
$cmd 0170 fwd 127.0.0.1,3128 tcp from 192.168.1.0/24 to any 80

# NAT
$cmd 0200 divert natd ip from any to any in via $pif

# Allow keep-state statement.
$cmd 0201 check-state

# POP3/POP3S
$cmd 0325 $skip tcp from any to any 110 out via $pif setup keep-state
$cmd 0326 $skip tcp from any to any 995 out via $pif setup keep-state

# WWW (HTTP/HTTPS/..)
$cmd 0350 $skip tcp from any to any 80 out via $pif setup keep-state
$cmd 0352 $skip tcp from any to any 443 out via $pif setup keep-state

# This is skipto location for outbound stateful rules
$cmd 5000 divert natd ip from any to any out via $pif

...

В конфиге выше запрос открыть сайт сначала обрабатывается правилом 0170, которое заворачивает запрос в Squid. Squid (как и любая другая программа) также выполняет требования брандмауэра - только для него правило 0170 не действует, а вот правило 0350 разрешает Squid отправить запрос в интернет. Для того, чтобы выходить в интернет без Squid, необходимо закоментировать правило 0170. В этом случае Squid не получит ничего, а все запросы броузеров из локальной сети будут обрабатываться правилом 0350.

Переадресация портов в Linux

Если на нашем шлюзе установлена Linux и iptables, то вышеуказанная команда будет выглядеть так:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

где eth0 - внутренний интерфейс.

В остальном смысл переадресаций и пр. аналогичен тому, как это объяснялось для ipfw. Разнятся только правила постороения конфигурационных файлов ipfw и iptables. Пример правил iptables можно изучить здесь.

С этим разобрались. Теперь надо дать указание Squid о том, что он должен обрабатывать пакеты, изначально на него не направленные. Переходим к включению режима прозрачности Squid.

Прозрачный Squid в squid.conf

Теперь дело осталось за малым - настроить Squid в режим невидимки, т.е. принимать автоматически перенаправленные пакеты и обрабатывать их. В разных версиях Squid за это отвечали разные команды. Настройка Squid версии 2.6.*  выглядит так:

http_port 127.0.0.1:3128 transparent # Squid работает в прозрачном режиме

Внимательно просмотрите конфигурационный файл squid.conf на предмет дубликатов директив - я потратил два часа времени, обратился на форум за помощью с "нестандартной проблемой", в то время как просто не обратил внимание на то, что первой строкой у меня включался обычный режим работы Squid:

http_port 3128 # Squid работает в обычном режиме

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

Плюсы и минусы

Из плюсов можно отметить абсолютную уверенность, что все запросы на 80 порт (стандартный для веб) будут обработаны Squid-ом. Соответственно, будут логи, статистика для шефа и отсутствие необходимости бегать и руками все настраивать.

Из минусов можно отметить:

  • невозможность (по-крайней мере, простым способом) авторизовать пользователей для доступа в интернет;
  • если вдруг "упадет" Squid, то доступ к сайтам прекратится. Поэтому админу нужно или быть уверенным, что все будет ОК, или иметь возможность удаленно изменить конфиг брандмауэра, или написать скрипт, автоматом проверяющего, висит ли Squid на порту 3128, и если нет, то запускающего его.

Настройка Squid в прозрачном режиме завершена. Вот теперь - все.

Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?