Прозрачный прокси-сервер с использованием Squid

From DD-WRT Wiki

Revision as of 10:53, 24 December 2019 by Atatob (Talk | contribs)
(diff) ←Older revision | Current revision (diff) | Newer revision→ (diff)
Jump to: navigation, search

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

Это руководство поможет включить прозрачный прокси-сервер так, чтобы маршрутизатор (на примере 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 таким образом.