среда, 13 мая 2009 г.

Настройка прозрачного прокси-сервера Squid

Все команды выполнялись от прав пользователя root.
Настроил на работе сервер для предоставления доступа пользователем 2-х локальных сетей в интернет. И естественно, получилось так, что пользователь который первым поставил файл\файлы на закачку, забирал всю «ширину» канала себе, следовательно Интернет для остальных представлял собой жалкое зрелище: страницы долго открываются, часто происходит обрыв сессий и т.д. Поэтому было решено установить прозрачный прокси-сервер – Squid3 с редиректом – SquidGuard для ограничения доступа к нерабочим ресурсам, обрезания рекламы и т.д. Операции по установке и настройке данной связки я тут и опишу:
1. Устанавливаем Squid — 'apt-get install squid3'. После установки останавливаем его, ибо нужно сконфигурировать его под наши нужды - '/etc/init.d/squid3 stop'.
2. Устанавливаем редирект SquidGuard – 'apt-get install squidguard'.
3. Собственно редактируем файл прокси-сервера — '/etc/squid3/squid.conf', должно получится примерно следующее:
# минимальная конфигурация
# у меня в фале 'deny_inet_hosts1' хранятся IP адреса не имеющие доступа в интернет
# как оказалось сквид всеравно пробрасывал их в интернет, пришлось прикрутить
# этот список к Squid'у
acl bn1 src "/etc/deny_inet_hosts1"
# описываем сети
acl Net1 src 192.168.0.1
# а тут описываем привилегированных пользователей админов и начальство
acl Admins src 192.168.0.17 192.168.0.2 192.168.0.21 192.168.0.22 192.168.0.3 192.168.0.33 192.168.0.35
acl manager proto cache_object
# описываем локалхост
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
# описываем запрет к отвлекающим от работы сайтам
acl zapret dstdomain .vkontakte.ru .odnoklassniki.ru .my.mail.ru .blogs.mail.ru .horo.mail.ru .news.mail.ru .games.mail.ru .auto.mail.ru .map.mail.ru .rabota.mail.ru .travel.mail.ru .lady.mail.ru .deti.mail.ru .realty.mail.ru .video.mail.ru .cards.mail.ru .pogoda.mail.ru .afisha.mail.ru .mobile.mail.ru .soft.mail.ru .otvet.mail.ru .chat.mail.ru .sowbiz.mail.ru .torg.mail.ru .love.mail.ru .foto.mail.ru .content.mail.ru .odnoklasniki.ru .adobe.com .radio.tut.by .blog.tut.by .i.tut.by .update.icq.com
################# PORTS ##################
# Открываем нужные порты
acl SSL_ports port 443 563
#acl SSL_for_client_banks port 910 8443 4500
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
#acl Safe_ports port 70 # gopher
#acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
#acl Safe_ports port 280 # http-mgmt
#acl Safe_ports port 488 # gss-http
#acl Safe_ports port 591 # filemaker
#acl Safe_ports port 777 # multiling http
#acl Jabber_ports port 5222 #jabber
acl Pop_ports port 110 #
acl Smtp_ports port 25 #
acl Icq_ports port 5190 #
# разрешаем соединение типа CONNECT для нужных протоколов
acl CONNECT method CONNECT
#http_access allow CONNECT Jabber_ports
http_access allow CONNECT Icq_ports
http_access allow CONNECT Pop_ports
http_access allow CONNECT Smtp_ports
############### ACCESS CONTROLL############
# назначаем права доступа
# пропускаем sqstat
http_access allow manager localhost
http_access deny manager
# запрещаем досуп к сайтам
http_access deny zapret
# зарубаем все порты кроме safe_ports
http_access deny !Safe_ports
# зарубаем конект кроме как к SSL
http_access deny CONNECT !SSL_ports
# блокирум IP адреса не имеющие доступа в интернет
http_access deny bn1
# разрешаем инет сетям
http_access allow Net1
icp_access deny all
htcp_access deny all
# админам выделяем всю ширину канала
# выделяем на все подсети максимальный канал (-1), каждому пользователю даем
# скорость максимум в 5 Кб\сек после того, как он скачает на максимальной
# скорости первые 300 Кб файла
delay_pools 2
delay_class 1 2
delay_parameters 1 -1/-1 -1/-1
delay_access 1 allow Admins
delay_access 1 deny all
delay_class 2 2
delay_parameters 2 -1/-1 5000/300000
delay_access 2 allow Net1
delay_access 2 deny all
http_access allow all
############### NETWORK OPTIONS #############
# настройка порта для прокси
http_port 3128 transparent
##### OPTIONS WHICH AFFECT THE NEIGHBOR SELECTION ALGORITHM #####
# pfghtoftv r'ibhjdfnm CGI-скрипты
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
########### MEMORY CACHE OPTIONS ###########
# размер ОЗУ под кэш (по default 8 Мв)
cache_mem 32 MB
# ############ DISK CACHE OPTIONS ###############
# Max размер объекта записываемого в кэш
maximum_object_size 16384 KB
# Место кэша и размер 50 Гб 16 директорий 1-го уровня 256 2-го
cache_dir ufs /var/spool/squid3/cache 50000 16 256
# Адрес пользователя ответственного за очистку переполненого кэша
#cache_mgr root@test.ru
# Пользователь от имени какого работает Squid
cache_effective_user proxy
# Разрешаем управлять кэшем с помощью cachemgr.cgi с паролем "passwd"
#cachemgr_passwd passwd all
################ LOGFILE OPTIONS ####################
# Лог доступа к кэшу
cache_access_log /var/logs/squid3/access.log
# Лог работы кэша
cache_log /var/logs/squid3/cache.log
# Лог работы менеджера кэша
cache_store_log none
# Ротация логов
logfile_rotate 10
#mime_table /etc/squid3/mime.conf
#pid_filename /var/run/squid3.pid
########## OPTIONS FOR FTP GATEWAYING ##############
# Под этим юзером ходим в Ftp
#ftp_user vasa@pupkin.ru
# Разрешаем пассивный режим работы FTP
ftp_passive on
ftp_sanitycheck on
ftp_list_width 32
########## OPTIONS FOR URL REWRITING ##################
# Путь до редиректора
#redirect_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf
# Кол-во одновременных запусков редиректов
#redirect_children 5
########### OPTIONS FOR TUNING THE CACHE ##############
# Оставляем как есть
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern (cgi-bin|\?) 0 0% 0
refresh_pattern . 0 20% 4320
############ ERROR PAGE OPTIONS ###############
# Отсюда берем файлы стандартных сообщений об ошибках
error_directory /usr/share/squid3/errors/Russian-koi8-r
# Если Squid уже скачал 60% файла, а пользователь отказался его забирать, то всеравно продолжить скачивание
quick_abort_pct 60
# Время жизни запросов завершившихся ошибкой "connection refused" "404 Not Found"
negative_ttl 1 minutes
# Включить отправку сообщений об ошибках
#email_err_data on
# кому писать
#<А hrеf="mаilto:%w%W" mcе_hrеf="mаilto:%w%W">%w
################# DNS OPTIONS ###################
dns_testnames server.ex
# Путь к файлу hosts
hosts_file /etc/hosts
# Время жизни успешного DNS запроса.
positive_dns_ttl 6 hours
# Время жизни DNS запроса с ошибкой
negative_dns_ttl 5 minutes
############## MISCELLANEOUS ######################
# Место откуда берутся страницы с ошибками, сюда же ложим и свои
coredump_dir /var/spool/squid3
# Поддержка нестандартных Http запросов
half_closed_clients on
# Включать ли IP адрес клиента в заголовок Http запроса
forwarded_for on
# Вкл. сбор статистики по каждому клиенту
client_db on
4. Создаем необходимые директории и назначаем права доступа пользователям.
'mkdir /var/spool/squid3/cache' – тут у меня будет лежать кэш
'mkdir /var/log/squid3' — тут у меня будут лежать логи
Теперь необходимо обеспечить доступ пользователя от имени которого будут осуществлять доступ Squid к этим папкам. Узнать это можно командой 'cat /etc/squid3/squid.conf | grep cache_effectiv', должно выдать что-то похожее на это:
cache_effective_user proxy
т.е. получается что Squid работает от имени пользователя — proxy. Разрешаем этому пользователю доступ к созданным папкам ' chown -R proxy /var/spool/squid3/cache /var/log/squid3'.
5. В директории /var/log/squid3 создаем иерархию директорий для хранения кэша – '/usr/sbin/squid3 -z'.
6. Вот так у меня настроен squidguard
# путь к базе
dbhome /var/lib/squidguard/db
# путь к логам
logdir /var/log/squid
# рабочее время
time workhours {
weekly mtwhf 09:00 - 18:00
}
# создаем группы
src admin {
ip 192.168.0.3 192.168.0.33
# user root foo bar
within workhours
}
src lan {
ip 192.168.0.2 192.168.0.4-192.168.0.32 192.168.0.34-192.168.0.254 192.165.15.2-192.165.15.254
}


dest porno {
domainlist porn/domains
urllist porn/urls
log /var/log/squid/porno.log
}
dest warez {
domainlist warez/domains
urllist warez/urls
log /var/log/squid/warez.log
}
#dest ads {
#domainlist ads/domains
#urllist ads/urls
#}
dest spy {
domainlist spyware/domains
urllist spyware/urls
log /var/log/squid/spawere.log
}
dest hack {
domainlist hacking/domains
urllist hacking/urls
log /var/log/squid/hacking.log
}
dest drag {
domainlist drugs/domains
#urllist drugs/urls
log /var/log/squid/narkota.log
}
# указываем правила
acl {
admin {
pass any
}

lan within workhours {
pass !porno !warez !spy !hack !drag all
}
#else {
# pass any
# }

default {
pass none
}
}
7. Запускаем Squid — '/etc/init.d/squid3 start' и проверяем лог — /var/log/squid3/cache.log, если все нормально должны получить что-то вида:
8. Создаем правило в iptables для перенаправления локального трафика с 80 порта на порт Squid'а — 3128:
/sbin/iptables -t nat -A PREROUTING -i eth1 -s 192.168.0.0/24 -p tcp -d 0.0.0.0/0 --dport 80 -j REDIRECT --to-port 3128

понедельник, 6 апреля 2009 г.

Настройка кэширующего DNS

Все команды задавал от имени root.

Установка Bind в chroot окружении
Устанавил Bind 9.
server:/# apt-get install bind9
Все установилось без ошибок (проверить можно командой 'server:/# named -v' — должна отобразится версия bind) останавил его.
server:/# /etc/init.d/bind9 stop
Из соображений безопасности запускать буду Bind в chroot среде (“песочнице”), а вот как я это делал:
1. Отредактировал файл '/etc/default/bind9', туда добавил строку о среде chroot, которая будет находится у меня в '/var/lib/dns', изменив строку OPTIONS=” -u bind” на OPTIONS=”-u bind -t /var/lib/dns” т.е. должно получится что-то типа:
OPTIONS=”-u bind -t /var/lib/dns”
# Set RESOLVCONF=no to not run resolvconf
RESOLVCONF=yes
2. Теперь создал все необходимые для работы bind9 директории:
server:/# mkdir -p /var/lib/dns/etc
server:/# mkdir /var/lib/dns/dev
server:/# mkdir -p /var/lib/dns/var/cache/bind
server:/# mkdir -p /var/lib/dns/var/run/bind/run
3. Переместил директорию с конфигурацией bind9 из '/etc' в '/var/lib/dns/etc':
server:/# mv /etc/bind /var/lib/dns/etc
4. Создал символическую ссылку на новую директорию с файлами конфигурации bind на случай если в дальнейшем соберусь обновить пакет, это поможет избежать проблем.
server:/# ln -s /var/lib/dns/etc/bind /etc/bind
5. Создал необходимые устройства и устанавил права на каталоги
server:/# mknod /var/lib/dns/dev/null c 1 3
server:/# mknod /var/lib/dns/dev/random c 1 8
server:/# chmod 666 /var/lib/dns/dev/null /var/lib/dns/dev/random
server:/# chown -R bind:bind /var/lib/dns/var/*
server:/# chown -R bind:bind /var/lib/dns/etc/bind
    ***В дистрибутиве Etch надо изменить стартовый скрипт демона sysklogd для того что бы сообщения bind попадали в syslog для этого надо отредактировать файл '/etc/default/sysklogd' , изменив там строку SYSLOGD=”” на SYSLOGD=”-u syslog -a /var/lib/dns/dev/log”. Иногда sysklogd ругается на опцию «-u»,тогда надо SYSLOGD=”-a /var/lib/dns/dev/log”. И перезапуск службы:
server:/# /etc/init.d/sysklogd restart
*** В дистрибутиве Lenny я не нашел стартовый скрипт демона sysklogd, однако сообщения bind попадали в syslog, возможно из-за символической ссылки.

Настройка Bind
1. Cоздал отдельный файл конфигураций для моих зон ( в данном случае у меня будет одна зона описывающая виртуальный домен .ex):
server:/# touch /var/lib/named/etc/bind/myzones.conf
server:/# chown bind:bind /var/lib/named/etc/bind/myzones.conf
2. Редактирую файл конфигурации моей зоны .ex (имя моего домена) он должен выглядеть примерно так:
zone "ex." {
type master;
file "/etc/bind/db.ex";
};
В данном случае я специально создал «несуществующую зону», т.к. настраивал Bind в роли кэширующего DNS с возможностью обработки локальных имен/адресов моих локальных сетей.
3. Создал файл и назначил права доступа прямой зоны для локальных сетей.
server:/# touch /var/lib/dns/etc/bind/db.ex
server:/# chown bind:bind /var/lib/dns/etc/bind/db.ex
Отредактировал файл:
$TTL 86400 ; 1 day
@ IN SOA server root.server (
2009032601 ; serial
10800 ; refresh (3 hours)
900 ; retry (15 minutes)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
@ IN NS server

server A 192.168.0.1 ; адрес сервера для 1-й сети
server A 192.165.15.1 ; адрес сервера для 2-й сети
Внимание: в конце файла обязательно должна быть пустая строка!!!
4. Создал файл и назначил права доступа обратной зоны для локальных сетей.
server:/# touch /var/lib/dns/etc/bind/local.rev
server:/# chown bind:bind /var/lib/dns/etc/bind/local.rev
Отредактировал файл:
$TTL 604800
@ IN SOA server.ex. root.server.ex. (
2009032601 ; serial
604800 ; refresh
86400 ; retry
2419200 ; expire
604800 ; negative cache TTL
)
@ IN NS server.ex.
1.0.168 IN PTR server.ex.
1.15.165 IN PTR server.ex.

Внимание: в конце файла обязательно должна быть пустая строка!!!
5. Отредактировал файл '/var/lib/dns/etc/named.conf.options' до такого вида:
options {
directory "/var/cache/bind";

version "SecurityDNS v.USSR";
allow-recursion { "net"; };
allow-query { any; };
//auth-nxdomain no; # conform to RFC1035
listen-on-v6 { none; };
# отключил поддержку IPv6
};
6. Отредактировал файл '/var/lib/named/etc/named.conf'.
В начале файла, до включения файла с опциями (named.conf.options), создал список acl для указания, что будет обслуживать мой сервер Bind, указав свои подсети, обратную петлю, адрес сетевой карты, смотрящей в интернет, и оба DNS провайдера:
acl "net" {
192.168.0.0/24;
192.165.15.0/24;
127.0.0.1;
212.98.185.103;
212.98.160.50;
212.98.160.65;
};
Для возможности работы и передачи зоны с подписью TSIG включил rndc.key и указал, кто сможет управлять моим сервером и по какому порту:
include "/etc/bind/rndc.key";
controls {
inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys {rndc-key;};
};
В конце файла добавил настройки обратной зоны для локальных сетей:
zone "192.in-addr.arpa" {
type master;
file "/etc/bind/local.rev";
};
Ну и последним (последняя команда) подключил прямые зоны:
include "/etc/bind/myzones.conf";
7. Подведя итоги пункта 6, получил файл named.conf следующего вида:
acl "net" {
192.168.0.0/24;
192.165.15.0/24;
127.0.0.1;
212.98.185.103;
212.98.160.50;
212.98.160.65;
};

include "/etc/bind/named.conf.options";

include "/etc/bind/rndc.key";
controls {
inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys {rndc-key;};
};

zone "." {
type hint;
file "/etc/bind/db.root";
};

zone "localhost" {
type master;
file "/etc/bind/db.local";
};

zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};

zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};

zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};

zone "192.in-addr.arpa" {
type master;
file "/etc/bind/local.rev";
};

include "/etc/bind/myzones.conf";
С учетом моих настроек у меня оказались не задействованы следующие файлы 'db.empty', 'zones.rfc1918' и 'named.conf.local' естественно я их удалил.
8. Поправил следующие файлы:
/etc/resolv.conf — добавил в начале файла следующие строки (вписал свой домен):
search server.ex
nameserver 127.0.0.1
/etc/hosts.conf — добавил в начале файла следующую строку:
order hosts, bind
/etc/hosts — вписал строки после строки '127.0.0.1 localhost':
192.168.0.1 server.ex server
192.165.15.1 server.ex server
9. Добавил в свой фаервол следующие правила:
# DNS rndc сервер на Lo разрешаю. (обход connection refused)
/sbin/iptables -A OUTPUT -p tcp -m tcp -o lo --dport 953 --sport 1024:6553 -j ACCEPT
# разрешаю доступ DNS-серверу наружу
/sbin/iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
/sbin/iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
10. Запустил Bind.
server:/# /etc/init.d/bind9 start
server:/# rndc reload
11. Проверил работоспособность под Debian:
serverd:/etc/init.d# nslookup
> set q=any
> localhost
Server: 127.0.0.1
Address: 127.0.0.1#53

localhost
origin = localhost
mail addr = root.localhost
serial = 2
refresh = 604800
retry = 86400
expire = 2419200
minimum = 604800
localhost nameserver = localhost.
Name: localhost
Address: 127.0.0.1
localhost has AAAA address ::1
> 127.0.0.1
Server: 127.0.0.1
Address: 127.0.0.1#53

1.0.0.127.in-addr.arpa name = localhost.
> google.ru
Server: 127.0.0.1
Address: 127.0.0.1#53

Non-authoritative answer:
google.ru mail exchanger = 10 smtp2.google.com.
google.ru mail exchanger = 10 smtp3.google.com.
google.ru mail exchanger = 10 smtp4.google.com.
google.ru mail exchanger = 10 smtp1.google.com.
Name: google.ru
Address: 72.14.221.104
Name: google.ru
Address: 74.125.77.104
Name: google.ru
Address: 216.239.59.104
google.ru
origin = ns1.google.com
mail addr = dns-admin.google.com
serial = 2009033100
refresh = 21600
retry = 3600
expire = 1209600
minimum = 300
google.ru nameserver = ns3.google.com.
google.ru nameserver = ns1.google.com.
google.ru nameserver = ns4.google.com.
google.ru nameserver = ns2.google.com.

Authoritative answers can be found from:
google.ru nameserver = ns1.google.com.
google.ru nameserver = ns3.google.com.
google.ru nameserver = ns2.google.com.
google.ru nameserver = ns4.google.com.
ns2.google.com internet address = 216.239.34.10
ns3.google.com internet address = 216.239.36.10
ns4.google.com internet address = 216.239.38.10
serverd:/etc/init.d# dig @server.ex google.com

; <<>> DiG 9.5.1-P1 <<>> @server.ex google.com
; (2 servers found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28297
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:
;google.com. IN A

;; ANSWER SECTION:
google.com. 300 IN A 74.125.67.100
google.com. 300 IN A 209.85.171.100
google.com. 300 IN A 74.125.45.100

;; AUTHORITY SECTION:
google.com. 345600 IN NS ns1.google.com.
google.com. 345600 IN NS ns3.google.com.
google.com. 345600 IN NS ns4.google.com.
google.com. 345600 IN NS ns2.google.com.

;; ADDITIONAL SECTION:
ns1.google.com. 172741 IN A 216.239.32.10
ns2.google.com. 172740 IN A 216.239.34.10
ns3.google.com. 172740 IN A 216.239.36.10
ns4.google.com. 172740 IN A 216.239.38.10

;; Query time: 107 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Mon Jan 1 00:39:58 2001
;; MSG SIZE rcvd: 212

serverd:/etc/init.d# dig @server.ex google.com

; <<>> DiG 9.5.1-P1 <<>> @server.ex google.com
; (2 servers found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27974
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:
;google.com. IN A

;; ANSWER SECTION:
google.com. 273 IN A 74.125.45.100
google.com. 273 IN A 74.125.67.100
google.com. 273 IN A 209.85.171.100

;; AUTHORITY SECTION:
google.com. 345573 IN NS ns1.google.com.
google.com. 345573 IN NS ns4.google.com.
google.com. 345573 IN NS ns3.google.com.
google.com. 345573 IN NS ns2.google.com.

;; ADDITIONAL SECTION:
ns1.google.com. 172714 IN A 216.239.32.10
ns2.google.com. 172713 IN A 216.239.34.10
ns3.google.com. 172713 IN A 216.239.36.10
ns4.google.com. 172713 IN A 216.239.38.10

;; Query time: 2 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Mon Jan 1 00:40:25 2001
;; MSG SIZE rcvd: 212
И на машине входящей в сеть под управлением
Windows XP:
Microsoft Windows XP [Версия 5.1.2600]

(С) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\Администратор>nslookup
Default Server: server.ex
Address: 192.168.0.1
> set q=any
> server.ex
Server: server.ex
Address: 192.168.0.1

server.ex internet address = 192.165.15.1
server.ex internet address = 192.168.0.1
ex nameserver = server.ex