Прозрачный прокси сервер 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, так же можно добавить что бы подключение сбрасывалось через допустим час
и требовала снова авторизации. В общем есть поля для творчества.
Надеюсь это будет кому-нибудь полезно, удачи.http://habrahabr.ru/post/140052/

Комментарии закрыты.