Количество прокси-серверов способных работать в "прозрачном" режиме очень невелико, и большая часть из них либо имеет ограниченный функционал, либо потребляет слишком много ресурсов, что для прокси-серверов небольших компаний не приемлемо.
Однако есть огромное количество лёгких и достаточно функциональных прокси-серверов, единственным недостатком которых является невозможность работать в "прозрачном" режиме. Однако эту проблему можно можно решить используя пакет 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, занимающий в памяти около двухсот килобайт. Но при количестве одновременных сессий не более десяти-пятнадцати это не критично.
На этой пожалуй всё. Приятной работы!
tierpunk 2008-07-11 00:17:57 (#)
1 Почему статья не дописана?
2 Подойдет ли транспрокси для заворачивания фтп?
3 Зачем это нужно если есть сквид и иптаблес ?