По работе столкнулся с такой проблемой: есть десяток прокси серверов (squid) в разных странах и не один десяток пользователей. Каждый из них сам решает через какой сервер работать — есть chrome extension в котором они могут сделать выбор.
Но все сервера находятся на разном удалении от пользователя и пользователь из России, пользуясь сервером в Канаде сталкивается с хорошими тормозами. С другой стороны все сервера подключены в дата центрах к магистралям и между ними задержки много меньше.
Было принято решение направлять каждого пользователя к ближайшему к нему серверу, а от туда к выбранному.
Первым пунктом необходимо настроить прокси для работы друг с другом. Самым простым путем было указать:
Но оказалось, что не все позволяют обратное преобразование в указанный тобой домен. Пришлось прописывать все ip серверов:
Если кто подскажет другое решение, я буду рад поправить. Пока сервера не часто меняются и в случае изменения быстро правятся с помощью puppet-ов.
Следующий шаг настроить acl для перенаправления по серверам:
При этом user1, user2 и user3 это acl пользователей.
В компании был уже настроен для этих случаев radius сервер. В centos 5 я шел путем настройки через pam, так как сам squid не собирал, но потом пришлось пойти по пути самостоятельной сборки (в стандартную не включен ssl) и я воспользовался ключом --enable-basic-auth-helpers=squid_radius_auth. Также, тем кто не хочет заморачиваться с pam я бы посоветовал отдельную библиотеку:
В любом варианте установки конфигурация squid не меняется, только пути к файлу в первой строчке:
Пример файла radius_config:
Правила оказались достаточно просты. Сначала указываем какой пользователь будет управляться каким правилом:
И, естественно разрешаем им пользоваться прокси:
Вот и все. Когда пользователь выбирает сервер, отдельная программа удаляет пользователя из файлов в userlist и добавляет в выбранный. Но это уже другая история.
Основная информация была взята из wiki squid, но там не хватает примеров:
Но все сервера находятся на разном удалении от пользователя и пользователь из России, пользуясь сервером в Канаде сталкивается с хорошими тормозами. С другой стороны все сервера подключены в дата центрах к магистралям и между ними задержки много меньше.
Было принято решение направлять каждого пользователя к ближайшему к нему серверу, а от туда к выбранному.
Прокси-прокси
Первым пунктом необходимо настроить прокси для работы друг с другом. Самым простым путем было указать:
acl localnet srcdomain мой домен.com
Но оказалось, что не все позволяют обратное преобразование в указанный тобой домен. Пришлось прописывать все ip серверов:
acl localnet srcdomain IP серверa 1
acl localnet srcdomain IP серверa 2
acl localnet srcdomain IP серверa 3
Если кто подскажет другое решение, я буду рад поправить. Пока сервера не часто меняются и в случае изменения быстро правятся с помощью puppet-ов.
Управление перенаправлением
Следующий шаг настроить acl для перенаправления по серверам:
cache_peer {сервер 1} parent 3128 3130 name=peer1
cache_peer {сервер 2} parent 3128 3130 name=peer2
cache_peer {сервер 3} parent 3128 3130 name=peer3
cache_peer_access peer1 allow user1
cache_peer_access peer2 allow user2
cache_peer_access peer3 allow user3
При этом user1, user2 и user3 это acl пользователей.
Авторизация
В компании был уже настроен для этих случаев radius сервер. В centos 5 я шел путем настройки через pam, так как сам squid не собирал, но потом пришлось пойти по пути самостоятельной сборки (в стандартную не включен ssl) и я воспользовался ключом --enable-basic-auth-helpers=squid_radius_auth. Также, тем кто не хочет заморачиваться с pam я бы посоветовал отдельную библиотеку:
wget http://www.squid-cache.org/contrib/squid_radius_auth/squid_radius_auth-1.10.tar.gz
tar xvzf squid_radius_auth-1.10.tar.gz
cd squid_radius_auth-1.10
cp Makefile.default Makefile
make
make install
В любом варианте установки конфигурация squid не меняется, только пути к файлу в первой строчке:
auth_param basic program /usr/local/squid/libexec/basic_radius_auth -f /usr/local/squid/etc/radius_config
auth_param basic children 5
auth_param basic realm {мой сервер} // будет отображаться в окошке авторизации
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
acl radius proxy_auth REQUIRED
Пример файла radius_config:
server {адрес radius сервера}
password {секретная фраза для подключения к radius}
Каждому серверу своего пользователя
Правила оказались достаточно просты. Сначала указываем какой пользователь будет управляться каким правилом:
acl user1 proxy_auth "/usr/local/squid/userlist/user1" no_cache
acl user2 proxy_auth "/usr/local/squid/userlist/user2" no_cache
acl user3 proxy_auth "/usr/local/squid/userlist/user3" no_cache
И, естественно разрешаем им пользоваться прокси:
http_access allow localnet // для proxy-proxy
http_access allow radius // для тех, кто не выбрал прокси - пользуется ближайшим
http_access allow user1
http_access allow user2
http_access allow user3
http_access deny all // не забываем запретить остальным
Вот и все. Когда пользователь выбирает сервер, отдельная программа удаляет пользователя из файлов в userlist и добавляет в выбранный. Но это уже другая история.
Источники
Основная информация была взята из wiki squid, но там не хватает примеров:
- Основной сайт wiki.squid-cache.org. Без перевода на русский. Не указываю отдельные страницы, так как их много использовал.
- Настройка radius Setup Squid and FreeRADIUS on CentOS 5 and CentOS 6
- А это справочник по Acl — элементы ACL
В статье описан не весь сервис, а только настройка squid. Но не написанное относится только к динамике, а у всех она может быть своя. Я отметил только нужные моменты. Не пытайтесь все настроить методом копипаста — пропущены строки, отношения не имеющие к теме статьи.