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 это разумно в любом случае ;) и настроить клинта на работу с ним.
  • не везде пускают через прокси :(

Если вас это устраивает – пользуйтесь на здоровье.