Как показал читательский отклик, одной из наиболее интересных тем является настройка аутентификации через прокси-сервер Squid. Сегодня, располагая небольшим свободным временем, мы решили написать небольшую заметку на эту тему, которая в итоге вылилась в полноценную статью.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Сразу важное предупреждение: аутентификация и прозрачный прокси несовместимы! Придется выбирать что-то одно. Второе предупреждение: аутентификация через прокси позволит ограничить доступ в Интернет только по HTTP протоколу. Остальные протоколы: FTP, SMTP, POP3 и другие будут спокойно продолжать работать через NAT. Хотя в небольших организациях это не столь критично, наиболее употребляемым (и злоупотребляемым) является именно протокол HTTP, и одной из задач администратора является ограничение доступа сотрудников в интернет именно через браузер.
Подготовка сервера.
В качестве базы мы будем использовать роутер, обновленный до Ubuntu Server 10.04 LTS. В первую очередь отключим прозрачное проксирование, для этого в файле /etc/nat закомментируем последнюю строку:
#iptables -t nat -A PREROUTING -i eth1 -d ! 10.0.0.0/24 -p tcp -m multiport --dport 80,8080 -j DNAT --to 10.0.0.1:3128
Также следует запретить HTTP соединения (порт 80) через NAT, для этого перед строкой:
# Разрешаем доступ из внутренней сети наружу
добавляем:
# Запрещаем HTTP через NAT
iptables -A FORWARD -i eth1 -p tcp --dport 80 -j REJECT
В случае необходимости можно запретить по умолчанию все порты и протоколы, а затем разрешить нужные. Для этого правило будет выглядеть следующим образом:
# Запрещаем все по умолчанию
iptables -P FORWARD DROP
# Разрешаем нужные службы (FTP, SMTP, POP3)
iptables -A FORWARD -i eth1 -p tcp --dport 21 -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp --dport 25 -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp --dport 110 -j ACCEPT
Перезагружаемся, проверяем правильность работы цепочек.
Настройка Squid
Подготовив сервер, перейдем к настройке Squid, для этого откроем /etc/squid/squid.conf, далее пойдем от начала файла. Найдем, раскомментируем и приведем к следующему виду строку:
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/passwd
Данная строка указывает использовать NCSA аутентификацию на основе списка пользователей из файла passwd. Далее найдем и раскомментируем следующие строки:
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
Первая строка указывает количество одновременно доступных каналов для аутентификации, вторая выводимое приветствие, можете заменить Squid proxy-caching web server на то, что вам нравиться, например Интернет сервер ООО "Рога и Копыта". Третья строка отвечает за время хранения пары логин - пароль, по истечении этого времени сервер попросит повторную проверку.
Зададим группу доступа для всех прошедших проверку, раскомментировав:
acl password proxy_auth REQUIRED
Теперь изменим права доступа через Squid, найдем и закомментируем строку, разрешающую доступ всем членам локальной сети:
#http_access allow localnet
И добавим рядом строку, которая разрешает доступ только для аутентифицированных пользователей:
http_access allow password
Не забываем убрать настройку, отвечавшую за прозрачность, вместо
http_port 10.0.0.1:3128 transparent
оставьте
http_port 10.0.0.1:3128
Важно, в версиях Squid3, начиная с 3.1 и новее, вместо опции transparent используется intercept.
Сохраняем файл. Теперь нам надо создать файл паролей и завести пользователей. Для этого нам понадобится утилита htpasswd из состава apache2-utils, установим этот пакет:
sudo apt-get install apache2-utils
Теперь заведем пользователя командой:
htpasswd -c /etc/squid/passwd ivanov
Ключ -с указывает создать файл паролей в случае его отсутствия, второго и последующего пользователей следует заводить командой:
htpasswd /etc/squid/passwd petrov
Перезагружаем Squid.
На клиентской машине в браузере явно укажем использование прокси и попробуем выйти в интернет, если все сделано правильно должно появиться окно запроса логина - пароля.
Автоматическое определение настроек прокси-сервера
Вроде бы мы все настроили, но данное решение требует ручной настройки браузеров на каждом клиентском ПК, а если завтра мы поменяем параметры прокси, порт или IP адрес? Снова бегать? Здесь нам на помощь придет WPAD (Web Proxy Auto Detection), который позволяет один раз указать в настройках браузера клиента адрес скрипта автоматической настройки и дальнейшие изменения вносить уже в этот скрипт.
Скрипт WPAD должен быть опубликован на локальном веб-сервере, если вы не собираетесь использовать роутер в качестве полноценного веб-сервера то нет необходимости устанавливать такой тяжеловес как Apache, с данной задачей отлично справиться быстрый и легкий Lighttpd. Данный веб-сервер благодаря именно этим качествам прочно "прописался" в аппаратных маршрутизаторах, модемах и т.п. Для установки выполним:
sudo apt-get install lighttpd
Для проверки работы веб-сервера наберем в любом браузере http://10.0.0.1, если все работает нормально мы увидим стандартную страничку Lighttpd:
Откроем конфигурационный файл Lighttpd и добавим в него следующую секцию:
mimetype.assign += (".dat" => "application/x-ns-proxy-autoconfig")
Теперь в корневой папке веб-сервера создадим файл WPAD:
sudo touch /var/www/wpad.dat
Откроем его внесем следующий текст:
function FindProxyForURL(url, host)
{
if(isInNet(host, "10.0.0.0", "255.255.255.0")) { return "DIRECT"; }
return "PROXY 10.0.0.1:3128";
}
Данная конструкция будет автоматически заворачивать на прокси все запросы, кроме адресов вашей локальной сети. Также добавим аналогичное правило для localhost:
if (shExpMatch(host, "127.0.0.1" )) {return "DIRECT";}
if (shExpMatch(host, "*/localhost*" )) {return "DIRECT";}
Кроме того, отправим напрямую протокол HTTPS, который Squid все равно не обрабатывает, тем самым сняв возможные проблемы с сайтами работающими по этому протоколу:
if (shExpMatch(url, "https:*")) {return "DIRECT";}
В итоге файл должен принять вид:
function FindProxyForURL(url, host)
{
if(isInNet(host, "10.0.0.0", "255.255.255.0")) { return "DIRECT"; }
if (shExpMatch(host, "127.0.0.1" )) {return "DIRECT";}
if (shExpMatch(host, "*/localhost*" )) {return "DIRECT";}
if (shExpMatch(url, "https:*")) {return "DIRECT";}
return "PROXY 10.0.0.1:3128";
}
Если в вашей сети используется Internet Explorer можно передавать расположение скрипта WPAD при помощи DHCP сервера, для этого в /etc/dnsmasq.conf добавьте:
dhcp-option=252,http://10.0.0.1/wpad.dat
В свойствах подключения браузера достаточно будет установить галочку "Автоматическое определение параметров"
К сожалению, не все альтернативные браузеры не умеют получать настройки по DHCP, в этом случае адрес скрипта настройки придется указать вручную.
Для Firefox:
Для Opera:
Google Chrome использует настройки Internet Explorer, однако не умеет получать настройки по DHCP, поэтому потребуется дополнительно указать прямой путь к скрипту автонастройки:
На этом настройку можно считать законченной. Остается пожелать аптайма вашему серверу.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Последние комментарии