Перейти до

Stg 2.4 + Squid


Рекомендованные сообщения

Нужна помощь в настройке рабочей конфигурации squid

Хотелось бы:

 

Что бы работал Сквид и кэшировал трафик но при этом из кеша ничего не выдавалось без авторизации пользователя.

 

Сквид должен быть прозрачным и пользователи не должны знать что они исользуют.

 

Желательно что бы трафик из кеша брался и считался как веб. (Но не обязательно)

 

У меня не получилось:

 

1.) Запретить пользователям проходить на прокси без авторизации.

2.) отдавать трафик пользователям и считать что он веб.

 

Мои скрипты и настройки:

 

http_port 3128
httpd_accel_host virtual
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
icp_port 0
acl QUERY urlpath_regex cgi-bin
no_cache deny QUERY
cache_mem 32 MB
cache_dir ufs /var/spool/squid 5120 16 256
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
logfile_rotate 10
mime_table /etc/squid/mime.conf
pid_filename /var/run/squid.pid
ftp_user anonymous@
ftp_list_width 32
ftp_passive on
ftp_sanitycheck on
dns_nameservers 81.24.135.1

acl server src 192.168.1.1/255.255.255.255
acl zal src 192.168.0.2-192.168.0.10/255.255.255.255
acl bibl src 192.168.1.30/255.255.255.255

acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563
acl SMTP port 25
acl Safe_ports port 80
acl Safe_ports port 21
acl Safe_ports port 443 563
acl Safe_ports port 777
acl CONNECT method CONNECT

http_access allow server
http_access allow zal
http_access allow bibl
http_access deny !Safe_ports
http_access deny SMTP
http_access deny all

icp_access deny all

error_directory /etc/squid/errors

delay_pools 3

delay_class 1 2
delay_class 2 3
delay_class 3 2

delay_access 1 allow server
delay_access 1 deny all
delay_parameters 1 -1/-1 -1/-1

delay_access 2 allow zal
delay_access 2 deny all
delay_parameters 2 500000/500000 500000/500000 250000/250000

delay_access 2 allow bibl
delay_access 3 deny all
delay_parameters 3 500000/500000 -1/-1

 

Файрвол настроен так:

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
service vsftpd start
#service httpd start
/etc/rc.d/init.d/mysqld start

ipta=iptables

office=81.24.135.72
admin=192.168.0.0/24

server1=192.168.0.1
server0=81.24.135.140

iface_world=eth0
iface_cli=eth1
conf_port=5555
user_port1=5555
user_port2=5555

echo "1" > /proc/sys/net/ipv4/ip_forward

$ipta -t filter -F
$ipta -t filter -X
$ipta -t nat -F
$ipta -t nat -X

#    DROP:
$ipta -t filter -P INPUT DROP
$ipta -t filter -P FORWARD DROP
$ipta -t filter -P OUTPUT DROP

#$ipta -t filter -A INPUT -p icmp -j ACCEPT
#$ipta -t filter -A FORWARD -p icmp -j ACCEPT
#$ipta -t filter -A OUTPUT -p icmp -j ACCEPT
$ipta -t filter -A INPUT -d 127.0.0.1 -j ACCEPT
$ipta -t filter -A OUTPUT -s 127.0.0.1 -j ACCEPT

$ipta -t filter -A INPUT -i $iface_world -j ACCEPT
$ipta -t filter -A OUTPUT -o $iface_world -j ACCEPT
$ipta -t filter -A INPUT -i $iface_cli -j ACCEPT
$ipta -t filter -A OUTPUT -o $iface_cli -j ACCEPT

####

# SSH

$ipta -t filter -A INPUT -p tcp -s $admin -d $server1 --dport 22 -j ACCEPT
$ipta -t filter -A OUTPUT -p tcp -d $admin -s $server1 --sport 22 -j ACCEPT

$ipta -t filter -A INPUT -p tcp -s 81.24.135.0/24 -d $server0 --dport 22 -j ACCEPT
$ipta -t filter -A OUTPUT -p tcp -d 81.24.135.0/24 -s $server0 --sport 22 -j ACCEPT

$ipta -t filter -A INPUT -p tcp -s $admin -d $server1 --dport 21 -j ACCEPT
$ipta -t filter -A OUTPUT -p tcp -d $admin -s $server1 --sport 21 -j ACCEPT

# Stargazer configurator
$ipta -t filter -A INPUT -p tcp -s 192.168.0.0/24 -d $server1 --dport $conf_port -j ACCEPT
$ipta -t filter -A OUTPUT -p tcp -d 192.168.0.0/24 -s $server1 --sport $conf_port -j ACCEPT

# UDP stargazer InetAccess
$ipta -t filter -A INPUT -p udp -s 192.168.0.0/24 --sport $user_port2 -d $server1 --dport $user_port1 -j ACCEPT
$ipta -t filter -A OUTPUT -p udp -d 192.168.0.0/24 --dport $user_port1 -s $server1 -j ACCEPT

$ipta -t nat -A POSTROUTING -d 192.168.0.0/24 -j MASQUERADE
stargazer

  #$ipta -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3128
  #service squid restart

 

Что надо дописать в ОН Конекте и в дисконекте для правильной авторизации пользователей.

Ссылка на сообщение
Поделиться на других сайтах

Ну примерно вот так:

server0=10.0.0.9

ProxyIP=10.0.0.9 # Поменяй на свои

iface_lan=eth0

localnet=10.0.0.0/21

 

iptables -t filter -A INPUT -i $iface_lan -p tcp -s $localnet -m multiport ! --dport 3128 -j ACCEPT

iptables -t filter -A OUTPUT -o $iface_lan -p tcp -d $localnet -m multiport ! --sport 3128 -j ACCEPT

iptables -t filter -A INPUT -i $iface_lan -p udp -s $localnet -m multiport ! --dport 3128 -j ACCEPT

iptables -t filter -A OUTPUT -o $iface_lan -p udp -d $localnet -m multiport ! --sport 3128 -j ACCEPT

 

Разрешаем общаться с локалкой, кроме портов прокей.

В rules - указываем:

TCP 10.0.0.9/32:3128 DIR1

ALL 10.0.0.0/21 DIR0

ALL 192.168.1.0/24 DIR0

ALL 0.0.0.0/0 DIR1

Соотв DIR1 - интернет, DIR0 - локалка.

 

iptables -t nat -A PREROUTING -s $localnet -d ! $server0 -p tcp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081 -j DNAT --to-destination $proxyIP:3128

iptables -t nat -A PREROUTING -s $localnet -d ! $server0 -p udp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081 -j DNAT --to-destination $proxyIP:3128

 

OnConnect:

iptables -t filter -A INPUT -s $IP -j ACCEPT

iptables -t filter -A FORWARD -s $IP -j ACCEPT

iptables -t filter -A FORWARD -d $IP -j ACCEPT

iptables -t filter -A OUTPUT -d $IP -j ACCEPT

 

Сквид с поддержкой прозрачности. Пользователи даже не подозревают, что где-то есть прокся... Экономия у нас 23%

Ссылка на сообщение
Поделиться на других сайтах

А как насчет онлайн игр? Насколько я знаю они не работают через squid,

Как вы решили этот трабл? Я думаю в фаерволе не заворачивать используемые порты игр на проксю, а гнать через нат/ Подкиньте схему как кто реализовал.

Ссылка на сообщение
Поделиться на других сайтах

А может мне кто нибудь помочь сделать тоже самое только под фрю ?? (ipfw)

Очень уж хочется чтобы была статистика по URL..

И вот еще очень инетерсный момент:

К примеру авторизация прошла через стг. правило добавилось и получается что в стг будет траф считаться для конкретного зверя. А вот как он будет в сквиде считаться ?? т.е. он наверняка будет считаться для того IP с которого авторизовался зверь .... а как быть если с одного и тогоже IP выходят разные звери?? СТГ то конечно посчитат этих зверей отдельно а вот сквид посчитает вместе .... как сделать так что бы сквиду передавался не IP для подсчета трафика а именно то имя зверя под которым он авторизуется ???????

Ссылка на сообщение
Поделиться на других сайтах
А как насчет онлайн игр? Насколько я знаю они не работают через squid,

Как вы решили этот трабл? Я думаю в фаерволе не заворачивать используемые порты игр на проксю, а гнать через нат/ Подкиньте схему как кто реализовал.

Почему не работают?

 

acl sites dstdomain "/usr/local/squid/sites.conf (список сайтов)

acl IP src "/usr/local/squid/IP.conf" (список разрешенных IP)

 

http_access allow IP

http_access allow sites

Ссылка на сообщение
Поделиться на других сайтах

Для того чтоб прокси стал прозрачным - в конфиге сквида измени строку:

 

http_port IP_интерфейса_торчащего_внутри_локальной_Сети:3128 transparent

например:

 

http_port 10.201.201.201:3128 transparent

 

 

потом при помощи IPTABLES насильно заверни пакеты проходящие на на 80 порт на порт 3128

Ссылка на сообщение
Поделиться на других сайтах
А может мне кто нибудь помочь сделать тоже самое только под фрю ?? (ipfw)

Очень уж хочется чтобы была статистика по URL..

И вот еще очень инетерсный момент:

К примеру авторизация прошла через стг. правило добавилось и получается что в стг будет траф считаться для конкретного зверя. А вот как он будет в сквиде считаться ?? т.е. он наверняка будет считаться для того IP с которого авторизовался зверь .... а как быть если с одного и тогоже IP выходят разные звери?? СТГ то конечно посчитат этих зверей отдельно а вот сквид посчитает вместе .... как сделать так что бы сквиду передавался не IP для подсчета трафика а именно то имя зверя под которым он авторизуется ???????

Нууу... Напрмер вот так:

 

Создаем БД в mysql: ip,user,url,bytes,host,trans - и т.д. (Читаем squid.conf про формат файла access.log, и добавляем нужные нам поля - user, host).

Создаем таблицу соответствий now (ip=user) - которую поддерживают в актуальном состоянии скрипты OnConnect, OnDisconnect.

 

Создаем трубу (pipe) mkfifo в /var/log/squid/access.log

Запускаем скрипт (./s2m < /var/log/squid/access.log), который будет с одной стороны трубы ловить идущий в него поток.

Запускаем сквид. Сквид пихает в лог строки, мы это дела разбираем, и тутже кладем в БД. (Долго искал патчик на сквида, чтоб сразу писал в БД, не нашел.)

 

 

#!/usr/bin/perl
use DBI;
use DBI::DBD;
use Time::localtime;
use Data::Dump qw(dump);
$dbh=DBI->connect('DBI:mysql:traffics','_USER_','_PASS_');
open(FBLOG,">>"."/tmp/squid-desynchro.log");
open(FBERR,">>"."/tmp/squid-sql-errs.txt");

load_type ();
check_now ();

$typeid=0;
my @type;
while(<>) {

$original=$_;
($time, $resp_time, $userip, $method, $bytes, $metod, $url , $user, $trans, $type) = split (" ", $original);


$url=~s/\"/'``'/egs;
$url=~s/\"/'``'/egs;
$typen=typer();
$namen=namer();

($time,$msec)= split (/\./,$time );

check_now ();

$act = time();
$delta=$act-$time;
#print $delta."\n";
#print $time-$act."\n";
#print $url."\n";
host ();

if  ( $delta > 3) {

print FBLOG $delta." ".$original;

} else {
#print $original."\n";
namer();
#$sql = "INSERT INTO squid (ip,bytes,link,trans,time,type,user) SELECT '$userip','$bytes','$url','$trans',from_unixtime('$time'),'$typen',now.`username` from now where now.`ip`='$userip'";
$sql = "INSERT INTO squid (ip,bytes,link,trans,time,type,user,host,proto) VALUES ( '$userip','$bytes',\"$url\",'$trans',from_unixtime('$time'),'$typen','$namen','$host','$prota')";
print $sql."\n";

my $sth = $dbh->prepare( $sql );
if ($sth->execute()) {

} else {
#system "echo $sql >> /tmp/squid-sql-errs.txt";
print FBERR $sql.";\n";
}


}}


$dbh->disconnect();
close(FBLOG);

exit();

sub check_now {
$sql = "SELECT UPDATE_TIME FROM information_schema.TABLES where TABLE_NAME='squid'";
my $sth = $dbh->prepare( $sql );
$sth->execute();
$ch_now=$sth->fetchrow_array;
#print $update_now." -> ".$ch_now."\n";
if ($update_now eq $ch_now) {
} else {
#print $update_now." -> ".$ch_now."\n";
$update_now=$ch_now;
}}

sub read_now {
}



sub typer () {
$type_n='';
for(my $i=0; $i<= $#type;$i++){
if (${$type[$i]}{'type'} eq $type) {
$type_n=${$type[$i]}{'id'};
}}
if ($type_n eq '') {
$sql = "INSERT INTO content (type) VALUES ('$type')";
my $sth = $dbh->prepare( $sql );
$sth->execute();

load_type();
for(my $i=0; $i<= $#type;$i++){
if (${$type[$i]}{'type'} eq $type) {
$type_n=${$type[$i]}{'id'};
}}}
return $type_n;

}

sub load_type () {
@type='';
$sql = "SELECT * FROM content";
my $sth = $dbh->prepare( $sql );
$sth->execute();
while (@temp=$sth->fetchrow_array) {
push @type,{'id'=>$temp[0],'type'=>$temp[1]};}
#dump @type;
}

sub namer () {
$sql = "SELECT username FROM now where ip='$userip'";
my $sth = $dbh->prepare( $sql );
if ($sth->execute()){
if ($name_n=$sth->fetchrow_array) {} else {
$name_n='name-not-found';
}} else {
$name_n='name-not-found';
}
return $name_n;
}

sub host () {
my @matches = ('/');
$url =~ /(@matches)/;
if ($1 eq '/')  {
($prota, $urle) = split ("://", $url);
($host, $temp) = split ("/", $urle);
$host=~s/www./''/egs;
$prota=~s/ftp/'1'/egs;
$prota=~s/http/'2'/egs;
} else {
$host=$url;
$prota="0";
}
#print $prota."  ".$host."\n";
}

 

Код несколько коряв, но работает. Если интересно, могу выложить все свое самописное, On(Dis)connect, rules, структуру правил файрвола и слепки БД.

 

В результате в БД напротив каждого url, bytes помимо ip есть username. По нему можно делать выборку. Красивых .php пока не написал (и некрасивых тоже). Будет время - поставлю себе творение Алферова, и может добавлю туда логи сквида и топ сайтов.

Ссылка на сообщение
Поделиться на других сайтах

когда transparent proxy находится на той же машине, что и stargazer, например на 10.0.0.1, и соответсвенно вся сеть это /24, то кешированный трафик отдаётся напрямую клиенту без участия старгейзера, следовательно мы теряем деньги :) а это 23% как сказано выше :(

Ссылка на сообщение
Поделиться на других сайтах
когда transparent proxy находится на той же машине, что и stargazer, например на 10.0.0.1, и соответсвенно вся сеть это /24, то кешированный трафик отдаётся напрямую клиенту без участия старгейзера, следовательно мы теряем деньги :) а это 23% как сказано выше :(

См мой пост выше -

 

Разрешается общаться с локалкой, _кроме_ порта 3128. Соотв в OnConnect OnDisconect разрешаем общаться с проксей.

iptables -t filter -A INPUT -i $iface_lan -p tcp -s $localnet -m multiport ! --dport 3128 -j ACCEPT
iptables -t filter -A OUTPUT -o $iface_lan -p tcp -d $localnet -m multiport ! --sport 3128 -j ACCEPT
iptables -t filter -A INPUT -i $iface_lan -p udp -s $localnet -m multiport ! --dport 3128 -j ACCEPT
iptables -t filter -A OUTPUT -o $iface_lan -p udp -d $localnet -m multiport ! --sport 3128 -j ACCEPT 

 

В /etc/stargazer/rules

TCP     10.0.0.9/32:3128        DIR1
TCP     10.0.0.10/32:3128       DIR1
TCP     10.0.0.242/32:3128      DIR1
TCP     10.0.0.249/32:3128      DIR1
ALL     10.0.0.0/21             DIR0
ALL     192.168.1.0/24          DIR0
ALL     0.0.0.0/0               DIR1

Порт проксика приравнять к интернету.

И все - прокся считается интернетом, и общитыватся stargazer'ом

Ссылка на сообщение
Поделиться на других сайтах
А если нельзя приравнивать весь трафик со сквида к интернету, то как тогда?

Даю наводку: при прозрачном проксировании запросов к прокси-серверу нет, соответственно нет и нужды добавлять в rules что_то_там:3128 со всеми вытекающими.

Ссылка на сообщение
Поделиться на других сайтах
А если нельзя приравнивать весь трафик со сквида к интернету, то как тогда?

Даю наводку: при прозрачном проксировании запросов к прокси-серверу нет, соответственно нет и нужды добавлять в rules что_то_там:3128 со всеми вытекающими.

пробывал ничего не добавлять - не считается траф...

 

кста. а мож это у меня всё из за того, что когда траф попадает на шлюз, то он сначала уходит в сквид, а потом тока на выходе перехватывается старгейзером и общитывается по рулесам? может быть как то можно натравить старгейзер, чтобы он выходящий трафик от провайдера первым загонял в queue, обсчитывал и потом отдавал системе, которая в свою очередь кидала его в сквид? (вроде ясно выразился :))

Ссылка на сообщение
Поделиться на других сайтах
Даю наводку: при прозрачном проксировании запросов к прокси-серверу нет, соответственно нет и нужды добавлять в rules что_то_там:3128 со всеми вытекающими.

Можно пример как оно у тебя так получается? Прозрачное проксирование (как я это понимаю) - все HTTP запросы скрытно от юзера заворачиваются на проксю, т.е. :

 

iptables -t nat -A PREROUTING -s $userip -d ! $lanip -p tcp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081 -j DNAT --to-destination ".$proxy.":3128

 

Преобразование в PREROUTING. Траффик еще не дошел до правила QUEUE, и не попал в cap_ipq, и соотв еще не обработался старгейзером. Старгейзер, если посмотреть detailstat обсчитывает общение с инетом, как общение с проксей.

 

Alferov, то что ты говоришь, может быть правдой, если прозрачный проксик стоит отдельно, между шлюзом с stg и интернетом, тогда старгейзер действительно не сделает разницы между NAT интернетом, и обработаным проксей. Но всеравно, я бы вписал в правила стг считать общение с проксей интернетом, ибо юзеры могут пронюхать ип-порт.

 

А если нельзя приравнивать весь трафик со сквида к интернету, то как тогда?

 

А в чем заключается разница? Разница будет в суммарный размер страниц сообщений об ошибках, которые увидит юзер (из тех что генерит сквид), да в размер иконок (типа папок и типов файлов при посещении фтп). Если ты имеешь ввиду траффик на локальные сайты, типа апача статистики и т.д., это легко решается методами iptables, например вот так:

1) В таблице PREROUTING завернуть все (80,81,82,83,88,8000,8001,8002,8080,8081) запросы в свежесозданную цепочку http

(прим. Если например сервер статистики находится в локальной сети пользователся, то он может сам общаться с ним, не прибегая к использованию шлюза. В случае с vpn это не покатит - весь пусть даже локальный траффик пойдет через шлюз)

2) Цепочку http построчно разбирать:

а) На сервер статистики, который юзер не видит в локалке? DNAT -> на сервер локалки.

б) На хоум-паги пользователей (внутри локалки)? DNAT - тудаже.

в) destination address не локалка? Отдать на растерзание сквиду.

Для а и б нужно в файрволе прописать чтото вида:

iptables -t filter -A FORWARD  -p tcp -s $localnet -d $localnet -m multiport ! --dport 3128 -j ACCEPT

 

кста. а мож это у меня всё из за того, что когда траф попадает на шлюз, то он сначала уходит в сквид, а потом тока на выходе перехватывается старгейзером и общитывается по рулесам? может быть как то можно натравить старгейзер, чтобы он выходящий трафик от провайдера первым загонял в queue, обсчитывал и потом отдавал системе, которая в свою очередь кидала его в сквид?

 

И как старгейзер, который не рзбирает пакеты, узнает для кого сквид берет этот пакет? У траффика сквида адрес запроса - твой сервер, получатель - сайт. Какому пользователю что отдать, это уже знает сам сквид...

lan-map.png

 

Траффик от юзеров сначала обрабатывается iptables, и принимается решение о том куда он пойдет, и только потом его обсчитывает старгейзер. То что должно пойти в локалку (игры, обменник), пойдет в локалку. А по пути его осчитает сквид по тарифу. Траффик, идущий в интернет поделится на 2 части - то что пойдет натом (аська, on-line игры...) посчитается старгейзером и уйдет в интернет, который предназначен сквиду посчитается stg и только потом попадет к нему. А вот например DNS запоросы от твоего собственного сервера, и обновления которые качет сам сервак, к stg не попадут. Точнее они могут быть пропущены через QUEUE, но stg не обратит на них внимания, и спокойно подпишет им ACCEPT.

Этот траффик можно посчитать средствами iptables, запихнув каждый из таких сервисов в отдельную цепочку.

Ссылка на сообщение
Поделиться на других сайтах

У меня стоит все на одной машине. И стг и сквид. Ось - freebsd

ipfw + natd

 

в правилах есть это

ipfw add 140 tee 15701 ip from any to any via em0

 

В OnConnect есть это:

$login=@ARGV[0];

$ip=@ARGV[1];

$cash=@ARGV[2];

$id=@ARGV[3];

 

.......

 

$id_proxy=($id+1000);

 

......

 

`ipfw add $id_proxy fwd 127.0.0.1,3128 tcp from $ip to not me 80 recv em0`

 

В конфиге сквида это:

http_port localhost:3128 transparent

 

и все работает как часы.

Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Вхід

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Зараз на сторінці   0 користувачів

    Немає користувачів, що переглядають цю сторінку.

×
×
  • Створити нове...