Прозрачный 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
Вот по-моему и всё, что касается основных моментов настройки. Готов выслушать комментарии и поправки.
Tags: freebsd, nat, network, pf, proxy, squid- Разделы: Networking, UNIX, ИТ
- Автор: Danil
Комментарии»
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
вот бы все это, для тех, кто вообще в первый раз !!!
http_port 3128 transparent
все работает но AIM отказывается – приходится несмотря на всю прозрачность указывать настройки squid
не пойму в чем тут дело ?
Нужно взять tcpdump и посмотреть, какие ещё пакеты отправляет AIM. У вас не NAT?
Для pf еще надо
chgrp squid /dev/pf
chmod g+rw /dev/pf
Странно, но у меня такого нет, а всё работает как надо.
башшшое спс. долго и упорно не мог заернуть порты на сквид потому что заворот стоял ниже ната..
Все привет!
тут пару дней назад наткнулся на одну задачку, и реально не могу найти ответ. Подскажите кто может. Суть в следущем:
3 женщины решили купить чайник, который стоит 30 долларов и скинулись по 10 долларов. Потом менеджер узнал, что чайник стоит 25 доларов, он получил из кассы 5 долларов и решил отдать их женщинам.
Hо как поделить 5 на 3?
Поэтому он каждой женщине отдал по 1 доллару (всего получается 3), а себе взял 2.
Итак, каждая женщина получила обратно по 1 доллару.
То есть вместо 10 потратила 9 долларов.
Во сколько обошелся чайник женщинам?
Правильно, в 9х3 = 27 долларов.
К ним прибавляем 2 доллара, которые менеджер положил себе в карман.
Получается 29
Кто подскажет где вкралась ошибка?
AnerneInvinly, ошибка в неверных выводах, 3 доллара надо было вычесть из 5, а не из 30. Потому что 5 – это расходы.
По теме: у меня ipfw+pf+squid, не заворачивается так трафик на squid, хоть тресни. Если в браузере его прописать – всё работает. Мистика.