перейти к навигации

Прозрачный Squid 2.6 и FreeBSD с pf 25.03.2007

Я решил наконец-то поставить Squid в transparent-режиме на шлюз, который ведёт в Интернет.

На шлюзе установлена FreeBSD 6.1, настроен pf с обычным NAT’ом.

Все примеры, касающиеся настройки Squid с pf, которые удалось найти в Интернет, относились к версии 2.5. В то время как в версии 2.6, которая на данный момент находится в портах, основная часть работы делается немного проще и удобнее.

Итак, процесс установки и настройки.

SQUID 

При установке из опций необходимо выбрать Enable transparent proxying with PF (WITH_SQUID_PF). Я на перспективу также выбрал Enable delay pools (WITH_SQUID_DELAY_POOLS), Enable SNMP support (WITH_SQUID_SNMP) и Enable ACLs based on ethernet address (WITH_SQUID_ARP_ACL). После этого выполняется непосредственно установка.

Что касается настройки, то я поменял в файле конфигурации следующие опции:

http_port 127.0.0.1:3128 transparent (это теперь вместо всяких httpd_accel_* в предыдущих версиях)
acl our_network src x.x.x.0/24
http_access deny to_localhost
http_access allow our_network
(перед http_access deny all)
httpd_suppress_version_string on
visible_hostname your.server.name
via off
forwarded_for off

И ещё в формат лог-файлов squid добавил пунктик %tl, чтобы удобнее было смотреть время записи.

Перед первым стартом необходимо сделать squid -z, чтобы инициализировать директории для кешируемых объектов, а также добавить в /etc/rc.conf опцию squid_enable=”YES” (это для тех, кто вообще в первый раз). И ещё лучше вставить в /etc/crontab строчку /usr/local/sbin/squid -k rotate для выполнения каждые сутки.

PF

Настройка pf также не должна вызвать трудностей. Всё зависит от сложности набора правил, используемого вами.

Итак, необходимо добавить в /etc/pf.conf следующую строчку:

rdr on $if_lan inet proto tcp from $ip_lan to any port www -> 127.0.0.1 port 3128

Эту строчку нельзя добавить куда попало: в pf.conf соблюдается строгий порядок (об этом написано в man pf.conf прямо в самом начале); её надо вставить перед следующей, или подобной, строкой:

nat pass on $if_ext from $ip_lan to any -> $if_ext

Здесь $if_lan - это имя сетевого интерфейса локальной сети; $if_ext – имя внешнего сетевого интерфейса; $ip_lan – это адрес локальной сети (т.е. чьи адреса передавать прокси-серверу), например, “192.168.0.0/24″.

Далее, это можно немного усложнить.

Допустим, доступ в Интернет получают IP-адреса, указанные в таблице <nat_users>. Тогда в обоих правилах необходимо вместо $ip_lan указать <nat_users>.

Для большей наглядности можно ввести список портов, которые будут перехватываться Squid’ом:

ports_transp = “{ 80, 8080 }”

И последнее: не все обращения следует перехватывать, а именно  – обращения к локальным ресурсам. Предположим, у вас есть таблица <wan>,  которая содержит все сети или адреса вашей локальной сети. Тогда вместо to any следует указать ! <wan>.

В итоге, правила выглядят следующим образом:

rdr on $if_lan inet proto tcp from <nat_users> to ! <wan> port $ports_transp -> 127.0.0.1 port 3128

nat pass on $if_ext from <nat_users> to any -> $if_ext

Вот по-моему и всё, что касается основных моментов настройки. Готов выслушать комментарии и поправки.

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong
Tags: , , , , ,

Комментарии»

1. Fedel - 30.08.2007

http_port 127.0.0.1:3128 transparent
за это спасибо!

Вот вариант для ipfw
ipfw add 124 fwd 10.205.6.14,3128 tcp from 19.168.0.0/24 to any 80, 8080 out

2. paulz - 17.10.2007

вот бы все это, для тех, кто вообще в первый раз !!!

3. Kastey - 26.11.2007

http_port 3128 transparent
все работает но AIM отказывается – приходится несмотря на всю прозрачность указывать настройки squid
не пойму в чем тут дело ?

4. Danil - 01.12.2007

Нужно взять tcpdump и посмотреть, какие ещё пакеты отправляет AIM. У вас не NAT?

5. Mihail - 09.04.2008

Для pf еще надо

chgrp squid /dev/pf
chmod g+rw /dev/pf

6. Danil - 12.04.2008

Странно, но у меня такого нет, а всё работает как надо.

7. Bro - 24.04.2009

башшшое спс. долго и упорно не мог заернуть порты на сквид потому что заворот стоял ниже ната..

8. AnerneInvinly - 01.11.2009

Все привет!
тут пару дней назад наткнулся на одну задачку, и реально не могу найти ответ. Подскажите кто может. Суть в следущем:
3 женщины решили купить чайник, который стоит 30 долларов и скинулись по 10 долларов. Потом менеджер узнал, что чайник стоит 25 доларов, он получил из кассы 5 долларов и решил отдать их женщинам.
Hо как поделить 5 на 3?
Поэтому он каждой женщине отдал по 1 доллару (всего получается 3), а себе взял 2.
Итак, каждая женщина получила обратно по 1 доллару.
То есть вместо 10 потратила 9 долларов.
Во сколько обошелся чайник женщинам?
Правильно, в 9х3 = 27 долларов.
К ним прибавляем 2 доллара, которые менеджер положил себе в карман.
Получается 29

Кто подскажет где вкралась ошибка?

9. Kucher - 28.04.2010

AnerneInvinly, ошибка в неверных выводах, 3 доллара надо было вычесть из 5, а не из 30. Потому что 5 – это расходы. :)

По теме: у меня ipfw+pf+squid, не заворачивается так трафик на squid, хоть тресни. Если в браузере его прописать – всё работает. Мистика.


ВНИМАНИЕ! Если в вашем комментарии есть хотя бы одна ссылка, он потребует моего подтверждения. Поймите правильно, надоел спам в комментариях.