Прозрачный прокси-сервер с использованием Squid
From DD-WRT Wiki
English • Deutsch • Español • Français • Italiano • 日本語 • Polski • Português • Русский • Svenska • 中文(中国大陆) • 中文(台灣) • |
Запуск прозрачного прокси-сервера в сети можно использовать для более сложной фильтрации содержимого веб-страниц в таких местах, как школа или библиотека (где в некоторых странах фильтрация требуется по закону) или для защиты детей в домашних условиях.
Это руководство поможет включить прозрачный прокси-сервер так, чтобы маршрутизатор (на примере Linksys WRT54G) автоматически перенаправлял весь трафик на прокси-сервер.
Contents |
[edit] Настройка на компьютере
[edit] Squid версий до 2.6
Сначала установите Squid на Unix-сервер. После этого нужно настроить Squid выполнять функции прозрачного прокси-сервера следующими настройками:
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
[edit] Squid версии 2.6 или новее
С установленным Squid на устройстве Unix или Linux, задайте следующую настройку:
http_port 192.168.1.10:3128 transparent
подставив IP-адрес маршрутизатора и порт по желанию, убедившись, что они соответствуют переменным в верхней части скрипта настройки маршрутизатора, представленного ниже.
Важно для пользователей Debian!
Пакет Squid3 (squid3_3.0.PRE5-5) из Debian Etch не работает с таким прозрачным прокси. Попробуйте использовать Squid3 из Debian Lenny или откатиться на Squid-2.6 в Etch. |
[edit] Настройка на маршрутизаторе
Вам нужно будет использовать iptables, чтобы сообщить маршрутизатору, куда направлять трафик. Если вы еще плохо разбираетесь в iptables, кто-то уже сделал всю работу и написал сценарий оболочки, который сделает всё за вас. Обязательно отредактируйте переменные вверху.
Эти сценарии необходимо сохранить в сценарии брандмауэра. В веб-интерфейсе перейдите на вкладку Administration → Commands и вставьте отредактированный скрипт в поле ввода, затем нажмите кнопку Save Firewall.
[edit] Прокси-сервер в локальной сети
Этот сценарий можно найти по адресу: http://www.dd-wrt.com/phpBB2/viewtopic.php?t=62222
#!/bin/sh PROXY_IP=192.168.1.10 PROXY_PORT=3128 LAN_IP=`nvram get lan_ipaddr` LAN_NET=$LAN_IP/`nvram get lan_netmask` iptables -t nat -A PREROUTING -i br0 -s $LAN_NET -d $LAN_NET -p tcp --dport 80 -j ACCEPT iptables -t nat -A PREROUTING -i br0 -s ! $PROXY_IP -p tcp --dport 80 -j DNAT --to $PROXY_IP:$PROXY_PORT iptables -t nat -I POSTROUTING -o br0 -s $LAN_NET -d $PROXY_IP -p tcp -j SNAT --to $LAN_IP iptables -I FORWARD -i br0 -o br0 -s $LAN_NET -d $PROXY_IP -p tcp --dport $PROXY_PORT -j ACCEPT
Измените переменные PROXY_IP и PROXY_PORT, чтобы они соответствовали IP-адресу вашего прокси-сервера и порту TCP.
Если вам необходимо разрешить какому-либо устройству обходить прозрачный прокси-сервер (например, игровой системе или медиа-ресиверу), добавьте следующую команду, которая позволяет конкретному IP-адресу обходить прокси-сервер. Вы можете использовать её, чтобы добавить столько исключений, сколько захотите. Приемники DirecTV, которые транслируют видео по запросу (Video On Demand), должны быть добавлены в исключения, чтобы обходить прокси-серве.
iptables -t nat -I PREROUTING -i br0 -s [IPADDRESS] -j ACCEPT
[edit] Прокси-сервер в локальной сети: альтернативное решение
Решение, описанное в предыдущем разделе, перенаправляет пакеты на прокси-сервер, используя преобразование сетевых адресов NAT. В результате пакеты, поступающие на прокси-сервер, имеют IP-адрес источника маршрутизатора, а не исходного клиента. В результате невозможно увидеть IP-адрес исходного клиента в журналах прокси-сервера, а также невозможно применить правила доступа в прокси-сервере на основе IP-адреса исходного клиента.
В следующем альтернативном подходе таблица mangle используется для маркировки пакетов и направления их на прокси-сервер с использованием пользовательской таблицы маршрутов, которая имеет только один маршрут по умолчанию прямо на прокси-сервер. Это требует дополнительной настройки iptable на прокси-сервере, но обладает преимуществом сохранения IP-адреса клиента. Это решение было адаптировано из информации, найденной по адресу http://en.tldp.org/HOWTO/TransparentProxy-6.html .
#!/bin/sh PROXY_IP=192.168.1.10 iptables -t mangle -A PREROUTING -p tcp --dport 80 -s $PROXY_IP -j ACCEPT iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 3 ip rule add fwmark 3 table 2 ip route add default via $PROXY_IP dev br0 table 2
Измените переменную PROXY_IP, чтобы она соответствовала IP-адресу прокси-сервера.
Если вам необходимо разрешить какому-либо устройству обходить прозрачный прокси-сервер (например, игровой системе или медиа-ресиверу), добавьте следующую команду, которая позволяет конкретному IP-адресу обходить прокси-сервер. Вы можете использовать её, чтобы добавить столько исключений, сколько захотите. Приемники DirecTV, которые транслируют видео по запросу (Video On Demand), должны быть добавлены в исключения, чтобы обходить прокси-серве.
iptables -t mangle -A PREROUTING -p tcp --dport 80 -s [IPADDRESS] -j ACCEPT
Изменения, приведенные выше, будут направлять пакеты на IP-адрес прокси-сервера, но, поскольку пакеты не были изменены, они всё равно будут поступать на прокси-сервер через порт 80. Вам всё равно придется перенаправлять пакеты на правильный порт прокси-сервера по мере их поступления. Добавьте следующее правило в iptable на вашем прокси-сервере (обратите внимание, что на прокси-сервере потребуются дополнительные шаги, чтобы сделать эти изменение постоянным, но они здесь не рассматриваются).
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port [PROXY_PORT]
Замените PROXY_PORT на правильный порт для вашего прокси, который будет 3128 из предыдущего примера.
[edit] Прокси-сервер в другой сети с использованием Chillispot
Приведенные выше сценарии используются, когда прокси-сервер находится в той же сети. Для тех, кому нужен прозрачный прокси-сервер с включенной функцией DD-WRT Chillispot когда прокси-сервер находится в другой сети, я изменил сценарий Вариант 1 выше для этих нужд. Отредактируйте выделенные жирным шрифтом переменные в соответствии с вашей конфигурацией.
#!/bin/sh CHILLI_IP=192.168.182.1 CHILLI_NET=$CHILLI_IP/24 PROXY_IP=192.168.1.10 PROXY_PORT=3128 LAN_NET=192.168.1.0/24 iptables -t nat -A PREROUTING -i tun0 -s $CHILLI_NET -d $LAN_NET -p tcp --dport 80 -j ACCEPT iptables -t nat -A PREROUTING -i tun0 -s $CHILLI_NET -p tcp --dport 80 -j DNAT --to $PROXY_IP:$PROXY_PORT iptables -t nat -A POSTROUTING -o br0 -s $PROXY_IP -p tcp -d $CHILLI_NET -j SNAT --to $CHILLI_IP iptables -I FORWARD -i tun0 -o br0 -s $CHILLI_NET -d $PROXY_IP -p tcp --dport $PROXY_PORT -j ACCEPT
[edit] Обратный прокси-сервер
Squid также можно использовать в качестве «обратного прокси-сервера» ("reverse proxy") или «веб-ускорителя» ("web accelerator"), если за ним находятся веб-серверы, на которых работают приложения с интенсивным использованием баз данных, такие как вики, хостинг для блогов или форумов.
Для Squid 2.4 и более ранних версий это называется режимом «ускорение одного хоста» ("accelerate single host"). Для версии 2.6 команды в squid.cfg выглядят так:
# Squid обычно слушает порт 3128, поэтому удалите (закомментируйте) это: # http_port 3128 # # Вместо этого впишите следующую строку, чтобы Squid слушал порт 80, подставьте здесь внешний статический адрес сети (WAN): http_port 999.999.999.999:80 vhost defaultsite=example.org # Затем перенаправьте все запросы на ваш реальный веб-сервер (адрес локальной сети, измените в соответствии с вашей сетью): cache_peer 192.168.1.2 parent 80 0 no-query originserver
Squid осуществляет повышение скорости, сохраняя копии веб-страниц в файловой системе и передавая сохраненные копии пользователям вместо того, чтобы запрашивать их у веб-сервера, многократно генерируя динамический контент. Как таковой, он подходит в первую очередь для использования на устройствах с достаточным объемом жесткого диска (см. Хранилище USB) и может не подходить для небольших серверов с ограниченным пространством хранения.
Поскольку конфигурация Squid «обратный прокси-сервер» используется большими вики-сайтами, такими как Википедия, MediaWiki и Мета-ви́ки, предложил некоторую информацию об использовании Squid таким образом.