Кипелов — Pеки времен (WarCraft III)

Рубрика: клип | Оставить комментарий

Мельница — Господин горных дорог (Ангелофрения. Live)

Рубрика: клип | Оставить комментарий

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

Настраиваем Squid в качестве прозрачного прокси-сервера для офисной сети. Предполагается, что маршрутизация на сервере настроена, и доступ к сайтам из внутренней сети уже работает. Используем прокси-сервер для расшифровки веб-трафика, ограничения доступа к сайтам и фильтрации медиа-контента.

Настройка ядра

Для работы в режиме прозрачного прокси необходимо обеспечить перенаправление веб-трафика прокси-серверу. Если в качестве брандмауэра используется IPFW, необходимо включить форвардинг пакетов пересобрав ядро с опцией IPFIREWALL_FORWARD. В ядре GENERIC опция перенаправления по умолчанию отключена.

В ядре GENERIC опция перенаправления по умолчанию отключена.Проверяем включено ли перенаправление пакетов командой:

grep ipfw /var/run/dmesg.boot

Получаем следующий результат:

ipfw2 (+ipv6) initialized, divert loadable, nat loadable, rule-based forwarding disabled, default to deny, logging disabled

Если видим: «rule-based forwarding disabled«, форвардинг отключен, необходимо пересобрать ядро. Если сообщение отсутствует, значит IPFW не настроен.

Получаем идентификатор ядра:

uname -i

Если ранее ядро не изменялось, в результате получаем:

GENERIC

Создаем конфиг ядра IPFORWARD, на основе GENERIC

echo include GENERIC >/usr/src/sys/i386/conf/IPFORWARD
echo ident IPFORWARD >>/usr/src/sys/i386/conf/IPFORWARD

Включаем перенаправление пакетов:

echo options IPFIREWALL >>/usr/src/sys/i386/conf/IPFORWARD
echo options IPFIREWALL_FORWARD >>/usr/src/sys/i386/conf/IPFORWARD

Проверяем полученный конфиг:

cat /usr/src/sys/i386/conf/IPFORWARD

В результате получаем:

include GENERIC
ident IPFORWARD
options IPFIREWALL
options IPFIREWALL_FORWARD

Переходим в папку с исходниками системы:

cd /usr/src

Если файлы в /usr/src отсутствуют, необходимо установить исходники, соответствующие вашей версии системы.

Собираем и устанавливаем ядро, используя созданный конфиг:

make kernel KERNCONF=IPFORWARD

Перезагружаем систему:

shutdown -r now

Проверяем идентификатор ядра:

uname -i

В случае успешной установки ядра, в ответ получаем:

IPFORWARD

Проверяем статус IPFW:

grep ipfw /var/run/dmesg.boot

В случае успеха получаем:

ipfw2 (+ipv6) initialized, divert loadable, nat loadable, rule-based forwarding enabled, default to deny, logging disabled

Установка Squid

Обновляем коллекцию портов:

portsnap fetch && portsnap update || portsnap extract

Получаем список доступных версий Squid:

cd /usr/ports/www && echo squid*

Настраиваем порт:

cd /usr/ports/www/squid32
make config

В параметрах сборки включаем прозрачное проксирование для используемого брандмауэра и поддержку больших файлов:

[*] LARGEFILE      Support large (>2GB) cache and log files
...
[ ] TP_IPF         Enable transparent proxying with IPFilter
[*] TP_IPFW        Enable transparent proxying with IPFW
[ ] TP_PF          Enable transparent proxying with PF

Устанавливаем порт:

make install clean

Для сборки пакета используются параметры по умолчанию, установленный из пакета прозрачный прокси будет работать некорректно.

Настройка Squid

Сохраняем файл конфигурации, установленный по умолчанию:

mv /usr/local/etc/squid/squid.conf /usr/local/etc/squid/squid.conf.default

Создаем новый файл конфигурации:

ee /usr/local/etc/squid/squid.conf

Задаем параметры:

#Адрес и порт для входящих подключений
#Заданный порт используется при прозрачном проксировании для 
#передачи изображений на страницах ошибок и протоколом управления кэшем
http_port 3128
#Локальный интерфейс, для трафика, перенаправленного брандмауэром
http_port 127.0.0.1:3129 intercept

#Время ожидания установки TCP соединения с сервером
#По умолчанию 1 минута, если сервер не отвечает, выполняется 3 попытки установить соединение, итого время до появления ошибки 3 минуты
#Сократим таймаут до 20 секунд
connect_timeout 20 second

#При завершении работы ожидать закрытия клиентских подключений, так заявлено в документации
#По факту ждет независимо от наличия клиентских подключений
#По умолчанию - 30 секунд, сократим время ожидания до 1
shutdown_lifetime 1 seconds

#Кэш: формат, размещение, размер в мегабайтах, число папок первой и второй вложенности
#Указанный размер кэша не учитывает издержки файловой системы и должен быть примерно на 20% меньше доступного дискового пространства
#Директиву cache_dir, можно указать несколько раз, выделив под кэш дополнительные разделы
cache_dir ufs /usr/local/squid/cache 3000 16 256

#Не кэшировать файлы больше заданного размера
#По умолчанию 4Мб
maximum_object_size 320 MB

#Продолжить загрузку при отключении клиента, если осталось загрузить менее указанного объема данных
#Позволяет сохранить объект в кэше при отмене загрузки клиентом
#Значение 0 для quick_abort_min и quick_abort_max отменяют докачку
#Значение -1 включает полную закачку объекта, не зависимо от оставшегося объема, повышает нагрузку на канал
#По умолчанию 16 Кб
quick_abort_min 5 MB

#Размер кэша в оперативной памяти
#По умолчанию 256Мб
#cache_mem 256 MB

#Максимальный размер объекта, сохраняемого в оперативной памяти
#Объекты больше заданного размера в памяти не сохраняются
#maximum_object_size_in_memory 512 KB

#Отключить кеширование
#cache deny all

#Путь сохранения дампа аварийного завершения
coredump_dir /usr/local/squid/cache

#Путь и формат лог-файла
access_log daemon:/usr/local/squid/log/access.log squid

#Протоколировать параметры запросов
#По умолчанию в целях обеспечения приватности в логе не сохраняются параметры CGI-скриптов
#strip_query_terms off

#Протоколировать http-заголовки
log_mime_hdrs on

#Не отправлять заголовок X-Forwarded-For содержащий внутренний IP-адрес клиента
#forwarded_for transparent

#Не отправлять заголовок Via с именем и версией прокси-сервера
#via off

#Email администратора, для отправки уведомлений об отказе кэша
#На практике, ни одного уведомления не видел
#Адрес также отображается на страницах ошибок
cache_mgr root@localhost

#Адрес сервера, отображаемый на страницах ошибок
#По умолчанию используется функция gethostname(), которая при http_port 127.0.0.1, вернет localhost
#visible_hostname proxy.localnet.local

#
# Определяем списки контроля безопасности
#

#IP-адрес, с которого разрешен доступ к управлению кэшем
#acl CacheManagerIP src 192.168.0.2

#Обслуживаемая прокси-сервером сеть
#acl localnet src 10.0.0.0/8    # RFC1918 possible internal network
#acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
#acl localnet src fc00::/7       # RFC 4193 local private network range
#acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network

#Метод CONNECT, используется для SSL-соединений
acl CONNECT method CONNECT

#Путь к списку IP-адресов пользователей, для которых не действует фильтр сайтов и контента
#acl AdminsIP src "/usr/local/etc/squid/AccessLists/AdminsIP.txt"

#Путь к списку запрещенных сайтов
#acl RestrictedDomains dstdomain "/usr/local/etc/squid/AccessLists/RestrictedDomains.txt"

#Путь к списку доменов с рекламой
#acl AdDomains dstdomain "/usr/local/etc/squid/AccessLists/AdDomains.txt"

#Путь к списку доменов с рекламой для фильтрации по ответу
#Блокируются изображения и анимация, допускается переход по ссылкам
#acl AdDomains_ReplyFilter dstdomain "/usr/local/etc/squid/AccessLists/AdDomains_Content.txt"

#Mime-типы для блокировки рекламы
#acl AdMimeTypes rep_mime_type ^image/gif ^image/jpeg ^application/x-javascript ^application/x-shockwave-flash

#Mime-типы для аудио и видео
acl MimeAudioVideo  rep_mime_type audio video

#Сайты с IP-адресами
acl UrlIP url_regex -i ^http://[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/.*

#
# Задаем права доступа
#

#Разрешить локальное управление кэшем
http_access allow manager localhost
#Разрешить удаленное управление кэшем
#http_access allow manager CacheManagerIP
http_access deny manager

#Пароли для различных действий протокола управления кэшем
#Значение disable all отключает управление кэшем
#cachemgr_passwd disable all

#Запретить метод CONNECT
#Проксирование SSL-соединений в прозрачном режиме невозможно
http_access deny CONNECT

#Запретить доступ к локальным ресурсам сервера через прокси
http_access deny to_localhost

#Первичный фильтр рекламы
#Блокируется весь контент с заданных доменов
#http_access deny AdDomains

#Страница ошибки доступа для рекламы
#Создать командой: echo "[AD]" > /usr/local/etc/squid/ERR_ADV_DENIED
#deny_info ../../ERR_ADV_DENIED AdDomains

#Не ограничивать доступ администраторам
#http_access allow AdminsIP

#Блокировать запрещенные сайты
#http_access deny RestrictedDomains

#Запретить доступ к сайтам по IP-адресу
#http_access deny UrlIP

#Разрешить доступ из локальной сети
http_access allow localnet

#Блокировать все, что не разрешено
http_access deny all

#
#Фильтрация контента, на этапе получения ответа от сервера
#

#Фильтр рекламного контента: графика, анимация, JavaScript, клики по ссылкам продолжают работать
#http_reply_access deny AdDomains_ReplyFilter AdMimeTypes

#Не ограничивать доступ администраторам
#http_reply_access allow AdminsIP

#Блокировать загрузку аудио/видео контента
#http_reply_access deny MimeAudioVideo

#Разрешить весь остальной контент
http_reply_access allow all

#Время устаревания кэшируемого контента в минутах, если явно не задано сервером
#Поля: шаблон соответствия URL, минимальное время в минутах, процент для расчета времени устаревания объекта, максимальное время в минутах
#Если повторный запрос приходит до наступления минимального времени, объект считается актуальным, запрос к серверу не выполняется
#Расчет времени жизни производится по формуле: (ВремяПолучения-ВремяСоздания)*Процент
#Чем старее объект, тем дольше он содержится в кэше, но не дольше заданного максимального времени
#Подробности: http://etutorials.org/Server+Administration/Squid.+The+definitive+guide/Chapter+7.+Disk+Cache+Basics/7.7+refresh_pattern/
#
#Время жизни объектов для FTP-протокола
#refresh_pattern ^ftp:           1440    20%     10080
#Нулевое время жизни для динамического контента
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
#Время жизни по умолчанию
refresh_pattern .               0       20%     4320

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

mkdir /usr/local/etc/squid/AccessLists

Создаем необходимые списки, значения в списке разделяются новой строкой.

Список IP-адресов с неограниченным доступом:

ee /usr/local/etc/squid/AccessLists/AdminsIP.txt

Список сайтов, доступ к которым запрещен пользователям. Точка в начале адреса блокирует доступ ко всем адресам в заданном домене. Для массовой блокировки развлекательных ресурсов потребуется установка редиректора SquidGuard.

ee /usr/local/etc/squid/AccessLists/RestrictedDomains.txt

Фильтр рекламы:

ee /usr/local/etc/squid/AccessLists/AdDomains.txt

Фильтр рекламы с учетом типа контента:

ee /usr/local/etc/squid/AccessLists/AdDomains_Content.txt

Рассмотренные фильтры рекламы использовались во времена помегабайтной оплаты за интернет. Основной задачей тогда была экономия трафика. В список вручную заносились домены, генерирующие значительный объем трафика. Для борьбы с рекламой, более эффективным решением будет установка редиректора SquidGuard, либо настройка фильтров в браузере клиента. Так же данный список может быть полезен для блокировки вредоносных сайтов и блокировки загрузки обновлений с внешних ресурсов, при наличии внутренних служб распространения обновлений.

Некоторые сайты используют протокол https, фильтровать который при прозрачном проксировании невозможно. Для ограничения доступа к таким сайтам придется использовать брандмауэр либо DNS-сервер, либо проксировать https традиционным, непрозрачным, способом.

Создаем папку для кэша, задаем права доступа:

mkdir -p /usr/local/squid/cache && chown root:squid /usr/local/squid/cache && chmod 770 /usr/local/squid/cache

Создаем структуру кэша:

/usr/local/sbin/squid -z

Создаем папку для логов доступа, задаем права доступа:

mkdir /usr/local/squid/log && chown root:squid /usr/local/squid/log && chmod 770 /usr/local/squid/log

Лог доступа за месяц может занимать достаточно большой объем, по этой причине в рассматриваемой конфигурации лог был размещен в /usr. Если свободного места в /var достаточно, лог доступа можно оставить в  /var/log/squid.

Отображение местного времени на страницах ошибок Squid

По умолчанию на страницах ошибок Squid отображает время по Гринвичу, для отображения местного времени необходимо скорректировать шаблоны ошибок. Параметр шаблона %T указывает мировое время, %t — местное.

Копируем шаблоны ошибок в папку erros.local:

mkdir -p /usr/local/etc/squid/errors.local/ru
cp /usr/local/etc/squid/errors/ru/* /usr/local/etc/squid/errors.local/ru

Заменяем общемировое время (%T), на местное (%t):

sed -i .bak "s/%T/%t/g" /usr/local/etc/squid/errors.local/ru/* && rm /usr/local/etc/squid/errors.local/ru/*.bak

Задаем путь к измененным шаблонам ошибок в squid.conf:

printf "\n\n#Отображение местного времени на страницах ошибок\nerror_directory /usr/local/etc/squid/errors.local/ru\n" >> /usr/local/etc/squid/squid.conf

Запуск Squid

Включаем Squid в rc.conf:

printf '\nsquid_enable=\"YES\"\n' >>/etc/rc.conf

Запускаем демон:

/usr/local/etc/rc.d/squid start

Проверяем, стартанул ли демон:

ps -ax | grep squid

Проверяем, слушается ли сокет:

netstat -an | grep 3128

Проверяем лог:

cat /var/log/squid/cache.log

В случае успешного старта вывод будет примерно следующим:

2013/03/03 21:29:54 kid1| Starting Squid Cache version 3.2.7 for i386-portbld-freebsd9.1...
2013/03/03 21:29:54 kid1| Process ID 40625
2013/03/03 21:29:54 kid1| Process Roles: worker
2013/03/03 21:29:54 kid1| With 7149 file descriptors available
2013/03/03 21:29:54 kid1| Initializing IP Cache...
2013/03/03 21:29:54 kid1| DNS Socket created at [::], FD 7
2013/03/03 21:29:54 kid1| DNS Socket created at 0.0.0.0, FD 8
2013/03/03 21:29:54 kid1| Adding nameserver 127.0.0.1 from /etc/resolv.conf
2013/03/03 21:29:54 kid1| Logfile: opening log daemon:/usr/local/squid/log/access.log
2013/03/03 21:29:54 kid1| Logfile Daemon: opening log /usr/local/squid/log/access.log
2013/03/03 21:29:54 kid1| WARNING: no_suid: setuid(0): (1) Operation not permitted
2013/03/03 21:29:54 kid1| WARNING: no_suid: setuid(0): (1) Operation not permitted
2013/03/03 21:29:55 kid1| Unlinkd pipe opened on FD 14
2013/03/03 21:29:55 kid1| Store logging disabled
2013/03/03 21:29:55 kid1| Swap maxSize 3072000 + 262144 KB, estimated 256472 objects
2013/03/03 21:29:55 kid1| Target number of buckets: 12823
2013/03/03 21:29:55 kid1| Using 16384 Store buckets
2013/03/03 21:29:55 kid1| Max Mem  size: 262144 KB
2013/03/03 21:29:55 kid1| Max Swap size: 3072000 KB
2013/03/03 21:29:55 kid1| Rebuilding storage in /usr/local/squid/cache (clean log)
2013/03/03 21:29:55 kid1| Using Least Load store dir selection
2013/03/03 21:29:55 kid1| Set Current Directory to /usr/local/squid/cache
2013/03/03 21:29:55 kid1| Loaded Icons.
2013/03/03 21:29:55 kid1| HTCP Disabled.
2013/03/03 21:29:55 kid1| Squid plugin modules loaded: 0
2013/03/03 21:29:55 kid1| Accepting HTTP Socket connections at local=[::]:3128 remote=[::] FD 17 flags=9
2013/03/03 21:29:55 kid1| Accepting NAT intercepted HTTP Socket connections at local=127.0.0.1:3128 remote=[::] FD 18 flags=41
2013/03/03 21:29:55 kid1| Done reading /usr/local/squid/cache swaplog (0 entries)
2013/03/03 21:29:55 kid1| Store rebuilding is 0.00% complete
2013/03/03 21:29:55 kid1| Finished rebuilding storage from disk.
2013/03/03 21:29:55 kid1|         0 Entries scanned
2013/03/03 21:29:55 kid1|         0 Invalid entries.
2013/03/03 21:29:55 kid1|         0 With invalid flags.
2013/03/03 21:29:55 kid1|         0 Objects loaded.
2013/03/03 21:29:55 kid1|         0 Objects expired.
2013/03/03 21:29:55 kid1|         0 Objects cancelled.
2013/03/03 21:29:55 kid1|         0 Duplicate URLs purged.
2013/03/03 21:29:55 kid1|         0 Swapfile clashes avoided.
2013/03/03 21:29:55 kid1|   Took 0.04 seconds (  0.00 objects/sec).
2013/03/03 21:29:55 kid1| Beginning Validation Procedure
2013/03/03 21:29:55 kid1|   Completed Validation Procedure
2013/03/03 21:29:55 kid1|   Validated 0 Entries
2013/03/03 21:29:55 kid1|   store_swap_size = 0.00 KB
2013/03/03 21:29:56 kid1| storeLateRelease: released 0 objects

По поводу «WARNING: no_suid: setuid(0): (1) Operation not permitted», отслеживаем баг-репорт: http://bugs.squid-cache.org/show_bug.cgi?id=3785.

В брандмауэре разрешаем исходящие подключения для Squid (порядковый номер правила и внешний интерфейс необходимо задать свой):

ipfw add 110 allow tcp from me to any out via em0 keep-state uid squid

Перенаправляем веб-трафик с тестового компьютера в Squid:

ipfw add 120 fwd 127.0.0.1,3129 tcp from 192.168.0.2 to any 80-83,8080-8088 out via em0

Инициируем веб-трафик с тестового компьютера и проверяем лог доступа:

cat /usr/local/squid/log/access.log

В случае проблем проверяем, работает ли правило брандмауэра:

ipfw show

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

Если при тестировании проблем не выявлено, заворачиваем в прокси всю подсеть:

ipfw add 120 fwd 127.0.0.1,3129 tcp from 192.168.0.0/16 to any 80-83,8080-8088 out via em0

Протокол управления кэшем

Если управление кэшем не было запрещено в конфиге, используем squidclient для получения статистики и оперативного управления.

Получить общую статистику сервера:

squidclient -h 127.0.0.1 cache_object://localhost/info

Получить список доступных команд:

squidclient -h 127.0.0.1 cache_object://localhost/menu

Управление кэшем возможно также из браузера. Статистика сервера доступна по адресу: http://адрес.прокси.сервера:3128/squid-internal-mgr/info, список команд: http://адрес.прокси.сервера:3128/squid-internal-mgr/menu.

Ротация лога доступа Squid

Настраиваем ежемесячную ротацию и архивацию access.log

Создаем скрипт RotateAccessLog:

ee /usr/local/etc/squid/RotateAccessLog

Со следующим содержимым:

#!/bin/sh

#Задаем число хранимых архивов
ArcCount=12

#Предварительно запускаем парсер LightSquid
#/usr/local/www/lightsquid/lightparser.pl today

#Выполнить ротацию, выход при ошибке.
/usr/local/sbin/squid -k rotate || return 1

#Ротация производится в фоновом режиме, ждем завершения 10 секунд.
sleep 10

#Удаляем старый cache.log.1, новый сохраняется с именем cache.log.0.
rm /var/log/squid/cache.log.1 2>/dev/null

#Удаляем старый store.log.1
rm /var/log/squid/store.log.1 2>/dev/null

i=$(($ArcCount-1))
#Переходим в папку с логами, выход, если папка не существует.
cd /usr/local/squid/log || return 1

#Удаляем самый старый архив.
rm access.log.$i.bz2 2>/dev/null

#Выполняем ротацию
while [ $i -gt 0 ]
do
    mv access.log.$(($i-1)).bz2 access.log.$i.bz2 2>/dev/null
    i=$(($i-1))
done

#Архивируем лог доступа.
bzip2 access.log.0

Разрешаем запуск скрипта:

chmod 700 /usr/local/etc/squid/RotateAccessLog

Выполняем тестовый запуск:

/usr/local/etc/squid/RotateAccessLog

Проверяем, создан ли архив:

ls -l /usr/local/squid/log/*.bz2

Настраиваем cron на ежемесячный запуск первого числа в полночь:

printf '\n0\t0\t1\t*\t*\troot\t/usr/local/etc/squid/RotateAccessLog\n' >>/etc/crontab && cat /etc/crontab

Автоматический перезапуск Squid при отказе

Squid 2.7 изредка грешил периодическими отказами, оставляя при этом сеть без доступа к вебу.  Хотя в третьей версии таких безобразий более не замечено, лишняя проверка не повредит. Проверяем сценарием, загружен ли Squid и запускаем при необходимости. Попутно, чистим кэш, при обнаружении сообщения о нехватке дискового пространства.

Создаем сценарий AutoRestart:

ee /usr/local/etc/squid/AutoRestart

Со следующим содержимым:

#!/bin/sh

#Точка монтирования файловой системы
FS=/usr

#Путь к кэшу
CacheDir=/usr/local/squid/cache

#Проверяем, загружен ли Squid, выходим в случае успеха
/usr/local/sbin/squid -k check >/dev/null 2>&1 && return

#При нехватке дискового пространства, удаляем кэш
#Если обнаружено сообщение filesystem full в журнале messages
if grep $fs:\ filesystem\ full /var/log/messages; then
 #Уведомляем об ошибке
 echo Disk full detected, cleanup

 #Удаляем кэш с предварительной проверкой, что заданный путь указывает именно на кэш
 test -f $CacheDir/swap.state && rm -R $CacheDir/*

 #Создаем структуру кэша
 /usr/local/sbin/squid -z
fi

#Запускаем демон
/usr/local/etc/rc.d/squid start

Разрешаем запуск скрипта:

chmod 700 /usr/local/etc/squid/AutoRestart

Выполняем тестовый запуск:

/usr/local/etc/rc.d/squid stop
/usr/local/etc/squid/AutoRestart

Запускаем через cron каждые 15 минут:

printf '\n*/15\t*\t*\t*\t*\troot\t/usr/local/etc/squid/AutoRestart\n' >>/etc/crontab && cat /etc/crontab

В случае проблем на почту root’у будет отправлено уведомление.

Анализ логов Squid

LightSquid — анализатор лога доступа, написанный на Perl. Каждые полчаса сканирует лог доступа и формирует отчеты по трафику для каждого пользователя (IP-адреса) за день, за месяц, за год. Фиксирует загрузку больших файлов, почасовую активность пользователя, строит рейтинг сайтов по объему потребленного трафика.  Для просмотра отчетов потребуется веб-сервер. Инструкции по настройке ищем здесь.

Список других анализаторов доступен на сайте проекта: http://www.squid-cache.org/Misc/log-analysis.html

Решение проблем

Если в cache.log постоянно пишутся предупреждения:

WARNING: transparent proxying not supported

При сборке не была включена поддержка прозрачного прокси для вашего брандмауэра. Переустановите Squid из коллекции портов с включением соответствующих параметров.


Если получаем следующие предупреждения:

WARNING: (A) '192.168.0.0/16' is a subnetwork of (B) '::/0'
WARNING: because of this '192.168.0.0/16' is ignored to keep splay tree searching predictable
WARNING: You should probably remove '192.168.0.0/16' from the ACL named 'all'

Обнаружена декларация acl all. В третьей версии список доступа all создается сквидом автоматически, его декларация не требуется. Удалите или переименуйте acl all.

Дополнительная информация

Список всех параметров конфигурации:  /usr/local/etc/squid/squid.conf.documented

Документация на сайте проекта: http://www.squid-cache.org/Doc/

Настройка SquidGuard

Bog BOS: Squid (кеширующий прокси для http): установка, настройка и использование

Зона особого внимания: Squid

Squid. The definitive guide

По материалам: itadept.ru/freebsd-squid/

Рубрика: *Proxy, *Unix,*Linux | Оставить комментарий

Настройка репликации postgresql

Встроенная потоковая репликация (Streaming Replication), есть в PostgreSQL начиная с версии 9.0, , усовершенствованна и реализована с помощью передачи WAL (write-ahead logs, журналов (логов) опережающей записи) с главного (Master/Primary) сервера на подчиненный (Slave/Secondary/Replica).
Это асинхронная репликация Master/Slave, когда на ведущий/главный сервер идут запросы, приводящие к изменениям в БД, а на подчиненном сервере эти изменения будут выполнены только через некоторое время. В данном случае реализация состоит в том, что создается сетевое подключение между Standby и Master СУБД вместо копирования журналов по 16 мегабайт, как при Warm Standby и Hot Standby. Как известно, механизм используемый в Warm Standby и Hot Standby основан на пересылке от мастера к слейву.
Мы сначала настроим Hot Standby репликацию, а затем добавим возможность потоковой репликации.
Можно совмещать Hot Standby и Streaming Replication. Это позволяет увидеть на слейве почти мгновенно изменения, выполненные на мастере. Хотя и при работе только потоковой репликации записи с WAL-логов востанавливаются сразу же при процессе их получения. При потоковой репликации на серверах создаются специальных два дополнительных процесса walsender и walreceiver на каждую пару серверов управления базами данных, взаимодействующих между собой через сеть. Потоковая репликация позволяет легко реализовать работу нескольких ведомых.

Исходные данные.
Мастер-сервер ip-адрес: 192.168.200.62
Slave-сервер ip-адрес: 192.168.51.52
postgresql версия: 9.0.8. Важно! Для настройки репликации postgresql: Версия postgresql и операционной системы должна быть одинаковой для мастера и slave серверов
OS: OpenSuSE 11.4

1. Внесем некоторые изменения на мастер сервере:
mkdir /opt/scripts
mkdir /usr/local/pgsql/wal_archive
chown postgres /usr/local/pgsql/wal_archive
2. Добавим скрипты необходимые для репликации postgresql:
/opt/scripts/master_save_wal.pl:

показать файл »

/opt/scripts/slave_get_wal.pl:

показать файл »

/opt/scripts/slave_wal_cleanup.pl:

показать файл »

3. На мастер сервере в конфигурационном файле /usr/local/pgsql/postgresql.conf добавим следующий строчки:

wal_level = hot_standby

archive_mode = on
archive_command = ‘/opt/scripts/master_save_wal.pl %p %f /usr/local/pgsql/wal_archive’
archive_timeout = 3600
4. Перезагрузим postgresql и убедимся что wal-logs создаются в директории /usr/local/pgsql/wal_archive:
/etc/init.d/postgres restart
ls -al /usr/local/pgsql/wal_archive/
psql -c «select pg_switch_xlog();»
ls -al /usr/local/pgsql/wal_archive/
Для возможности создания снимка данных postgresql посылается запрос к серверу:
select pg_start_backup(‘label’,true);
,где ‘label’ может быть любым словом.
Этот запрос переводит мастер в режим создание резервной копии, при котором можно копировать директорию data на slave (например rsync). Полученный таким образом «snapshot» будет не противоречивый и будет содержать файл, указывающий ведомому серверу когда он был сделан для дальнейшего приведения данных в БД к актуальному состоянию. До посылки на мастере запроса «select pg_stop_backup();» никакие изменения в базу не записываются, а заносятся в транзакционные логи, что стоит учесть и не забывать выйти с данного режима.

5. Переводим мастер в режим бекапа:
psql -c «SELECT pg_start_backup(‘label’, true)»
6. Останавливаем postgresql на slave:
/etc/init.d/postgres stop
7. Копируем postgresql instance на slave:
rsync —rsh=ssh -avrz —progress —delete —exclude=pg_xlog —exclude=postmaster.pid [email protected]:/usr/local/pgsql/data/ /usr/local/pgsql/data/
После окончания не забудем выключить режим бекапов на мастере:
psql -c «SELECT pg_stop_backup()»
8. Для настройки репликации postgresql на slave-сервере. Создадим файл следующего содержания:
/usr/local/pgsql/data/recovery.conf:

standby_mode = ‘on’
restore_command = ‘/opt/scripts/slave_get_wal.pl %f %p /usr/local/pgsql/wal_archive_in’
trigger_file = ‘/usr/local/pgsql/data/trigger_file’
archive_cleanup_command = ‘/opt/scripts/slave_wal_cleanup.pl %r /usr/local/pgsql/wal_archive_in’
#primary_conninfo = ‘host=192.168.200.62 port=5432 user=postgres’ //для потоковой репликации

trigger_file нужен для того, чтобы в случае падения мастера, можно было бы сделать слейв-мастером. Т.е. доступным на запись.

9. На slave-сервере внесем одно изменение в файл /usr/local/pgsql/postgresql.conf:
hot_standby=on
Создадим директорию в которую будут попадать wal-logs с мастера:
mkdir /usr/local/pgsql/wal_archive_in
chown -R postgres /usr/local/pgsql/wal_archive_in
10. Запускаем postgresql на slave-сервере:
/etc/init.dpostgres start
11.Добавим в cron пользователя postgres копировать wal-logs с мастер сервера:
* * * * * /opt/scripts/wal_copy.pl [email protected]:/usr/local/pgsql/wal_archive/ /usr/local/pgsql/wal_archive_in 2>&1 | /bin/logger -t pgsql.error
12. Для настройки потоковой репликации postgresql достаточно на мастер сервере:
/usr/local/pgsql/data/postgresql.conf:
max_wal_senders = 2
13. Добавить в файл /usr/local/pgsql/data/pg_hba.conf :
# for streaming replication
host replication postgres 192.168.51.52/32 trust
14. На slave расскоментировать строку:
primary_conninfo = ‘host=192.168.200.62 port=5432 user=postgres’
15. Мониторинг репликации postgresql:
При настроенной репликации на мастере и slave запускаются дополнительные процессы: postgres: wal sender process и postgres: wal receiver process, соответственно.

postgres  3510 11745  0 Apr15 ?        00:21:11 postgres: wal sender process postgres 192.168.51.52(47161) streaming 19/E493D4F8

postgres: wal receiver process   streaming 19/E496A050

Для анализа от полученных результатов нужно взять только шестнадцатиричное (HEX) значение, которое после слеша ‘/’ и перевести в десятичный (DEC) формат. Разница этих чисел даст некоторое значение от которого можно отталкиваться при подсчете отставания слейва от мастера. Для перевода HEX to DEC, т.е. шестнадцатиричного в десятичное число можно воспользоваться, к примеру, такими утилитами:

echo «ibase=16; FF»|bc
255
printf «%d\n» 0xff
255

Если у вас есть некоторая таблица в которую данные поступают регулярну то можно просто написать запрос который будет сравнивать время последнего изменения в данной таблицы с текущим — таким образом можно будет определить на сколько отстает slave от мастера.

Ссылки:
Мониторинг репликации postgresql
Настройка репликации postgresql

Рубрика: *CentOS, *Unix,*Linux, FreeBSD | Оставить комментарий

Установка веб-сервера apache22+php52

apache
Apache HTTP-сервер (сокращение от англ. a patchy server) — свободный веб-сервер.
Система конфигурации Apache основана на текстовых конфигурационных файлах. Имеет три условных уровня конфигурации:
— Конфигурация сервера (httpd.conf).
— Конфигурация виртуального хоста (httpd.conf c версии 2.2 extra/httpd-vhosts.conf).
— Конфигурация уровня директории (.htaccess).

Ставить будем apache22+php52

==============================================================
Часть 1 — Устанавливаем веб-сервер Apache
==============================================================
Первое, с чего необходимо начинать любую установку, это обновление портов . Рекомендую держать Ваши порты в current состоянии.
Далее, переходим в порты:

cd /usr/ports/www/apache22

выполняем установку:

/usr/ports/www/apache22/make install clean

Появится окошко выбора устанавливаемых опций, оставляем все в дефолте и нажимаем Ок

Полезные советы:
Если вам понадобится выбрать другие опции в апаче (или в любом другом порту), выполните /usr/ports/www/apache22/make config
после этого /usr/ports/www/apache22/make deinstall clean && make install clean. При удалении программы, например apache, она будет работать до ее выключения или перезагрузки системы.
Если вам нужно удалить порт, выполните /usr/ports/www/apache22/make deinstall clean

Если, при установке какого-либо порта, Вы получаете похожую ошибку —

===>   apache-2.2.21 is already installed
      You may wish to ``make deinstall'' and install this port again
      by ``make reinstall'' to upgrade it properly.
      If you really wish to overwrite the old port of www/apache22
      without deleting it first, set the variable "FORCE_PKG_REGISTER"
      in your environment or the "make install" command line.
*** Error code 1

Stop in /usr/ports/www/apache22.
*** Error code 1

Значит порт, который вы ставите, или явно зависящий от него порт — уже установлены. Если это порт-зависимость, то перейдите к этому порту и выполните make deinstall clean, после чего вернитесь в порт, который вы ставили, и продолжайте установку. Зависимость он установит сам.

После успешной установки, конфигурационные файлы Вы найдете в /usr/local/etc/apache22/
Добавляем apache в автозагрузку apache

echo 'apache22_enable="YES"' >> /etc/rc.conf

==============================================================
Часть 2 — Устанавливаем PHP5.2
==============================================================

php

Далее устанавливаем модуль PHP. Так как мы будем использовать версию PHP 5.2, то переходим в соответствующий порт и запускаем установку:

cd /usr/ports/lang/php52
/usr/ports/lang/make install clean

Появится меню выбора соответствующих модулей, нам необходимо поставить галочку на:

[X] APACHE     Build Apache module

и нажимаем Ок

Дожидаемся окончания процесса установки. В конфигурационный файл apache httpd.conf автоматически будет добавлен модуль PHP:

LoadModule php5_module        libexec/apache22/libphp5.so

А программа установки напоследок выдаст следующее сообщение:

***************************************************************
Make sure index.php is part of your DirectoryIndex.

You should add the following to your Apache configuration file:

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
***************************************************************

Последние две строчки мы должны добавить в главный конфигурационный файл веб-сервера /usr/local/etc/apache22/httpd.conf в директиву IfModule mime_module
В директиве Directorylndex можно задать несколько имен файлов. Если первый документ, указанный в строке, не найден в каталоге, то сервер ищет следующий и, в случае успеха, передает его клиенту. Чтобы разрешить в качестве индексных страниц передавать файлы index.php или index.phps, приведите строку Directorylndex к такому виду:

DirectoryIndex index.html index.html.var index.php index.phps

Что бы проверить, что мы ничего не забыли, выполните следующую команду и сравните результат с моим:

/usr/local/etc/apache22]# cat httpd.conf | grep php
LoadModule php5_module        libexec/apache22/libphp5.so
    DirectoryIndex index.html index.html.var index.php index.phps
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps

На этом, работа с PHP еще не закончена. Возвращаемся в порты и переходим к установке модулей PHP:

cd /usr/ports/lang/php52-extensions/
/usr/ports/lang/php52-extensions]# make install clean

Появится окно с выбором модулей. Здесь Вы должны выбрать модули, которые планируете использовать в дальнейшей работе вашего веб-сервера.
Мне необходимы следующие модули:

               Options for php52-extensions 1.3_1                 

│ │   [X] BCMATH      bc style precision math functions
│ │   [X] BZ2         bzip2 library support
│ │   [ ] CALENDAR    calendar conversion support
│ │   [X] CTYPE       ctype functions
│ │   [X] CURL        CURL support
│ │   [ ] DBA         dba support
│ │   [ ] DBASE       dBase library support
│ │   [X] DOM         DOM support
│ │   [X] EXIF        EXIF support
│ │   [X] FILEINFO    fileinfo support
│ │   [X] FILTER      input filter support
│ │   [ ] FRIBIDI     FriBidi support
│ │   [ ] FTP         FTP support
│ │   [X] GD          GD library support
│ │   [X] GETTEXT     gettext library support
│ │   [ ] GMP         GNU MP support
│ │   [X] HASH        HASH Message Digest Framework
│ │   [X] ICONV       iconv support
│ │   [X] IMAP        IMAP support
│ │   [ ] INTERBASE   Interbase 6 database support (Firebird)
│ │   [X] JSON        JavaScript Object Serialization support
│ │   [ ] LDAP        OpenLDAP support
│ │   [X] MBSTRING    multibyte string support
│ │   [X] MCRYPT      Encryption support
│ │   [ ] MHASH       Crypto-hashing support
│ │   [ ] MING        ming shockwave flash support
│ │   [X] MSSQL       MS-SQL database support
│ │   [X] MYSQL       MySQL database support
│ │   [X] MYSQLI      MySQLi database support
│ │   [ ] NCURSES     ncurses support (CLI only)
│ │   [ ] ODBC        unixODBC support
│ │   [X] OPENSSL     OpenSSL support
│ │   [ ] PCNTL       pcntl support (CLI only)
│ │   [X] PCRE        Perl Compatible Regular Expression support
│ │   [ ] PDF         PDFlib support (implies GD)
│ │   [ ] PDO         PHP Data Objects Interface (PDO)
│ │   [ ] PDO_SQLITE  PDO sqlite driver
│ │   [ ] PDO_MYSQL   PDO mysql driver
│ │   [ ] PGSQL       PostgreSQL database support
│ │   [X] POSIX       POSIX-like functions
│ │   [X] PSPELL      pspell support
│ │   [ ] READLINE    readline support (CLI only)
│ │   [ ] RECODE      recode support
│ │   [X] SESSION     session support
│ │   [ ] SHMOP       shmop support
│ │   [X] SIMPLEXML   simplexml support
│ │   [X] SNMP        SNMP support
│ │   [ ] SOAP        SOAP support
│ │   [X] SOCKETS     sockets support
│ │   [X] SPL         Standard PHP Library
│ │   [ ] SQLITE      sqlite support
│ │   [ ] SYBASE_CT   Sybase database support
│ │   [ ] SYSVMSG     System V message support
│ │   [ ] SYSVSEM     System V semaphore support
│ │   [ ] SYSVSHM     System V shared memory support
│ │   [ ] TIDY        TIDY support
│ │   [ ] TOKENIZER   tokenizer support
│ │   [ ] WDDX        WDDX support (implies XML)
│ │   [X] XML         XML support
│ │   [X] XMLREADER   XMLReader support
│ │   [X] XMLRPC      XMLRPC-EPI support
│ │   [X] XMLWRITER   XMLWriter support
│ │   [X] XSL         XSL support (Implies DOM)
│ │   [ ] YAZ         YAZ support (ANSI/NISO Z39.50)
│ │   [X] ZIP         ZIP support
│ │   [] ZLIB        ZLIB support

Нажимаем Ок и ждем. Установка займет какое-то время, в течении которого, вам будут предложены к установке дополнительные опции устанавливаемых модулей. Можете просто соглашаться с предлагаемыми значениями.

Если вам необходимо добавить какой-нибудь модуль PHP, например php52-zlib, Вам нет необходимости пересобирать полностью все модули. Выполняем поиск:

/usr/ports]# whereis php52-zlib
php52-zlib: /usr/ports/archivers/php52-zlib

Устанавливаем:

/usr/ports/archivers/php52-zlib#/make install clean

Перезапускаем apache

/usr/local/etc/rc.d/./apache22 restart

Все, Ваш модуль php52-zlib установлен и работает.

И в конце, нам необходимо показать PHP как ему работать. Делается это через файл php.ini – это файл настроек и конфигурации PHP. В нем находится ряд директив, которые определяют различное поведение PHP, ну и, следовательно, сайта.
После установки в каталоге /usr/local/etc/ будет несколько вариантов этого файлы. Скопируем и переименуем нужный нам:

cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini

===================================================
Часть 3 — настройка Apache+PHP
===================================================

Полезный совет:
Сделаю небольшое отступление — когда я начинал изучать apache, я делал все по разным мануалам, не до конца представляя себе конечную цель. Имею ввиду всю структуру, с дальнейшим наращиванием виртуалхостов, каких-то дополнительных программ и модулей. К чему я это говорю? А к тому, что сразу приучите себя видеть конечный результат. Делайте сразу эстетично и удобно структуру тех же каталогов и логов. Когда у Вас их будет 50, а Вы все еще будете писать все виртуалхосты в одном файле httpd-vhosts.conf — сразу же поймете как это было неправильно. При том, что можно было сразу делать удобнее. Логи хранить отдельно для каждого хоста. Ротировать их и снимать статистику. Один хост — отдельный конфиг. А в httpd-vhosts.conf только глобальные алиасы сервера.

Итак, мы установили apche 2.2+PHP5.2 и прописали в http.conf использовать PHP
Для запуска apache необходимо изменить еще несколько секций в конфигурационном файле /usr/local/etc/apache22/httpd.conf
Раскомментировать и изменить значение:
ServerName на своё, например —

ServerName soulbrat.org.ua:80

Раскомментировать следующие конфиги:

# Вирутал хосты
Include etc/apache22/extra/httpd-vhosts.conf
# Статистика apache
Include etc/apache22/extra/httpd-info.conf
# Различные настройки по умолчанию
Include etc/apache22/extra/httpd-default.conf
# Убедиться, что раскомментирован конфиг - тут мы будем хранить конфигурационные файлы наших виртуалхостов:
Include etc/apache22/Includes/*.conf

В конфигурационном файле /etc/apache22/extra/httpd-vhosts.conf мы будем описывать только глобальные алиасы сервера и дефолтовый хост, который будет выводиться при запросе о несуществующем виртуахосте нашего сервера.

Если мы не создадим виртуалхост по-умолчанию, то при не найденных запросах, будет выводиться виртуалхост, который apache найдет первым по списку, просматривая файлы в порядке очереди — httpd.conf, httpd-vhosts.conf и дальше каталог Includes/*.conf — первый найденный конфиг в алфавитном порядке.

Удаляем все, что есть в нашем текущем /etc/apache22/extra/httpd-vhosts.conf и пишем что нам необходимо:

cat /etc/apache22/extra/httpd-vhosts.conf

NameVirtualHost *:80

# Наш виртуалхост по-умолчанию, слушает 80-й порт

# Какой домен
ServerName default
# Директория с файлами
DocumentRoot /usr/local/www/non-existent-host/www
# Подключаемые директивы, в указанном каталоге
"/usr/local/www/non-existent-host/www">
       # Включаем листинг каталога (что бы отключить листинг, добавте минус Options -Indexes)
       Options Indexes
       # Разрешаем чтение файлов .htaccess
       AllowOverride All
       # Индексный файл директории
       DirectoryIndex index.php
</Directory>
</VirtualHost>

#######################################################
###############ALIASES#################################
# Наш первый алиас, по этому принципу добавляются и остальные

### В алиасе выведем PHP-info для проверки работы нашего php-модуля
### php-info
Alias /testphp "/usr/local/www/test"
"/usr/local/www/test">
      Options Indexes
      AllowOverride All
      # Запретим доступ к нашей странице, всем кроме своей сети. Незачем кому-то видеть настройки нашего PHP
      Order deny,allow
      Deny from all
      Allow from 195.8.40.0/24
      DirectoryIndex index.php
</Directory>

Создаем необходимые директории и файлы:

mkdir /usr/local/www/non-existent-host

mkdir /usr/local/www/non-existent-host/www

touch /usr/local/www/non-existent-host/www/.htaccess

mkdir /usr/local/www/test

touch /usr/local/www/test/index.php

Редактируем htaccess дефолтового хоста:

ee /usr/local/www/non-existent-host/www/.htaccess

Здесь будет всего одна строчка, которая будет редиректить (перенаправлять), любой, не найденный запрос, на наш виртуалхост (любой), например -

Redirect 301 / http://soulbrat.org.ua

Пишем наш PHP-info

ee /usr/local/www/test/index.php


phpinfo();
?>

Теперь создадим конфигурационный файл, нашего виртуалхоста:

touch /usr/local/etc/apache22/Includes/soulbrat.org.ua.conf

ee /usr/local/etc/apache22/Includes/soulbrat.org.ua.conf

###################################################
###SOULBRAT.ORG.UA######################

    ServerAdmin [email protected]
    DocumentRoot "/usr/www/soulbrat.org.ua/WWW"
    ServerName soulbrat.org.ua
    ServerAlias http://soulbrat.org.ua, www.soulbrat.org.ua
    "/usr/www/soulbrat.org.ua/WWW">
            Options Indexes
            AllowOverride All
            DirectoryIndex index.php
    </Directory>
    # Делаем отдельные логи для нашего хоста
    ErrorLog /usr/www/soulbrat.org.ua/logs/soulbrat-error.log
    CustomLog /usr/www/soulbrat.org.ua/logs/soulbrat.log combined
</VirtualHost>

Мне удобно хранить все виртуалхосты в директории /usr/www — это дело вкуса каждого. Так же я создаю имена директорий по доменному имени, так удобней.

Создаем директории:

mkdir /usr/www

mkdir /usr/www/soulbrat.org.ua

mkdir /usr/www/soulbrat.org.ua/WWW

mkdir /usr/www/soulbrat.org.ua/logs

Создаем индексный файл:

touch /usr/www/soulbrat.org.ua/WWW/index.php

И выведем в нем надпись:

ee /usr/www/soulbrat.org.ua/WWW/index.php


echo "Привет мир!";
?>

В конфигурационном файле httpd.conf, мы так же включили статистику apache. Настроим ее:

ee /usr/local/etc/apache22/extra/httpd-info.conf

# включаем ExtendedStatus, меняем значение на On
ExtendedStatus On

# В директиве , добавляем разрешение просмотра этой
# страницы, только нашей внутренней сети.
/server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 10.0.0.0/24
</Location>

Сохраняем изменения.

==============================================================
Часть 4 — Запуск и проверка веб-сервера Apache
==============================================================

Итак все готово, можно проверять.

Запускаем наш апач и если все нормально, Вы должны увидеть такую надпись:

/usr/local/etc/rc.d/./apache22 start
Performing sanity check on apache22 configuration:
Syntax OK
Starting apache22.

Проверяем что апач запущен и слушает 80-й порт

sockstat | grep 80

www      httpd      49729 3  tcp46  *:80                  *:*
www      httpd      49728 3  tcp46  *:80                  *:*

Видим, что все нормально. Идем дальше, открываем браузер и проверяем http://soulbrat.org.ua — если Вы увидели надпись «Привет мир!» — значит наш виртуалхост работает нормально.
Добавьте к имени алиас — http://soulbrat.org.ua/testphp и должна открыться такая страница:

А теперь введите в строке адреса, просто IP-адрес Вашего сервера — http://195.8.40.85
Если Вы снова увидели надпись «Привет мир!» — значит редирект дефолтового хоста работает так же нормально.

Для просмотра статистики веб-сервера, добавим алиас в виде server-status:
http://soulbrat.org.ua/server-status
должна открыться страница текущего состояния Apache, вот такая:

На этом наша установка завершена.

Если вы, вместо PHP-info, видите белый, пустой лист — значит PHP не работает. Возможно Вы забыли прописать нужные параметры в файл httpd.conf

Если у Вас возникли проблемы с запуском, например апач ругается на какие-то файлы и не стартует, более подробную информацию Вы найдете в его логах —
cat /var/log/httpd-error.log

Логи конкретного вируалхоста Вы найдете, там, где их создали:
/usr/www/soulbrat.org.ua/logs/*log

По этой аналогии, теперь Вы можете добавлять следующие виртуалхосты и алиасы.
По материалам: soulbrat.org.ua/?p=230

Рубрика: *CentOS, *Unix,*Linux, *Web, FreeBSD | Оставить комментарий