Transparent proxy
Транспарентный проксинг (исправлено и дополнено 28.11.98)
Иногда (особенно при наличии особо «продвинутых» юзеров ;) появляется необходимость в перенаправлении всего HTTP трафика через прокси-сервер не конфигурируя клиента для работы с прокси. Для этого вам понадобятся: Линукс с кернелом не ниже 2.0.33, squd – желательно 2.0, и ipfwadm – не ниже 2.3.0, он наверняка есть в вашем дистрибутиве Линукс.
Для начала конфигурируем кернел:
[root@val linux]# cd /usr/src/linux ; make config
*
* Networking options
*
Network firewalls (CONFIG_FIREWALL) [Y/n/?]
TCP/IP networking (CONFIG_INET) [Y/n/?]
IP: forwarding/gatewaying (CONFIG_IP_FORWARD) [Y/n/?]
IP: firewalling (CONFIG_IP_FIREWALL) [Y/n/?]
*
* Protocol-specific masquerading support will be built as modules.
*
IP: transparent proxy support (EXPERIMENTAL) (CONFIG_IP_TRANSPARENT_PROXY) [Y/n/?]
IP: always defragment (CONFIG_IP_ALWAYS_DEFRAG) [Y/n/?]
*
[root@val linux]# make dep;make clean;make zImage
Далее берем vi и делаем скрипт примерно следующего содержания:
[root@val linux]# cat /etc/rc.d/rc.fwadm
#!/bin/sh
# rc.fwadm Linux firewalling rules
FW=/sbin/ipfwadm# Очистим все.
${FW} -I -f
${FW} -O -f
${FW} -F -f# Установим полиси по-умолчанию
${FW} -I -p reject # Incoming policy: reject (quick error)
${FW} -O -p accept # Output policy: accept
${FW} -F -p deny # Forwarding policy: deny# Input Rules:
# loopback интерфейс - можно все
${FW} -I -a accept -S localhost/32 -D localhost/32# Эзернет в локалку
#Если у вас http сервер на этой-же машине, сквид циклится при.
#обращении клиентов к нему. Во избежание эта строчка
${FW} -I -a accept -P tcp -S localnet/8 -D _your_IP_/0 80# Редиректим все на прокси-сервер
${FW} -I -a accept -P tcp -D default/0 80 -r 9090# Разрешаем трафик из локалки
${FW} -I -a accept -P all -S localnet/8 -D default/0 -W eth0# Маскарадим все остальное, если есть такая необходимость
${FW} -F -a m -P tcp -S localnet/8 -D default/0
${FW} -F -a m -P udp -S localnet/8 -D default/0
В результате весь трафик из локалки по 80 порту редиректится на порт 9090 нашей машины с линуксом.
Последнее действие – настраиваем squid. Squid-2.0 поддерживает редирект (если быть точным – фильтрование пакетов ;) с рождения.
Осталось добавить следующие строчки в squid.conf:
http_port 3128 9090
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
Ключевое слово здесь – virtual ;) Порт не обязательно должен быть 9090, но обязательно должен совпадать с прописанным в rc.fwadm. Порт 3128 оставлен для нормальных клиентов. Хотя по идее хватит и одного ;)
Все, заводимся и проверяем работоспособность по логам squid. По идее должно работать ;)
Примечания ;)
Эту штуку вполне можно использовать, хотя при этом возникает парочка проблем
- работает только HTTP протокол – FTP и gopher не работают.
- браузер сам должен отресолвить данный ему URL – так что разумно иметь свой nameserver (IMHO это разумно в любом случае ;) и настроить клинта на работу с ним.
- не везде пускают через прокси :(
Если вас это устраивает – пользуйтесь на здоровье.



