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

в 13:52, , рубрики: Linux для всех, squid, авторизация, системное администрирование, Убунтариум, метки: ,

Недавно появилась задача реализовать некоторые функции 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, так же можно добавить что бы подключение сбрасывалось через допустим час
и требовала снова авторизации. В общем есть поля для творчества.
Надеюсь это будет кому-нибудь полезно, удачи.

Автор: Javded


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js