Недавно появилась задача реализовать некоторые функции Kerio в Linux, а именно авторизацию Пользователи прокси-сервера Squid в прозрачном режиме.
Это довольно легко сделать и В интернете много статей как это сделать, но в прозрачном режиме есть проблема (прозрачный прокси) авторизация не работает. Конечно, если у вас небольшое количество пользователей Это не проблема, я отключил прозрачный и прописал во всех браузерах прокси-сервер и всё.
Но когда пользователей и компьютеров много и всем не обязательно прописывать прокси-сервер возможность/время, вам придется искать решения.
Одним из решений является комбинация Squid+PHP+NAT.
Система, на которой все это тестировалось и впоследствии работало, была Ubuntu 11.04.
Установка: MySQL, PHP5, Apache2, iptables, squid. apt-get install squid mysql-server mysql-client php5 apache2
Включите прозрачный режим в 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
Создайте таблицу с полями логина и пароля.
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 = "Кальмар-сервер";
{
header('WWW-Authenticate: Basic realm="'.
$title.'"');
header('HTTP/1.0 401 Unauthorized');
die("Otkaz");
}
?>
Содержимое файла hext.html META HTTP-EQUIV="Refresh" CONTENT="0; URL=<a href="/yti/cgLLgcnVodHRwOi8vZ29vZ2xl2Zv" target="_blank" rel="nofollow noopener" title="Прозрачный прокси-сервер Squid с паролем в Ubuntu 11.04"> http://google.ru "
Просто поставь "<" before META and after URL= http://google.ru " "> "
Таким образом, пользователь, желающий выйти в Интернет, сначала направляется на сервер, где
PHP-скрипт запущен.
После того как пользователь ввел свое имя пользователя и пароль, правила добавляются.
в iptables, а пользовательский порт 80 завернут в squid на порту 3128 Собственно вот и всё, естественно можно навести красоту и вообще сделать что бы было аналогично Керио, можно еще добавить, чтобы соединение сбрасывалось скажем через час и снова потребовалось разрешение.
В общем, есть простор для творчества.
Надеюсь кому-то это пригодится, удачи.
Теги: #Системное администрирование #авторизация #конфигурация Linux #squid #php+nat #прозрачный прокси-сервер
-
Решение Задачи Про Мудрецов Без Компьютера
19 Oct, 24 -
Философский Вопрос
19 Oct, 24