Friday, July 8, 2011

Transparent Squid + LightSquid на отдельной машине.

Появилась задачка, посмотреть куда же ходят любимые сотрудники вместо работы, ну и увеличить скорость загрузки фишек и прочих айфанов. Но при этом не менять структуру сети и не прописывать прокси в браузере.
Решение - Squid в режиме прозрачности и LightSquid для отчетов. Крутиться это все добро будет на виртуалке. Поставим туда Debian 6.

1. Поднимаем Squid

apt-get install squid

На данный момент в репозитариях лежит 2.7 версия, что меня вполне устроила.

/etc/squid/squid.conf

acl all src all
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl localnet src адрес локальной сети

http_access allow localhost
http_access allow localnet

icp_access allow localnet
icp_access deny all

http_port 3128 transparent

hierarchy_stoplist cgi-bin ?

cache_dir ufs /var/spool/squid 80000 16 256

access_log /var/log/squid/access.log squid

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880
refresh_pattern .

acl shoutcast rep_header X-HTTP09-First-Line ^ICY.[0-9]
upgrade_http0.9 deny shoutcast

acl apache rep_header Server ^Apache
broken_vary_encoding allow apache

extension_methods REPORT MERGE MKACTIVITY CHECKOUT

hosts_file /etc/hosts

memory_pools_limit 768 MB

coredump_dir /var/spool/squid

2. Настраиваем правила.
Мне повезло, у меня роутер, который позволяет вводить команды напрямую.

Router part:
iptables -t mangle -A PREROUTING -j ACCEPT -p tcp --dport 80 -s адрес Squid
iptables -t mangle -A PREROUTING -j MARK --set-mark 3 -p tcp --dport 80
ip rule add fwmark 3 table 2
ip route add default via адрес Squid dev интерфейс lan table 2

Я до конца не разобрался в этих командах, честно - просто брал примеры из документации. Плюс - при такой схеме сохраняются IP адреса машин, сделавших запрос.
В таком случае все запросы на 80-й порт будут перенаправляться на 80-й порт нашего Squid. В таком случае на squid тоже надо сделать перенаправление:

Squid part:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

Перезапускаем Squid и роутер. После этого все должно работать. Проверить - просто просмотреть файл /var/log/squid/access.log на наличие записей.

3. Настраиваем отчеты:

apt-get install lighttpd

/etc/lighttpd/lighttpd.conf

server.modules = (
"mod_access",
"mod_alias",
"mod_compress",
"mod_redirect",
"mod_cgi"
# "mod_rewrite",
)
server.port = 8080
server.document-root = "/var/www"
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
server.errorlog = "/var/log/lighttpd/error.log"
server.pid-file = "/var/run/lighttpd.pid"
server.username = "www-data"
server.groupname = "www-data"

index-file.names = ( "index.php", "index.html",
"index.htm", "default.htm",
" index.lighttpd.html","index.cgi" )

url.access-deny = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

include_shell "/usr/share/lighttpd/use-ipv6.pl"

dir-listing.encoding = "utf-8"
server.dir-listing = "enable"

compress.cache-dir = "/var/cache/lighttpd/compress/"
compress.filetype = ( "application/x-javascript", "text/css", "text/html", "text/plain" )

include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"

#### CGI module
cgi.assign = ( ".pl" => "/usr/bin/perl",
".cgi" => "/usr/bin/perl" )

Скачиваем и настраиваем LightSquid по его инструкции, благо, она очень простая.

Только не забудьте поправить пути в lightsquid.cfg.

Перезапускаем lighttpd и получаем страничку с отчетами на порту 8080.