Добро пожаловать, гость ( Вход | Регистрация )
![]() ![]() |
| Leo |
Feb 23 2009, 12:48 PM
Сообщение
#1
|
|
Administrator ![]() ![]() ![]() Группа: Root Admin Сообщений: 128 Регистрация: 29-April 07 Пользователь №: 1 |
Выкладываю свое решение по управлению интернет-трафиком, прошедшим через SQUID.
Задача: - Подсчет трафика. - Суточное квотирование трафика по пользователю или по IP адресу. - Возможность изменения квот "на лету". - Поддержка русскоязычных имен пользователей (относится к пользователям домена NT). - Просмотр статистики и управление квотами через веб-интерфейс. Реализация: - ОС FreeBSD 6.1-RELEASE i386 - SQUID-2.5 - Apache-1.3 + PHP-5.1 + MySQL-5.1 Средства разработки: - perl-5.8.8 - P5::Mysql (/usr/ports/databases/p5-Mysql) - P5::DBI (/usr/ports/databases/p5-DBI) - PHP-5.1 Подробное описание решения находится в скрипте (вызов с ключом --help). Хотелось бы только отметить некоторые особенности, не описанные в справке: 1) Идея с записью данных сквида через FIFO канал в БД "на лету" была взята мною из squid2mysql. Соединение с БД происходит в момент веб-запроса, и если сервер БД недоступен, то скрипт пишет лог в резервный лог-файл, что повышает отказоустойчивость прокси сервера на случай недоступности БД. 2) Данные из резервного лог-файла периодически просматриваются скриптом и заносятся в БД, что предотвращает потерю данных при потере связи с БД. 3) Для авторизации пользователей в домене NT я использую SAMBA-3.0.26 + WINBIND, а точнее модуль ntlm_auth, который идет в комплекте с самбой. Это решает проблему русскоязычных имен пользователей, т к модуль проверяет членство пользователя в доменной группе, а не само имя пользователя. Пример squid.conf: auth_param ntlm program /usr/local/bin/ntlm_auth \ --require-membership-of=DOMAIN_GROUP_CHANGE_THIS --helper-protocol=squid-2.5-ntlmssp auth_param ntlm children 100 auth_param ntlm max_challenge_reuses 0 auth_param ntlm max_challenge_lifetime 20 minutes auth_param ntlm use_ntlm_negotiate on auth_param basic program /usr/local/bin/ntlm_auth --require-membership-of=DOMAIN_GROUP_CHANGE_THIS \ --helper-protocol=squid-2.5-basic auth_param basic children 100 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours auth_param basic casesensitive off authenticate_ttl 1 minutes вместо названия группы я использую GID (можно узнать с помощью wbinfo -n <group>) acl InternetUsers proxy_auth REQUIRED http_access allow InternetUsers 4) Если имя пользователя русскоязычное, в лог (а соответственно и в БД) оно попадает в url-кодировке, а при просмотре статистики или управлении квотой кодируется (декодируется) средствами PHP. В связи с этим я исключил возможность добавлять квоты вручную через веб-интерфейс. Они появляются автоматически при первом веб-запросе. 5) Алгоритм добавления пользователей/IP адресов в БД следующий: КЛИЕНТ - объект квотирования, если (ПОЛЬЗОВАТЕЛЬ АВТОРИЗОВАН) { КЛИЕНТ = имя пользователя } иначе { КЛИЕНТ = текущий IP адрес пользователя } АДРЕС = текущий IP адрес пользователя /* исключаем конфликт IP адресов и пользователей, при смешанном квотировании */ если (КЛИЕНТ = имя пользователя) { удаляем все записи, где КЛИЕНТ = АДРЕС } Скрипт скачать можно здесь: 1. http://sources.codenet.ru/file/1660/squidacc.tar.gz 2. http://www.opennet.ru/soft/squidacc.tar.gz |
![]() ![]() |