Dimas_Jack 0 Опубликовано: 2008-02-19 10:10:03 Share Опубликовано: 2008-02-19 10:10:03 Нужна помощь в настройке рабочей конфигурации 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 Что надо дописать в ОН Конекте и в дисконекте для правильной авторизации пользователей. Ссылка на сообщение Поделиться на других сайтах
fernir 0 Опубліковано: 2008-02-21 06:53:47 Share Опубліковано: 2008-02-21 06:53:47 Ну примерно вот так: 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% Ссылка на сообщение Поделиться на других сайтах
goonman 7 Опубліковано: 2008-02-21 08:16:26 Share Опубліковано: 2008-02-21 08:16:26 А как насчет онлайн игр? Насколько я знаю они не работают через squid, Как вы решили этот трабл? Я думаю в фаерволе не заворачивать используемые порты игр на проксю, а гнать через нат/ Подкиньте схему как кто реализовал. Ссылка на сообщение Поделиться на других сайтах
aksel 0 Опубліковано: 2008-02-22 01:40:38 Share Опубліковано: 2008-02-22 01:40:38 А может мне кто нибудь помочь сделать тоже самое только под фрю ?? (ipfw) Очень уж хочется чтобы была статистика по URL.. И вот еще очень инетерсный момент: К примеру авторизация прошла через стг. правило добавилось и получается что в стг будет траф считаться для конкретного зверя. А вот как он будет в сквиде считаться ?? т.е. он наверняка будет считаться для того IP с которого авторизовался зверь .... а как быть если с одного и тогоже IP выходят разные звери?? СТГ то конечно посчитат этих зверей отдельно а вот сквид посчитает вместе .... как сделать так что бы сквиду передавался не IP для подсчета трафика а именно то имя зверя под которым он авторизуется ??????? Ссылка на сообщение Поделиться на других сайтах
rtrt 53 Опубліковано: 2008-02-22 13:03:15 Share Опубліковано: 2008-02-22 13:03:15 А как насчет онлайн игр? Насколько я знаю они не работают через 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 Ссылка на сообщение Поделиться на других сайтах
Scorpikor 0 Опубліковано: 2008-02-22 16:16:16 Share Опубліковано: 2008-02-22 16:16:16 Для того чтоб прокси стал прозрачным - в конфиге сквида измени строку: http_port IP_интерфейса_торчащего_внутри_локальной_Сети:3128 transparent например: http_port 10.201.201.201:3128 transparent потом при помощи IPTABLES насильно заверни пакеты проходящие на на 80 порт на порт 3128 Ссылка на сообщение Поделиться на других сайтах
fernir 0 Опубліковано: 2008-02-26 12:52:31 Share Опубліковано: 2008-02-26 12:52:31 А может мне кто нибудь помочь сделать тоже самое только под фрю ?? (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 пока не написал (и некрасивых тоже). Будет время - поставлю себе творение Алферова, и может добавлю туда логи сквида и топ сайтов. Ссылка на сообщение Поделиться на других сайтах
DoS 0 Опубліковано: 2008-03-01 02:51:09 Share Опубліковано: 2008-03-01 02:51:09 когда transparent proxy находится на той же машине, что и stargazer, например на 10.0.0.1, и соответсвенно вся сеть это /24, то кешированный трафик отдаётся напрямую клиенту без участия старгейзера, следовательно мы теряем деньги а это 23% как сказано выше Ссылка на сообщение Поделиться на других сайтах
fernir 0 Опубліковано: 2008-03-03 07:00:27 Share Опубліковано: 2008-03-03 07:00:27 когда 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'ом Ссылка на сообщение Поделиться на других сайтах
DoS 0 Опубліковано: 2008-03-03 09:36:02 Share Опубліковано: 2008-03-03 09:36:02 А если нельзя приравнивать весь трафик со сквида к интернету, то как тогда? Ссылка на сообщение Поделиться на других сайтах
Alferov 0 Опубліковано: 2008-03-03 15:27:07 Share Опубліковано: 2008-03-03 15:27:07 А если нельзя приравнивать весь трафик со сквида к интернету, то как тогда? Даю наводку: при прозрачном проксировании запросов к прокси-серверу нет, соответственно нет и нужды добавлять в rules что_то_там:3128 со всеми вытекающими. Ссылка на сообщение Поделиться на других сайтах
DoS 0 Опубліковано: 2008-03-03 16:29:28 Share Опубліковано: 2008-03-03 16:29:28 А если нельзя приравнивать весь трафик со сквида к интернету, то как тогда? Даю наводку: при прозрачном проксировании запросов к прокси-серверу нет, соответственно нет и нужды добавлять в rules что_то_там:3128 со всеми вытекающими. пробывал ничего не добавлять - не считается траф... кста. а мож это у меня всё из за того, что когда траф попадает на шлюз, то он сначала уходит в сквид, а потом тока на выходе перехватывается старгейзером и общитывается по рулесам? может быть как то можно натравить старгейзер, чтобы он выходящий трафик от провайдера первым загонял в queue, обсчитывал и потом отдавал системе, которая в свою очередь кидала его в сквид? (вроде ясно выразился ) Ссылка на сообщение Поделиться на других сайтах
fernir 0 Опубліковано: 2008-03-04 12:27:03 Share Опубліковано: 2008-03-04 12:27:03 Даю наводку: при прозрачном проксировании запросов к прокси-серверу нет, соответственно нет и нужды добавлять в 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, обсчитывал и потом отдавал системе, которая в свою очередь кидала его в сквид? И как старгейзер, который не рзбирает пакеты, узнает для кого сквид берет этот пакет? У траффика сквида адрес запроса - твой сервер, получатель - сайт. Какому пользователю что отдать, это уже знает сам сквид... Траффик от юзеров сначала обрабатывается iptables, и принимается решение о том куда он пойдет, и только потом его обсчитывает старгейзер. То что должно пойти в локалку (игры, обменник), пойдет в локалку. А по пути его осчитает сквид по тарифу. Траффик, идущий в интернет поделится на 2 части - то что пойдет натом (аська, on-line игры...) посчитается старгейзером и уйдет в интернет, который предназначен сквиду посчитается stg и только потом попадет к нему. А вот например DNS запоросы от твоего собственного сервера, и обновления которые качет сам сервак, к stg не попадут. Точнее они могут быть пропущены через QUEUE, но stg не обратит на них внимания, и спокойно подпишет им ACCEPT. Этот траффик можно посчитать средствами iptables, запихнув каждый из таких сервисов в отдельную цепочку. Ссылка на сообщение Поделиться на других сайтах
DoS 0 Опубліковано: 2008-03-04 16:55:23 Share Опубліковано: 2008-03-04 16:55:23 спасибо за развёрнутый ответ. буду пробывать ещё интегрировать squid... с меня развёрнутый отчёт Ссылка на сообщение Поделиться на других сайтах
Alferov 0 Опубліковано: 2008-03-04 20:07:08 Share Опубліковано: 2008-03-04 20:07:08 У меня стоит все на одной машине. И стг и сквид. Ось - 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 и все работает как часы. Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВхід
Уже зарегистрированы? Войдите здесь.
Войти сейчас