Главная >> Статьи и заметки >> Сети >> Cisco >> SQUID+WCCP+TPROXY = прозрачный прокси!

SQUID+WCCP+TPROXY = прозрачный прокси! Печать


Однажды перед нами стала задача просматривать, при необходимости, на каких сайтах околачиваются наши пользователи. Логика подсказывала, что нужен прокси сервер, но здравый смысл намекал, что настроить каждому пользователю браузер, антивирус и прочие программы на работу с прокси, при количестве пользователей более 1000 — ни-за-что! Да ещё была проблема — выпускать такое количество пользователей под одним внешним IP-адресом в интернет — дело не благородное. А ещё хотелось, чтобы всё это было бесплатно. И решение всё-таки нашлось — прозрачный прокси.
Здесь я расскажу вам как настроить связку SQUID+WCCP+TPROXY, какие у неё плюсы и минусы.
Итак, немного теории:
  • Web Cache Communication Protocol (WCCP) — разработанный компанией Cisco протокол перенаправления контента. Предоставляет механизм перенаправления потоков траффика в реальном времени. WCCP позволяет использовать Cisco Cache Engines (или другие устройства хранения кэша с работающим WCCP) для локализации источника web-траффика в сети. Локализация траффика снижает стоимость передачи и время скачивания.
  • Squid — программный пакет, реализующий функцию кэширующего прокси-сервера для протоколов HTTP, FTP, Gopher и HTTPS. Используется в UNIX-like системах и в ОС семейства Windows NT. Имеет возможность взаимодействия с Active Directory Windows Server путём аутентификации через LDAP, что позволяет использовать разграничения доступа к интернет ресурсам пользователей, которые имеют учётные записи на Windows Server, также позволяет организовать «нарезку» интернет трафика для различных пользователей.
  • TProxy — механизм ядра Linux, позволяющий ОС отправлять ip пакеты с чужим адресом источника.

Задачи:
  • Логировать посещённые пользователями сайты в интернете
  • Подсчитывать потребляемый траффик
  • Сделать это незаметно для пользователей

Решение:
Для отслеживания перемещения пользователей по всемирной сети можно использовать прокси сервер. Наиболее популярным является Squid.
Проблема: Для работы через прокси каждый пользователь должен в настройках браузера и других программ, работающих с интренет, указать ip-адрес и порт прокси сервера, а так-же логин и пароль.
Чтобы избежать настройки программ пользователей для работы с прокси, можно использовать прозрачное проксирование.
  • Прозрачный прокси — это такой прокси-сервер, который принимает трафик от клиентов сети через маршрутизатор, способный различать какой трафик должен быть направлен через прокси-сервер. То есть клиенту не нужно проводить конфигурацию ПО для работы через прокси-сервер, маршрутизатор сам направит трафик клиента на прокси-сервер.

Прозрачное проксирование на Squid можно осуществлять в 2-х режимах:
  • Transparent
  • TProxy

И в первом и во втором случае пользователи не догадываются о существовании прокси и им не нужно настраивать браузеры и прочие программы для работы в интернет. Однако в первом случае запросы от пользователя поступают на Squid и IP-адрес пользователя подменяется на IP-адрес Squid'a. Внешний мир будет считать что все запросы идут от одного компьютера (squid'a).
Во втором случае, запросы от пользователя проходят через Squid прозрачно и на выходе Squid запросы продолжают свой путь с IP-адресом клиента, а не Squid'a.
Зачем это нужно? Например, все пользователи сети имеют приватные адреса и натятся на пограничном файерволе (см. рисунок ниже). Причём каждая отдельная подсеть натится в свой публичный IP. Если будет использоваться первый способ, то все подсети будут натиться в один публичный IP, т.к. на firewall будут приходить запросы от одного о того же IP Squid'a. При способе 2 на firewall запросы приходят от squid но с адресами настоящих отправителей и каждая подсеть продолжает натится в свой публичный IP.

Как это сделать? Читайте дальше!

image
Нам понадобится:
  • Linux сервер с ядром 2.6.30 или выше
  • Squid 3.1 или выше
  • iptables 1.4.3.2 или выше
  • маршрутизатор cisco с IOS 12.4(15)T8 или выше
  • Немного настырности
  • Данная статейка


Настройка ядра Linux

Приведу настройку TPROXY на примере CentOS 5.4.
Для поддержки TProxy ядро нужно перекомпилировать.
Для этого:
  • Установите CentOS с пакетами для разработки ядра
  • Выключите SELinux и ненужные сервисы
  • Выполните yum update, перезагрузитесь
  • Скопируйте рабочий конфиг ядра из /boot в /usr/src/kernels/linux-2.6.3x.x
    cp /boot/config-2.6.3x.x... /usr/src/kernels/linux-2.6.3x.x/.config
  • В каталоге с исходниками ядра (/usr/src/kernels/linux-2.6.3x.x) выполните make xconfig
  • Включите следующие опции:

    В «Networking support -> Networking options»
    Включите (не модулем):
    Packet socket
    Packet socket: mmapped IO
    TCP/IP networking
    IP: advanced router
    IP: policy routing
    Включите (как модуль):
    IP: tunneling
    Включите (не модулем):
    IP: GRE tunnels over IP
    IP: broadcast GRE over IP
    Network packet filtering framework (Netfilter)

    В «Networking support -> Networking options -> Network packet filtering
    framework (Netfilter)»
    Включите (не модулем):
    Advanced netfilter configuration

    В «Networking support -> Networking options -> Network packet filtering
    framework (Netfilter) -> Core Netfilter Configuration»
    Включите (как модуль):
    Netfilter connection tracking support
    Включите (не модулем):
    Connection tracking security mark support
    Connection tracking events
    Включите (как модуль):
    Connection tracking netlink interface
    Transparent proxying support (EXPERIMENTAL)
    Netfilter Xtables support (required for ip_tables)
    «CONNMARK» target support
    «MARK» target support
    «TPROXY» target support (EXPERIMENTAL)
    «connmark» connection mark match support
    «conntrack» connection tracking match support
    «mark» match support
    «socket» match support (EXPERIMENTAL)
    «state» match support

    В «Networking support -> Networking options -> Network packet filtering
    framework (Netfilter) -> IP: Netfilter Configuration»
    Включите (как модуль):
    IPv4 connection tracking support (required for NAT)
    IP tables support (required for filtering/masq/NAT)
    Full NAT
    MASQUERADE target support
    REDIRECT target support
    Packet mangling
  • Сохраните конфиг, выйдите из конфигурации
  • Выполните make, make modules_install, make install
  • Загрузитесь с новым ядром
  • В файле конфугурации /etc/sysctl.conf измените следующее:
    set net.ipv4.forwarding = 1
    или при каждой загрузке выполняйте:
    echo 0 > /proc/sys/net/ipv4/conf/lo/rp_filter
    echo 1 > /proc/sys/net/ipv4/ip_forward

GRE

Теперь необходимо пошаманить с gre интерфейсом. Дело в том, что когда маршрутизатор перенаправляет траффик пользователя на Squid, то протокол wccp добавляет к ip-пакету gre заголовок (gre инкапсуляция). Для того, чтобы Linux сервер смог принять и обработать ip-пакет, необходимо на нём создать gre-интерфейс, который будет отрезать от пакетов gre заголовок.
Внимание! На маршрутизаторе никаких gre настраивать не нужно!!!
  • Включаем модуль ip_gre:insmod ip_gre
  • Создаём GRE интерфейс:
    iptunnel add gre1 mode gre remote 10.80.3.2 local 10.80.2.2 dev eth0
    ifconfig gre1 10.0.0.1 up

    Где:
    10.80.2.2 ip-адрес ethernet интерфейса squid.
    10.80.3.2 ip-адрес внешнего интерфейса маршрутизатора. Это может быть и публичный ip, если NAT осуществляет маршрутизатор.
    10.0.0.1 любой свободный ip-адрес
  • Проверяем командой ifconfig:
    Должно быть что-то типа:
    gre1 Link encap:UNSPEC HWaddr 0A-51-00-06-E7-BF-F4-CF-00-00-00-00-00-00-00-00
    inet addr:10.0.0.1 P-t-P:10.0.0.1 Mask:255.255.255.255
    UP POINTOPOINT RUNNING NOARP MTU:1502 Metric:1
    RX packets:886184838 errors:0 dropped:0 overruns:0 frame:0
    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:1485331192 (1.3 GiB) TX bytes:0 (0.0 b)

На этом настройка gre интерфейса заканчивается.

Squid

Приступим к установке Squid.
Скачайте и установите Squid 3.1.x.x из исходников или из rpm пакета. Если будете компилировать сами, при конфигурации используйте опции:
./configure --enable-linux-netfilter
make
make install

Конфигурация:

Скопируйте файл конфигурации squid.conf поставляемый с программой в squid.conf.back:
cp /usr/local/squid/etc/squid.conf /usr/local/squid/etc/squid.conf.back
Удалите всё из squid.conf:
cat /dev/null > squid.conf
Запишите следующую конфигурацию в squid.conf:
acl localhost src 127.0.0.1/32
acl localnet src 10.0.0.0/8

http_access allow all
http_access allow localnet
http_access allow localhost

http_port 3128 intercept
http_port 3129 tproxy

visible_hostname -=Proxy=-

wccp2_router 10.80.2.1
wccp_version 2
wccp2_rebuild_wait on
wccp2_forwarding_method 1
wccp2_return_method 1
wccp2_service standard 0
wccp2_service dynamic 80
wccp2_service dynamic 90
wccp2_service_info 80 protocol=tcp flags=src_ip_hash priority=240 ports=80
wccp2_service_info 90 protocol=tcp flags=dst_ip_hash,ports_source priority=240 ports=80

hierarchy_stoplist cgi-bin ?
coredump_dir /usr/local/squid/var/cache
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320


Внимание! Этой конфигурации достаточно чтобы squid заработал в прозрачном режиме, но её недостаточно для полноценной работы Прокси-сервера. Необходимо добавить опции кеширования и прочие необходимые для Вас настройки Squid! Squid чрезвычайно гибок и описание его настройки займёт парочку больших статей.

Iptables

  • Если iptables не установлен, скачайте и распакуйте исходники iptables 1.4.3.2 или выше
  • В директории с исходниками выполните:
  • Проверьте правильность установки iptables командой:
    iptables -V


Настройка iptables:

iptables -t mangle -F
iptables -t mangle -A PREROUTING -d 10.80.2.2 -j ACCEPT
iptables -t mangle -N DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT

iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129


Настройка таблицы маршрутизации Linux

Ещё одним важным шагом является настройка таблицы маршрутизации линукса, для того, чтобы полученные пакеты перенаправлялись на TProxy.
Для этого выполните:
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100


Настройка маршрутизатора cisco:

Настройка маршрутизатора проста:
создайте пару аксес листов такого типа:
conf t
ip access-list extended wccp
permit ip host 10.26.9.171 any
permit ip 10.26.5.0 0.0.0.255 any
permit ip 10.26.7.0 0.0.0.255 any
...
exit
ip access-list extended wccp_to_inside
permit ip any host 10.26.9.171
permit ip any 10.26.5.0 0.0.0.255
permit ip any 10.26.7.0 0.0.0.255
exit

Обратите внимание, оба листа очень похожи, но первый список определяет запросы от каких пользователей будут перенаправляться на Squid, а второй список определяет ответы из внешнего мира для каких пользователей будут так же перенаправляться на Squid.
Далее включаем wccp:
ip wccp 80 redirect-list wccp
ip wccp 90 redirect-list wccp_to_inside

Теперь нужно включить перенаправление на нужных интерфейсах. В нашем случае (см. рисунок выше) на интерфейсе f0/2:
interface f0/2
ip wccp 80 redirect out
ip wccp 90 redirect in

а на интерфейсе f0/1:
interface f0/1
ip wccp redirect exclude in

Если хотите перенаправлять всех подряд, аксес листы создавать не нужно.

Запускаем в работу:

Запустите Squid. Для этого:
/usr/local/squid/sbin/squid -z
/usr/local/squid/sbin/squid

Зайдите на маршрутизатор, и посмотрите состояние wccp:
show ip wccp
Дождитесь пока значение «Number of Cache Engines» и «Number of routers» не станет равно 1:
Global WCCP information:
Router information:
Router Identifier: 10.80.3.2
Protocol Version: 2.0

Service Identifier: 80
Number of Cache Engines: 1
Number of routers: 1
Total Packets Redirected: 97693092
Process: 390
Fast: 0
CEF: 97692702
Redirect access-list: wccp
Total Packets Denied Redirect: 7881163
Total Packets Unassigned: 9126
Group access-list: -none-
Total Messages Denied to Group: 0
Total Authentication failures: 0
Total Bypassed Packets Received: 0

Service Identifier: 90
Number of Cache Engines: 1
Number of routers: 1
Total Packets Redirected: 128516597
Process: 0
Fast: 0
CEF: 128517863
Redirect access-list: wccp_to_inside
Total Packets Denied Redirect: 11196991
Total Packets Unassigned: 11852
Group access-list: -none-
Total Messages Denied to Group: 0
Total Authentication failures: 0
Total Bypassed Packets Received: 0


Откройте какую-либо страницу в интернете. Если значение «Total Packets Redirected» увеличивается, значит всё работает. Зайдите на www.2ip.ru и проверьте свой ip. Если он отличен от внешнего ip адреса, в который транслируется приватный ip адрес Squid'a значит у вас всё получилось!!!

Как это работает:

Это наиболее важная глава, которой мне очень не хватало, когда я всё это пытался настроить, потому что знание как что работает, решает половину проблем.
Итак, как это работает? Когда вы запускаете Squid с настроенным wccp, то он начинает слать служебные wccp пакеты на указанный в его конфиге ip-адрес wccp маршрутизатора (10.80.2.1). Если маршрутизатор доступен, и на нём так-же включён wccp, то они между собой договариваются, и маршрутизатор регистрирует у себя обнаруженный web-кеш сервер (10.80.2.2).
Далее, маршрутизатор анализирует пакеты, проходящие через его интерфейс (f0/2), на котором включено перенаправление исходящих пакетов (ip wccp 80 redirect out), и, если адрес отправителя попадает под аксес лист wccp, и пакет адресован на 80 порт назначения, то пакет перенаправляется по gre тунелю на squid. При этом ip адрес источника и получателя не изменяется. Так как ip пакет имеет gre заголовок, то он попадает на интерфейс gre1 Linux сервера.
На интерфейсе gre1 присутствуют только входящие пакеты от клиента к публичному web-серверу. И входящие пакеты от публичного сервера, к клиенту. Вы никогда не увидите здесь исходящих пакетов.
На Lunux сервере Squid, в нашем случае, слушает 2 порта 3128 (squid в прозрачном режиме) и 3129 (squid в режиме TProxy).
Полученные сервером пакеты обрабатываются правилами iptables, и в соответствии с ними, сначала маркируются, а затем перенаправляются на squid с TPROXY на порту 3129.
Далее Squid от имени пользователя отправляет пакет на публичный web-сервер в интернет через интерфейс eth0. От публичного web-сервера ответ приходит на интерфейс маршрутизатора f0/2, где включено перенаправление входящих пакетов (ip wccp 90 redirect in), и если адрес получателя подходит под аксес лист wccp_to_inside, то пакет, по gre туннелю перенаправляется на Squid на интерфейс gre1. Здесь, если это настроено в конфиге Squid'a, происходит кеширование полученной информации и затем через интерфейс eth0, Squid отправляет пакет пользователю.

Недостатки

Практически у всего есть свои недостатки. К наиболее весомым недостаткам данной связки можно отнести:
  • Не возможность использования какой-либо авторизации пользователей на Squid'e, кроме простой авторизации по IP.
  • Наличие GRE тунеля может создавать определённые проблемы в сети, связанные с размером MTU.


Trouble Shooting

Используйте программу tcpdump для отслеживания прохождения пакетов.
tcpdump -i gre1
tcpdump -i eth0

или так:
tcpdump -i eth0 src host 10.26.5.22 and dst host ya.ru

Просмотрите правила iptables, счетчик пакетов должен увеличиваться. Вы должны увидеть что-то вроде этого:
iptables -t mangle -vL
Chain PREROUTING (policy ACCEPT 1685K packets, 768M bytes)
pkts bytes target prot opt in out source destination
904M 619G ACCEPT all -- any any anywhere 10.80.2.2
845M 590G DIVERT tcp -- any any anywhere anywhere socket
51M 2267M TPROXY tcp -- any any anywhere anywhere tcp dpt:http TPROXY redirect 0.0.0.0:3129 mark 0x1/0x1

Chain DIVERT (1 references)
pkts bytes target prot opt in out source destination
845M 590G MARK all -- any any anywhere anywhere MARK xset 0x1/0xffffffff
845M 590G ACCEPT all -- any any anywhere anywhere


P.S. Я не претендую на гениальность мысли, просто собрал всё в кучку из разных источников и описал то, с чем мне пришлось реально столкнуться на практике. В статье могут попадаться и неточности, прошу сильно не винить. Через прозрачный прокси у нас проходит сейчас около 1000 пользователей. Для отчётности используется sams 2.0.
Надеюсь кому-нибудь статья будет полезной. Успехов вам! :-)

Используемый материал:

  • wiki.squid-cache.org/Features/Tproxy4
  • www.mail-archive.com/squid-users@squid-cache.org/msg65056.html
Автор Bordac, http://bloggik.net


 

Последние комментарии