Делаю второй в своей жизни сервер-гейт на FreeBSD.
Задача: прикрутить прозрачный прокси и настроить, чтобы пользователи не сидели в рабочее время на сайтах lovemy.ru, vkontake.ru и
прочих любовно/морковных ресурсах.
Воспользовался в целях настройки статьей Лиссяры "Прокси-сервер SQUID" (http://www.lissyara.su/?id=1026):
(за что автору огромное человеческое спасибо за толковую статью для начинающих закипать чайников :)
В целом и в общем, все чудно запустилось и работает. Небольшой затык, конечно был, когда обнаружил,
что опции httpd_accel* уже не применяются, но справился, вроде, почитав оригинальную документацию на squid-cache.org, хотя
возможно именно с этим и "накосячил".
Вся схема: FreeBSD 6.2-RELEASE + IPFW + Squid Cache version 2.6.STABLE16. Все заработало, включая acl-листы на
запреты/разрешения.
Предвидя вопросы, сразу скажу, что squid работает под пользователем nobody, на папки, для логов и кеша выданы
соответствующие права и nobody является их владельцем, и прежде чем писать на форум, это было неоднократно проверено.
Моя проблема: не хочет работать скрипт redirector.pl, ну тот который по идее должне фильтровать и редиректить с "вредных"
сайтов (в моем случае, временно разумеется: gazeta.ru, vkontakte.ru)
Выяснилось следущее при проверке из шелла (правда, мне это мало о чем говорит, я даже не знаю куда рыть...):
Код: Выделить всё
gw# ps -ax | grep squid
11324 ?? Ss 0:00.00 /usr/local/squid/sbin/squid -D
11326 ?? S 0:00.05 (squid) -D (squid)
Код: Выделить всё
gw# ps -ax | grep perl
11327 ?? Is 0:00.01 redirect (perl5.8.8)
11328 ?? Is 0:00.01 redirect (perl5.8.8)
11329 ?? Is 0:00.01 redirect (perl5.8.8)
11330 ?? Is 0:00.01 redirect (perl5.8.8)
11331 ?? Is 0:00.01 redirect (perl5.8.8)
11332 ?? Is 0:00.01 redirect (perl5.8.8)
11333 ?? Is 0:00.01 redirect (perl5.8.8)
11334 ?? Is 0:00.01 redirect (perl5.8.8)
11335 ?? Is 0:00.01 redirect (perl5.8.8)
11336 ?? Is 0:00.01 redirect (perl5.8.8)
gw# sockstat | grep perl
Код: Выделить всё
nobody perl5.8.8 11336 0 stream -> ??
nobody perl5.8.8 11336 1 stream -> ??
nobody perl5.8.8 11335 0 stream -> ??
nobody perl5.8.8 11335 1 stream -> ??
nobody perl5.8.8 11334 0 stream -> ??
nobody perl5.8.8 11334 1 stream -> ??
nobody perl5.8.8 11333 0 stream -> ??
nobody perl5.8.8 11333 1 stream -> ??
nobody perl5.8.8 11332 0 stream -> ??
nobody perl5.8.8 11332 1 stream -> ??
nobody perl5.8.8 11331 0 stream -> ??
nobody perl5.8.8 11331 1 stream -> ??
nobody perl5.8.8 11330 0 stream -> ??
nobody perl5.8.8 11330 1 stream -> ??
nobody perl5.8.8 11329 0 stream -> ??
nobody perl5.8.8 11329 1 stream -> ??
nobody perl5.8.8 11328 0 stream -> ??
nobody perl5.8.8 11328 1 stream -> ??
nobody perl5.8.8 11327 0 stream -> ??
nobody perl5.8.8 11327 1 stream -> ??
И похоже, проблема как раз в том, что perl и squid не стыкуются. Сразу скажу, что apache (ну тот, куда указывает редирект в
redirector.pl) живет на др. сервере, но та картинка, соответственно, ссылка http://gw/warning/prohibited.jp вполне
существует и в браузере открывается преспокойно.
Вот то, что у меня накорябано из конфигов:
Код: Выделить всё
---------------------------------
/etc/rc.conf
---------------------------------
# Поскольку, сервер пока в тестовом режиме, то IP-адреса использую "серые".
# Сетевые настройки
hostname="gw"
ifconfig_em1="inet 172.25.210.200/24" # Внутренний интерфейс
ifconfig_em0="inet 192.168.0.200/24" # Внешний интерфейс
defaultrouter="192.168.0.252"
gateway_enable="YES"
natd_enable="YES"
natd_flags="-f /etc/natd.conf"
# Службы
named_enable="YES"
squid_enable="YES"
# Файрволл
firewall_enable="YES"
firewall_quiet="NO"
firewall_logging="YES"
firewall_type="filename"
firewall_script="/etc/fw_new"
Код: Выделить всё
fwd 127.0.0.1,3128 tcp from 172.25.210.0/24 to any dst-port 80 via em0
Код: Выделить всё
---------------------------------
/usr/local/squid/etc/squid.conf
---------------------------------
http_port 3128 transparent
icp_port 0
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
cache_mem 256 MB
maximum_object_size 8092 KB
maximum_object_size_in_memory 512 KB
cache_dir ufs /var/cache/squid 5120 64 256
access_log /usr/local/squid/var/logs/access.log squid
cache_log /usr/local/squid/var/logs/cache.log
cache_store_log /usr/local/squid/var/logs/store.log
cache_mgr gw.support@gw
visible_hostname gw
tcp_outgoing_address 192.168.0.200
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
redirect_program /usr/local/squid/etc/redirector.pl
redirect_children 10
acl all src 0.0.0.0/0.0.0.0
acl allowed_sites dstdomain "/usr/local/squid/etc/allowed_sites.conf"
acl limited_IP src "/usr/local/squid/etc/limited_IP.conf"
acl localhost src 127.0.0.0/8
acl our_networks src 172.25.210.0/24
# acl denied_sites dstdomain "/usr/local/squid/etc/denied_ext.conf"
# http_access deny denied_sites
http_access allow allowed_sites
http_access deny limited_IP
http_access allow our_networks
http_access allow localhost
http_access deny all
http_port 80 accel vhost vport
# Следующие строки закомментированы в свете тех событий, что версия squid'a 2.6
# httpd_accel_host virtual
# httpd_accel_port 80
# httpd_accel_uses_host_header on
coredump_dir /var/cache/squid/cache
pid_filename /usr/local/squid/var/logs/squid.pid
Код: Выделить всё
---------------------------------
/usr/local/squid/etc/allowed_sites.conf
---------------------------------
http://www.yandex.ru
mail.yandex.ru
http://www.ya.ru
http://www.mail.ru
Код: Выделить всё
---------------------------------
/usr/local/squid/etc/denied_ext.conf
---------------------------------
vkontakte.ru
love.ru
Код: Выделить всё
---------------------------------
/usr/local/squid/etc/limited_IP.conf
---------------------------------
172.25.210.123
Код: Выделить всё
---------------------------------
/usr/local/squid/etc/redirector.pl
---------------------------------
#!/usr/bin/perl
$0 = 'redirect' ;
$| = 1 ;
open (IN_FILE, "/usr/local/squid/etc/denied_ext.conf") || die $!;
my @tmp_data = <IN_FILE>;
chomp @tmp_data;
push @banners, map { qr /\Q$_\E/ } grep { ! /^\s*$/ } @tmp_data;
close IN_FILE;
while (<>) {
($url, $who, $ident, $method) = /^(\S+) (\S+) (\S+) (\S+)$/ ;
$url = 'http://gw/warning/prohibited.jpg'
if grep ($url=~/$_/i, @banners) ;
print "$url $who $ident $method\n" ;
}