polipo+transproxy = лёгкий, кэширующий, прозрачный прокси-сервер

()

Количество прокси-серверов способных работать в "прозрачном" режиме очень невелико, и большая часть из них либо имеет ограниченный функционал, либо потребляет слишком много ресурсов, что для прокси-серверов небольших компаний не приемлемо.

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

На самом деле transproxy это фактически прозрачный прокси-сервер, который умеет только перенаправлять все запросы на некий вышестоящий прокси-сервер. Далее будет показано как запустим кэширующий прокси-сервер polipo в прозрачном режиме используя transproxy на сервере под управлением Debian/Ubuntu. Но сначала опеределим начальные условия:

Итак, в качестве примера будет взята домашняя сеть автора имеющая адресное пространство 192.168.2.0/24 и состоящая из двух стационарных рабочих станций, одного ноутбука и раздающего интернет сервера со следующими характеристиками: Celeron 733/256MB. Запущенный на этом сервере squid сразу же "отъедал" порядка тридцати мегабайт памяти и в процессе работы эта величина медленно но достаточно верно росла, что совершенно неприемлемо, учитывая наличие на сервере ещё почтового сервера и jabber-сервера.

Гораздо удобнее оказался прокси-сервер polipo, который очень неплохо кэширует трафик и при этом потребляет в процессе работы всего около семи мегабайт памяти.

Итак. Для начала установим polipo и transproxy:

apt-get install polipo transproxy

Далее приступаем к настройке polipo. Первым делом создаём директорию для хранения кэша:

mkdir /var/cache/polipo
chown -vR proxy:proxy /var/cache/polipo

Далее дописываем в файл /etc/polipo/config следующие строки:

# Кому разрешено использовать этот прокси
allowedClients = 127.0.0.1, 192.168.2.0/24

# Директория для хранения кэша
diskCacheRoot = "/var/cache/polipo/"

# Неиспользуем IPv6. Так будет немного быстрее
dnsQueryIPv6 = no

# Не используем встроенный резолвер. Хватит нам и системного.
dnsUseGethostbyname = yes

Если вы хотите использовать дополнительный каскад для фильтрации рекламы на базе bfilter, то нужно ещё добавить строчку вида:

parentProxy = "127.0.0.1:8080"

После чего перезапускаем polipo:

invoke-rc.d polipo restart

Теперь переходим к настройке transproxy. Тут всё гораздо проще. Все настройки хранятся прямо в init-скрипте, потому сразу открываем init-скрипт /etc/init.d/transproxy в редакторе и строки вида:

start-stop-daemon --start --verbose --exec $DAEMON -- -s 8081 -r nobody localhost 3128

Заменяем на:

start-stop-daemon --start --verbose --exec $DAEMON -- -s 8081 -r nobody localhost 8123

Т.е. фактически заменяем порт "родительского" прокси, поскольку polipo по умолчанию слушает на порту 8123 а не на 3128.

Запускаем transproxy:

update-rc.d transproxy defaults
invoke-rc.d transproxy start

Осталось "завернуть" http-трафик на transproxy. Для этого вполне подойдёт скрипт, описанный здесь. Фактически модифицировать нужно только порт, на который перенаправляются запросы. В итоге скрипт будет выглядеть примерно так:

#!/bin/sh

# Сбрасываем цепочки правил
iptables -F
iptables -F -t nat

# Устанавливаем политики по умолчанию: запрет входящих запросов и разрешение исходящих
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

# Разрешаем принимать ответы на запросы
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Полностью разрешаем весь трафик на loopback
iptables -A INPUT -i lo -j ACCEPT

# Разрешаем трафик со стороны локальной сети (она подключена интерфейсу eth1)
iptables -A INPUT -s 192.168.2.0/255.255.255.0 -i eth1 -j ACCEPT

# Все запросы на 80-й порт перенаправляем на squid
iptables -t nat -A PREROUTING -s 192.168.2.0/255.255.255.0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8081

# NAT для всех остальных запросов
iptables -t nat -A POSTROUTING -s 192.168.2.0/255.255.255.0 -j MASQUERADE

Следует так же отметить что для каждой http-сессии создаётся отдельный процесс tproxy, занимающий в памяти около двухсот килобайт. Но при количестве одновременных сессий не более десяти-пятнадцати это не критично.

На этой пожалуй всё. Приятной работы!

Ключевые слова: transproxy, polipo, transparent, proxy.

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

tierpunk 2008-07-11 00:17:57 (#)

Есть 3 вопроса.
1 Почему статья не дописана?
2 Подойдет ли транспрокси для заворачивания фтп?
3 Зачем это нужно если есть сквид и иптаблес ?

MooSE 2008-07-11 07:37:10 (#)

1. Что именно недописано?
2. Нет
3. Потому что сквид слишком тяжёлый для ряда задач. Например на моём домашнем серваке он сжирает 15-20% памяти. ИМХО это лишком жирно...

PycmaM 2008-08-07 11:08:05 (#)

В который раз мануалы с Вашего сайта приходятся очень к стати. Спасибо огромное (:

Sharik987 2008-12-03 13:29:40 (#)

Здраствуте умные люди :-) У меня в организации используеться фаирвол на определенные сайты, т.е. блокировка стоит.Запускаю преложение OperaTor3.2 И все каким то образом начинает работать. При входе в папочку с программой имееться 3 папки и один экзэшный фаил(Сама ОпераТор).Одна папка Тор-это что бы следов не оставляла опера на пк и в инете(мне так кажеться).Вторая папка Опера-сам брайзер. и третия как раз таки Polipo. По всем моим довадам Полипа и открывает мне доступ во все роскаши интернета.Может не поскажете как из интернетЭкспловера сделать ОпераТор с полипой?

MooSE 2008-12-09 08:47:22 (#)

смотри в сторону tor+privoxy

Alexander 2011-02-08 21:25:07 (#)

А он может в прозрачном режиме принимать запросы по https, ftp???

MooSE 2011-02-08 21:51:33 (#)

Цитата:

А он может в прозрачном режиме принимать запросы по https, ftp???


Для прозрачного ftp смотри в сторону frox. Прозрачного https не бывает, ибо https как раз и имеет защит от MIM-атак.

Alexander 2011-02-09 14:09:59 (#)

Т.е. допустим через тот же самый прозрачный squid я не смогу зайти на https сайт?

MooSE 2011-02-10 01:15:16 (#)

Цитата:

Т.е. допустим через тот же самый прозрачный squid я не смогу зайти на https сайт?

Не сможешь.

Anonymous 2011-09-22 04:28:42 (#)

Вроде сквид можно нормально настроить и для работы с https Оо

MooSE 2011-09-22 12:42:37 (#)

Цитата:

Вроде сквид можно нормально настроить и для работы с https Оо

В прозрачном режиме - нет. Потому что нельзя влезть в SSL-сессию и подменить трафик.
Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE