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

Недавно появилась задача реализовать некоторые функции Kerio в linux, а именно авторизацию
пользователей прокси сервера Squid в режиме transparent. Это сделать довольно просто и на
просторах интернета много статей как это сделать, но появилась проблема в режиме transparent
(прозрачный прокси) авторизация не работает. Конечно если у Вас небольшое количество пользователей
это не является проблемой, отключил transparent прописал у всех прокси сервер в браузерах и все.
Но когда пользователей и компьютеров становиться много и прописывать прокси сервер у всех нет
возможности/времени, тут приходиться искать решения. Одно из решений это связка Squid+PHP+NAT.


Система на которой все это тестировалось и в дальнейшем работала Ubuntu 11.04.
Устанавливаем: MySQL, PHP5, Apache2, iptables, squid
apt-get install squid mysql-server mysql-client php5 apache2
Включаем режим transparent в Squid:
nano /etc/squid/squid.conf
# NETWORK OPTIONS
http_port 192.168.0.1:3128 transparent

Разрешаем прохождение трафика:
echo "1" > /proc/sys/net/ipv4/ip_forward
Настраиваем NAT в iptables:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
Заворачиваем 80 порт в Наш сервер:
iptables -t nat -A PREROUTING -s 192.168.0.0/24 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.1:80
В файл /etc/php5/apache2/php.ini добавляем:
extension=pdo.so
extension=pdo_mysql.so

Далее создаем базу данных где будут храниться у нас пользователи
mysql -u root -p
CREATE DATABASE authphp CHARACTER SET utf8;

Подключаемся к новой базе:
\r authphp
Создаем таблицу с полями login и password
CREATE TABLE User (login CHAR(20), password CHAR(20));
Добавляем данные в таблицу
INSERT INTO User VALUES ('user','qwerty');
Выходим из консоли mysql
\q
Таким образом мы создали базу данных и внесли туда пользователя «user» с паролем «qwerty»
Дальше настала очередь самого php скрипта который будет осуществлять авторизацию
Для работы с базой я использовал библиотеку RedBeanPHP, которую можно скачать в
официального сайта
Содержание файла index.php
<?php
require('rb.php');

$ip = getenv ("REMOTE_ADDR");

R::setup('mysql:host=localhost;dbname=authphp','root','qwerty');

if( $user = R::findOne('User',' login = ? and password = ?',
array( $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] ) )
)
{

header('Location: next.html');
system("sudo iptables -t nat -D PREROUTING -s 192.168.0.0/24 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.1:80");
system("sudo iptables -t nat -D PREROUTING -s $ip -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128");
system("sudo iptables -t nat -A PREROUTING -s $ip -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128");
system("sudo iptables -t nat -A PREROUTING -s 192.168.0.0/24 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.1:80");
exit(0);

}

$title = "Squid Server";

{
header('WWW-Authenticate: Basic realm="'.$title.'"');
header('HTTP/1.0 401 Unauthorized');
die("Otkaz");
}

?>


Содержание файла hext.html
META HTTP-EQUIV="Refresh" CONTENT="0; URL=http://google.ru"
Только поставьте перед META "<" и после URL=http://google.ru" ">"

Таким образом пользователя, который хочет выйти в интернет, с начало заворачивает на сервер где
выполняется php скрипт. После того как пользователь ввел свои логин и пароль, добавляются правила
в iptables, и 80 порт пользователя заворачивается в squid на порт 3128

Собственно вот и все, естественно можно навести красоту и сделать в обще что бы было
похоже на Kerio, так же можно добавить что бы подключение сбрасывалось через допустим час
и требовала снова авторизации. В общем есть поля для творчества.
Надеюсь это будет кому-нибудь полезно, удачи.
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 36

    0
    Мысль интересная… Но повторная авторизация через час — не оч хорошо. Да и что делать в такой ситуации, если в начале цикла некий курьер быстренько забежал, посмотрел почту и убежал. А после него тут же сел за это место другой курьер, и воспользовавшись тем, что цикл еще не закончен, и авторизацию никто не просит, накачал себе порнухи?
      0
      Или, кстати, что делать в случае использования терминального сервера?
        0
        И вообще, хотелось бы что бы пользователь был из AD.
          0
          AD прикрутить можно — из php совершить запрос в LDAP не проблема.
            +1
            А Squid в режиме transparent не поддерживает NTLM авторизацию?
              +1
              нет
          0
          Кстати да, на тему терминального сервера я не задумывался. Думаю что решение есть, так что будет продолжение с напильником.
      • НЛО прилетело и опубликовало эту надпись здесь
          0
          Проблема в том что IE пользуются единицы, в ручную настраивать лень/не охота/и так далее
          0
          Но когда пользователей и компьютеров становиться много и прописывать прокси сервер у всех нет
          возможности/времени, тут приходиться искать решения.

          Совершенно надуманная проблема. В крупных компаниях (могу лично ручаться за несколько компаний с 15К+ пользователями) как раз таки никто не делает никаких «прозрачных» прокси, т.к. мороки с ним много больше, т.к. далеко не всё надо принудительно заруливать на проксю.
          Эта тема с прозрачным прокси как раз популярна в мелких конторках 10-50 юзеров.
            0
            Согласен, дело в том что это делалось для компании с небольшим кол-во пользователей, но пользователи непостоянные, что то вроде гостевого инета. Дальше я применяю этот способ в компаниях с 10-20 пользователями, где важен контроль посещения ресурсов интернета.
            И собственно этот способ не для масштабного использования, но как решение задачи в отдельных случаях, очень даже подходит.
            Конечно если появиться потребность с оптимизации и доработки приема, тогда буду дорабатывать дописывать. Пока что он выполняет поставленную задачу и клиент доволен.
            0
            У меня за авторизацию выхода пользователей в Интернет отвечает Poptop. У данного решения есть несколько плюсов. Более безопасная авторизация. Интеграция с WinAD. Проксирование естественно прозрачное. Единственный минус у Win7 иногда разрывается соединение.
              0
              Ну если все это настраивать под Windows то лучше Kerio пока ни чего не нашел.
                0
                Естественно под *nix. Под Windows существуют несколько готовых решений и помимо Kerio. Например traffic inspector у нас стоял пару лет назад. Все бы хорошо, но платить надо за каждого пользователя. И вообще идея Win в качестве gateway меня не очень привлекает.
                  0
                  Ну я и про pptp согласен что это хорошее решение и с прозрачным прокси работает, но мне нужно было сделать что я не подходил к компьютеру пользователя. Что бы он просто воткнул провод в буки или подрубился по Wifi, открыл брауезер ему там вылезло — типа «Гостевой вход user пароль qwerty ограничение трафика 10 мб, для увеличение лимита обратитесь к Официанту или Администратору» дальше Ему дают логин/пароль.
                  Конечно это решение общее для отдельных клиентов все переписывается под них и под их задачи.

                  Конечно можно выложить так же инструкцию настройки pptp, но не все даже по инструкции настроят — это факт.
                    0
                    Согласен что по инструкции настроят не все (проверял). Но думаю есть способ автоматизации.
                      0
                      Ну да все настройки кроме пароля хранятся в файле %allusersprofile%\Application Data\Microsoft\Network\Connections\Pbk\rasphone.pbk
                      На своей windows-машине настроил файлик, сделал батник который скачивает rasphone.pbk с сервера и вставляет в %allusersprofile%\Application Data\Microsoft\Network\Connections\Pbk\ и все остется вбить логин пароль.
                        0
                        А в будущем, когда провайдер предоставит IPv6, планирую переход на OpenVPN.
                          0
                          зачем, если в ipv6 встроен ipsec?
                            0
                            А он будет тунелироваться поверх сетей ipv4? Кроме того, на мой взгляд, ipsec немного мутноват, хотя возможно мне не встречалось хорошего руководства.
                              0
                              Имел ввиду, что сеть предприятия состоит из нескольких сегментов, разделенных маршрутизаторами. И не хотелось бы поднимать на них ipv6 только ради Интернета.
                                0
                                NAT-PT, RFC 2766
                                  0
                                  Википедия пишет что NAT-PT имеет проблемы
                                    0
                                    а NAT не имеет, хочешь сказать?
                                      0
                                      А зачем еще лишние?
                                        0
                                        понятия не имею. Но некоторым почему-то хочется лишних.
                                        не хотелось бы поднимать на них ipv6 только ради Интернета
                                          0
                                          Дискуссия приобретает деструктивный характер. Предлагаю остановиться, до взаимных обвинений и драки.
                                            0
                                            ipv4 и v6 несовместимы. Это надо уяснить. Любые «связки» между ними будут костылями из говна и палок. Просто в данном случае NAT-PT — это официальное говно, крепкий кал, а openvpn — жиденький стул.
                                              0
                                              Между прочем, «крепкий кал» — запоры, являются основными причинами геморроя.
                                                0
                                                Чувствуется горечь опыта в этих словах.
                                                  0
                                                  Вы ошибаетесь. Ни NAT-PT ни геморрой я не юзал.
              0
              Это все от того, что гуглом пользоваться не умеете.
                0
                Ну не спорю проглядел, но принцип работы почти такой же. Да и радость была, что сам додумался без google.
              • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  Да я Сам делал по этому мануалу… естественно он не полный и под свои нужны ( у каждого свои) его нужно додумывать. по поводу команд:

                  «Содержание файла hext.html» — не чего что такого файла в конфигах ваших нет?
                  Как это нету? Смотрите внимательней в Файле index.php строчка header('Location: next.html');

                  «CREATE TABLE User (login CHAR(20), password CHAR(20);» — что-то забыли!
                  тут да скобочку забыл ну думаю это не страшно, исправлю.

                  «extension=pdo.so» — а не чего что в системе нет pdo изначально? (ставить его большая морока)
                  в Ubuntu мне не пришлось ставить ни чего дополнительно кроме того что я написал выше.

                  «Squid» — по поводу прокси, Вы уверены что добавя эту ОДНУ строчку я заведу скюид? Сомневаюсь!
                  Ну тут подразумевается что вы уже настроили Squid мануалов в интернете по настройки Squid полно, а этой строчкой мы включаем в нем Прозрачность не более.

                  Спасибо за высказанные недочеты.

                  • НЛО прилетело и опубликовало эту надпись здесь

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое