Konoplev e 17 tehnologii it linux

Page 1

СОДЕРЖАНИЕ Модуль ду 1. Резервное р копирование. р Копирование данных с продакшен-сервера на backup-сервер ............................................ 7 Перекрестное копирование данных ................................................................................................... 7 Системы хранения данных ...................................................................................................................... 8 Другие носители данных .......................................................................................................................... 9 Виды бекапа .................................................................................................................................................... 9 Схемы ротации бекапов ..........................................................................................................................10 Методы резервирования баз данных ...............................................................................................10 RAID – Redundant Array of Independent Disks ................................................................................11 Типы RAID-массивов..................................................................................................................................11 Уровни RAID-массивов.............................................................................................................................12 RAID 0 (Striped Disk Array without Fault Tolerance) .......................................................................12 RAID 1 (Mirroring & Duplexing) ..............................................................................................................12 RAID 5 (Independent Data Disks with Distributed Parity Blocks) ...............................................13 RAID 1+0 (Very High Reliability with High Performance) Performance)..............................................................13 ..............................................................13 RAID 5+0 (High I/O Rates & Data Transfer Performance) ...............................................................14 Storage Area Networkk ................................................................................................................................ 14 ................................................................................................................................14 Network Attached Storage .......................................................................................................................15 Direct Attached Storage ............................................................................................................................16 Самописный скрипт использующий атрибут mtime файлов.................................................17 файлов .................................................17 Rsync .................................................................................................................................................................19 Зеркалируем разделы ..............................................................................................................................21 Amanda............................................................................................................................................................22

Модуль ду 2. Сетевой интерфейс рф Linux. Какие файлы влияют на работу сетевого интерфейса интерфейса..............................................................30 ..............................................................30 DHCP iface ......................................................................................................................................................31 Loopback iface ..............................................................................................................................................32 Custom iface...................................................................................................................................................32 Практика.........................................................................................................................................................33 Маршрутизация ..........................................................................................................................................35 Прописываем маршруты ........................................................................................................................36 Про шлюз........................................................................................................................................................38 Полезные ключи netstat ..........................................................................................................................38 NMAP ................................................................................................................................................................40 tcpdump ..........................................................................................................................................................41

1


Модуль ду 3. TFTP. Установка .......................................................................................................................................................42 Работа с TFTP.................................................................................................................................................42 Типы пакета ...................................................................................................................................................43 Режимы передачи ......................................................................................................................................43 Коды ошибок ................................................................................................................................................43 Клиент tftp .....................................................................................................................................................44

Модуль ду 4. NFS. Установка .......................................................................................................................................................45 Настройка ......................................................................................................................................................46 Опции конфигурационного файла.....................................................................................................47 Дополнительная информация .............................................................................................................48

Модуль ду 5. Install-сервер. р р Принцип работы .........................................................................................................................................49 DHCP .................................................................................................................................................................50 TFTP ...................................................................................................................................................................51 Syslinux ............................................................................................................................................................51 NFS.....................................................................................................................................................................51 Создаем структуру tftp-сервера добавляем контент на сервер .........................................52 Устанавливаем ОС по сети .....................................................................................................................52 Автоматизация установки с помощью Kickstart ...........................................................................53 Диагностика ..................................................................................................................................................55

Модуль ду 6. Виртуализация р у ц Xen. Что это такое ? ..............................................................................................................................................56 Зачем это нужно ?.......................................................................................................................................56 Типы виртуализации .................................................................................................................................56 Архитектура Xen .........................................................................................................................................58 Причины по которым стоит использовать виртуализацию. ..................................................58 Настраиваем сервер виртуализации ................................................................................................58 Установка Xen...............................................................................................................................................59 Создание новых виртуальных машин в Xen .................................................................................60 Работа с виртуальными машинами ....................................................................................................61 Производительность виртуальных машин ....................................................................................62

2


Модуль ду 7. Subversion. Архитектура Subversion ..........................................................................................................................63 Протоколы работы с SVN ........................................................................................................................64 Способы хранения данных ....................................................................................................................64 Компоненты Subversion...........................................................................................................................64 Проблема одновременной работы с файлами.............................................................................64 Рабочий цикл................................................................................................................................................66 Установка .......................................................................................................................................................66 Работаем с репозиторием ......................................................................................................................66 Получение копии репозитария с удаленного сервера где у вас есть аккаунт ..............68 Ограничение доступа...............................................................................................................................69 Работа через Proxy .....................................................................................................................................72

Модуль ду 8. Apache. p Об Apache ......................................................................................................................................................73 Установка .......................................................................................................................................................73 Настройка ......................................................................................................................................................74 Добавляем виртуальный хост ..............................................................................................................82 Возможные опции в директиве Options ..........................................................................................84 Определение возможных директив в .htaccess ...........................................................................85 Аутентификация на сайте .......................................................................................................................86 Включение SSL .............................................................................................................................................87 Server-status и server-info ........................................................................................................................90 SSI.......................................................................................................................................................................91 Использование mod_rewrite .................................................................................................................91 Регулярные выражения mod_rewrite и флаги ..............................................................................93 Коды веб-сервера ......................................................................................................................................94

Модуль ду 9. SAMBA. Что такое SAMBA и зачем она нужна ? ........................................................................................... 104 Возможности SAMBA ............................................................................................................................. 104 Установка .................................................................................................................................................... 104 Типы аутентификации ........................................................................................................................... 104 Ключевые файлы ..................................................................................................................................... 105 Структура конфигурационного файла .......................................................................................... 106 Пример конфигурационного файла ............................................................................................... 106 Описание конфигурационного файла ........................................................................................... 107 SWAT – веб-интерфейс к SAMBA ....................................................................................................... 111

3


Модуль ду 10. DHCPD. Принцип работы ...................................................................................................................................... 112 Установка DHCPD .................................................................................................................................... 113 Настройка DHCPD ................................................................................................................................... 113 Описание опций из dhcpd.conf dhcpd.conf......................................................................................................... f......................................................................................................... 114 Секции-объявления ............................................................................................................................... 116 Типы пакетов протокола DHCP ......................................................................................................... 119 Используемые порты............................................................................................................................. 119 DHCP-клиент .............................................................................................................................................. 119

Модуль ду 11. MySQL. y Q Принцип работы ...................................................................................................................................... 121 Пример роли MySQL в информационном пространстве ..................................................... 122 Типы данных .............................................................................................................................................. 122 Сколько нужно места под хранение типа данных ? ................................................................ 124 Практика...................................................................................................................................................... 125 Файл как источник запросов ............................................................................................................. 130 Пользователи и привелегии .............................................................................................................. 132 Саммари по командам и принципу работы ................................................................................ 133 Конфигурационный файл my.cnf...................................................................................................... 134 Забытый пароль администратора ................................................................................................... 136 Резервное копирование ...................................................................................................................... 136 Проверка целостности таблиц с помощью myisamchkk ......................................................... 137 Саммари по myisamchkk ........................................................................................................................ 138

Модуль ду 12. Мониторинг. р О Nagios ....................................................................................................................................................... 139 Установка и настройка Nagios ........................................................................................................... 140 Добавление хостов и сервисов на мониторинг ........................................................................ 166 Мониторинг различных параметров сервера ........................................................................... 167 Мониторинг свободного места......................................................................................................... 167 Защита системы от пользовательских процессов ................................................................... 168 Мониторинг S.M.A.R.T. - параметров жесткого диска ............................................................. 168 Мониторинг сетевых портов в Linux .............................................................................................. 169 Мониторинг открытых файлов и сокетов .................................................................................... 169 Мониторинг запущенных процессов ............................................................................................. 170 Мониторинг системных ресурсов ................................................................................................... 170 Мониторинг свободного места в разделах ................................................................................. 170 Мониторинг сетевой подсистемы в реальном времени ...................................................... 171 Мониторинг работы DNS-сервера в реальном времени...................................................... 171

4


Мониторинг соединений proftpd в реальном времени........................................................ времени........................................................ 172 Статистика по виртуальной памяти ................................................................................................ 172 Статистика по процессору и устройствам ввода-вывода..................................................... 172

Модуль ду 13. DNS. Установка .................................................................................................................................................... 173 Инструменты ............................................................................................................................................. 173 Базовые понятия ..................................................................................................................................... 174 Правила построения DNS-системы ................................................................................................ 174 Режимы работы ДНС-серверов......................................................................................................... 175 Типы ответов DNS-серверов .............................................................................................................. 177 Виды запросов к DNS-серверу .......................................................................................................... 177 Способы копирования зоны с master-сервера ......................................................................... 177 Виды записей............................................................................................................................................. 179 Структура конфигурационного файла .......................................................................................... 181 Настройка ................................................................................................................................................... 182 Опции конфигурационного файла.................................................................................................. 186 Slave-сервер............................................................................................................................................... 187 Записи в /etc/resolv.conff ....................................................................................................................... 190 Статистика работы ................................................................................................................................. 190

Модуль ду 14. Nginx. g Что такое Nginx ?...................................................................................................................................... 192 Преимущества Nginx ............................................................................................................................. 192 Варианты использования Nginx ....................................................................................................... 192 Установка EPEL .......................................................................................................................................... 193 Ставим EPEL-пакет ................................................................................................................................... 193 Установка Nginx с поддержкой PHP. Настраиваем связку Nginx + FastCGI. FastCGI................... .................. 194 Конфигурирование Nginx + FastCGI................................................................................................ 195 Понижаем нагрузку на основной веб-сервер. Установка Nginx как Frontend к Apache............................................................................................................... 198 Установка mod_rpaff ............................................................................................................................... 201 Включение SSL .......................................................................................................................................... 202 Использование двух версий PHP в Nginx одновременно .................................................... 203 Примеры производительности с Nginx и без него. ................................................................. 204 ...................................................................... 205 Описание директив конфигурационного файла файла......................................................................

Модуль ду 15. Postfix. Установка и настройка .......................................................................................................................... 210 Postfix ............................................................................................................................................................ 210

5


MySQL ........................................................................................................................................................... 216 Dovecot......................................................................................................................................................... 217 Clamd............................................................................................................................................................. 220 ClamSMTP .................................................................................................................................................... 221 Spamassassin .............................................................................................................................................. 221 Postfixadmin ............................................................................................................................................... 224 Squirrelmail ................................................................................................................................................. 225 Описание конфигурационных файлов.......................................................................................... 226 Postfix ............................................................................................................................................................ 226 Dovecot......................................................................................................................................................... 229 Clamd............................................................................................................................................................. 230 Clamsmtp ..................................................................................................................................................... 231 Spamassassin .............................................................................................................................................. 232

Модуль ду 16. OpenVPN. p Об OpenVPN ............................................................................................................................................... 234 Установка Linux VPN-сервера ............................................................................................................ 234 Настройка Linux VPN-сервера ........................................................................................................... 235 Linux VPN-клиент ..................................................................................................................................... 240 Windows VPN-клиент.............................................................................................................................. 242 Добавление клиентов ........................................................................................................................... 243 Таблица предназначения ключей и сертификатов.................................................................. 243 Конфигурационный файл openvpn.conf на Linux VPN-сервере......................................... 243 Конфигурационный файл client.conf на Linux-клиентах ....................................................... 246 Конфигурационный файл client.ovpn на Windows-клиенте................................................. 247

Модуль ду 17. Отказоустойчивый у кластер. р Что такое кластер ? ................................................................................................................................. 248 Принцип работы нашего кластера ................................................................................................. 248 DRBD .............................................................................................................................................................. 249 Программы входщие в состав пакета DRBD................................................................................ 250 Heartbeat ..................................................................................................................................................... 251 Именование серверов .......................................................................................................................... 251 Установка ПО ............................................................................................................................................. 251 Настройка DRBD ...................................................................................................................................... 252 Настройка Heartbeat .............................................................................................................................. 257 Установка Apache .................................................................................................................................... 259

6


Модуль 1. Резервное копирование Процедура бекапа или резервного копирования очень проста, но может стать большой головной болью если её не делать. Бизнес многих компаний напрямую зависит от манипуляций с информацией которая хранится на серверах. Базы данных, репозитории исходных кодов, веб-проекты и т.д. Все это нужно ежедневно сохранять на резервные носители информации. В случае потери информации и её невозможности восстановить компания может понести большие убытки. В этом модуле мы рассмотрим несколько вариантов резервного копирования, от самописных скриптов до промышленных решений и получим необходимую теорию. Во первых, есть несколько схем резервного копирования.

Копирование данных с продакшен-сервера на backup-сервер Продакшен-сервер – это рабочий сервер, который выполняет какие либо сервисы для пользователей. backup-сервер – это сервер на который копируется контент с продакшенсервера. Единственное предназначение такого сервера – хранить данные с других серверов. Обычно сам он никаких сервисов не выполняет. Главное требование – большое дисковое пространство. Скорость дисковых накопителей особого значения не имеет, так как доступ к данным не частый – записать бекап на диск и считать его в случае необходимости. Минус этого решения – необходимость в отдельном сервере под backup`ы а это дополнительные затраты. Маленькие и средние компании обычно пытаются сэкономить деньги на покупке вспомогательного оборудования.

Перекрестное копирование данных Когда два или более продакшен серверов копируют друг на друга свои данные. В случае когда на продакшен серверах есть достаточное количество дискового пространства для хранение данных с других серверов, их можно использовать как backup-серверы. Мы копируем данные с сервера server1 на server2 а данные с server2 на server1. Плюс – экономим деньги на оборудование. Как я писал выше маленькие и средние организации могут не выделить деньги на вспомогательное оборудование, даже если это необходимо под резервные копии. В таком случае вам может помочь такой способ бекапа. Модуль 1. Резервное копирование.

7


Системы хранения данных “Классические” сервера для хранения бекапов хороши при относительно небольших объемах. Сейчас это несколько сотен гигабайт. Когда же объемы гораздо больше на помощь приходят СХД, Системы Хранения Данных.

Дисковые массивы Д По сути такой же сервер, но спроектирован специально под хранение данных. Имеет много HDD большего размера.

Дисковый массив Sun Storage J4500. Масштабируемость – от 24 до 192 Тб Поддерживаемые ОС: Solaris, RedHat, Suse, Windows

Ленточные накопители Они же стримеры. Данные как и в случае с ленточными библиотеками записываются на специальные картриджи. Как правило, картридж – это магнитная лента в пластиковом корпусе.

Ленточный накопитель HP StorageWorks DAT 160 SAS.

Картридж для HP StorageWorks DAT 160 SAS. 160 Гб.

8

Модуль 1. Резервное копирование.


Ленточные библиотеки Предназначены для автоматизированного резервного копирования данных. Одновременное использование нескольких лентопротяжных механизмов увеличивает производительность библиотеки и сокращает время, необходимое для записи и чтения резервных копий.

Одно из самых серьезных решений SUN. Ленточная библиотека Sun StorageTek SL8500. До 56 петабайт данных. До 70 тысяч картриджей.

Другие носители данных optical disc (CD-R/RW, DVD-R/RW); flash-накопители; ZIP, Jaz, MO драйвы.

Виды бекапа Полное – все файлы и каталоги которые мы хотим сохранять на отдельном носителе. Инкрементальное – копируем только то, что изменилось с момента последнего резервного копирования. Полного или инкрементального. Дифференциальное – копируем только то, что изменялось с момента последнего ПОЛНОГО бекапа. Пофайловый метод – копируем нужные файлы в индивидуальном порядке. Дублирование диска – метод при котором мы делаем полный снимок диска. Например утилитой dd. Модуль 1. Резервное копирование.

9


Схемы ротации бекапов Ротация – это политика по которой делается резервное копирование. Как часто мы будем делать бекап, как долго мы будем хранить резервные копии. Все это описывается политикой ротации. Одноразовое копирование – администратор делает копирование вручную. Обычно делается полный бекап данных. Простая ротация – подразумевается, что некий набор носителей используется циклически. К примеру 5 ленточных носителей на каждый день недели. В пятницу мы делаем полный бекап данных а в остальные дни недели инкрементальный. “Дед, отец, сын” (GFS) – имеет иерархическую структуру ротации. Используется три набора носителей. Раз в неделю делается полной бекап данных. В остальные дни недели – инкрементальный. Раз в месяц делается еще один полный бекап системы. Набор носителей для ежедневного инкрементального копирования – сын, набор для еженедельного полного бекапа – отец, набор для ежемесячного полного бекапа – дед. “Ханойская башня” – название пошло от древней китайской игры. Смысл игры заключается в следующем. Есть три стержня и какой-то набор дисков. Диски нужно перемещать со стержня на стержень, но так, чтобы каждый новый диск ложился на диск большего диаметра.

Такой метод бекапа достаточно сложен и практически не применяется в настоящее время. “10 наборов” – метод рассчитан на 10 наборов носителей. Период из 40 недель делится на десять циклов. В течение цикла за каждым набором закреплен один день недели. По прошествии четырехнедельного цикла осуществляется сдвиг номера набора. То есть в первом цикле за понедельник отвечал набор N1, за вторник N2, за среду N3 и т.д. Во втором цикле за понедельник будет отвечать набор N2, за вторник N3, за среду N4 и т.д. Такая схема позволяет равномерно распределить нагрузку между носителями но из-за своей сложности практически не используется.

Методы резервирования баз данных hot backup – горячий бекап базы данных. Это когда резервная копия делается при включенном сервере БД. cold backup – холодный бекап базы данных. Это когда сервер БД нужно выключить чтобы сделать резервную копию.

10

Модуль 1. Резервное копирование.


RAID – Redundant Array of Independent Disks Избыточный массив независимых дисков. Это когда несколько физических дисков объединяются вместе в один логический чтобы решать какие либо задачи. Скорее всего вы его будете использовать для отказоустойчивости. При выходе из строя одного из дисков система будет продолжать работать. В операционной системе массив будет выглядеть как обычный HDD. RAID – массивы зародились в сегменте серверных решений, но сейчас получили широкое распространение и уже используются дома. Для управления RAID-ом используется специальная микросхема с интеллектом , которая называется RAID-контроллер. Это либо чипсет на материнской плате, либо отдельная внешняя плата.

Типы RAID-массивов Есть два типа RAID-массивов.

RAID-контроллер - LSI LOGIC MegaRAID SCSI 320-1 Аппаратный – это когда состоянием массива управляет специальная микросхема. На микросхеме есть свой CPU и все вычисления ложатся на него, освобождая CPU сервера от лишней нагрузки. Программный – это когда состоянием массива управляет специальная программа в ОС. В этом случае будет создаваться дополнительная нагрузка на CPU сервера. Ведь все вычисления ложатся именно на него. Однозначно сказать какой тип рейда лучше – нельзя. В случае программного рейда нам не нужно покупать дорогостоящий рейд-контроллер. Который обычно стоит от 250 у.е. (можно найти и за 70 у.е. но я бы не стал рисковать данными) Но все вычисления ложатся на CPU сервера. Программная реализация хорошо подходит для рейдов 0 и 1. Они достаточно просты и для их работы не нужны большие вычисления. Поэтому программные рейды чаще используют в решениях начального уровня. Аппаратный рейд в своей работе использует рейд-контроллер. Рейд-контроллер имеет свой процессор для вычислений и именно он производит операции ввода/вывода. Модуль 1. Резервное копирование.

11


Уровни RAID-массивов Их достаточно много. Это основные – 0, 1, 2, 3, 4, 5, 6, 7 и комбинированные – 10, 30, 50, 53... Мы рассмотрим только самые ходовые, которые используются в современной инфраструктуре предприятия. Буква D в схемах означает Data (данные), или блок данных.

RAID 0 ((Striped p Disk Arrayy without Fault Tolerance))

Он же stripe. Это когда два или более физических дисков объединяются в один логический с целью объединения места. То есть берем два диска по 500 Гб, объединяем их в RAID 0 и в системе видим 1 HDD объемом в 1 Тб. Информация распределяется по всем дискам рейда равномерно в виде небольших блоков (страйпов). Плюсы – Высокая производительность, простота реализации. Минусы – отсутствие отказоустойчивости. При использование этого рейда надежность системы понижается в два раза (если используем два диска). Ведь при выходе из строя хотя бы одного диска вы теряете все данные.

RAID 1 ((Mirroringg & Duplexing) p g)

Он же mirror. Это когда два или более физических дисков объединяются в один логический диск с целью повышения отказоустойчивости. Информация пишется сразу на оба диска массива и при выходе одного из них информация сохраняется на другом. Плюсы – высокая скорость чтения/записи, простота реализации. Минусы – высокая избыточность. В случае использования 2-х дисков это 100%.

12

Модуль 1. Резервное копирование.


RAID 5 ((Independent p Data Disks with Distributed Parityy Blocks))

Самый популярный вид рейд-массива, в целом благодаря экономичности использования носителей данных. Блоки данных и контрольные суммы циклически записываются на все диски массива. При выходе из строя одного из дисков будет заметно снижена производительность, так как придется совершать дополнительные манипуляции для функционирования массива. Сам по себе рейд имеет достаточно хорошую скорость чтения/записи но немного уступает RAID 1. Нужно не менее трех дисков чтобы организовать RAID 5. Плюсы – экономичное использование носителей, хорошая скорость чтения/ записи. Разница в производительности по сравнению с RAID 1 не так сильно видна как экономия дискового пространства. В случае использования трех HDD избыточность составляет всего 33%. Минусы – сложное восстановление данных и реализация.

RAID 1+0 ((Veryy High g Reliabilityy with High g Performance))

Он же RAID 10. Сочетание зеркального рейда и рейда с чередованием дисков. В работе этого вида рейда диски объединяются парами в зеркальные рейды (RAID 1) а затем все эти зеркальные пары объединяются в массив с чередованием (RAID 0). В рейд можно объединить только четное количество дисков, минимум – 4, максимум – 16. От RAID 1 мы наследуем надежность, от RAID 0 - скорость. Плюсы – высокая отказоустойчивость и производительность Минусы – высокая стоимость Модуль 1. Резервное копирование.

13


RAID 5+0 ((High g I/O Rates & Data Transfer Performance))

Он же RAID 50, это сочетание RAID 5 и RAID 0. Массив объединяет в себе высокую производительность и отказоустойчивость. Плюсы – высокая отказоустойчивость, скорость передачи данных и выполнение запросов Минусы – высокая стоимость

Итоги Уровень RAID

Использование

Мин.дисков

Механизм обеспечения надежности

RAID 0

100%

1

нет

RAID 1

50%

2

зеркалирование

RAID 5

67-94%

3

четность

RAID 1+0

50%

4

зеркалирование

RAID 5+0

67-94%

6

четность

Главный вывод который можно сделать – у каждого уровня рейда есть свои плюсы и минусы. Еще главнее вывод – рейд не гарантирует целостности ваших данных. То есть если кто-то удалит файл или он будет поврежден каким либо процессом, рейд нам не поможет. Поэтому рейд не освобождает нас от необходимости делать бекапы. Но помогает, когда возникают проблемы с дисками на физическом уровне.

Storage Area Network Архитектурное решение SAN представляет собой сеть, как правило на базе

14

Модуль 1. Резервное копирование.


Fibre Channel (оптика) которая служит для подключения хранилищ данных к серверам таким образом, чтобы те считали устройства как локальные.

Такое решение добавляет большую гибкость инфраструктуре предприятия. Ведь СХД могут находиться физически в любом месте и их не нужно переподключать от одного сервера к другому. Все что нужно сделать – добавить сервер/СХД в SAN-сеть. Также, трафик LAN/WAN и SAN не конфликтует между собой. Из-за некоторой сложности, SAN пока не вышел за пределы крупных компаний.

Network Attached Storage

NAS – это сетевая система хранения данных. В целом это обычный сервер Модуль 1. Резервное копирование.

15


но вся вычислительная мощность которого направлена в одно русло – обслуживание и хранение файлов.

DEPO Storage NAS 1005. До 5 Тб данных. Неоспоримым плюсом NAS-серверов по отношению к “классическим” серверам является – цена. Так что, если от будущего сервера потребуются функции только файл-сервера стоит обратить внимание на NAS-решения. Для NAS-серверов была специально разработана операционная система FreeNAS, которая построена на базе FreeBSD. ОС максимально оптимизирована под задачи NAS и весит в районе 32 Мб. Её можно загрузить с flash-носителя/cdrom диска.

Direct Attached Storage Представляет из себя дисковый массив с прямым подключением к серверу. Другие сервера/клиенты могут получить доступ к этому массиву только через сервер, к которому он подключен.

16

Модуль 1. Резервное копирование.


Примеры DAS-устройств: USB-носители CD/DVD – драйвы ATA, SATA, SAS, SCSI – диски Ленточные накопители/библиотеки

Самописный скрипт использующий атрибут mtime файлов Сделаем простую реализацию бекапа. Пишем скрипт вида “Что бекапим, куда бекапим, как долго храним копии”. 1 2

#!/bin/bash #backup.sh

3 4 5 6

timestamp=`date “+%Y-%m-%d-%H-%M”` backupFS=”/etc /var/lib/mysql /usr/local/etc” backupTO=/var/backup KeepTime=7

7

if [ -d $backupTO ]; then

8

find $backupTO -maxdepth 1 -name \*.tar.gz -mtime +${KeepTime} -exec rm -f {} \;

9 10 11 12 13 14 15 16 17

for i in $backupFS do j=`expr ${i//\//-}` tar -zcvf $backupTO/`hostname`.${timestamp}.${j}.tar.gz $i echo “$i is done” done else echo “backup directory is missing...exiting” exit 1

18

fi

Выполняем команду chmod +x <имя этого скрипта>, другими словами делаем его исполняемым. В рабочем скрипте цифр быть не должно. Я добавил их для удобства объяснения строк кода. 1. Любой скрипт в Linux начинается с этой последовательности, которая называется sha-bang. По сути исполняемый файл может быть просто перечислением набора команд, но если планируется что-то сложнее, где предстоит работа с переменными то sha-bang стоит поместить в файл. В этом случае будет создан процесс, в котором мы можем хранить временные данные; Модуль 1. Резервное копирование.

17


2. Все строки в файле начинающиеся с символа #, кроме первой строки – комментарии. Здесь я просто указал название нашего скрипта как многие делают; 3. В переменную timestamp мы сохраняем результат выполнения команды date в нужном нам формате: год-месяц-день-час-минута. Значение переменной будет фигурировать в конечном имени файла; 4. В переменной backupFS мы будем сохранять список каталогов для бекапа. Каталоги указываем через пробел а весь их список берем в двойные кавычки; 5. Переменная backupTO содержит каталог, куда мы будем делать бекапы; 6. В переменной KeepTime мы храним срок хранения бекапов. Файлы старше 7 дней мы будем удалять. Место на диске все таки не резиновое; 7. В дело вступает команда test. Прежде чем продолжить дальше имеет смысл проверить существование backup-каталога. Иначе нет смысла продолжать. В скрипте мы не будем его создавать – пусть администратор сам управляет своей файловой системой; 8. Перед созданием бекапа мы просматриваем backup-каталог и удаляем файлы которые хранятся более 7 дней. Для вычисления сколько архив находится в файловой системе мы использовали атрибут файла mtime. В этом атрибуте сохраняется время последней модификации файла; 9. Начинаем цикл for и последовательно для каждого каталога в переменной backupFS сделаем ряд действий; 10. Начинаем новую итерацию цикла for; 11. В переменную j мы сохраняем результат выполнения регулярного выражения. Нам необходимо удалить символ “/” из путей каталогов в переменной i. Так как создать tar.gz-архив с “/” в имени файла у нас не получится; 12. Архивируем нужную нам директорию. Имя файла мы генерируем динамически. В имени будет использован результат выполнения команды hostname, То есть мы подставим имя нашего сервера, что весьма полезно при хранение бекапов в централизованном месте, где могут быть бекапы с десятка серверов. Далее в название файла добавляем текущее время в соответствие с форматом переменной timestamp. После добавления времени добавляем название резервируемого каталога с заменой символов “/” на “-”; 13. Выводим сообщение, что архивация директории завершена. Впрочем для скрипта висящего в cron в этом нет необходимости; 14. Завершение итерации цикла for; 15. Это условие выполняется если backup-каталог отсутствует в файловой системе;

18

Модуль 1. Резервное копирование.


16. Выводим сообщение “backup-каталог отсутствует”; 17. Выходим из скрипта с ошибкой (код 1). Польза от этого есть когда это анализируется каким-то другим процессом. Но в целях правописания мы это добавим; 18. Завершение условного оператора и выход из программы. В соответствие со своими нуждами поправьте список каталогов для бекапа, путь куда их сохранять и количество дней хранения копий. Помещаем скрипт в cron администратора, например на 4 часа утра каждый рабочий день, еще мы добавим и субботу, чтобы захватить данные которые были сделаны в течение рабочего дня пятницы. 0 4 * * 1-6 /root/backup.sh Каталог для бекапа может быть NFS-ресурсом экспортированным на сервер. Так мы простым скриптом решаем важную задачу системного администрирования. Для более сложной инфраструктуры скорее всего понадобится что-то более функциональное и гибкое. В своих backup-скриптах больше внимания уделяйте обходу потенциальных ошибок и неадекватного поведения в случае отсутствия места на диске или в случае отсутствия нужных каталогов. Не тратьте время на оптимизацию, смысла в этом не много, ведь узким местом всегда будет процесс копирования/архивирования ваших данных.

Rsync Rsync (Remote Synchronization) — с помошью этой программы происходит копирование файлов между серверами, пришла на замену rcp. centos52 — сервер куда будем делать бекап unixbox — сервер с которого будем делать бекап На сервере unixbox создадим пользователя rsync от которого будут запрашиваться файлы для бекапа. Добавим пользователя rsync и установим ему пароль. # useradd rsync # passwd rsync Добавим его в нужные группы чтобы он мог получить право на чтение если такого еще нет. Скопируем каталог /etc с сервера unixbox в наш локальный каталог /var/ backup $ rsync -e ssh -avz --delete-after --force rsync@unixbox:/etc /var/backup/ Вводим пароль и все. Модуль 1. Резервное копирование.

19


Если хочется процедуру автоматизировать то нужно будет сгенерировать public ключ на сервере centos52 и положить его в файл authorized_keys пользователю rsync на сервере unixbox. Давайте сделаем это. # ssh-keygen -t rsa # ssh-copy-id -i ~/.ssh/id_rsa.pub rsync@unixbox Все. Теперь можно поместить выполнение команды в crontab # crontab -e * */4 * * * rsync -e ssh -avz --delete-after --force rsync@unixbox:/etc /var/backup Каждые 4 часа будем копировать каталог /etc с сервера unixbox в локальный каталог /var/backup

Пояснения Внимание: если после /etc нет “/” то будет скопирован сам каталог и его содержимое. Если “/” есть, то будет скопировано только содержимое этого каталога. -e ssh – этим ключем мы показываем что будем использовать ssh, то есть наш трафик будет шифроваться; -a – работа в режиме архивирования, сохраняются права доступа и информация о владельцах; -v – выводить больше информативной информации; -z – архивировать передаваемые данные; --delete-after – удалять файлы которые отсутствуют в источнике после того как закончится передача файлов по сети. Мы хотим иметь полную копию контента с удаленного сервера. Можете включать эту опцию периодически. Вдруг кто-нибудь случайно удалит файл на удаленном сервере и во время ближайшей синхронизации мы удалим его тоже; --force – не удалять директорию пока в ней есть файлы.

rsyncd Также есть сервис – rsyncd который работает на порту 873 TCP. При запущенном сервисе строка доступа может выглядеть так: rsync://[USER@]HOST[:PORT]/SRC [DEST] то есть в начале будет добавлено rsync:// а остальное также как и в примере выше. Аутентификация в rsyncd основана на 128 bit MD4, что очень не надежно в наше время. К тому же данные передаются в открытом виде, что явно не в пользу этого сервиса, когда есть такие средства как rsync+ssh и scp. Поэтому подробно рассматривать его не вижу смысла.

20

Модуль 1. Резервное копирование.


Скрипт в помощь Этого материала достаточно чтобы начать пользоваться rsync в создание своих файловых зеркал/резервных копий. Ниже я дам пример скрипта, который может помочь когда нужно копировать набор каталогов с удаленного сервера. #!/bin/bash #backup.sh LIST=/var/backup/backup.list cat ${LIST} | while read res; do rsync -e ssh -avz --delete-after --force rsync@unixbox:$res /var/backup done

Файл /var/backup/backup.list должен содержать список каталог для копирования. Примерно так: /etc /var/www/cms /usr/local/etc /var/billing

Зеркалируем разделы (используем dd) Программа dd идеально подойдет там где нужно сделать точную копию раздела/слайса диска. Она сектор за сектором копирует данные из источника (параметр if ) в пункт назначения, если так можно выразиться (параметр of ). Чтобы понять как просто пользоваться программой давайте сделаем это на практике. # dd if=/dev/hda of=/dev/hdb conv=noerror,sync Команда выше сделает точную копию раздела /dev/hda в разделе /dev/hdb. То есть мы «отзеркалировали» /dev/hda После conv= мы можем указать ряд параметров. noerror — продолжать копирование не обращая внимание на bad-блоки и прочие ошибки sync — поврежденные или отсутствующие данные во входном буфере на выходе будут заменены на нули. Опция замедляет работу команды dd, но для более корректного образа стоит воспользоваться ею. # dd if=/dev/hda3 of=/var/backup/hda3.img Этой командой мы записали раздел /dev/hda3 в бинарный файл hda3.img. Теперь его можно перенести на другой сервер и развернуть в точную копию Модуль 1. Резервное копирование.

21


/dev/hda3. Только учтите один минус dd — программа копирует данные по секторам и ей все равно есть на этом участке диска данные или нет, будет воссоздана точная копия и размер будет точно такой же! То есть если раздел /dev/hda3 имеет объем в 5 Гб а занят на нем только 1 то файл hda3.img будет весить 5 Гб. Восстановить раздел из образа также просто как и создать: # dd if=/var/backup/hda3.img of=/dev/hda3 Ну и напоследок сделаем копию нашей MBR (Master Boot Record). MBR – это первый сектор на жестком диске содержащий таблицу разделов и запись, с какого раздела загружаться. Иногда требуется восстановить MBR из резерва. # dd if=/dev/hda1 of=/var/backup/mbr.dump bs=512 count=1 Команде dd мы просто передали параметры bs и count, этим указав какой объем данных мы хотим скопировать. bs — block size, размера блока который мы хотим скопировать count — количество bs Мы ведь уже знаем, что MBR находится в первых 512 байтах (1-й сектор). Теперь восстановим MBR из резервной копии # dd if=/var/backup/mbr.dump of=/dev/hda1 bs=512 count=1 Размер сектора можно узнать так: # fdisk -l /dev/hda1

Amanda - Advanced Maryland Automatic Network Disk Archiver

Amanda – это клиент/серверная система создания резервных копий. Хороший выбор для средних и крупных предприятий. Что тут говорить,

22

Модуль 1. Резервное копирование.


сама корпорация Xerox использует Amanda в своей ИТ инфраструктуре. Изначально Amanda была создана для работы с ленточными накопителями но сейчас активно используется при бекапе на HDD. Такая концепция получила название “виртуальные ленты” (vtapes). Amanda не испытывает проблем при работе в гетерогенных сетях (в сетях, которые используют разные платформы и операционные системы).

Некоторые термины level 0 – полный бекап level 1 – инкрементальный бекап level n – инкрементальный бекап с момента предыдущего инкрементального бекапа (level n-1) Disklist Entry (DLE) – каждая запись в файле disklist dumpcycle – Промежуток времени в течение которого делается level 0 backup каждой из DLE (обычно 1 неделя) runspercycle – сколько раз Amanda будет запущена в течение dumpcycle tapecycle – сколько лент будет использовано в системе резервного копирования Мы рассмотрим версию Amanda-2.5.0p2

Настройка Amanda Server Описание fasttech – так назовем наш проект про резервному копированию centos52 – Amanda Server unixbox – Amanda Client /var/backup – каталог для резервных копий Задача д Будем делать бекап каталога /etc сервера unixbox. Один раз в неделю будем делать полный бекап, остальные – инкрементальный. Начинаем установку yum -y install amanda-server.i386 Создаем каталог для нового проекта и копируем файл amanda.conf из проекта по умолчанию. mkdir /etc/amanda/fasttech Модуль 1. Резервное копирование.

23


cp /etc/amanda/DailySet1/amanda.conf /etc/amanda/fasttech/ Редактируем файл /etc/amanda/fasttech/amanda.conf org «Fasttech.ru» mailto «root» dumpuser «amanda» dumporder «sssS» taperalgo first displayunit «m» dumpcycle 5 runspercycle 5 tapecycle 10 tpchanger «chg-disk» # /usr/lib/amanda/chg-disk tapedev «file:/var/backup» tapetype DISK labelstr «fasttech-.*» infofile «/etc/amanda/fasttech/curinfo» logdir «/etc/amanda/fasttech» indexdir «/etc/amanda/fasttech/index» define tapetype DISK { length 500000 MB } define dumptype comp-tar { program «GNUTAR» compress fast index yes }

Создаем структуру каталогов и файлов которые потребуются во время работы. # mkdir /etc/amanda/fasttech/{curinfo,index} Создаем два пустых файла # touch /etc/amanda/fasttech/{tapelist,disklist} Нашему проекту назначаем правильного владельца # chown -R amanda:disk /etc/amanda/fasttech/

24

Модуль 1. Резервное копирование.


В файл disklist помещаем систему с которой будем делать бекап и директорию # echo 'unixbox /etc comp-tar' > /etc/amanda/fasttech/disklist Разрешаем пользователю root с сервера unixbox получать с нас бекап. # echo 'unixbox root' > `grep amanda /etc/passwd | cut -d: -f6`/.amandahosts Создаем директорию для временных файлов # mkdir -p /var/backup/holding В цикле создаем директории для наших будущих виртуальных лент # for i in 1 2 3 4 5; do mkdir /var/backup/slot$i; done Делаем символическую ссылку первой ленты на каталог data # ln -s /var/backup/slot1 /var/backup/data Устанавливаем права на backup-директорию # chown -R amanda:disk /var/backup/ Создаем каталог amanda # mkdir -p /usr/adm/amanda Устанавливаем правильного владельца на директорию # chown -R amanda:disk /usr/adm/amanda Переходим на учетную запись amanda # su - amanda В свой файл настроек добавляем каталог /usr/sbin в переменную PATH. Тогда не нужно будет писать полный путь к программам расположенным в этом каталоге, достаточно только указать их название. $ echo «export PATH=$PATH:/usr/sbin» >> .bash_profile

Проверяем р р статус у “лент” $ ammt -t file:/var/backup/ status file:/var/backup/ status: ONLINE

Переходим в бекап-директорию $ cd /var/backup Модуль 1. Резервное копирование.

25


Помечаем директории и виртуальную ленту $ for i in 1 2 3 4 5; do amlabel fasttech fasttech-$i slot $i; done Сбрасываем счетчик лент $ amtape fasttech reset

Проверим р р корректность рр нашего amanda.conf $ amcheck -s fasttech Amanda Tape Server Host Check ----------------------------slot 3: read label `fasttech-3’, date `X’ NOTE: skipping tape-writable test Tape fasttech-3 label ok WARNING: tapecycle (5) <= runspercycle (5). Server check took 0.070 seconds (brought to you by Amanda 2.5.0p2)

Если серьезных ошибок не замечено то продолжаем дальше.

Запускаем у сервис р В файле /etc/xinetd.d/amandaidx меняем disable=yes на disable=no # /etc/init.d/xinetd restart Проверяем, начала ли работать наша служба # netstat -lp | grep :amanda tcp 0 0 *:amandaidx

*:*

LISTEN

3403/xinetd

Сервер готов.

Amanda client # yum -y install amanda-client Разрешаем серверу centos52 получать с нас бекап. # echo «centos52 amanda» > `grep amanda /etc/passwd | cut -d: -f6`/. amandahosts

Запускаем у сервис р В файле /etc/xinetd.d/amanda меняем disable=yes на disable=no # /etc/init.d/xinetd restart # netstat -lp | grep :amanda udp 0 0 *:amanda *:* 4850/xinetd Клиент готов.

26

Модуль 1. Резервное копирование.


Backuping Бекапы делаем от пользователя amanda # su - amanda Делаем бекап каталога /etc с сервера unixbox (ну или что там у вас в /etc/ amanda/fasttech/disklist) $ amdump fasttech Проверим, получилось ли у нас.. $ amadmin fasttech info unixbox /etc Current info for unixbox /etc: Stats: dump rates (kps), Full: 968.0, -1.0, -1.0 Incremental: -1.0, -1.0, -1.0 compressed size, Full: 26.0%,-100.0%,-100.0% Incremental: -100.0%,-100.0%,-100.0% Dumps: lev datestmp tape file origK compK secs 0 20090214 fasttech-3 1 11190 2906 3

Как видим бекап был успешно сделан. Поскольку мы делали первый раз бекап каталога /etc то был сделан полный дамп (Dumps: 0) Сделав бекап еще раз, мы увидим что на этот раз получена инкрементальная копия (Dumps: 1) $ amadmin fasttech info unixbox /etc Current info for unixbox /etc: Stats: dump rates (kps), Full: 968.0, -1.0, -1.0 Incremental: 2891.0, -1.0, -1.0 compressed size, Full: 26.0%,-100.0%,-100.0% Incremental: 26.1%,-100.0%,-100.0% Dumps: lev datestmp tape file origK compK secs 0 20090214 fasttech-3 1 11190 2906 3 1 20090214 fasttech-4 1 11080 2891 1

Restoring su - amanda Выясняем на каких лентах есть нужный нам каталог. $ amadmin fasttech info unixbox /etc Модуль 1. Резервное копирование.

27


Current info for unixbox /etc: Stats: dump rates (kps), Full: 968.0, -1.0, -1.0 Incremental: 2891.0, -1.0, -1.0 compressed size, Full: 26.0%,-100.0%,-100.0% Incremental: 26.1%,-100.0%,-100.0% Dumps: lev datestmp tape file origK compK secs 0 20090214 fasttech-3 1 11190 2906 3 1 20090214 fasttech-4 1 11080 2891 1

Если версий этого файла много то можно использовать такую команду $ amadmin fasttech find unixbox /etc Scanning /var/backup/holding... Scanning /var/backup/holding... date host disk lv tape or file file part status 2009-02-14 unixbox /etc 0 fasttech-3 1 -- OK 2009-02-14 unixbox /etc 1 fasttech-4 1 -- OK

К примеру нам нужен файл shells из каталога /etc c ленты fasttech-3 Вставляем нужную ленту $ amtape fasttech slot 3 Получаем нужный архив с этой ленты в наш текущий каталог $ amrestore file:/var/backup/ unixbox '/etc' Полученный файл — это tar-архив. Теперь возьмем из него файл shells. $ tar xvf unixbox._etc.20090214.0 ./shells Файл shells отправляем на сервер unixbox и замещаем им поврежденный Точно также работаем с целыми наборами каталогов. Если команде amrestore не передавать в качестве аргумента нужный нам каталог то мы получим все резервируемые каталоги с сервера. Дальше дело техники. Чтобы делать бекап в 4 утра каждый будний день, пользователю amanda в crontab (crontab -e) помещаем такую строку: 0 4 * * 1-6 /usr/sbin/amdump fasttech

Полезное Эта команда попросит Amanda сделать полный бекап каталога /etc с сервера unixbox в следующий раз: amadmin fasttech force unixbox /etc Команда перемотает виртуальную ленту на начало ammt -t file:/var/backup rewind Конфигурационный файл /etc/amanda/fasttech/amanda.conf

28

Модуль 1. Резервное копирование.


org mailto dumpuser

Название компании; Кому отправлять почтовые отчеты; Логин используемый для бекапов; Приоритет дампера.

dumporder

s – маленький размер;

taperalgo displayunit dumpcycle runspercycle tapecycle tpchanger tapedev tapetype labelstr infofile logdir indexdir define tapetype define dumptype

S – большой размер. Алгоритм для выбора какой дамп записывать на ленту; В каких еденицах отображать цифры, используем мегабайты; Число дней в backup-цикле; Тоже самое что и dumpcycle; Число лент которое Amanda использует в порядке ротации, должно быть больше чем в dumpcycle, обычно это количество лент dumpcycle*2; Название устройства по смене лент; Тип ленточного устройства; Тип ленточного устройства ассоциированного с tapedev; Метка которая будет наноситься на ленты; Опции задают расположение log-файлов, индексных файлов (содержащих образ бекап-директорий); Задает бекап-устройство, в моем примере это диск на 500 Гб; Здесь задаются backup-опции.

Подводим итоги Принцип работы Amanda понять не сложно. Есть сервер с запущенной службой через xinetd и есть клиенты с запущенным сервисом ожидающим подключения от сервера. В файле .amandahosts на клиенте мы разрешаем каким серверам можно получать с нас бекап. В файле disklist на сервере мы перечисляем список серверов и каталогов которые мы хотим резервировать с них. Как я писал выше, изначально Amanda была создана для работы с ленточными накопителями и это дает о себе знать. Нам нужно создать набор каталогов и пометить их как лента. Как будто мы работаем с набором лент ленточного накопителя. При каждом запуске резервного копирования ленты последовательно будут меняться в “виртуальном лотке”.

Резюме Мы разобрали теорию бекапов и научились на практике дублировать наши данные разными способами.

Домашняя работа Установить и настроить Amanda, сделать пару бекапов, потом удалить“случайно” какой-нибудь файл в системе и восстановить его средствами Amanda. Модуль 1. Резервное копирование.

29


Сетевой интерфейс Linux Сетевой интерфейс – это точка присутствия сервера в локальной сети. В свою очередь, локальная сеть скорее всего будет иметь доступ в глобальные сети. Настройка сетевого интерфейса очень частая работа для системного администратора и в ней нет нечего сложного. Какие файлы влияют на работу сетевого интерфейса /etc/modprobe.conf – здесь загружаются модули ядра для различных устройств alias eth0 pcnet32 alias eth1 pcnet32 ... /etc/hosts – здесь находится список ip-адресов и назначенных им имен. Удобно в отсутствие DNS-сервера или когда нет необходимости сообщать эти имена на всю сеть. /etc/resolv.conf – в этом файле указываются DNS сервера. DNS-сервер задается директивой nameserver # cat /etc/resolv.conf nameserver 192.168.146.2 /etc/host.conf – файл указывает последовательность использования механизмов разрешения имени. В нашем случае сначала используем /etc/ hosts а только потом DNS-сервер. # cat /etc/host.conf order hosts,bind /etc/init.d/network – скрипт останавливающий и запускающий работу сети в Linux /proc/sys/net/ipv4/ip_forward – включение маршрутизации для своих интерфейсов, если у вас два или более интерфейсов её нужно включить. Включение осуществляется передачей “1” в этот файл. # echo '1' > /proc/sys/net/ipv4/ip_forward /etc/sysconfig/network — здесь мы указываем, является ли наш сервер доступным по сети, если да то по каким протоколам и указываем наш hostname, то есть имя сервера. Default gateway рекомендуется указывать здесь. # cat /etc/sysconfig/network NETWORKING=yes

30

Модуль 2. Сетевой интерфейс Linux.


NETWORKING_IPV6=no HOSTNAME=centos52 NETWORKING=yes — будет ли наш сервер работать в сети, наверно 99% случаев ответ будет — да, то есть yes :) Эта директива для Ipv4 NETWORKING_IPV6=no — Ipv6 уже где-то используется но не настолько чтобы переводить сервера на его использование. Пока я не буду его включать. HOSTNAME=centos52 — имя нашего сервера В /etc/sysconfig/network-scripts/ находятся различные скрипты влияющие на работу сетевого интерфейса Linux # ls -l /etc/sysconfig/network-scripts/ -rw-r--r-- 1 root root 140 Feb 14 19:23 ifcfg-eth0 -rw-r--r-- 1 root root 254 Mar 3 2008 ifcfg-lo ... /etc/sysconfig/network-scripts/ifcfg-* Для нас самое большое значение имеют скрипты ifcfg-*. Именно в них описываются настройки сетевых интерфейсов присутствующих в сервере. Давайте посмотрим что у них внутри.

DHCP iface Данный интерфейс работает с использованием службы DHCP. # cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=dhcp HWADDR=00:0C:29:43:5B:3D ONBOOT=yes Мой компьютер работает по DHCP, что отчетливо видно по директиве BOOTPROTO=dhcp. То есть сетевые настройки мы получаем у dhcp-сервера при загрузке нашего сервера. Другие директивы означают следующее: DEVICE=eth0 — как будет называться наш интерфейс, принято первый интерфейс называть как eth0, второй eth1 и так далее HWADDR=00:0C:29:43:5B:3D — MAC-адрес нашей сетевой карты. Media Access Control — это уникальный идентификатор сетевой карты. У каждой сетевой карты свой MAC-адрес и в идеале он не повторяется больше ни с каким в мире. Иногда MAC-адрес пытаются подменить чтобы выдать свой компьютер за чужой, по каким либо соображениям, обычно враждебным. Длина MAC-адреса составляет 48 бит что позволяет иметь 281 474 976 710 656 уникальных комбинаций. У каждого производителя сетевых плат есть Модуль 2. Сетевой интерфейс Linux.

31


свой диапазон в котором он назначает MAC-адреса своим платам. MACадрес пишется в шестнадцатеричной форме счисления. ONBOOT=yes — включать ли этот интерфейс автоматически при включение сервера. Думаю, что скорее всего это и нужно.

Loopback p iface loopback-интерфейс необходим для нормальной работы ОС. # cat /etc/sysconfig/network-scripts/ifcfg-lo DEVICE=lo IPADDR=127.0.0.1 NETMASK=255.0.0.0 NETWORK=127.0.0.0 BROADCAST=127.255.255.255 ONBOOT=yes NAME=loopback DEVICE=lo — это loopback интерфейс. Интерфейс есть в любой системе и всегда поднят. Он нужен для нормальной работы ОС. IPADDR=127.0.0.1 — ip-адрес loopback интерфейса. Он всегда такой. NETMASK=255.0.0.0 — сетевая маска NETWORK=127.0.0.0 — сеть в которой находится наш ip-адрес BROADCAST=127.255.255.255 — адрес широковещательной рассылки ONBOOT=yes — включать ли интерфейс при загрузке сервера, конечно да! NAME=loopback — имя сетевого интерфейса. Вывод команды ifconfig будет показывать значение указанное именно в DEVICE.

Custom iface Выше мы рассмотрели интерфейс работающий по протолу dhcp. Но как правило придется работать именно с custom-интерфейсами, то есть вручную задавать параметры и маршрутизацию о которой мы поговорим немного позже. Вот custom-интерфейс DEVICE=eth0 IPADDR=192.168.0.2 NETMASK=255.255.255.0 NETWORK=192.168.0.0 BROADCAST=255.255.255.255 GATEWAY=192.168.0.1

32

Модуль 2. Сетевой интерфейс Linux.


ONBOOT=yes BOOTPROTO=dhcp здесь отсутствует но есть другие директивы. IPADDR=192.168.0.2 — здесь мы задаем ip-адрес нашего интерфейса NETMASK=255.255.255.0 — сетевая маска NETWORK=192.168.0.0 — сеть в которой находится наш ip-адрес BROADCAST=255.255.255.255 — адрес широковещательной рассылки GATEWAY=192.168.0.1 — шлюз через который мы попадаем в другие сети ONBOOT=yes — включать ли интерфейс при загрузке сервера

Практика Настроим сетевой интерфейс в Linux. Мы знаем что lo всегда включен и его не нужно вообще трогать. Редактируем /etc/sysconfig/network-scripts/ifcfg-eth0 Мой конфигурационный файл выглядит так: DEVICE=eth0 HWADDR=00:0C:29:43:5B:3D IPADDR=192.168.146.130 NETMASK=255.255.255.0 BROADCAST=192.168.146.255 GATEWAY=192.168.146.2 ONBOOT=yes Далее нужно перезагрузить сетевой интерфейс чтобы прочитались новые настройки # service network restart или # /etc/init.d/network restart Shutting down interface eth0: [ OK ] [ OK ] Shutting down loopback interface: Bringing up loopback interface: [ OK ] Bringing up interface eth0: [ OK ] Проверим все ли поднялось # ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:43:5B:3D Модуль 2. Сетевой интерфейс Linux.

33


inet addr:192.168.146.130 Bcast:192.168.146.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff :fe43:5b3d/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1327 errors:0 dropped:0 overruns:0 frame:0 TX packets:1340 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:149547 (146.0 KiB) TX bytes:232486 (227.0 KiB) Interrupt:59 Base address:0x2000 ... Жирным выделены особенно интересные нам участки в выводе команды ifconfig. Как видим все похоже на правду и интерфейс «поднят», то есть находится в рабочем режиме. Для большей ясности разберем и некоторые другие параметры сетевого интерфейса MTU:1500 — это Maximum Transfer Unit. Различные сети и каналы передачи имеют разные скорости обмена. Это определяет максимальную длину пакета, пересылка которого с высокой вероятностью произойдет без ошибок. Для Ethernet — сетей значение MTU составляет 1500 байт. Metric:1 — чем меньше это значение тем лучше считается маршрут до этой сети. На серверах скорее всего это менять не придется. Этот параметр играет большую роль в работе протоколов маршрутизации. Сollisions:0 — нулевое значение говорит о том, что с сетевым интерфейсом все в порядке на физическом уровне. RX bytes — сколько данных принято TX bytes — сколько данных отослано Так идем дальше. В примере выше, после настройки сетевого интерфейса мы полностью перезагружали службу network. Когда на сервере только один интерфейс это не страшно, но если их несколько и какие-то уже работают и выполняют свои функции прерывать их работу нежелательно. Тут нам на помощь приходит скрипт ifup/ifdown. Он нужен для перезагрузки какого либо одного сетевого интерфейса. Короткий пример. Шаг 1. Вносим изменения в /etc/sysconfig/network-scripts/ifcfg-eth0 Шаг 2. # ifdown eth0 Шаг 3. # ifup eth0

34

Модуль 2. Сетевой интерфейс Linux.


Маршрутизация р ру ц Маршрутизация — это процесс поиска наилучшего пути от источника к получателю. Это набор правил по которым будет передаваться трафик. Мы вроде бы с ней еще нечего не делали, но она уже у вас работает. Не верите ? Сейчас проверим. netstat – команда позволяющая отслеживать сетевые подключения сервера # netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.146.0 * 255.255.255.0 U 0 0 0 eth0 default 192.168.146.2 0.0.0.0 UG 0 0 0 eth0 В выводе мы увидим список сетей и как до них добраться. То есть какой шлюз использовать для достижения пункта назначения. Помните, когда мы настраивали сетевой интерфейс eth0 мы указали директиву GATEWAY в ifcfgeth0 ? Этот gateway был помечен как default, то есть шлюз по умолчанию. Весь трафик в сети, которые явно не описаны в таблице маршрутизации, отправляются через шлюз по умолчанию. В нашем случае default gateway — 192.168.146.2 Вывод команды “netstat -r” нам говорит следующее Первая строка. Чтобы попасть в подсеть 192.168.146.0 нам не нужен никакой шлюз (*), поскольку мы и так находимся в этой сети Вторая строка — это default, то есть маршрут по умолчанию. Весь трафик предназначенный по все остальные сети будет уходить через этот шлюз. Genmask — это сетевая маска, благодаря маске можно отделить сетевую часть адреса от адреса хоста Flags: U — это UP, то есть маршрут поднят и функционирует сейчас Flags: UG — UP, Gateway. Маршрут поднят и использует gateway в своей работе MSS – Maximum Segment Size, определяет максимальный размер пакета для этого маршрута. Window – размер окна. Максимальный размер пакета, который система готова принять. irtt - initial round trip time, задает значение которое используется при установке Модуль 2. Сетевой интерфейс Linux.

35


соединения. Round trip time – представляет из себя отрезок времени, если в течение которого от удаленного хоста не пришло подтверждение о получение пакета, пакет будет выслан снова. Iface – показывает к какому интерфейсу относится маршрут

Прописываем р маршруты р ру Если на сервере несколько сетевых интерфейсов то скорее всего понадобится вручную составить таблицу маршрутизации. Приведу пример. У нас два сетевых интерфейса eth0 и eth1. Через eth0 мы получаем доступ во внешние сети и по умолчанию весь трафик направляется через него. Через eth1 мы получаем доступ ко внутренней сети 192.168.147.0/24 но что еще важнее, в этой сети есть сервер 192.168.147.1 у которого есть сетевой интерфейс в подсеть 192.168.148.0/24 и мы очень хотим туда попадать. А для того что туда попадать необходимо прописать правильные маршруты у себя в ОС.

Так выглядит таблица маршрутизации в нашем случае # netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt 192.168.147.0 * 255.255.255.0 U 0 0 0 192.168.146.0 * 255.255.255.0 U 0 0 0 192.168.148.0 192.168.147.1 255.255.255.0 UG 0 0 0 default 192.168.146.2 0.0.0.0 UG 0 0 0

Iface eth1 eth0 eth1 eth0

То есть в подсеть 192.168.148.0/24 (внутренняя подсеть) мы попадаем через eth1 -> 192.168.147.1, сервер выполняющий роль шлюза в эту подсеть. Все остальное идет через default шлюз. Все очень просто. Ну и собственно как привести настройки к этому.

36

Модуль 2. Сетевой интерфейс Linux.


Шлюз по умолчанию # cat /etc/sysconfig/network ... GATEWAY=192.168.146.2 ... eth0 # cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 HWADDR=00:0C:29:43:5B:3D IPADDR=192.168.146.130 NETMASK=255.255.255.0 BROADCAST=192.168.146.255 ONBOOT=yes eth1 # cat /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 ONBOOT=yes HWADDR=00:0c:29:43:5b:47 IPADDR=192.168.147.2 NETMASK=255.255.255.0 И самое главное, файл в котором мы прописываем статический маршрут для eth1. # cat /etc/sysconfig/network-scripts/route-eth1 192.168.148.0/24 via 192.168.147.1 Для того чтобы прописать маршруты для какого либо интерфейса, необходимо создать файл route-<название интерфейса> в каталоге / etc/sysconfig/network-scripts/ После того как все готово к работе, мы перезагружаем сетевой сервис. # service network restart Модуль 2. Сетевой интерфейс Linux.

37


Теперь подведем итоги, что и как мы сделали. Есть три вида маршрутов. Динамические – которые динамически назначаются сетевому интерфейсу, например сервером DHCP. Статические – которые вы вручную прописываете и они остаются в настройках после перезагрузки сервера. И маршруты по умолчанию – когда никакие другие маршруты не подходят для того, чтобы отослать по ним пакеты. Мы могли добавить маршрут в подсеть 192.168.148.0/24 командой route # route add -net 192.168.148.0/24 gw 192.168.147.1 Но после перезагрузки сервера информация о маршруте пропала бы. Чтобы такого не произошло используется специальный механизм. А именно создание файла вида route-<имя интерфейса> в /etc/sysconfig/networkscripts В него мы вносим список сетей и как до них добраться. Каждая новая запись начинается с новой строки.

Про р шлюз Чтобы сервер был шлюзом для других компьютеров необходимо удовлетворить ряд условий: 1.На сервере корректная таблица маршрутизации благодаря которой он поймет что делать с пакетами дальше; 2.Включена передача пакетов между интерфейсами: # echo '1' > /proc/sys/net/ipv4/ip_forward 3.Включен маскарадинг (или установлен прокси) для нужной нам сети, например вот так (перенаправлять пакеты для хостов из подсети 192.168.146.0/24): # iptables -t nat -A POSTROUTING -s 192.168.146.0/24 -j MASQUERADE

Полезные ключи netstat r – показывает таблицу маршрутизации n – выводит статистику по ip-адресу, не пытается определить имя хоста. Это работает несколько быстрее и обычно, вывод команды удобнее читать a – показывает состояние всех сокетов на сервере. Сокет – это конечная точка сетевых коммуникаций. Каждый сокет имеет тип и ассоциированный с ним процесс. t – протокол tcp u – протокол udp i – отображает таблицу сетевых интерфейсов l – отображает сокеты в режиме LISTEN, то есть ожидающие соединения p – показать PID (process ID) и имя программы с которой взаимодействует сокет

38

Модуль 2. Сетевой интерфейс Linux.


netstat на практике р Параметров выше вполне достаточно, чтобы многое узнать из жизни сетевых служб. Слушает ли кто нибудь 25-й порт ? # netstat -nlp | grep :25 tcp

0

0 127.0.0.1:25

0.0.0.0:*

LISTEN

2710/sendmail:

Видим что 25-й порт слушает процесс sendmail с PID 2710 # ps ux | grep 2710 root 2710 0.0 0.7 8992 1836 ? connections

Ss 11:17 0:00 sendmail: accepting

Посмотрим текущие ESTABLISHED-соединения по tcp, то есть с кем у нас есть подключение и по какому порту # netstat -nt Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address 0 ::ffff :192.168.146.130:22

Foreign Address

State

tcp

0

::ffff :192.168.146.1:2642 ESTABLISHED

tcp

0 132 ::ffff :192.168.146.130:22 ::ffff :192.168.146.1:2027 ESTABLISHED

Как видим это только соединения по ssh Также, будет полезно знать какие состояния бывают у сокетов: ESTABLISHED – сокет с установленным соединением; SYN_SENT – сокет в процессе установки соединения; SYN_RECV – был принят запрос установки соединения из сети; FIN_WAIT1 – сокет закрыт и соединение закрывается; FIN_WAIT2 – сокет закрыт и сокет ждет закрытия соединения с удаленного хоста; TIME_WAIT – сокет после своего закрытия, еще какое-то время принимает пакеты из сети; CLOSED – сокет не используется; CLOSE_WAIT – удаленный хост отключился, ожидаем закрытия сокета; LAST_ACK – удаленный хост отключился и сокет закрыт. Ожидание потдверждения; LISTEN – сокет ожидает входящие подключения; CLOSING – оба сокета отключились но еще не все наши данные отосланы; UNKNOWN – статус сокета неизвестен. Модуль 2. Сетевой интерфейс Linux.

39


Мы научились настраивать один и более сетевых интерфейсов. Разобрались с маршрутизацией. Узнали какие файлы и как влияют на работу сети в Linux. Сейчас мы познакомимся с двумя программами которые играют существенную роль в работе сети. Это программа nmap – которая сканирует порты удаленного хоста и сообщается какие порты на нем открыты. И программа tcpdump, она переводит вашу сетевую плату в режим promiscuous, что позволяет перехватывать весь трафик проходящий через карту.

NMAP Nmap позволяет сканировать удаленные компьютеры на предмет открытых портов. С более агрессивными опциями можно узнать версию ОС и некоторые другие вещи. Устанавливаем программу # yum -y install nmap Просканируем удаленный хост. Как видим есть кое что интересное. # nmap -A -T5 192.168.146.132 Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-02-18 19:36 MSK Interesting ports on unixbox (192.168.146.132): Not shown: 1677 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh

OpenSSH 4.3 (protocol 2.0)

111/tcp open rpcbind 2 (rpc #100000) 935/tcp open status 1 (rpc #100024) MAC Address: 00:0C:29:25:04:55 (VMware) Device type: general purpose Running: Linux 2.4.X|2.5.X|2.6.X OS details: Linux 2.4.7 - 2.6.11 Uptime 0.195 days (since Wed Feb 18 14:55:10 2009) Nmap finished: 1 IP address (1 host up) scanned in 14.239 seconds У nmap много различных опций, подробнее о них можно прочитать в man nmap

40

Модуль 2. Сетевой интерфейс Linux.


tcpdump p p Иногда в целях выявления неисправностей нам нужно выяснить, какие пакеты передаются по сети. Это не сложно сделать с помощью tcpdump. Слушаем весь трафик для MAC-адреса 00:a0:80:00:2f:fe на интерфейсе eth1 # tcpdump -n -i eth1 «ether host 00:a0:80:00:2f:fe» Слушаем трафик для определенного ip-адреса и порта # tcpdump -nn host 192.168.146.130 and port 22 Сканируем диапазон портов # nmap -sT -p 13722-13783 linuxbox

Резюме Мы разобрали базовую настройку сетевого интерфейса и маршрутов в Linux. То, что вы узнали достаточно чтобы администрировать сетевой интерфейс, иногда может понадобиться добавить сетевую карту и маршруты, но все делается по такому же принципу.

Домашнее задание Пройдитесь по всем пунктам описанным в этом модуле. Воспользуйтесь nmap и tcpdump на практике.

Модуль 2. Сетевой интерфейс Linux.

41


TFTP TFTP (Trivial File Transfer Protocol) — это простой протокол передачи данных. Для передачи данных использует протокол UDP, что в свою очередь не гарантирует надежность передачи. Также в нем нет средств аутентификации пользователей. TFTP используется в связке с другими технологиями когда нужно просто передать файл без каких либо сложностей. Самые р распространенные р р способы использования TFTP: передача файлов при загрузке бездисковых рабочих станций; передача начального загрузочного образа при установке ОС по сети; участие в процессе backup`а и восстановления конфигурации сетевого оборудования; другие схожие операции. TFTP ищет все файлы в каталоге /tftpboot который создается автоматически при установке программы.

Установка Устанавливаем пакет tftp-server из репозитория # yum -y install tftp-server Теперь необходимо включить tftp в конфигурации xinetd, для этого в файле /etc/xinetd.d/tftp Меняем “disable = yes” на “disable = no” и включаем xinetd # service xinetd start Проверяем что порт tftp-сервера прослушивается (tftp работает на порту 69) # netstat -nlp | grep :69 udp 0 0 0.0.0.0:69 0.0.0.0:* 3105/xinetd

Работа с TFTP После того как TFTP-сервер запущен можно помещать все нужные файлы в / tftpboot на отдачу по сети. Если вы хотите делать backup файлов конфигураций сетевых устройств, например оборудование компаний Cisco или Nortel то сначала нужно создать пустые файлы в которые планируется сохранять конфигурацию.

42

Модуль 3. TFTP


То есть при backup`е конфигурации в файл на TFTP-сервере он уже должен существовать! Создаем пустой файл # touch /tftpboot/cisco2960.backup Устанавливаем на него права # chmod 666 /tftpboot/cisco2960.backup

Типы пакета В каждом передаваемом пакете есть поле размером 2 байта, оно и определяет что это за пакет. Знание какой тип чего делает может помочь при анализе сетевого трафика, например с помощью tcpdump. RRQ (Read Request) – запрос на чтение файла; WRQ (Write Request) – запрос на запись файла; DATA – данные передаваемые через tftp; ERR (Error) – ошибка; OACK (Options Acknowledgment) – подтверждение опций.

Режимы передачи Существует два режима передачи файлов: netascii – файл перед передачей перекодируется в ASCII octet – файл передается без изменений

Коды ошибок 0

Нет определенного кода, см. текст ошибки;

1

Файл не найден;

2

Доступ запрещен;

3

Невозможно выделить место на диске;

4

Некорректная TFTP-операция;

5

Неправильный Transfer ID;

6

Файл уже существует;

7

Пользователь не существует;

8

Неправильная опция.

Модуль 3. TFTP

43


Клиент tftp Чтобы подключаться к TFTP-серверу из командной строки нужно поставить tftp-клиент # yum -y install tftp Ну а далее просто подключаемся к tftp-серверу, например: # tftp 192.168.146.135 Можно набрать help чтобы получить список доступных команд. Самое распространенное действие – это скачка файла, сделать это можно командой get. tftp>get filename.txt

Резюме Обычно TFTP используется в связке с другими технологиями а для классической передачи данных используют FTP. Настройка TFTP не занимает более 10 минут.

Домашнее задание Сделайте TFTP-сервер и поработайте с ним. Закачайте/скачайте файлы воспользовавшись tftp-клиентом.

44

Модуль 3. TFTP


NFS Network File System — сетевая файловая система разработанная компанией Sun Microsystems в 1984 году. Технология позволяет монтировать удаленные файловые системы у себя, далее вы с ними работаете как с локальными, права доступа задаются при экспорте.

Установка Скорее всего NFS уже есть в системе. Это можно проверить следующей командой. # chkconfig --list nfs nfs

0:off 1:off 2:off 3:off 4:off 5:off 6:off

Добавляем в автозагрузку # chkconfig nfs on # service nfs start Если же nfs в системе не обнаружен то ставим из репозитория # yum -y install nfs-utils В своей работе NFS использует RPC-вызовы а значит работоспособность службы можно проверить с помощью portmapper (он тоже должен быть запущен на сервере где выполняются программы использующие RPC Calls). # rpcinfo -p localhost | grep nfs program vers proto port 100003 2

udp

2049 nfs

100003 3

udp

2049 nfs

100003 4

udp

2049 nfs

100003 2

tcp

2049 nfs

100003 3

tcp

2049 nfs

100003 4

tcp

2049 nfs

Как видим на моем сервере обслуживаются NFS-запросы всех версий NFS (4-ая - последняя на данный момент). Модуль 4. NFS.

45


Настройка Файл конфигурации /etc/exports содержит список файловых систем которые мы экспортируем, то есть разрешаем монтировать по протоколу NFS на удаленных системах. Каждая строка в файле это указание на экспортируемую ФС и режим доступа к ней, шаблон следующий: [файловая система] [кому разрешено получать доступ] [опциональные ключи] Пример /etc/exports: /home 192.168.146.135(rw,no_root_squash) Здесь мы разрешаем монтировать /home на сервере 192.168.146.135 в режиме rw Внимание! Аккуратнее с пробелами в файле. Если написать /home 192.168.146.135 (rw) то сервер 192.168.146.135 получит доступ к /home в режиме ro, все остальные в rw. Если 192.168.146.135(rw) то сервер 192.168.146.135 получит доступ в режиме rw, всем остальным доступ будет запрещен! Перечитываем файл чтобы внесенные изменения начали действовать. # exportfs -r Проверим список экспортированных ФС # exportfs /home

192.168.146.135

Как видим все хорошо. Теперь на сервере 192.168.146.135 попробуем примонтировать ФС /home экспортированную на 192.168.146.132 Создаем каталог куда будем монтировать # mkdir /mnt/nfs Монтируем с помощью команды mount. Ключем -t задаем тип монтируемой ФС, далее <hostname>:<resource> <точка монтирования в локальной системе> # mount -t nfs 192.168.146.132:/home /mnt/nfs

46

Модуль 4. NFS.


Используя опцию -o можно указать дополнительные ключи монтирования. По умолчанию монтирование происходит в режиме rw. Если ФС экспортированы на сервере который работает 24 часа в сутки то монтирование разделов можно добавить в /etc/fstab тем самым автоматизировав процедуру при старте компьютера. Строчка в /etc/fstab в нашем случае будет такая: 192.168.146.132:/home /mnt/nfs

nfs

defaults

Все готово.

Опции конфигурационного файла Самые часто используемые опции я описал ниже. ro rw root_squash

Только чтение; Чтение и запись; Не разрешает пользователю root получать rootпривилегии в удаленной файловой системе, все действия будут сделаны от лица пользователя nobody; no_root_squash Пользователь root в локальной системе получает такие же права в удаленной. Стоит использовать эту опцию только в случае острой необходимости. Используется для бездисковых клиентов; all_squash Все запросы происходят от анонимного пользователя, что способствует повышению безопасности. Актуально для публичных разделов; anonuid/anongid Позволяет задать UID и GID пользователя от лица которого будут выполняться все запросы; sync Синхронный режим работы, ответы на запросы происходят только после того, как данные будут надежно записаны на диск. Надежность выше, производительность меньше; async Асинхронный режим работы, ответы на запросы происходят сразу, не дожидаясь записи на диск. Надежность ниже, производительность выше; insecure Разрешать запросы с портов более чем 1024; no_subtree_check Если экспортируется подкаталог файловой системы, но не вся файловая система, сервер, проверяет, находится ли запрошенный файл в экспортированном подкаталоге. Эта проверка называется проверкой подкаталога. Отключение проверки уменьшает безопасность, но увеличивает скорость передачи данных. Модуль 4. NFS.

47


Указать каким хостам разрешено монтировать наши разделы можно несколькими способами: 1. Указать hostname или просто IP-адрес; 2. Указать “*”, что означает разрешено всем. Если указать *.fasttech.ru то будет разрешено testers.fasttech.ru но запрещено alex.testers.fasttech.ru Чтобы этого избежать нужно написать *.*.fasttech.ru; 3. В нужных местах использовать “?”, что заменяет любой символ (не применимо к IP-адресам); 4. Использовать маски подсетей, например 192.168.146.32/27; 5. Использовать NIS-группы, например @nisgroup2.

Дополнительная информация Описанного выше должно хватить сполна, но если хочется больше то: # man nfs # man exports # man exportfs Не путайте exports и exportfs. exports – это конфигурационный файл, exportfs – программа для работы с ним.

Резюме Мы выяснили что такое NFS и как ее использовать.

Домашнее задание Сделайте доступ к ресурсу с помощью NFS и примонтируйте его с другого компьютера.

48

Модуль 4. NFS.


Install-сервер В “зоопарке” системных администраторов часто попадаются сервера без внешних CD/DVD-приводов. Время от времени на них нужно ставить операционную систему и в этом может сильно помочь установка по сети. Вы просто включаете сервер и начинаете установку. Сетевая карта должна поддерживать технологию PXE. PXE – Pre-Boot Execution Environment, позволяет осуществлять загрузку по сети. Но PXE не достаточно для полного счастья, технология которая позволит полностью автоматизировать установку – kickstart (разработчиком которой является компания Red Hat). Суть ее проста, мы заранее составляем файл содержащий значения всех опций которые могут понадобиться в ходе установки. Более того мы можем выполнять свои скрипты до установки и после. Тем самым задавая настройки будущей ОС. Установка с помощью kickstart типового комплекта Linux занимает 5-7 минут. Для Install-сервера нужно 3 службы и 1 пакет. DHCP – предоставляет клиентам сетевые реквизиты TFTP – простой способ предоставить доступ к файлам по сети Syslinux – пакет содержит загрузчик pxelinux.0 и некоторые другие файлы NFS – предоставляет доступ к файловой системе по сети

Принцип работы

Процесс установки можно разбить на этапы: pxe – прошивка pxe начинает свою работу, когда мы в BIOS выставляем p установку по сети или когда на HDD не найдена MBR DHCP фаза ф 1 – клиент получает сетевые реквизиты и адрес tftp-сервера а также название файла-загрузчика (pxelinux.0). По умолчанию TFTP-сервер это DHCP-сервер. TFTP – загрузчик pxelinux.0 обращается к TFTP-серверу и запрашивает у него initrd.img (Initial RAM disk, временная файловая система) ядро Linux. Kernel – передача управления ядру Linux DHCP фаза ф 2 – ядро Linux далет запрос к DHCP-серверу чтобы получить Модуль 5. Install-сервер.

49


сетевые реквизиты и в дальнейшем адрес NFS-сервера NFS – этап когда монтируется NFS-раздел Init – происходит запуск /sbin/init и управление передается ему. Init – это главный процесс в системе, другие процессы являются родительскими процессами init. В свободном изложение: DHCP-сервер ожидает bootp-запросы в своей сети, после того как он получает запрос он смотрит MAC-адрес источника, и если о таком MAC-адресе у него имеется соответствующая запись он начинает с ним работать. DHCP — сервер выдает клиенту сетевые реквизиты (ip-адрес, gateway, DNS-сервера, ...) и по протоколу TFTP, с помощью TFTP-сервера отправляет загрузочный образ pxelinux.0. Этого образа хватает чтобы вывести меню выбора ОС. Выбрав ОС вы начинаем загрузку ядра и начинаем инсталляцию, в процессе выбрав источник установки — NFS-сервер. На NFS-сервер нужно выложить подготовленный контент будущей операционной системы и убедиться, что соответствующие каталоги экспортированы.

DHCP Устанавливаем DHCPD и добавляем его в автозагрузку # yum -y install dhcp # chkconfig dhcpd on Файл /etc/dhcpd.conf делаем такой: ddns-update-style interim; ignore client-updates; subnet 192.168.146.0 netmask 255.255.255.0 { option routers option subnet-mask

192.168.146.2; 255.255.255.0;

option domain-name option domain-name-servers

«company.ru»; 192.168.146.2;

default-lease-time 21600; max-lease-time 43200; Allow bootp; Allow booting;

50

Модуль 5. Install-сервер.


host unixbox { hardware ethernet 00:0c:29:77:9c:9c; fixed-address 192.168.146.129; filename «pxelinux.0»; option subnet-mask 255.255.255.0; option routers 192.168.146.2; option domain-name «company.ru»; option host-name «unixbox»; next-server 192.168.146.130; } }

Запускаем DHCPD или перезагружаем если он был запущен # service dhcpd restart

TFTP Устанавливаем пакет tftp-server из репозитория # yum -y install tftp-server Теперь необходимо включить tftp в конфигурации xinetd, для этого в файле /etc/xinetd.d/tftp Меняем “disable = yes” на “disable = no” и включаем xinetd # service xinetd start Проверяем что порт tftp-сервера прослушивается (tftp работает на порту 69) # netstat -nlp | grep :69 udp 0 0 0.0.0.0:69 0.0.0.0:* 3105/xinetd

Syslinux Пакет содержит набор файлов для загрузки по сети. Нам нужны pxelinux.0 который как загрузочный образ мы будем отдавать через DHCP и menu. c32, с помощью этого файла будет рисоваться более привлекательное меню пользователя. # cp $(rpm -ql syslinux | grep menu.c32) /tftpboot/ # cp $(rpm -ql syslinux | grep pxelinux.0) /tftpboot/

NFS По умолчанию в системе скорее всего есть NFS, если нету то поставьте с помощью yum. # chkconfig nfs on Модуль 5. Install-сервер.

51


В файл /etc/exports добавляем запись echo “/var/install-server/ *(ro,no_root_squash)” >> /etc/exports Запускаем nfs-сервер # service nfs start Проверяем что каталог экспортирован # exportfs /var/install-server <world>

Создаем структуру tftp-сервера добавляем контент на сервер # mkdir -p /tftpboot/{pxelinux.cfg,centos52_x86} # mkdir -p /var/install-server/centos52_x86 Монтируем наш DVD с CentOS 5.2 и закачиваем содержимое в /var/installserver/centos52_x86 # mount /dev/cdrom /mnt/ # cp -r /mnt/* /var/install-server/centos52_x86/ #cp /var/install-server/centos52_x86/images/pxeboot/* /tftpboot/centos52_x86/ В каталоге /tftpboot/pxelinux.cfg создаем файл default и заполняем его как ниже: default menu.c32 menu title Linux Install Server. Please choose OS to install. prompt 0 timeout 100 label CentOS 5.2 x86 Custom install kernel /centos52_x86/vmlinuz append initrd=/centos52_x86/initrd.img label Quit localboot 0

Устанавливаем ОС по сети После всех сделанных манипуляций которые описаны выше, можем приступить к установке ОС. Стартуем нашу машину с MAC-адресом 00:0c:29:77:9c:9c включив в BIOS загрузку по сети. Когда начнется установка все делаем стандартным образом, кроме как в списке откуда будет ставить

52

Модуль 5. Install-сервер.


ОС нужно выбрать NFS, далее когда попросят, указать: NFS server name : 192.168.146.130 CentOS directory: /var/install-server/centos52_x86 Дальше устанавливаем ОС и пользуемся на здоровье :)

Автоматизация установки с помощью Kickstart Для автоматизации нужно создать файл содержащий всю нужную информацию, которая может потребоваться в процесс установки. Такой файл создается программой system-config-kickstart (GUI tool) в любой CentOS с X Window # yum -y install system-config-kickstart # system-config-kickstart После того как мы создали файл с помощью system-config-kickstart его нужно перенести на Install-сервер и сделать доступным по одному из протоколов – http, nfs или ftp. Поскольку в работе Install-сервера активно используется NFS то и будем использовать ее. В моем случае kickstart-файл лежит в /var/install-server/centos52_x86/ centos52_x86_ks.cfg В файл /tftpboot/pxelinux.cfg/default нужно всего лишь добавить директиву ks с указанием местоположения kickstart-файла. Пример с kickstart-файлом. default menu.c32 menu title Linux Install Server. Please choose OS to install. prompt 0 timeout 100 label CentOS 5.2 x86 Custom install kernel /centos52_x86/vmlinuz append initrd=/centos52_x86/initrd.img label CentOS 5.2 x86 Kickstart Install kernel /centos52_x86/vmlinuz append initrd=/centos52_x86/initrd.img ks=nfs:192.168.146.135:/var/install-server/ centos52_x86/centos52_x86_ks.cfg label Quit localboot 0

Теперь выбрав «CentOS 5.2 x86 Kickstart Install» в меню выбора ОС нам останется только подождать сервера с установленной на нем ОС. Ниже пример моего Kickstart-файла. Мне захотелось чтобы в установленной Модуль 5. Install-сервер.

53


ОС в настройках sshd была опция «PermitRootLogin yes». Kickstart-файл позволяет не только задавать параметры установки ОС но и выполнять скрипты, до инсталляции (%pre) и после (%post). Таким образом можно написать массу скриптов по тюнингу и за 5-10 минут инсталляции получить полностью готовую ОС. #platform=x86, AMD64, or Intel EM64T # System authorization information auth --useshadow --enablemd5 # System bootloader configuration bootloader --location=mbr # Clear the Master Boot Record zerombr # Partition clearing information clearpart --all --initlabel # Use text mode install text # Firewall configuration firewall --disabled # Run the Setup Agent on first boot firstboot --disable # System keyboard keyboard us # System language lang en_US # Installation logging level logging --level=info # Use NFS installation media nfs --server=192.168.146.130 --dir=/var/install-server/centos52_x86 # Network information network --bootproto=dhcp --device=eth0 --onboot=on #Root password rootpw --iscrypted $1$Bz09jb2I$hfzh2vApqMjG0sEPsAwNr/ # SELinux configuration selinux --disabled # Do not configure the X Window System skipx # System timezone timezone Europe/Moscow # Install OS instead of upgrade install # Disk partitioning information part swap --bytes-per-inode=4096 --fstype=”swap” --size=512 part / --bytes-per-inode=4096 --fstype=”ext3” --grow --size=1 %post --interp /bin/bash PATH=/somework /bin/mkdir $PATH /bin/sed -e ‘s/#PermitRootLogin yes/PermitRootLogin yes/g’ /etc/ssh/sshd_config > $PATH/sshd_config_edited /bin/cp $PATH/sshd_config_edited /etc/ssh/sshd_config /bin/rm -rf $PATH

54

Модуль 5. Install-сервер.


%packages @base @mysql @mail-server @web-server @system-tools

После того как процесс установки завершится нужно закомментировать строчку “ filename “pxelinux.0”;” в /etc/dhcpd.conf, чтобы после перезагрузки сервера снова не начался процесс установки. Я пробовал поставить“label Quit” первым в списке меню, чтобы по таймауту делался localboot 0 (выход из меню и загрузка ОС на сервере), но счетчик банально не отсчитывается. Очевидно это один из багов syslinux. Скажу что в Debian все работает нормально. Как видно секции %packages, были установлены базовые утилиты, MySQL, MTA, Apache и системные утилиты. Установка ОС у меня заняла 5 минут.

Диагностика В случае возникновения неисправностей используйте tcpdump. Но его также стоит использовать чтобы понять как все работает “изнутри”. # tcpdump -n -i eth0 “ether host 00:0c:29:25:04:55” Ну и на всякий случай структура каталога /tftpboot

Резюме Мы разобрались с простым и эффективным способом быстрой установки ОС по сети.

Домашнее задание Сделать свой Install-сервер и используя его, установить ОС на клиент. Можно использовать мой kickstart-файл в качестве примера, только не забудьте изменить IP-адрес NFS-сервера и путь к дистрибутиву Linux, пароль на систему будет 111111 (root/111111). Модуль 5. Install-сервер.

55


Xen Что это такое ? Виртуализация — это очень эффективная технология построения виртуальной инфраструктуры. Благодаря различным средствам виртуализации стало возможно в рамках одного «железного» сервера настраивать несколько виртуальных.

Зачем это нужно ? Большинство преимуществ вытекает из так называемой консолидации серверов. Мы можем переместить несколько не полностью используемых систем на один сервер. Тем самым снизив стоимость конечной инфраструктуры, чеки на электроэнергию, повысив удобство обслуживания.

Типы виртуализации Эмуляция у ц аппаратуры р ур

Популярный продукт в этой категории: QEMU На хост-машине создается виртуальная машина которая эмулирует определенную архитектуру. Способ работает медленно но полезен, когда нужно на сервере запустить ОС другой архитектуры.

Полная виртуализация р у ц

56

Модуль 6. Виртуализация. Xen.


Популярный продукт в этой категории: VMware В работе этого способа используется виртуальная машина (hypervisor) которая выступает посредником между гостевой ОС и реальным оборудованием. Гостевая ОС может быть запущена без всяких модификаций, но должна поддерживать аппаратную платформу.

Паравиртуализация р р у ц

Популярный продукт в этой категории: Xen Способ похож на полную виртуализацию – здесь тоже используется гипервизор, но код виртуализации интегрируется в саму операционную систему. Это конечно же минус, но паравиртуализация позволяет добиться производительности близкой к не виртуализированной ОС.

Виртуализация р у ц ур уровня операционной р ц системы

Популярный продукт в этой категории: Linux-VServer Способ

виртуализации,

при

котором

виртуализируются

серверы

запускаемые в самой операционной системе. В этом случае операционная система одна и просто изолируются сервера запускаемые под ее управлением. Необходима модификация ядра. Модуль 6. Виртуализация. Xen.

57


Архитектура Xen

Причины по которым стоит использовать виртуализацию. 1. Сильная экономия на аппаратном оборудование при консолидации серверов; 2. Возможность поддержки старых платформ в целях совместимости; 3. Возможность изолировать потенциально опасные окружения; 4. Возможность создания любой аппаратной конфигурации (в рамках возможностей сервера); 5. Симуляция различного оборудования в виртуальной машине (зависит от возможностей ПО виртуализации); 6. Возможность создания виртуальных сетей в рамках одного сервера; 7. Мобильность виртуальных машин (простота переноса между двумя физическими серверами); 8. Повышение управляемости сервером (простота создания резервных копий).

Настраиваем сервер виртуализации Создадим виртуальную машину и научимся ее использовать. Также разберемся с Xen.

58

Модуль 6. Виртуализация. Xen.


Установка Xen Мои виртуальные машины будут располагаться в /vm. Я специально выделил этот раздел сервера под виртуальные машины. Устанавливаем Xen # yum -y install xen В процессе установки в /boot/grub/menu.lst будет добавлен блок загрузки ядра с поддержкой Xen title CentOS (2.6.18-92.1.22.el5xen) root (hd0,0) kernel /xen.gz-2.6.18-92.1.22.el5 module /vmlinuz-2.6.18-92.1.22.el5xen ro root=/dev/VolGroup00/LogVol00 module /initrd-2.6.18-92.1.22.el5xen.img

Нужно сделать так чтобы именно оно загружалось в процессе загрузки сервера. Для этого опцию ”default=1” меняем на “default=0”. Таким образом будет загружаться ядро перечисленное первым в файле загрузчика Grub (наше ядро с поддержкой Xen). Перезагружаем сервер # shutdown -r now Убедимся что Xen удачно стартовал. В процессе загрузки сервера мы должны увидеть что-то похожее.

Посмотрим какое ядро загрузилось в самой ОС. # uname -r 2.6.18-92.1.22.el5xen Отлично, как видим загрузилось ядро с поддержкой Xen. Модуль 6. Виртуализация. Xen.

59


Создание новых виртуальных машин в Xen Давайте посмотрим список нашим виртуальных машин. # xm list Name Domain-0

ID Mem(MiB) VCPUs State Time(s) 0

26

1 r-----

59.3

Поскольку мы только начали, никаких виртуальных машин нет. Но сейчас мы это исправим. Установка новой ВМ можно сделать с помощью команды virt-install. [root@localhost ~]# virt-install What is the name of your virtual machine? linuxbox4 How much RAM should be allocated (in megabytes)? 256 What would you like to use as the disk (file path)? /vm/linuxbox4.img How large would you like the disk (/vm/linuxbox4.img) to be (in gigabytes)? 6 Would you like to enable graphics support? (yes or no) no What is the install location? /mnt Распишуу по пунктам у о чем нас спрашивали: р “What is the name of your virtual machine?” - здесь мы указываем имя виртуальной машины “How much RAM should be allocated (in megabytes)?” - сколько оперативной памяти выделить для новой виртуальной машины “What would you like to use as the disk (file path)?” - путь к файлу-образу будущей виртуальной машины “How large would you like the disk (/vm/linuxbox4.img) to be (in gigabytes)?” сколько места выделить для новой ВМ в гигабайтах “Would you like to enable graphics support? (yes or no)” - обращаю внимание, что пункт не имеет отношения к X Window в новой системе. Здесь нас спрашивают, в каком режиме мы хотим провести процесс инсталляции. Ставиться мы будем из консоли без графики. В противном случае нужно было бы использовать VNC чтобы подключиться к этой машине. Лишние хлопоты. “What is the install location?” - здесь указываем откуда мы будем ставить ОС, я заблаговременно примонтировал dvd-диск в /mnt, но устанавливать можно откуда угодно.

60

Модуль 6. Виртуализация. Xen.


После того как мы зададим все эти опции начнется стандартный процесс инсталляции. Чтобы выйти из интерфейса виртуальной машины нажмите Ctrl+] (наберите “xm console linuxbox4” чтобы вернуться).

Работа с виртуальными машинами Конфигурационный файл нашей виртуальной машины находится в /etc/xen/ linuxbox4 Другие конфигурационные файлы # /etc/sysconfig/xend* # /etc/xen* Чтобы ВМ автоматически загружалась при перезагрузке сервера делаем так: # ln -s /etc/xen/linuxbox4 /etc/xen/auto/ Для обслуживания виртуальных машин есть целый список подкоманд в программе xm. В свою очередь команда работает с сервисом xend, который все время должен быть запушен. xm list – вывести список виртуальных машин # xm list Name

ID Mem(MiB) VCPUs State Time(s)

Domain-0

0

493

1 r-----

254.2

linuxbox4

3

255

1 -b----

95.0

Name – это административный домен, сама хост-система. Остальные домены – это гостевые системы; ID – ID домена в котором находится ВМ; Mem(MiB) – объем памяти этой ВМ; VCPUs – сколько процессоров используется; State – статус ВМ, ниже перечислены возможные статусы; r – running, ВМ запущена; b – blocked, обычное состояние когда ВМ ожидает ввода/вывода, это нормальное состояние ВМ; p – paused, режим паузы, режим наступает при команде xm pause; s – shutdown, в процессе выключения или перезагрузки; c – crashed, произошла какая-то серьезная ошибка; d – dying, в процессе завершения своей работы, но пока не достигший состояния shutdown или crashed; Time(s) – как долго запущена ВМ. Модуль 6. Виртуализация. Xen.

61


#xm console linuxbox4 - подключиться к linuxbox4 (выйти можно с помощью Ctrl+]) #xm create linuxbox4 – включить linuxbox4 # xm shutdown <имя ВМ> - выключить виртуальную машину #xm destroy <имя ВМ> - немедленно выключить ВМ, как будто отключили питание #xm uptime – выводит uptime #xm help - подсказка

Производительность виртуальных машин Посмотреть производительность можно командой ниже # xentop

Резюме Мы разобрали работу Xen и научились создавать и запускать виртуальные машины.

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

62

Модуль 6. Виртуализация. Xen.


Subversion Subversion — это бесплатная система управления версиями с открытым исходным кодом. Subversion позволяет управлять файлами и каталогами, а так же сделанными в них изменениями во времени. Это позволяет восстановить более ранние версии данных, даёт возможность изучить историю всех изменений. Благодаря этому многие считают систему управления версиями своего рода «машиной времени». -Управление версиями в Subversion, Бен Коллинз-Сассман, Брайан У. Фитцпатрик, К. Майкл Пилато, Copyright © 2002, 2003, 2004, 2005, 2006, 2007

Архитектура Subversion

Модуль 7. Subversion.

63


Протоколы работы с SVN file:/// http://

прямой доступ к хранилищу (на локальном диске); доступ через протокол WebDAV (если Subversion-сервер работает через Apache); https:// https://то же, что и http://, но с SSL-шифрованием; svn:// доступ через собственный протокол к серверу svnserve; svn+ssh:// то же, что и svn://, но через SSH-соединение.

Способы хранения данных Berkley DB – старый способ хранения данных репозитория, сейчас уже не используется FSFS – хранение данных в специальных файлах, сейчас активно используется

Компоненты Subversion svn – Клиент с интерфейсом командной строки svnversion – Программа, показывающая состояние (в пределах ревизий существующих элементов) рабочей копии svnlook – Инструмент прямого управления хранилищем Subversion. svnadmin – Инструмент для создания, настройки или восстановления хранилища Subversion. svndumpfilter – Программа для фильтрации дамповых потоков хранилища Subversion. mod_dav_svn – Подключаемый модуль для HTTP-сервера Apache, использующийся для предоставления сетевого доступа к вашему хранилищу. svnserve – Собственный отдельный сервер, запускаемый как процессдемон и доступный посредством SSH; еще один способ для предоставления сетевого доступа к хранилищу svnsync – Программа для последовательного зеркалирования одного хранилища в другое через сеть Все программы расположены в /usr/bin/ кроме mod_dav_svn который поставляется с Apache.

Проблема одновременной работы с файлами Всем системам контроля версий приходится ее решать. Как обеспечить

64

Модуль 7. Subversion.


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

Блокирование р -> Изменение -> Разблокирование р Пользователь берет нужный файл из репозитория и ставит на него блокировку пока с ним работает. Никто не сможет внести в него изменения пока тот, кто его заблокировал не заблокирует. Пока файл заблокирован у остальных будет только доступ только на чтение. Этот способ может применяться при работе с графическим контентом или звуковыми файлами, ведь они являются бинарными. А в свою очередь Subversion может анализировать только текстовые файлы. У этого способа есть свои минусы. Пользователь может просто забыть разблокировать файл или может возникнуть неоправданная пошаговость, ведь не всегда вносимые изменения могут пересекаться между собой.

Копирование р -> Изменение -> Слияние Пользователь извлекает нужные ему данные из репозитория, тем самым создавая рабочую копию. Рабочая копия – это локальное отражение данных из репозитория. Далее он вносит необходимые изменения в файлы и закачивает их обратно в репозиторий (операция commit). В случае если с момента создания его рабочей копий кто-то еще внес изменения в репозиторий ему будет предложено обновить рабочую копию, внести в нее поправки учтя работу других пользователей и только потом положить в репозиторий. Ответственность за успешное разрешение конфликтов в файлах лежит на пользователе. Модуль 7. Subversion.

65


Рабочий цикл Обновление рабочей копии svn update Внесение изменений svn add svn delete svn copy svn move Анализ изменений svn status svn diff svn revert Слияние изменений, выполненных другими, с вашей рабочей копией svn update svn resolved Фиксация изменений svn commit

Установка # yum -y install subversion Все, мы получили инструмент для создания репозиториев и работы с ними.

Работаем с репозиторием Для удобства работы я настроил работу по ключам у себя на машине, чтобы не приходилось вводить пароль каждый раз когда его спросят. # ssh-keygen -t rsa # ssh-copy-id -i ~/.ssh/id_rsa.pub root@localhost Создаем каталог где будут хранится репозитории # mkdir /svn Создаем репозиторий # svnadmin create /svn/myrepo Информация по репозиторию # svn info file:///svn/myrepo/

66

Модуль 7. Subversion.


Path: myrepo URL: file:///svn/myrepo Repository Root: file:///svn/myrepo Repository UUID: 0328446d-48a7-4758-9808-7aeb55de1aea Revision: 0 Node Kind: directory Last Changed Rev: 0 Last Changed Date: 2009-03-07 22:52:55 +0300 (Sat, 07 Mar 2009) Репозиторий пустой о чем говорит “Revision: 0”. С каждым новым измением в репозитории номер ревизии будет увеличиваться на единицу. В каталоге docs я подготовил несколько файлов которые положат начало новому репозиторию # svn import docs file:///svn/myrepo/ -m «start the dance» Adding

docs/file1

Adding

docs/file2

Adding

docs/file3

Committed revision 1. Посмотрим изменилась ли ревизия. # svn info file:///svn/myrepo Path: myrepo URL: file:///svn/myrepo Repository Root: file:///svn/myrepo Repository UUID: 0328446d-48a7-4758-9808-7aeb55de1aea Revision: 1 Node Kind: directory Last Changed Author: root Last Changed Rev: 1 Last Changed Date: 2009-03-08 16:20:00 +0300 (Sun, 08 Mar 2009) Посмотрим содержимое репозитория # svn list file:///svn/myrepo/ file1 file2 file3 Модуль 7. Subversion.

67


У нас получился репозиторий с тремя файлами. Теперь мы создадим рабочую копию этого репозитория и поработаем с ней. # svn co file:///svn/myrepo/ A myrepo/file1 A myrepo/file2 A myrepo/file3 Checked out revision 1. # cd myrepo # echo «new line» >> file1 # svn commit -m «file1 has been modified» Sending file1 Transmitting file data . Committed revision 2. Примерно так проходят будни SVN-пользователя. Пока мы работали с репозиторием локально, нам было достаточно использовать способ доступа как file:/// При удаленной работе рекомендуется использовать протоколы https если доступ к репозиторию осуществляется через Apache, или через svn+ssh, когда достаточно shell-пользователя в удаленной системе. Оба способа осуществляют шифрование передаваемых данных. Доступ через Apache применяется когда необходимо обеспечить доступ к репозиторию удаленных разработчиков. Они не будут иметь доступ ко всей системе а только к SVNрепозиторию. В этом варианте используется механизм аутентификации пользователей Apache и файл паролей создаваемый с помощью htpasswd. Использование системных пользователей оправданно когда на сервере нужно получать доступ не только к SVN-репозиторию.

Получение копии репозитория с удаленного сервера где у вас есть аккаунт Убедитесь, что пользователь включен в нужную группу для доступа к репозиториям. $ svn co svn+ssh://mybestuser@linuxbox/svn/myrepo The authenticity of host 'linuxbox (192.168.146.132)' can't be established. RSA key fingerprint is 18:db:9d:74:3e:f3:7a:f2:1f:e7:e5:36:33:c8:6d:2e. Are you sure you want to continue connecting (yes/no)? yes

68

Модуль 7. Subversion.


Warning: Permanently added 'linuxbox,192.168.146.132' (RSA) to the list of known hosts. mybestuser@linuxbox's password: mybestuser@linuxbox's password: A myrepo/file1 A myrepo/file2 A myrepo/file3 Checked out revision 2.

Ограничение доступа Subversion обладает возможностью регулировать доступ в репозиторий. У нас уже есть репозиторий /svn/myrepo и сейчас мы разберемся с правами доступа к нему. Вся настройка производится в /svn/myrepo/conf/svnserve.conf, То есть <путь к репозитарию>/conf/svnserve.conf [general] anon-access = none #auth-access = write #password-db = passwd authz-db = authz realm = Bunch_Of_My_Repos anon-access = none – запрещаем анонимный доступ в репозиторий auth-access = write – аутентифицированные пользователи могут читать и редактировать данные в репозитории, я закомментировал это условие так как планирую указать КАКИЕ аутентифицированные пользователи чего получат. #password-db = passwd – файл аккаунтов для репозитория. Файл содержащий строки вида “пользователь = пароль” открытым текстом и используемый в работе службы svnserve. Передаваемая информация не шифруется. Этот способ устарел и я не рекомендую его использовать. Чтобы вы примерно понимали что это за файл я вам приведу пример: # cat /svn/myrepo/conf/passwd [users] harry = harryssecret sally = sallyssecret Модуль 7. Subversion.

69


В файле svnserve.conf раскоментируем строку password-db = passwd, в файл authz добавим запись для пользователя harry если общая политика ему не подходит. Запустим службу svnserve # svnserve -d # svn list svn://harry@linuxbox/svn/myrepo Authentication realm: <svn://linuxbox:3690> Bunch_Of_My_Repos Password for 'root': Authentication realm: <svn://linuxbox:3690> Bunch_Of_My_Repos Username: harry Password for 'harry': file1 file2 file3 secret/ authz-db = authz – здесь указываем название файла в котором будут описаны права доступа. В нашем случае файл называется authz realm = MyRepo – реалм в котором находится репозиторий, это что-то типа домена В том же каталоге где и svnserve.conf (<путь к репозиторию>/conf/) создаем файл authz и вносим в него конфигурацию [groups] agents = james, piter [/] *=r [/secret] @agents = rw *= [/secret/public] * = rw

Файл описывающий права доступа умеет работать с группами. В группе мы перечисляем пользователей а далее, в путях в которых нужно что-то ограничить мы просто ссылаемся на группу через @ в результате не нужно перечислять всех пользователей вручную. r – это право на чтение w- право на запись

70

Модуль 7. Subversion.


* = - означает что никому и нечего не разрешено В начале перечисления путей репозитория нужно указать корень - [/] и задать на него права, далее следуя структуре каталогов репозитория указать нужные нам ограничения. Каталоги ниже уровнем наследуют права от родительских. Но права на них можно переназначить, что я собственно продемонстрировал. В каталог /secret смогут попасть только участники группы agents, но в каталог public который находится ниже уровнем смогут попасть все. Учитывайте эти особенности в вашей политике безопасности. Пользователи используемые в это схеме аутентификации – это системные пользователи. Сейчас я продемонстрирую права доступа в деле. Системный пользователь который р не является членом группы ру agents g $ svn list svn+ssh://mybestuser@linuxbox/svn/myrepo mybestuser@linuxbox's password: file1 file2 file3 secret/ $ svn list svn+ssh://mybestuser@linuxbox/svn/myrepo/secret mybestuser@linuxbox's password: svn: Authorization failed $ svn list svn+ssh://mybestuser@linuxbox/svn/myrepo/secret/public mybestuser@linuxbox’s password: file3 Системный пользователь который р является членом группы ру agents g $ svn list svn+ssh://james@linuxbox/svn/myrepo james@linuxbox's password: file1 file2 file3 secret/ $ svn list svn+ssh://james@linuxbox/svn/myrepo/secret Модуль 7. Subversion.

71


james@linuxbox's password: file1 file2 file3 public/ $ svn list svn+ssh://james@linuxbox/svn/myrepo/secret/public james@linuxbox’s password: file3 Я надеюсь все понятно. Кстати не забывайте указывать пользователя в строке подключения перед @ иначе будет использоваться аккаунт root

Работа через Proxy Доступ к репозиторию можно получать и через proxy-сервер. Для этого нужно указать его в ~/.subversion/servers

Программы-клиенты р р Получить доступ к репозиторию можно не только через консоль. Существует несколько известных и хороших программ. Например TortoiseSVN для ОС Windows.

Резюме Мы разобрали работу Subversion и освоили принцип базовой работы с этой технологией. Subversion будет очень кстати в компаниях по разработке программного обеспечения, для контроля исходных кодов программ. Также, многие используют Subversion при коллективной работе с большим числом текстовых документов.

Домашнее задание Установить Subversion, создать репозиторий и поработать с ним с Linuxклиента(командная строка) и Windows-клиента (программа TortoiseSVN).

72

Модуль 7. Subversion.


Apache Apache – это самый популярный веб-сервер. Его задача как и любого другого веб-сервера – отдавать контент на запросы клиентов. Apache обладает большим функционалом за счет подключаемых модулей. На данный момент есть три независимые рабочие ветки – 1.3.x, 2.0.x, 2.2.x. В репозитории CentOS находится Apache ветки 2.2.x, его мы и будем использовать.

Установка Установим классическую связку — Apache + PHP + MySQL. Пакет php-mysql обеспечивает поддержку MySQL в PHP, он нужен если вы хотите работать с СУБД через PHP. # yum -y install httpd httpd-devel php php-mysql mysql # chkconfig httpd on Apache имеет большой функционал за счет подключаемых модулей. Но чтобы была возможность их использовать в Apache core должен быть вкомпилирован модуль mod_so, который позволяет использовать DSOмодули (Dynamic Shared Object). Проверить наличие mod_so можно командой httpd -l # httpd -l Compiled in modules: core.c prefork.c http_core.c mod_so.c В листинге выше еще один интересный момент – это prefork.c, означающий что наш Apache использует MPM prefork. MPM – это multi-processing module, он описывает каким образом будут приниматься запросы и как они будут отдаваться на обработку дочерним процессам или потокам Apache. Два самых популярных: worker – это поточный MPM, каждый запрос обслуживается в отдельном потоке. Так как потоки более легкие для ОС объекты то они они используют меньше памяти чем процессы. Однако есть и минус – поскольку каждый Модуль 8. Apache.

73


поток имеют доступ ко всей памяти процесса то worker MPM подвержен сбоям в большей степени, чем prefork, о котором ниже. prefork k – в этом случае используется несколько процессов, каждый процесс обслуживает одно подключение. Этот MPM используетс немного больше ресурсов но более стабилен. Посмотреть сколько памяти в килобайтах потребляет каждый процесс Apache можно такой командой: # ps -ylC httpd | awk {'print $8,$13'}; Выбор MPM зависит от конкретных условий и задач, но думаю prefork по умолчанию – это хороший выбор. Подключение PHP к Apache осуществляться в файле /etc/httpd/conf.d/php.conf Конфигурационный файл PHP - /etc/php.ini LoadModule php5_module modules/libphp5.so AddHandler php5-script .php AddType text/html .php

Подключаем модуль и назначаем обработчик (про обработчики немного позже).

Настройка Файлы и каталоги Apache /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/

Главный конфигурационный файл; Дополнительные подключаемые файлы конфигурации; /var/www/error/ Страницы ошибок; /usr/lib/httpd/modules/ Каталог с модулями Apache; /var/www/html/ DocumentRoot, каталог в котором будут искаться файлы при попытке доступа к веб-серверу; /var/log/httpd Log-файлы веб-сервера; /etc/sysconfig/httpd Здесь можно задать опции с которыми будет стартовать Apache; /usr/share/doc/httpd-<version>/ Документация.

74

Модуль 8. Apache.


Конфигурационный файл /etc/httpd/conf/httpd.conf Структуру файла можно представить тремя секциями. Главная секция

Настройки этой секции влияют на работу Apache в целом; Секция настроек Настройки “главного” веб-сервера, или веб-сервера веб- по умолчанию, именно к нему будут осуществляться “главного” сервера запросы не обработанные виртуальными хостами. Также настройки этой секции предоставляют настройки по умолчанию для виртуальных хостов; Секция виртуальных Секция виртуальных хостов, которая позволяет хостов настроить поведение веб-сервера определенным образом в зависимости от того какой hostname или IP-адрес был запрошен;

Глобальная секция httpd.conf ServerTokens

Включать ли в поле заголовок ответа базовую информацию об ОС сервера и версии Apache. ServerTokens Prod — сервер отправит: Server: Apache; ServerTokens Major — сервер отправит: Server: Apache/2; ServerTokens Minor — сервер отправит: Server: Apache/2.0; ServerTokens Min — сервер отправит: Server: Apache/2.0.41; ServerTokens OS — сервер отправит: Server: Apache/2.0.41 (Unix); ServerTokens Full — сервер отправит: Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2

ServerRoot

Пусть к директории где располагаются log-файлы (в CentOS это симлинки) и файлы конфигурации; PidFile Файл в который Apache записывает свой PID (Process ID); Timeout Таймаут соединения; KeepAlive Разрешать ли постоянные соединения (более одного запроса при подключение); MaxKeepAlive Requests Максимальное количество запросов в процессе одного подключения (0 — неограниченные запросы); Модуль 8. Apache.

75


KeepAliveTimeout <IfModule> </IfModule> Listen LoadModule Include conf.d/*.conf ExtendedStatus User Group

Период времени в течение которого ожидается очередной запрос от клиента на том же соединение; Модуль в этой секции загрузится только в случае если результат выполнения теста будет истина, если ложь то секция будет проигнорирована; Предписывает Apache принимать соединения на выбранном IP-адресе и/или порту; Загрузка DSO (Dynamic Shared Object) модуля; Директива подключения дополнительных файлов конфигурации; Генерировать полную статистику или только базовую, когда запрошен server-status; Пользователь/группа с полномочиями которых работает Apache.

Секция настроек “главного” веб-сервера ServerAdmin

E-mail администратора веб-сервера, на этот адрес будут приходить уведомления об ошибках и он будет отображаться на некоторых страницах (error documents); ServerName Имя которое используется для самоидентификации веб-сервером, обычно оно определяется автоматически, но лучше прописать явно; UseCanonicalName Когда директива отключена, используется hostname и порт указанный клиентом если включена то используется значение ServerName; DocumentRoot Директория с файлами которую Apache будет использовать для обслуживания запросов клиентов; <Directory /> Данная секция позволяет описать настройки для Options FollowSymLinks конкретногокаталога.Вданномпримеремыразрешаем веб-серверу перемещаться по символическим ссылкам AllowOverride None из этого каталога и отключаем обработку файлов </Directory> .htaccess в которых можно задать дополнительные настройки для этого каталога; DirectoryIndex Файл, который будет передан клиенту при запросе каталога, файлов может быть перечислено несколько но будет использован первый доступный; AccessFileName Файл, в котором могут быть дополнительные настройки для каждого каталога, по умолчанию он называется .htaccess;

76

Модуль 8. Apache.


<Files ~ «^\.ht»> Order allow,deny Deny from all </Files> TypesConfig DefaultType HostnameLookups

EnableMMAP

EnableSendfile ErrorLog LogLevel

LogFormat

Секция <Files></Files> позволяет задать настройки для файлов по определенной маске, в данном примере для всех файлов с расширением .ht мы запрещаем доступ через веб-браузер; Директива задает расположение файла с Mime — типами; Mime — тип по умолчанию text/plain, То есть содержимое выводим на экран; В log-файлы записывать IP-адреса или имена клиентов, если опция включена то каждый раз производиться запрос к DNS-серверу с целью выяснить имя клиента. Включать эту опцию не рекомендуется так как это повлечет за собой задержку с обработкой пользовательских запросов; Включать ли memory-mapping, включается когда есть необходимость читать содержимое файла в процессе его доставки. Не рекомендуется включать при обслуживание NFS-директорий; Включать поддержку sendfile или нет. На некоторых платформах и ОС лучше отключить; Расположение log-файла для журналирования ошибок; Директива задает уровень журналирования в logфайлы. Возможны такие опции: emerg — система полностью неработоспособна; alert — что-то должно быть сделано немедленно; crit — критическая ситуация; error — журналирование ошибок; warn — журналирование предупреждений; notice — уровень мелких замечаний; info — информационный уровень; debug — максимальный уровень журналирования; Задает формат записи log-файла;

CustomLog

Расположение основного log-файла, если для виртуальных хостов не задан свой CustomLog то вся информация будет записываться в CustomLog “главного” веб-сервера;

ServerSignature

Позволяет задать строку которая будет выводиться на генерируемых страницах. Полезно при использование цепочки прокси-серверов;

Модуль 8. Apache.

77


Alias

ScriptAlias

Redirect

Задание альяса в формате: Alias fakename realname. Если в альясе есть слеш (/) то и при запросе его тоже нужно указывать. Пример альяса (псевдонима): Alias /icons/ “/var/www/icons/” - при запросе http://<server_ip>/icons/ будут использоваться картинки из каталога /var/www/icons/; Тоже самое что и Alias, только файлы расположенные в realname каталоге будут выполняться как скрипты а не пересылаться клиенту в виде обычных файлов как это происходит при использование Alias; Позволяет делать перенаправление на другой ресурс. Например: Redirect /service http://foo2.example.com/service

IndexOptions

AddIconByEncoding AddIconByType AddIcon DefaultIcon

При запросе файла http://example.com/service/foo. txt будет сделан запрос к http://foo2.example.com/ service/foo.txt Позволяет задать ряд настроек для директорий, такие как кодировка, MIME-тип, Description Width, FancyIndexing, FoldersFirst и многие другие; Директивы AddIcon* указывают серверу, какие иконки показывать для различных файлов, или расширений имен файлов. Они показываются только для директорий с FancyIndexing; Директива указывает какую иконку показывать для файлов, не имеющих явно определенных иконок;

ReadmeName

Задает название README файла, которое сервер будет искать по умолчанию, затем он будет добавлен в листинг директории;

HeaderName

Задает файл который будет добавлен в начало листинга директории;

IndexIgnore

Директива задает список файлов которые должны быть исключены из листинга;

DefaultLanguage AddLanguage

Директивы позволяют указать язык для документов. Выможете в последствиеиспользоватьдинамическое определение содержимого (content negotiation) для выдачи браузеру файла на языке понятном пользователю. DefaultLanguage задает язык по умолчанию для всех документов, AddLanguage позволяет задать язык для конкретных;

78

Модуль 8. Apache.


LanguagePriority

LanguagePriority позволяет задать порядок выбора некоторых языков (в случае неоднозначности) при динамическом определении содержания (content negotiation); ForceLanguagePriority Директива позволяет серверу выдать конкретную страницу, вместо сообщения MULTIPLE CHOICES (задается Prefer) или сообщения NOT ACCEPTABLE (задается Fallback), в случае, если не один язык не подошел; AddDefaultCharset Директива задает кодировку по умолчанию; AddType Позволяет задать новый MIME-тип или переопределить старый; AddEncoding Позволяет на ходу распаковывать данные. Не все браузеры это поддерживают; AddHandler Директива позволяет назначить обработчик файлам с определенным расширением. В свою очередь, обработчики могут уже быть встроены в веб-серверы или определены директивой Action; AddOutputFilter Директива позволяет назначить фильтр файлам определенным с расширением. Фильтры обрабатывают страницы до того как их отправить клиенту; ErrorDocument Позволяет задать отображаемые страницы для различного рода ошибок; BrowserMatch Позволяет задать поведение сервера для конкретного веб-браузера, это полезно в случае известных ошибок в реализации веб-браузера; <Location /server-status> Секция описывает страницу статус веб-сервера, SetHandler server-status на которой много интересной информации о состояние веб-сервера. Доступ к ней можно Order deny,allow получить по адресу: http://<servername>/serverDeny from all status/ Allow from 192.168.146.150 </Location> <Location /server-info> Секция описывает страницу с конфигурацией вебSetHandler server-info сервера. Доступ к ней можно получить по адресу: http://<servername>/server-info/ Order deny,allow Deny from all Allow from 192.168.146.150 </Location> Модуль 8. Apache.

79


<IfModule mod_proxy.c> </IfModule> <IfModule mod_disk_ cache.c> CacheEnable disk / CacheRoot “/var/cache/mod_proxy” </IfModule>

Секция описывает прокси сервер, раскоментируйте строки чтобы его включить; Секция позволяет включить кэширование проксируемого контента и задать директорию где он будет храниться.

Секция виртуальных хостов Виртуальные хосты позволяют обслуживать множество сайтов в рамках одного сервера, ниже я приведу типовую конфигурацию виртуального хоста. Наш веб-сервер помимо своего сайта (сайта “по умолчанию”), дополнительно будет обслуживать запросы для сайта company.ru. Но вначале погорим про виртуальные хосты. Есть несколько вариантов их использования.

Много именованных веб-сайтов на одном IP-адресе Ситуация самая распространенная. Ее мы рассмотрим в конце, когда будем конфигурировать виртуальный хост для company.ru

Много именованных веб-сайтов на множестве IP-адресов В примере ниже у нас два IP-адреса. На IP-адресе 192.168.146.10 будет обслуживаться “главный” веб-сервер, на IP 192.168.146.20 два виртуальных хоста. Listen 80 # «Главный» сервер работает на 192.168.146.10 ServerName mainserver.com DocumentRoot /www/mainserver # Другой IP-адрес NameVirtualHost 192.168.146.20 <VirtualHost 192.168.146.20> DocumentRoot /www/example1 ServerName www.example.com # Другие директивы </VirtualHost> <VirtualHost 192.168.146.20> DocumentRoot /www/example2 ServerName www.example2.com # Другие директивы </VirtualHost>

80

Модуль 8. Apache.


Все запросы которые не направлены к 192.168.146.20 будут обработаны “главным” сервером. Запросы к 192.168.146.20 с неизвестным hostname или без заголовка Host: будут обслуживаться из /www/example1/

Обслуживание одного и того же контента на разных IP-адресах NameVirtualHost 192.168.146.10 NameVirtualHost 217.10.20.30 <VirtualHost 192.168.146.10 217.10.20.30> DocumentRoot /www/server1 ServerName server.example.com ServerAlias server </VirtualHost>

Работа на разных портах Listen 80 Listen 8080 NameVirtualHost 192.168.146.150:80 NameVirtualHost 192.168.146.150:8080 <VirtualHost 192.168.146.150:80> ServerName www.example.com DocumentRoot /www/domain-80 </VirtualHost> <VirtualHost 192.168.146.150:8080> ServerName www.example.com DocumentRoot /www/domain-8080 </VirtualHost> <VirtualHost 192.168.146.150:80> ServerName www.example.org DocumentRoot /www/otherdomain-80 </VirtualHost> <VirtualHost 192.168.146.150:8080> ServerName www.example.org DocumentRoot /www/otherdomain-8080 </VirtualHost>

Модуль 8. Apache.

81


IP-based виртуальный хостинг Указанные ниже IP-адреса в свою очередь резолвятся в example.com и example2.com Listen 80 <VirtualHost 192.168.146.10> DocumentRoot /www/example1 ServerName www.example.com </VirtualHost> <VirtualHost 192.168.146.20> DocumentRoot /www/example2 ServerName www.example2.com </VirtualHost>

Также могут быть смешанные вариации, которые могут одновременно использовать порты, IP-адреса

Добавляем виртуальный хост Добавим виртуальный хост для домена company.ru. Сделаем альяс на www, ведь обычно пользователи указывают www вначале каждого сайта, так что это нужно учесть. Файлом который будет запрашиваться при обращение к корневой директории хоста будет index2.php. Поскольку вебсервер установлен с поддержкой PHP то можно попробовать обработать такую страницу. Страница будет состоять из хорошо известной функции phpinfo(); которая генерирует информацию о настройках PHP и многое другое. Страницу ошибки под номером 404 мы определим в файле .htaccess предварительно включив возможность его использования с помощью директивы AllowOverride. Log-файлы у нас будут свои. Включив Indexes для наших каталогов – мы сможем просматривать log-файлы прямо из браузера (http://www.company.ru/logs/). Но в целях безопасности не стоит это использовать на рабочем сервере, или, если используете то ограничивать доступ. Как это сделать я покажу ниже. <Directory /var/sites/> AllowOverride All Options All </Directory> <VirtualHost *:80> ServerAdmin support@company.ru DocumentRoot /var/sites/company.ru/html ServerName company.ru ServerAlias www.company.ru

82

Модуль 8. Apache.


DirectoryIndex index2.php ScriptAlias /cgi-bin/ /var/sites/company.ru/html/cgi-bin/ ErrorLog /var/sites/company.ru/html/logs/error_log CustomLog /var/sites/company.ru/html/logs/access_log common </VirtualHost>

Создаем структуру для домашнего каталога сайта # mkdir -p /var/sites/company.ru/html/{pages,logs} Создаем log-файлы # touch /var/sites/company.ru/html/logs/{access_log,error_log} Создаем файл .htaccess в каталоге /var/sites/company.ru/html/ с таким содержанием: ErrorDocument 404 /pages/404.html

Не забудьте создать страницу 404.html с любым сообщением. Эта страница будет выводиться каждый раз, когда будет запрошена страница которой нет на сервере. А теперь создадим файл /var/sites/company.ru/html/index2.php с таким содержанием: <?php phpinfo(); ?>

Функция phpinfo(); позволяет сгенерировать страницу с настройками PHP и установленными модулями. Это нам позволит убедиться, что PHP функционирует правильно и узнаем какие модули PHP присутствуют в системе. В целях безопасности CGI-скрипты принято выполнять в определенной директории. Директивой ScriptAlias мы определили каталог в котором можно выполнять CGI-скрипты (не забудьте в файле httpd.conf раскомментировать обработчик для CGI - “AddHandler cgi-script .cgi” ). На каталог должна быть установлена опция Options +ExecCGI (или Options All). Создадим тестовый файл /var/sites/company.ru/html/cgi-bin/test.cgi с таким содержанием: #!/usr/bin/perl print «Content-type: text/html\n\n»; print «Hello, World.»;

Модуль 8. Apache.

83


Устанавливаем право на исполнение для этого файла # chmod +x test.cgi Проверяем http://www.company.ru/cgi-bin/test.cgi Проверяем конфигурацию виртуальных хостов Apache на наличие ошибок. Если Syntax OK то переходит к следующему шагу, если в конфигурации окажется ошибка то будет показано где именно. # httpd -S Проверить весь конфигурационный файл можно так: # apachectl configtest Когда убедимся, что все ОК можно перезагрузить веб-сервер. Apachectl – это утилита для управления веб-сервером. Можно перезагрузить веб-сервер используя классический способ (service httpd restart) а можно этот. Опция graceful – это аккуратная перезагрузка веб-сервера, она не завершает принудительно текущие соединения а дожидается их завершения. # apachectl graceful Базовая настройка виртуального хоста закончена. Теперь можно обратиться к веб-сайту по такому адресу. Если вы это делаете на виртуальной машине то возможно придется в файл hosts добавить записи: 192.168.146.150 company.ru 192.168.146.150 www.company.ru

В Linux это /etc/hosts, в Windows C:\WINDOWS\system32\drivers\etc\hosts Пишем в адресной строке веб-браузера: http://www.company.ru/

Возможные опции в директиве Options Options задают возможности которые будут доступны в конкретной директории. По умолчанию значение Options установлено в All. Синтаксис: Options [+|-]option [[+|-]option] ... Доступны следующие опции:

84

Модуль 8. Apache.


All

Доступны все опции кроме MultiViews, эту опцию нужно указывать явно; ExecCGI Выполнение CGI-скриптов с использованием mod_ cgi разрешено; FollowSymLinks Разрешено переходить по символическим ссылкам; Includes Разрешены Server Side Includes (SSI); IncludesNOEXEC SSI разрешены но команды #exec cmd и #exec cgi отключены; Indexes Если при запросе директории в ней не будет найден файл из DirectoryIndex то mod_autoindex вернет листинг этой директории с файлами и каталогами; MultiViews Разрешено Content-negotiation, когда есть возможность отдавать контент в разных его вариациях и клиент присылает свои пожелания; SymLinksIfOwnerMatch Разрешен переход только по симлинкам владелец конечного файла которых является владельцем этого симлинка.

Определение возможных директив в .htaccess Файл .htaccess позволяет задавать дополнительные опции поведения вебсервера. Директива AllowOverride может использоваться только в секции <Directory>. Возможные значения приведены в таблице ниже. All AuthConfig

FileInfo

Модуль 8. Apache.

Разрешено использовать все; Разрешено использовать директивы авторизации: AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require и т.д. Разрешено использовать директивы контролирующие тип документов: DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, и mod_mime Add* и Remove* directives, Header, RequestHeader, SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain, CookieStyle, CookieTracking, CookieName), mod_ rewrite directives RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule) и Action из модуля mod_actions;

85


Indexes

Limit Options None

Позволяет использовать директивы отвечающие за индексацию директории: AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName и т.д. Директивы для управления доступа к хосту: Allow, Deny and Order; Позволяет использовать специфичные опции для директорий; Запрещает использование .htaccess.

Аутентификация на сайте Доступ в какой либо каталог можно ограничить списком учетных записей. Для создания файла учетных записей используется программа htpasswd. Когда мы создаем свой первый файл, который будет содержать список учетных записей, программа htpasswd вызывается с ключем -c который говорит о том, что нужно файл создать. При добавление учетных записей в существующий файл, этот ключ использовать не нужно. Создаем новый файл паролей и добавляем туда пользователя user1 # htpasswd -c /var/sites/company.ru/.htpasswd user1 Как видим все пароли внутри файла шифруются. # cat /var/sites/company.ru/.htpasswd user1:rZ.NmkqrKJLCc Добавим еще пару пользователей # htpasswd /var/sites/company.ru/.htpasswd user2 # htpasswd /var/sites/company.ru/.htpasswd user3 Теперь нужно сообщить веб-серверу, что при запросе каталога logs доступ туда будет разрешен только определенному списку пользователей. Для этого в файл /var/sites/company.ru/logs/.htaccess добавим такие директивы. AuthType Basic AuthName «Restricted Area» AuthBasicProvider file AuthUserFile /var/sites/company.ru/.htpasswd Require valid-user

86

Модуль 8. Apache.


Проверяем http://www.company.ru/logs/ В таблице перечислены использованные нами директивы. AuthType

AuthName

AuthBasicProvider AuthUserFile Require

Тип аутентификации. Basic – базовый, все передается открытым текстом, Digest – все передается в зашифрованном виде. Для создания digest-файлов есть программа htdigest (AuthType Digest); Реалм и текст, который будет выведен в диалоговом окне ввода логина и пароля. Суть реалма - если клиент уже проходил аутентификацию на сайте где реалм был “Restricted Area”, то для еще одного каталога с таким же реалмом будет отослан такой же пароль и диалоговое окно ввода логина/пароля не будет выведено на экран; Директива указывает каким способом будет проходить аутентификация; Указывает расположение файла с паролями; Условия прохождения аутентификации. Require valid-user – доступ будет выдан любому пользователю указанному в аккаунте, успешно прошедшему аутентификацию; Require user user3 – здесь доступ разрешается только user3, соответственно доступ для user1 и user2 будет запрещен.

Еще один способ ограничения доступа - это указать с каким IP-адресов можно попадать в директорию, например вот так: Order deny,allow Deny from all Allow from 192.168.146.1

Мы запрещаем доступ всем разрешив только с нашего IP-адреса (можно перечислить IP-адреса через пробел, или указывать сети, например так 192.168.146.0/24). Директива Order задает порядок проверки, То есть сначала блокируем всех а потом разрешаем избранным.

Включение SSL SSL (Secure Sockets Layer) – криптографический протокол обеспечивающий безопасную передачу данных. Для реализации SSL в Apache есть Модуль 8. Apache.

87


специальный модуль – mod_ssl, который предоставляет интерфейс к библиотеки OpenSSL, предоставляющею сильное шифрование с использованием протоколов SSL и TLS (Transport Layer Security). Для работы с SSL необходимо сгенерировать два файла – ключ, который хранится на сервере и сертификат, этот сертификат будет предлагаться всем желающим когда они запросят любую информацию по адресу https://ваш_сервер/ и т.д. Сертификаты могут быть выданы специальными службами, - CA – Certificate Authority, это будет стоит определенных денег. А можно сделать самоподписанный, тогда при запросе страниц по https клиенту будет выдаваться предупреждение, что сертификат выдан неизвестным источником. Но как показывает практика, большинство организаций именно такими и пользуются. Устанавливаем mod_ssl # yum -y install mod_ssl После установки mod_ssl он будет подключен к Apache с помощью файла / etc/httpd/conf.d/ssl.conf Все что нам нужно сделать – это добавить новую секцию VirtualHost для 443 порта, именно на этом порту обслуживаются https соединения и директиву NameVirtualHost. NameVirtualHost *:443 <VirtualHost *:443> SSLEngine on SSLCertificateKeyFile /etc/pki/tls/private/localhost.key SSLCertificateFile /etc/pki/tls/certs/localhost.crt ServerAdmin support@company.ru DocumentRoot /var/sites/company.ru/html ServerName company.ru ServerAlias www.company.ru DirectoryIndex index2.php ErrorLog /var/sites/company.ru/html/logs/error_log CustomLog /var/sites/company.ru/html/logs/access_log common RewriteLog /var/sites/company.ru/rewrite.log RewriteLogLevel 1 </VirtualHost>

SSLEngine позволяет включить SSL для сайта а директивы SSLCertificateKeyFile и SSLCertificateFile указывают на расположение ключа и файла сертификата. По умолчанию сертификат выдан на localhost.localdomain, что не очень красиво. Давайте создадим новый самоподписанный сертификат для

88

Модуль 8. Apache.


company.ru Для этого понадобится библиотека OpenSSL (если не установлена то yum -y install openssl). Еще одна особенность SSL - для каждого сертификата нужен отдельный IPадрес. Наш сервер работает с IP 192.168.146.150 и все размещенные сайты делят его между собой. Самый главный сайт на сервере – это конечно корпоративный сайт и именно для него мы сделаем сертификат а другие сайты также будут его использовать. Переходим в директорию httpd # cd /etc/httpd/conf.d/ Генерируем сертификат и ключ # openssl req -new -x509 -nodes -out server.crt -keyout server.key Generating a 1024 bit RSA private key .....................++++++ ..................................++++++ writing new private key to 'server.key' ----You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----Country Name (2 letter code) [GB]:RU State or Province Name (full name) [Berkshire]:Moscow Locality Name (eg, city) [Newbury]:Moscow Organization Name (eg, company) [My Company Ltd]:company.ru Organizational Unit Name (eg, section) []:IT Dept Common Name (eg, your name or your server’s hostname) []:company.ru Email Address []:support@company.ru

После запуска команды openssl, будет задано несколько простых вопросов, после чего сгенерируются server.crt и server.key файлы. Обращаю внимание – Common Name должно полностью соответствовать вашему доменному имени. В файле /etc/httpd/conf.d/ssl.conf находим директивы SSLCertificateFile и SSLCertificateKeyFile и приводим их к такому виду: SSLCertificateFile /etc/httpd/conf.d/server.crt SSLCertificateKeyFile /etc/httpd/conf.d/server.key

В секции виртуального хоста в httpd.conf исправляем пути к нашим новым файлам: Модуль 8. Apache.

89


<VirtualHost *:443> SSLEngine on SSLCertificateKeyFile /etc/httpd/conf.d/server.key SSLCertificateFile /etc/httpd/conf.d/server.crt ServerAdmin support@company.ru DocumentRoot /var/sites/company.ru/html ServerName company.ru ServerAlias www.company.ru DirectoryIndex index2.php ErrorLog /var/sites/company.ru/html/logs/error_log CustomLog /var/sites/company.ru/html/logs/access_log common RewriteLog /var/sites/company.ru/rewrite.log RewriteLogLevel 1 </VirtualHost>

# apachectl graceful Теперь, если у вас сохранен старый сертификат для company.ru в браузере то его нужно удалить, иначе вы будете продолжать его использовать. Для браузера Firefox удалить сертификат можно вот так: Инструменты -> Настройки -> Дополнительно -> Просмотр сертификатов -> закладка Серверы, там мы находим сертификат для company.ru и удаляем его. Пробуем зайти на наш сайт – https://www.company.ru/ При сохранение очередного сертификата убедитесь, что теперь он выдан на company.ru а не localhost.localdomain

server-status и server-info Можно получить много информации о состояние вашего веб-сервера, для этого нужно в httpd.conf внести следующие записи: <Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 192.168.146.1 </Location> <Location /server-info> SetHandler server-info Order deny,allow Deny from all Allow from 192.168.146.1 </Location>

90

Модуль 8. Apache.


Директивой Allow from задайте IP-адреса с которых можно попасть на эту страницу.

SSI SSI (Server Side Includes) – это директивы которые могут быть помещены в html страницу. Они позволяют генерировать динамический контент htmlстраниц без применения CGI, Perl или PHP. Для включения SSI необходимо убедиться, что в файле httpd.conf есть такие строки: AddType text/html .shtml AddOutputFilter INCLUDES .shtml

Теперь нужно включить возможность выполнения SSI в выбранном каталоге, для этого на каталоге должна быть установлена директива Options +Includes В моем случае (/var/sites/) установлено Options All, То есть разрешено все, так что остается просто протестировать работоспособность. Создаем файл test.shtml в каталоге /var/sites/company.ru/html/ с таким содержанием: <!--#echo var=»DATE_LOCAL» -->

В браузере пишем – http://www.company.ru/test.shtml На странице должно отобразиться текущее время на сервере. Еще полезный пример – отображение даты последней модификации документа This file last modified <!--#echo var=»LAST_MODIFIED» -->

Использование mod_rewrite Описание работы Apache не может быть полным без описания модуля mod_ rewrite. Он является одним из самых популярных среди веб-разработчиков, позволяя на лету модифицировать запрошенный URL. Для простого перенаправления достаточно директивы Redirect, но mod_rewrite позволяет решать более сложные задачи. Ниже я приведу ряд примеров, чтобы было понятно о чем идет речь. Все эти команды нужно указывать в вашем .htaccess Модуль 8. Apache.

91


RewriteEngine RewriteBase RewriteRule

Включаем mod_rewrite; Определяем корень, / соответствует корню сайта http://www.company.ru/ Само правило, их может быть много.

Все запросы к странице oldpage.html будут перенаправляться к newpage.html. RewriteEngine on RewriteBase / RewriteRule ^oldpage\.html$ newpage.html [R=permanent]

Замена всех .htm файлов .html файлами. RewriteEngine on RewriteBase / RewriteRule ^(.*)\.htm$ $1.html [R=permanent]

Переписывание части URL. Например у нас есть интернет-магазин и адреса товара выглядят примерно вот так: http://www.company.ru/catalog/shop.php?product1 http://www.company.ru/catalog/shop.php?product2 http://www.company.ru/catalog/shop.php?product3 У такого подхода есть минусы. Например поисковые машины могут не проиндексировать страницы использующие в адресе “?”. Также не просто будет запомнить такой адрес, ведь я привел один из самых безобидных примеров. Чтобы улучшить ситуацию, мы перепишем часть URL чтобы все стало проще и нагляднее. Мы сделаем возможность обращаться к продуктам вот по такому адресу: http://www.company.ru/shop/product1 http://www.company.ru/shop/product2 http://www.company.ru/shop/product3 и т.д. RewriteEngine on RewriteBase / RewriteRule ^(.*)shop/(.*)$ $1catalog/shop.php?$2

Для записи всех действий mod_rewrite, в секции виртуального хоста можно указать такие директивы.

92

Модуль 8. Apache.


RewriteLog

/var/sites/company.ru/html/logs/rewrite.log

RewriteLogLevel 1 Если нужно больше отладочной информации то можно установить RewriteLogLevel в положение 2 или 3.

Регулярные выражения mod_rewrite и флаги Регулярные выражения ^ Начало строки $ Конец строки . Любой символ (a|b) a или b (...) Выбор группы; [abc] Любой из этих символов (диапазон); [^abc] Ни один символ из этого диапазона; a? Буква a один раз или 0; a* Буква а ноль или более раз; a+ Буква а один или более раз; a{3} Буква а три раза; a{3,} Буква а более трех раз; a{3,6} Буква а от 3 до 6 раз; !(pattern) Отрицание; Флаги RewriteRule R[=code] Redirect, перенаправление на новый URL по заданному коду; F Forbidden, недоступно; P Proxy, прокси; L Last, последнее правило; G Gone, больше не существует; N Next, следующая; C Chain, цепочка; T=mime-type Type, задание MIME-типа; NS NoSubreq, пропустить директиву если текущий подзапрос является внутренним подзапросом; NC NoCase, не учитывать регистр; QSA QSAppend, добавлять строку запроса; NE NoEscape, не экранировать URI при выводе; PT PassThrough, пропускать через следующий обработчик; Модуль 8. Apache.

93


S=количество E=VAR:VAL CO=NAME:VAL:domai n[:lifetime[:path]]

Skip, пропустить следующее количество правил; ENV, установить переменную окружения; Cookie, записывает cookie клиенту. NAME – название cookie; VAL – значение cookie; domain – домен; lifetime – время жизни cookie; path – путь куда записать cookie;

Коды веб-сервера 100-199 – информационные, запрос агента принят и обрабатывается; 200-299 – запрос успешно обработан и отправлен; 300-399 – запрос изменен и нужно предпринять действия для удовлетворения измененного запроса; 400-499 – возникли серьезные проблемы при попытке выполнить запрос; 500-599 – ошибки на сервере; 100 101 200 201 202 203 204 205 206 300 301 302 303 304 305 307 400 401 402 403

94

Продолжить; Переключение протоколов; OK; Создан; Принято; Не авторская информация; Нет содержимого; Сбросить содержимое; Частичное содержимое; Множественный выбор; Перемещен навсегда; Найден; Смотреть другой; Не модифицирован; Использовать прокси-сервер; Временно переадресован; Неправильный запрос; Несанкционированно; Требуется оплата; Запрещено; Модуль 8. Apache.


404 405 406 407 408 409 410 411 412 413 414 415 416 417 500 501 502 503 504 505

Ресурс не найден; Метод запрещен; Не приемлем; Требуется аутентификация через прокси-сервер; Истекло время ожидания запроса; Конфликт; Недоступен; Требуется длина запроса; Предусловие неверно; Объект запроса слишком большой; URI запроса слишком длинный; Неподдерживаемый тип медиа; Диапазон запроса неудовлетворителен; Ожидание неуспешно; Внутренняя ошибка веб-сервера; Не реализовано; Плохой шлюз; Сервис недоступен; Таймаут; Версия протокола HTTP не поддерживается;

Файл конфигурации httpd.conf может выглядеть примерно вот так: # === Global Section === ServerTokens Full ServerRoot «/etc/httpd» PidFile run/httpd.pid Timeout 120 KeepAlive Off MaxKeepAliveRequests 100 KeepAliveTimeout 15 <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 </IfModule>

Модуль 8. Apache.

95


<IfModule worker.c> StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule> Listen 80 LoadModule auth_basic_module modules/mod_auth_basic.so LoadModule auth_digest_module modules/mod_auth_digest.so LoadModule authn_file_module modules/mod_authn_file.so LoadModule authn_alias_module modules/mod_authn_alias.so LoadModule authn_anon_module modules/mod_authn_anon.so LoadModule authn_dbm_module modules/mod_authn_dbm.so LoadModule authn_default_module modules/mod_authn_default.so LoadModule authz_host_module modules/mod_authz_host.so LoadModule authz_user_module modules/mod_authz_user.so LoadModule authz_owner_module modules/mod_authz_owner.so LoadModule authz_groupfile_module modules/mod_authz_groupfile.so LoadModule authz_dbm_module modules/mod_authz_dbm.so LoadModule authz_default_module modules/mod_authz_default.so LoadModule ldap_module modules/mod_ldap.so LoadModule authnz_ldap_module modules/mod_authnz_ldap.so LoadModule include_module modules/mod_include.so LoadModule log_config_module modules/mod_log_config.so LoadModule logio_module modules/mod_logio.so LoadModule env_module modules/mod_env.so LoadModule ext_filter_module modules/mod_ext_filter.so LoadModule mime_magic_module modules/mod_mime_magic.so LoadModule expires_module modules/mod_expires.so LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so LoadModule usertrack_module modules/mod_usertrack.so LoadModule setenvif_module modules/mod_setenvif.so LoadModule mime_module modules/mod_mime.so LoadModule dav_module modules/mod_dav.so LoadModule status_module modules/mod_status.so LoadModule autoindex_module modules/mod_autoindex.so LoadModule info_module modules/mod_info.so LoadModule dav_fs_module modules/mod_dav_fs.so LoadModule vhost_alias_module modules/mod_vhost_alias.so LoadModule negotiation_module modules/mod_negotiation.so LoadModule dir_module modules/mod_dir.so LoadModule actions_module modules/mod_actions.so

96

Модуль 8. Apache.


LoadModule speling_module modules/mod_speling.so LoadModule userdir_module modules/mod_userdir.so LoadModule alias_module modules/mod_alias.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule cache_module modules/mod_cache.so LoadModule suexec_module modules/mod_suexec.so LoadModule disk_cache_module modules/mod_disk_cache.so LoadModule file_cache_module modules/mod_file_cache.so LoadModule mem_cache_module modules/mod_mem_cache.so LoadModule cgi_module modules/mod_cgi.so LoadModule version_module modules/mod_version.so Include conf.d/*.conf ExtendedStatus On User apache Group apache # === 'Main' server section === ServerAdmin root@localhost UseCanonicalName Off DocumentRoot «/var/www/html» <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory «/var/www/html»> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> <IfModule mod_userdir.c> UserDir disable </IfModule>

Модуль 8. Apache.

97


DirectoryIndex index.html index.htm index.php index.php5 AccessFileName .htaccess <Files ~ «^\.ht»> Order allow,deny Deny from all </Files> TypesConfig /etc/mime.types DefaultType text/plain <IfModule mod_mime_magic.c> MIMEMagicFile conf/magic </IfModule> HostnameLookups Off ErrorLog logs/error_log LogLevel warn LogFormat «%h %l %u %t \»%r\» %>s %b \»%{Referer}i\» \»%{User-Agent}i\»» combined LogFormat «%h %l %u %t \»%r\» %>s %b» common LogFormat «%{Referer}i -> %U» referer LogFormat «%{User-agent}i» agent CustomLog logs/access_log combined ServerSignature On Alias /icons/ «/var/www/icons/» <Directory «/var/www/icons»> Options Indexes MultiViews AllowOverride None Order allow,deny Allow from all </Directory> <IfModule mod_dav_fs.c> DAVLockDB /var/lib/dav/lockdb </IfModule> ScriptAlias /cgi-bin/ «/var/www/cgi-bin/»

98

Модуль 8. Apache.


<Directory «/var/www/cgi-bin»> AllowOverride None Options None Order allow,deny Allow from all </Directory> IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip AddIconByType (TXT,/icons/text.gif) text/* AddIconByType (IMG,/icons/image2.gif) image/* AddIconByType (SND,/icons/sound2.gif) audio/* AddIconByType (VID,/icons/movie.gif) video/* AddIcon /icons/binary.gif .bin .exe AddIcon /icons/binhex.gif .hqx AddIcon /icons/tar.gif .tar AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip AddIcon /icons/a.gif .ps .ai .eps AddIcon /icons/layout.gif .html .shtml .htm .pdf AddIcon /icons/text.gif .txt AddIcon /icons/c.gif .c AddIcon /icons/p.gif .pl .py AddIcon /icons/f.gif .for AddIcon /icons/dvi.gif .dvi AddIcon /icons/uuencoded.gif .uu AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl AddIcon /icons/tex.gif .tex AddIcon /icons/bomb.gif core AddIcon /icons/back.gif .. AddIcon /icons/hand.right.gif README AddIcon /icons/folder.gif ^^DIRECTORY^^ AddIcon /icons/blank.gif ^^BLANKICON^^ DefaultIcon /icons/unknown.gif ReadmeName README.html HeaderName HEADER.html IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t AddLanguage ca .ca AddLanguage cs .cz .cs

Модуль 8. Apache.

99


AddLanguage da .dk AddLanguage de .de AddLanguage el .el AddLanguage en .en AddLanguage eo .eo AddLanguage es .es AddLanguage et .et AddLanguage fr .fr AddLanguage he .he AddLanguage hr .hr AddLanguage it .it AddLanguage ja .ja AddLanguage ko .ko AddLanguage ltz .ltz AddLanguage nl .nl AddLanguage nn .nn AddLanguage no .no AddLanguage pl .po AddLanguage pt .pt AddLanguage pt-BR .pt-br AddLanguage ru .ru AddLanguage sv .sv AddLanguage zh-CN .zh-cn AddLanguage zh-TW .zh-tw LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW ForceLanguagePriority Prefer Fallback AddDefaultCharset UTF-8 AddType application/x-compress .Z AddType application /x-gzip .gz .tgz AddHandler cgi-script .cgi AddHandler type-map var AddType text/html .shtml AddOutputFilter INCLUDES .shtml Alias /error/ «/var/www/error/» <IfModule mod_negotiation.c> <IfModule mod_include.c> <Directory «/var/www/error»>

100

Модуль 8. Apache.


AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allow,deny Allow from all LanguagePriority en es de fr ForceLanguagePriority Prefer Fallback </Directory> </IfModule> </IfModule> BrowserMatch «Mozilla/2» nokeepalive BrowserMatch «MSIE 4\.0b2;» nokeepalive downgrade-1.0 force-response-1.0 BrowserMatch «RealPlayer 4\.0» force-response-1.0 BrowserMatch «Java/1\.0» force-response-1.0 BrowserMatch «JDK/1\.0» force-response-1.0 BrowserMatch «Microsoft Data Access Internet Publishing Provider» redirect-carefully BrowserMatch «MS FrontPage» redirect-carefully BrowserMatch «^WebDrive» redirect-carefully BrowserMatch «^WebDAVFS/1.[0123]» redirect-carefully BrowserMatch «^gnome-vfs/1.0» redirect-carefully BrowserMatch «^XML Spy» redirect-carefully BrowserMatch «^Dreamweaver-WebDAV-SCM1» redirect-carefully <Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 192.168.146.1 </Location> <Location /server-info> SetHandler server-info Order deny,allow Deny from all Allow from 192.168.146.1 </Location> # === Virtual Hosts section === NameVirtualHost *:80 NameVirtualHost *:443

Модуль 8. Apache.

101


<Directory /var/sites/> AllowOverride All Options All </Directory> <VirtualHost *:80> ServerAdmin support@company.ru DocumentRoot /var/sites/company.ru/html ServerName company.ru ServerAlias www.company.ru DirectoryIndex index2.php ScriptAlias /cgi-bin/ /var/sites/company.ru/html/cgi-bin/ ErrorLog /var/sites/company.ru/html/logs/error_log CustomLog /var/sites/company.ru/html/logs/access_log common RewriteLog /var/sites/company.ru/rewrite.log RewriteLogLevel 1 </VirtualHost> <VirtualHost *:443> SSLEngine on SSLCertificateKeyFile /etc/httpd/conf.d/server.key SSLCertificateFile /etc/httpd/conf.d/server.crt ServerAdmin support@company.ru DocumentRoot /var/sites/company.ru/html ServerName company.ru ServerAlias www.company.ru DirectoryIndex index2.php ScriptAlias /cgi-bin/ /var/sites/company.ru/html/cgi-bin/ ErrorLog /var/sites/company.ru/html/logs/error_log CustomLog /var/sites/company.ru/html/logs/access_log common RewriteLog /var/sites/company.ru/rewrite.log RewriteLogLevel 1 </VirtualHost>

Резюме Мы установили и настроили наш веб-сервер. Разобрались с ключевым моментами: Установка Apache; Настройка Apache; Полностью разобрали конфигурационный файл httpd.conf;

102

Модуль 8. Apache.


Разобрались с опциями в директивах AllowOverride и Options; Виртуальные хосты; Аутентификация; .htaccess .htpasswd SSL; server-status и server-info; SSI; CGI; mod_rewrite; также, получили много другой полезной информации.

Домашнее задание Домашним заданием будет установить Apache и пройтись по всему функционалу описанному в этом модуле.

Модуль 8. Apache.

103


SAMBA Что такое SAMBA и зачем она нужна ? Samba – это программа позволяющая обращаться к сетевым дискам по протоколу SMB/CIFS из разных операционных систем.

Возможности SAMBA • обеспечение доступа к Linux-разделам Windows-клиентам; • обеспечение доступа к Windows-разделам Linux-клиентам; • совместное использование принтеров подключенных к Linux-системе Windows-клиентами; • совместное использование принтеров подключенных к Windows-системе Linux-клиентами; • Средства авторизации и аутентификации. Одним словом система, которая позволит сделать файл-сервер и принтсервер.

Установка Устанавливаем SAMBA # yum -y install samba Добавляем в автозагрузку # chkconfig smb on

Типы аутентификации Прежде чем мы приступим к настройке, важно будет узнать какие способы аутентификации есть в SAMBA. Это наверно самый главный параметр в ней, который описывает способ получения доступа к ресурсам сервера. ADS – samba является членом домена Active Directory. Необходимо поставить Kerberos чтобы использовать этот режим. Domain – samba полагается на информацию от Primary или Backup Domain Controller. Поступающие к ней пароли и логины она направляет к контроллеру и ждет пока тот проверит, есть ли такой пользователь в домене или нет.

104

Модуль 9. SAMBA.


Server – samba пытается проверить валидность пользователя направляя его учетные данные на проверку другому Samba-серверу. Если это невозможно то пытается использовать режим доступа User. Share – свободный доступ на Samba-сервер. Пароль не запрашивается пока пользователь не попытается попасть в какую либо специфичную область файловой системы на которую стоит ограниченный режим доступа. User – используется по умолчанию. Аутентификация происходит на уровне SAMBA-сервера. Нужно создать системную учетную запись а потом связать ее с учетной записью SAMBA.

Ключевые файлы /etc/samba/smb.conf Главный конфигурационный файл и все настройки задаются здесь; /etc/samba/smbusers Файл в котором можно залинковать Windowsпользователя на UNIX-пользователя, например чтобы понять при подключение Windowsпользователя кто он будет на SAMBA-сервере. Еще одно назначение – это линковка многих windowsпользователей на одного UNIX-пользователя, в этом случае все действия в системе будут производится от его лица и с его правами доступа; /etc/samba/lmhosts Похож на /etc/hosts только занимается резолвингом NetBIOS имен; /usr/bin/smbpasswd Программа создания учетных записей SAMBA. Популярный ключи: -a добавляем пользователя (он уже должен быть в системе); -e включаем его учетную запись (по умолчанию отключена); -x удаляем пользователя из базы данных SAMBA (системный пользователь остается на месте); SAMBA-клиент, позволяет подключаться к SAMBA/usr/bin/smbclient ресурсам из командной строки (после того как подключитесь наберите help для вывода возможных действие, help <command> - более подробное описание команды); /usr/bin/smbcontrol Позволяет отсылать команды smbd и nmbd; / u s r / s h a r e / d o c / Документация. samba-3.0.33 Модуль 9. SAMBA.

105


Структура конфигурационного файла Файл smb.conf состоит из нескольких секций. Первая секция – [global] в ней описываются глобальный параметры, они указывают SAMBA-серверу как нужно функционировать. Далее идут секции описывающие доступные ресурсы. Графически структуру файла можно изобразить так: [global] ... [share1] ... [share2] ... [shareN] ...

Пример конфигурационного файла В этой примере я покажу как создать типовую конфигурацию без использования Active Directory. SAMBA-сервер будет служить файл-серверов для Windows-клиентов. Описанные нами ресурсы будут иметь различные способы доступа к себе, вы сможете выбрать удобные для себя. Доступ будет ограничен определенной сетью. [global] workgroup = OFFICE server string = Samba Mega Server %v bind interfaces only = yes interfaces = eth0 192.168.146.0/24 hosts deny = ALL hosts allow = 192.168.146. 127.0.0.1 # --------------------------- Logging Options ----------------------------log file = /var/log/samba/%m.log # max 50KB per log file, then rotate max log size = 1024 # ----------------------- Standalone Server Options --------------------security = user encrypt passwords = yes socket options = TCP_NODELAY SO_SNDBUF=8192 SO_RCVBUF=8192 IPTOS_LOWDELAY # ----------------------- Browser Control Options -----------------------local master = yes os level = 255 preferred master = yes

106

Модуль 9. SAMBA.


# ----------------------------- Name Resolution ----------------------------dns proxy = yes # ------------------------------Charsets---------------------------------------unix charset = utf8 dos charset = cp1251 display charset = cp1251 # --------------------------- Printing Options -------------------------------load printers = yes cups options = raw printcap name = /etc/printcap printing = cups # ----------------------------Share Definitions -----------------------------[home] comment = Home Directories path = /home/%u browseable = yes writable = yes [private] comment = Private Directory path = /home/private browseable = yes writable = yes valid users = bestuser [public] comment = Public Stuff path = /home/public browseable = yes writable = yes guest ok = yes [printers] comment = All Printers path = /var/spool/samba browseable = yes guest ok = yes writable = no printable = yes

Описание конфигурационного файла workgroup server string bind interfaces only

Модуль 9. SAMBA.

Название рабочей группы; Определяет название сервера, переменная %v содержит версию SAMBA-сервера; В целях безопасности мы включаем режим ограничения обработки запросов SAMBA только определенными сетевыми интерфейсами;

107


interfaces hosts deny hosts allow

log file max log size security encrypt passwords socket options local master

os level

preferred master

Здесь мы указываем разрешенные интерфейсы и сети; Запрещаем доступ всем хостам; Разрешаем доступ только из доверенных сетей. Такая политика доступа используется во многих технологиях, мы сначала запрещаем доступ всем а потом разрешаем нужным нам сетям или IPадресам. Это куда проще, чем запретить доступ всем кому мы не хотим давать доступ (по сути весь Интернет); Задает расположение log-файла; Размер log-файла в килобайтах, после достижения максимального размера произойдет ротация; Способ аутентификации на SAMBA-сервере; Все пароли шифруются; Некоторые опции для тюнинга соединений; Если установлено в “yes” то разрешает SAMBAсерверу попытаться стать мастер браузером в своей сети. Мастер браузер получает анонсы от компьютеров и доменов, высылает browse list на запросы клиентов; Целое число до 255, чем оно больше тем больше шансов что SAMBA-сервер станет мастер браузером. По умолчанию SAMBA выигрывает “выборы” мастер браузера у всех ОС Windows кроме Windows NT 4.0/2000 контроллера домена; Значение “yes” дает небольшое преимущество в “выборах” мастер браузера;

dns proxy

Пытаться резолвить NetBIOS имена через DNS или нет? Обратите внимание, что NetBIOS имя ограничено 15 символами, так что DNS имя не может быть более 15 символов;

unix charset dos charset display charset load printers

Опции отвечают за нормальное перекодирование имен файлов;

cups options

108

Загружать ли принтеры указанные в /etc/printcap для отображения в списке ресурсов; Здесь можно перечислить специфичные опции CUPS, посмотреть список доступных можно с помощью команды lpoptions -d <printername> -l Модуль 9. SAMBA.


printcap name printing [home] comment = ... path = /home/%u browseable = yes writable = yes

[private] comment = ... path = /home/private browseable = yes writable = yes valid users = bestuser [public] comment = ... path = /home/public browseable = yes writable = yes guest ok = yes [printers] comment = ... path = /var/spool/samba browseable = yes guest ok = yes writable = no printable = yes

Расположение printcap-файла; Используемая система печати; comment – это комментарий к ресурсу, path – это путь к ресурсу в файловой системе, в данном случае мы хотим давать доступ к домашнему каталогу пользователя, при аутентификации он попадет именно в свой каталог, вместо переменной %u будет подставлен его логин, browseable – отображать ли ресурс в списке доступных ресурсов, writeable – можно ли записывать и удалять файлы на ресурсе; Личный каталог пользователя bestuser, только он сюда сможет попасть;

Это общая share, сюда может попасть любой анонимный пользователь (guest ok = yes) из разрешенной сети (192.168.146.0/24) Не забудьте сделать chmod 777 на публичный каталог, чтобы все могли записывать в него;

Секция описывающая доступные принтеры, browseable- принтер можно увидеть в списке доступных ресурсов, guest ok - его может использовать анонимный пользователь, writeable - право на запись не нужно так как это принтер, printable - можно ли печатать на принтере;

После того как файл конфигурации подготовлен его желательно проверить на корректность командой testparm # testparm Load smb config files from /etc/samba/smb.conf Processing section «[home]» Processing section «[private]» Модуль 9. SAMBA.

109


Processing section «[public]» Processing section «[printers]» Loaded services file OK. Server role: ROLE_STANDALONE Press enter to see a dump of your service definitions ... Теперь нужно создать SAMBA-пользователей. Дело в том, что SAMBA использует свою базу аккаунтов пользователей но в ее работе нужно чтобы существовали и системные пользователи тоже. То есть чтобы завести SAMBAаккаунт сперва нужно создать системного пользователя командой useradd а потом “связать” его с SAMBA. Все это сделано с целью масштабировать SAMBA, ведь в этом случае возможно создавать достаточно сложные конфигурации с использование стандартных механизмов UNIX, такие как права пользователей и группы. Ладно приступим. Создаем системного пользователя # useradd bestuser Задаем пароль пользователю. Внимание! Если вы создаете аккаунт только для того чтобы он пользовался SAMBA то имеет смысл закрыть ему прямой доступ в систему задав в качестве shell /sbin/nologin в /etc/passwd Тогда пользователь будет ограничен только возможностью использования SAMBA # passwd bestuser Теперь самый животрепещущий момент! “Связываем” системный аккаунт с аккаунтом SAMBA, который создается после выполнения этой команды # smbpasswd -a bestuser Включаем учетную запись SAMBA (по умолчанию отключена) # smbpasswd -e bestuser Теперь можно проверить работоспособность прямо из командной строки # smbclient //192.168.146.132/home -U bestuser Password: Domain=[LOCALHOST] OS=[Unix] Server=[Samba 3.0.33-3.7.el5] smb: \> Все работает! Теперь можно подключиться из Windows, Пуск - > Выполнить -> \\192.168.146.132

110

Модуль 9. SAMBA.


Проверим состояние с помощью smbstatus # smbstatus -p Samba version 3.0.33-3.7.el5 PID

Username

Group

Machine

------------------------------------------------------------------11241 bestuser

bestuser

main

(192.168.146.1)

Похоже на правду! В public мы зайдем без паролей, так как это публичная файлопомойка, чтобы зайти в home вводим свои учетные данные и попадаем в свой личный домашний каталог а вот каталог private будет доступен только пользователю bestuser. Аккаунты SAMBA-пользователей находятся в /etc/samba/smbpasswd

SWAT – веб-интерфейс к SAMBA # yum -y install samba-swat Редактируем /etc/xinet.d/swat • Меняем “disable = yes” на “disable = no” тем самым включаем службу • В строке ”only_from = 127.0.0.1.” вместо 127.0.0.1 нужно указать IP-адрес с которого будете подключаться Перезагружаем xinetd # service xinetd restart Получаем доступ к нашему веб-интерфейсу http://192.168.146.132:901 Для входа используем учетную запись root, на закладке PASSWORD можно добавить еще пользователей. Через веб-интерфейс можно полностью управлять SAMBA-сервером.

Резюме Мы выяснили что такое SAMBA и как ее использовать. Есть множество способов аутентификации, но мы использовали классические – на базе системных аккаунтов.

Домашнее задание Установить и настроить SAMBA и проверить работоспособность с Windowsклиента. Модуль 9. SAMBA.

111


DHCPD Dynamic Host Configuration Protocol – протокол динамической конфигурации хоста. Протокол позволяет получать сетевые реквизиты по сети хостам из сетей которые DHCP-сервер обслуживает. Но это не единственное на что он способен, благодаря DHCP-серверу (в связке с дополнительным ПО) можно осуществлять установку ОС по сети и загрузку бездисковых станций (тонких клиентов).

Принцип работы Принцип получения IP-адреса с помощью DHCP-сервера можно разделить на 4 этапа:

1. Клиент выполняет широковещательный запрос в своей сети на адрес 255.255.255.255 с целью обнаружения DHCP-сервера. Запрос представляет из себя UDP-пакет с сообщением типа DHCPDISCOVER. Адрес источника содержит 0.0.0.0 так как клиент еще не получил IP-адрес; 2. Получив сообщение от клиента, DHCP-сервер просматривает свою конфигурацию чтобы определить настройки для клиента. После этого DHCP-сервер отправляет клиенту сообщение DHCPOFFER, в котором предлагает конфигурацию. Предлагаемый клиенту IP-адрес находится в поле yiaddr, другие опции в разделе options пакета. Сообщение отсылается широковещательно и если в сети несколько DHCP-серверов то клиент может выбрать наилучший ответ для себя из предложенных вариантов;

112

Модуль 10. DHCPD.


3. Выбрав для себя конфигурацию, клиент широковещательно отправляет сообщение DHCPREQUEST содержащим идентификатор DHCP-сервера; 4. DHCP-сервер подтверждает запрос, отправляя клиенту сообщение DHCPACK. После этого клиент должен применить полученные настройки к своему сетевому интерфейсу.

Установка DHCPD # yum -y install dhcp # chkconfig dhcpd on

Настройка DHCPD

Файлы конфигурации /etc/dhcpd.conf /usr/share/doc/dhcp-3.0.5/ /usr/sbin/dhcpd /usr/sbin/dhcrelay

/etc/rc.d/init.d/dhcpd /etc/rc.d/init.d/dhcrelay /var/lib/dhcpd/dhcpd.leases /etc/sysconfig/dhcpd

Файл конфигурации DHCPD; Документация; DHCP daemon, бинарный файл; DHCP Relay, предназначен для перенаправления запросов DHCP или BOOTP из сети где нет DHCP-сервера в сеть где он есть; Скрипты автоматизации запуска (с помощью chkconfig инсталлируются в /etc/init.d/); Файл в котором сохраняется информация о выданных IP-адресах; Файл аргументов.

DHCPD настраивается в файле /etc/dhcpd.conf который сразу после установки скорее всего будет пустым. Нужно скопировать файл-шаблон на его место и отредактировать под свои задачи. # cp /usr/sha re/doc/dhcp-3.0.5/dhcpd.conf.sample /etc/dhcpd.conf Конфигурационный файл /etc/dhcpd.conf ф ур ц ф p ddns-update-style interim; ignore client-updates; authoritative; subnet 192.168.146.0 netmask 255.255.255.0 { range 192.168.146.140 192.168.146.160;

Модуль 10. DHCPD.

113


option routers option subnet-mask option broadcast-address option ntp-servers option domain-name option domain-name-servers

192.168.146.2; 255.255.255.0; 192.168.146.255; 192.168.146.2; «fasttech.ru»; 192.168.146.2;

option ip-forwarding off; default-lease-time 86400; max-lease-time 86400; Allow bootp; Allow booting; host linuxbox { hardware ethernet 00:0C:29:77:9C:9C; fixed-address 192.168.146.150; # filename «pxelinux.0»; option subnet-mask 255.255.255.0; option routers 192.168.146.2; option domain-name «fasttech.ru»; option host-name «dhcphost»; # next-server 192.168.146.130; } }

# service dhcpd start

Описание опций из dhcpd.conf ddns-update-style interim; Рекомендуемая схема обновления DNS; ignore client-updates; Игнорировать все клиентские запросы DDNS обновлений (Dynamic DNS). DDNS позволяет в реальном времени изменять доменную запись для хоста IP-адрес которого постоянно изменяется; authoritative; Обычно DHCP сервер предполагает что конфигурационная информация описывающая сегмент сети правильна и “авторитетна”. Так что если клиент запрашивает IP адрес и сервер знает что этот адрес не правилен, то сервер ответит клиенту сообщением DHCPNAK, что является предложением клиенту отказаться от этого адреса и запросить новый;

114

Модуль 10. DHCPD.


subnet 192.168.146.0 netmask 255.255.255.0 {...} range 192.168.146.140 192.168.146.160; option routers

Начало секции настроек для определенной подсети; IP-адреса будут динамически выделяться из этого диапазона; Шлюз по умолчанию который будет назначаться клиентским компьютерам; option subnet-mask Маска назначаемая клиентам; option broadcast-address Broadcast-адрес который будет назначаться клиентским компьютерам; option ntp-servers NTP-сервер (Network Time Protocol) для клиента; option domain-name Домен в котором будут расположены клиентские компьютеры (если домен - fasttech. ru а hostname - dhcphost то полное имя (FQDN) будет dhcphost.fasttech.ru); option domain-name- DNS-сервера которые будут предоставлены servers клиентам для резолвинга; option ip-forwarding off ; Не перенаправлять DHCP запросы с одного сетевого интерфейса на другой; default-lease-time 86400; Время на которое выдается IP-адрес если клиент не указал другое. Время указывается в секундах; max-lease-time 86400; Максимальное время на которое может выдаваться IP-адрес; Allow bootp; Разрешать обрабатывать запросы BOOTP (протокол который позволяет получить IPадрес клиенту, сегодня на его смену пришел DHCP предоставляющий больше возможностей и более сложный сам по себе). По умолчанию разрешено; Allow booting; Разрешать обрабатывать запросы конкретного клиента. По умолчанию разрешено; Host linuxbox {...} Секция описывающая настройки конкретного хоста; MAC-адрес сетевой карты клиента; hardware ethernet Какой IP-адрес назначить сетевой карте с fixed-address указанным выше MAC-адресом, IP-адрес будет постоянно закреплен за этим MAC`ом; filename «pxelinux.0»; Файл начальной загрузки, используется для сетевой загрузки и установки по сети, приведен для примера. Подробнее в модуле “Install-server”; Модуль 10. DHCPD.

115


option host-name next-server

Указание имени клиента, его hostname; Указание TFTP-сервера, что нужно при загрузке по сети (тонкие клиенты, установка по сети).

В файле конфигурации есть два типа операторов – параметры и объявления. Как понятно из названия, параметры – это параметры задаваемые для клиентов. Некоторые параметры начинаются с option, что означает что они не обязательные. Про объявления давайте поговорим подробнее.

Секции-объявления Структуру конфигурационного файла dhcpd.conf можно представить как набор секций. Каждая секция несет в себе определенную роль. Секции могут быть вложенными. Задаваемые параметры могут быть глобальными или приватными, для одного хоста или группы хостов.

shared-network Секция shared-network сообщает серверу DHCP, что несколько IP-подсетей используют один физический сегмент. Каждая подсеть в такой сети объявляется внутри секции shared-network. shared-network имя { [ параметры ] [ объявления ] } Пример: shared-network MyBigNetwork { shared-network-specific parameters... subnet 192.168.146.0 netmask 255.255.255.224 { subnet-specific parameters... range 192.168.146.10 192.168.146.20; } subnet 192.168.146.32 netmask 255.255.255.224 { subnet-specific parameters... range 192.168.146.35 192.168.146.60; } }

116

Модуль 10. DHCPD.


subnet Секция используется для предоставления информации DHCP-серверу о том, принадлежит ли данный IP-адрес указанной подсети или нет. Также она позволяет задать специфичные параметры для подсети. subnet subnet-number netmask netmask { [ параметры ] [ объявления ] } Пример: subnet 192.168.146.0 netmask 255.255.255.0 { range 192.168.146.140 192.168.146.160; option routers option subnet-mask

192.168.146.2; 255.255.255.0;

option broadcast-address

192.168.146.255;

option domain-name

«fasttech.ru»;

}

range g Для любой подсети адреса которой присваиваются динамически, должен быть указан хотя бы один диапазон с помощью секции range. В параметрах указывается начальный и конечный адреса диапазона. Все IP адреса в диапазоне должны принадлежать той подсети к описанию которой относится секция range. Параметр dynamic-bootp указывается в случае, если предполагается назначать адреса из диапазона клиентам по протоколу BOOTP. Если указан только один адрес, то параметр конец диапазона может быть опущен. range [ dynamic-bootp ] начало_диапазона [ конец_диапазона]; Пример: range 192.168.146.35 192.168.146.60; Модуль 10. DHCPD.

117


host Секция host позволяет назначить индивидуальные параметры хосту. Если необходимо за каждым хостов закрепить определенный IP-адрес то секция host как раз для этого. host имя_хоста { [ параметры ] [ объявления ] } Пример: host linuxbox { hardware ethernet 00:0C:29:77:9C:9C; fixed-address 192.168.146.150; }

g p group Секция group используется для присвоения одного или нескольких параметров группе объявлений. Параметры могут быть одновременно присвоены группе секций hosts, shared networks, subnets, или даже group. group { [ параметры ] [ объявления ] } Пример: group { filename «pxelinux.0»; next-server 192.168.146.132; host thinclient1 { hardware ethernet 0:f0:a3:49:2b:27; } host thinclient2 { hardware ethernet 0:f0:a3:30:fc:22; } host thinclient3 { hardware ethernet 0:f0:a3:12:46:61; } }

118

Модуль 10. DHCPD.


Типы пакетов протокола DHCP DHCPDISCOVER Широковещательный запрос клиента при первоначальном поиске сервера, может содержать желаемый для получения IP адрес и время аренды; DHCPREQUEST

Широковещательный ответ на DHCPOFFER (должен содержать идентификатор сервера), либо запрос на возобновление аренды адреса после перезагрузки клиента или истечения предыдущего интервала аренды;

DHCPDECLINE

Ответ на DHCPOFFER с отказом принять адрес (например, клиент выяснил с помощью ARP или ICMP, что адрес занят), клиент начинает всё с начала;

DHCPRELEASE

Освобождение адреса;

DHCPINFORM

Клиент получил адрес с помощью другого механизма и нуждается только в параметрах;

DHCPOFFER

Ответ на DHCPDISCOVER, поле yiaddr содержит предлагаемый адрес (он пока не зарезервирован!);

DHCPACK

Согласие на выделение адреса по DHCPREQUEST или DHCPINFORM (в этом случае сервер не проверяет допустимость адреса), клиент может пользоваться им оговоренное время;

DHCPNAK

Отказ на выделение адреса по DHCPREQUEST (например, в промежутке между DHCPOFFER и DHCPREQUEST адрес был выделен другому), клиент начинает всё с начала.

Используемые порты DHCP server ожидает запросы на порту 67 UDP DHCP client ожидает ответы на порту 68 UDP

DHCP-клиент Для того чтобы получать сетевые настройки с помощью DHCP-сервера необходимо убедиться, что в настройках сетевого интерфейса есть следующее: # cat /etc/sysconfig/network-scripts/ifcfg-eth0 Модуль 10. DHCPD.

119


DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes

Резюме Мы разобрали работу DHCP. Как видно настройка является простой и нечто большее требуется очень редко. DHCP-сервер также будет использоваться в модуле посвященном Install-серверу.

Домашнее задание Настроить свой DHCP-сервер и попробовать динамически получить сетевые реквизиты для какого-нибудь клиента в той же сети.

120

Модуль 10. DHCPD.


MySQL MySQL – самая известная и популярная СУБД (Система управления базами данных). Высокая популярность тесно взаимосвязана с бесплатностью продукта. Но по возможностям она не уступает платным аналогам, таким как Oracle или IBM DB2. Я даже знаю многие компании где помимо Oracle для менее официальных задач используют MySQL и она отлично справляется! На позиции системного администратора/инженера знать MySQL никто не заставляет. Для этого есть целых две должности — разработчик БД и администратор БД. Чем занимается и первый, и второй я думаю понятно из названия. Но если все же освоить эту тему то это будет только ощутимым плюсом в вашем резюме. Меня очень часто спрашивали на собеседованиях, знаю ли я MySQL. Причем обычно требовалось знание только основ и опыт написания простых запросов. В большинстве случаев этого достаточно. Помните закон Парето ? Вот-вот, 20% знаний о MySQL покроют 80% ваших потребностей в этой технологии. Так давайте получим их.

Принцип работы Раньше все данные хранились в обычных текстовых файлах. Но со временем, объем информации с которым стали работать становился все больше и больше. Появилась необходимость в получение к ней быстрого и удобного доступа. Появилась необходимость структурировать большой объем данных и производить там поиск. MySQL — это клиент-серверное приложение. То есть где-то запущена программа-сервер а вы как клиент подключаетесь к ней, делаете специально сформированный запрос и получаете результат в виде набора данных.

Данные в базе хранятся в двухмерном массиве, примерно вот так, как в примере ниже. Имя Фамилия Телефон Александр Иванов 111-22-33 Федор Емельянин 222-33-11 Сергей Петров 333-22-11 И подобных данных может быть очень много. Запросы к базе осуществляются с помощью SQL-запросов. Модуль 11. MySQL.

121


SQL(Structured Query Language) — язык структурированных запросов, не путать с СУБД. Принцип работы с БД прост. Создается база данных, в ней создаются таблицы с нужными типами данных и размерами. Таблицы заполняются данными. Далее к ним делают запросы, чтобы извлечь, добавить, модифицировать или удалить данные. Для однозначного определения строки в таблице используется так называемый первичный ключ. Обычно это номер, который уникален для каждой записи. Обозначается он как PRIMARY KEY. Команды принято набирать заглавными буквами.

Пример роли MySQL в информационном пространстве

СИС – это справочно-информационная система, по сути это обычно вебсайт, данные которого хранятся в базе MySQL.

Типы данных Все данные хранятся в определенном формате, который принято называть типом данных. Типы данных бывают разные, числовые – хранят числа, строковые – хранят наборы символов (слова, целые предложения) и

122

Модуль 11. MySQL.


бинарные – хранят бинарные данные, такие как графические картинки. Тип данных нужно выбирать исходя из своих потребностей.

Числа TINYINT – очень маленькое целое число, может быть от -128 до 127 или от 0 до 255 SMALLINT – малое целое число, может быть от -32768 до 32767 или от 0 до 65535 MEDIUMINT – целое число среднего размера, может быть от -8388608 до 8388607 или от 0 до 16777215 INT – целое число нормального размера, может быть от -2147483648 до 2147483647 или от 0 до 4294967295 BIGINT – большое целое число, может быть от -9223372036854775808 до 9223372036854775807 или от 0 до 18446744073709551615 FLOAT – малое число с плавающей точкой обычной точности. Может быть от -3.402823466E+38 до -1.175494351E-38, 0, и от 1.175494351E-38 до 3.402823466E+38. DOUBLE - число с плавающей точкой удвоенной точности нормального размера. Может быть от -1,7976931348623157E+308 до -2,2250738585072014E308, 0, и от 2,2250738585072014E-308 до 1,7976931348623157E+308

Символы CHAR – до 255 символов, пустота заполняется пробелами VARCHAR – строка переменной длины, для хранения величин типа VARCHAR используется только то количество символов, которое нужно + 1 байт для хранения информации о длине

Бинарные р данные BLOB – этот тип данных содержит бинарные данные, например графические картинки. Максимальная размер BLOB – 65535 байт. MEDIUMBLOB – тоже самое что и BLOB, только максимальный размер 16,777,215 байт (16 МБ) LONGBLOB – бинарный тип, размер до 4 Гб.

Тип данных для хранения р даты и времени р DATE – поддерживает диапазон от '1000-01-01' до '9999-12-31' Модуль 11. MySQL.

123


DATETIME – содержит комбинацию даты и времени. Может быть от '1000-0101 00:00:00' до '9999-12-31 23:59:59' TIMESTAMP – содержит время в секундах начиная с 1970-01-01. Может быть от '1970-01-01 00:00:01' UTC до '2038-01-09 03:14:07' UTC TIME – Время. Диапазон от '-838:59:59' до '838:59:59' YEAR[(2|4)] – год в двухзначном или четырехзначном формате. В четырехзначном может быть от 1901 до 2155, и 0000. В двухзначном может быть от 70 до 69, воспроизводя даты от 1970 до 2069.

Сколько нужно места под хранение типа данных ? Числа Тип д данных TINYINT SMALLINT MEDIUMINT INT, INTEGER BIGINT FLOAT(p) FLOAT DOUBLE [PRECISION], REAL

Сколько нужно у места д для хранения р 1 байт 2 байта 3 байта 4 байта 8 байт 4 байта если 0 <= p <= 24, 8 байт если 25 <= p <= 53 4 байта 8 байт

Даты и время Д р Тип данных DATE TIME DATETIME TIMESTAMP YEAR

Сколько нужно места 3 байта 3 байта 8 байт 4 байта 1 байт

Строки р и бинарный р тип Тип данных CHAR VARCHAR

124

Сколько нужно места M × w байт, 0 <= M <= 255, где w – нужное число байт для объекта L + 1 байт если значение требует до 255 байт, L + 2 байт если требуется больше чем 255 байт Модуль 11. MySQL.


BLOB MEDIUMBLOB LONGBLOB

L + 2 байт, где L < 216 L + 3 байт, где L < 224 L + 4 байт, где L < 232

M – декларированная длина ячейки, L – актуальная длина ячейки Лучший источник о типах данных в MySQL 5.0 – это конечно же официальная документация: http://dev.mysql.com/doc/refman/5.0/en/data-types.html

Практика Начнем осваивать MySQL но для начала поставим нужное ПО. # yum -y install mysql-server Теперь проверим статус базы # /etc/init.d/mysqld status mysqld is stopped База в выключенном состояние. Давайте ее запустим в первый раз. # chkconfig mysqld on # /etc/init.d/mysqld start Initializing MySQL database: Installing MySQL system tables... OK Filling help tables... OK To start mysqld at boot time you have to copy support-files/mysql.server to the right place for your system PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands: /usr/bin/mysqladmin -u root password 'new-password' /usr/bin/mysqladmin -u root -h centos52 password 'new-password' See the manual for more instructions. Модуль 11. MySQL.

125


You can start the MySQL daemon with: cd /usr ; /usr/bin/mysqld_safe & You can test the MySQL daemon with mysql-test-run.pl cd mysql-test ; perl mysql-test-run.pl Please report any problems with the /usr/bin/mysqlbug script! The latest information about MySQL is available on the web at http://www.mysql.com Support MySQL by buying support/licenses at http://shop.mysql.com [ OK ] Starting MySQL:

[ OK ]

Запуская впервые БД мы увидели предупреждение о необходимости установить административный пароль. Попробуем получить доступ в интерфейс mysql без пароля. # mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.0.45 Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> Мы без проблем попали внутрь и можем делать что хотим! Думаю вам не захочется чтобы кто-то еще получил доступ к Вашим данным. Поэтому мы сейчас поставим административный пароль. # /usr/bin/mysqladmin -u root password ‘the_secret’ Готово. Проверяем что изменилось. # mysql

126

Модуль 11. MySQL.


ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) Ошибка доступа! Это хорошо, это означает что уже не любой сможет попасть в базу. Теперь зададим команду mysql с ключом -p, То есть запросим строку ввода пароля, ключ -u позволяет задать пользователя под которым мы хотим зайти. Но если ключ не задан будет использован root, То есть администратор сервера. # mysql -p <вводим наш пароль на MySQL, который мы ввели выше> Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 5.0.45 Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> Выполним команду status, ее можно ввести сокращенно, То есть так: \s Она нам покажет различную информацию о MySQL. mysql> \s -------------mysql Ver 14.12 Distrib 5.0.45, for redhat-linux-gnu (i686) using readline 5.0 Connection id:

12

Current database: Current user: SSL:

root@localhost Not in use

Current pager:

stdout

Using outfile:

''

Using delimiter:

;

Server version:

5.0.45 Source distribution

Protocol version:

10

Модуль 11. MySQL.

127


Connection:

Localhost via UNIX socket

Server characterset: latin1 Db

characterset:

latin1

Client characterset: latin1 Conn. characterset: latin1 UNIX socket:

/var/lib/mysql/mysql.sock

Uptime:

19 min 51 sec

Threads: 1 Questions: 26 Slow queries: 0 Opens: 12 Flush tables: 1 Open tab les: 6 Queries per second avg: 0.022 -------------mysql> Выход из монитора MySQL выполняется командой quite или просто \q Справка по командам — команда help или просто \h Посмотрим какие базы данных у нас есть mysql> show databases; +-------------------------+ | Database

|

+-------------------------+ | information_schema | | mysql

|

| test

|

+-------------------------+ 3 rows in set (0.00 sec) Эти три базы стандартные, они всегда есть в новой инсталляции MySQL. Базу test можно удалить, это делается командой DROP DATABASE mysql> DROP DATABASE test; Query OK, 0 rows affected (0.00 sec)

128

Модуль 11. MySQL.


Отлично мы поставили MySQL, задали на нее административный пароль, научились заходить и поняли как выполнять там команды. Продолжим. Лучше всего обучение происходит на практике. Давайте поставим задачу. Создадим базу данных, создадим в ней две таблицы, занесем в них данные, создадим пользователя и сделаем его владельцем этой базы. Ну и в конце сделаем несколько SQL-запросов. Создаем базу данных company, это делается командой CREATE DATABASE mysql> CREATE DATABASE company; Query OK, 1 row affected (0.00 sec) Воспользовавшись командой \s мы заметим что поле Current database: является пустым. В этом поле отображается текущая база данных. Выбрав какую-то базу мы можем производить в ней манипуляции, например просматривать структуру таблиц и делать запросы. Выберем нашу базу данных в качестве текущей, это делается командой USE mysql> USE company; Database changed Просмотрим содержимое базы а именно ее таблицы mysql> show tables; Empty set (0.00 sec) Пока пусто, исправим это. Создадим таблицу с сотрудниками нашей компании mysql> CREATE TABLE users ( id INT(5) AUTO_INCREMENT PRIMARY KEY, name VARCHAR(64), surname VARCHAR(64), age TINYINT(3), email VARCHAR(64), status VARCHAR(128)) DEFAULT CHARACTER SET UTF8; Query OK, 0 rows affected (0.01 sec) Отлично. Проверим, действительно ли таблица была создана. Модуль 11. MySQL.

129


Проверим, правильно ли описана наша таблица. Структуру таблицы можно посмотреть командой DESCRIBE

Таблица готова, теперь ее нужно заполнить. mysql> INSERT INTO users VALUES('', 'Ivan', 'Petrov', '25', 'petrov@company.ru', 'work'); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> INSERT INTO users VALUES('', 'Sergey', 'Malevin', '29', 'serg@company.ru', 'tourism'); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> INSERT INTO users VALUES('', 'Fyodor', 'Karpin', '27', 'fyodor@company.ru', 'work'); Query OK, 1 row affected, 1 warning (0.01 sec)

Файл как источник запросов Внимание! Вы можете все свои запросы к базе поместить в файл а потом выполнить его в помощью команды SOURCE. Создадим файл sourcefile.sql и поместим туда все наши запросы INSERT. Сам файл расположен в /root. mysql>USE company;

130

Модуль 11. MySQL.


mysql> SOURCE /root/sourcefile.sql; Query OK, 1 row affected, 1 warning (0.00 sec) Query OK, 1 row affected, 1 warning (0.00 sec) Query OK, 1 row affected, 1 warning (0.00 sec) Мы добавили три записи в таблицу, теперь давайте посмотрим что получилось. Выборку из базы данных можно сделать командой SELECT <что нам нужно> FROM <название таблицы>. Мы сделаем выборку всего что есть в таблице.

То, что нужно! Мы создали поле id и поставили на него AUTO_INCREMENT, то есть при вводе каждой новой записи значение id будет увеличиваться на единицу. Сделаем запрос с условием. Нам нужно узнать кто сейчас работает. Условие можно задать командой WHERE. Сегодня наш коллега Сергей вернулся из отпуска, нужно это отобразить в БД.

Модифицировать данные можно командой UPDATE. Мы указываем в какой таблице будем делать изменения, далее через условие WHERE мы находим нужного нам сотрудника по фамилии или другому параметру, который позволит однозначно определить его. Модуль 11. MySQL.

131


mysql> UPDATE users SET status='work' WHERE surname='Malevin'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0

Все получилось. Теперь удалим запись из таблицы. К примеру Федор Карпин больше не работает в нашей компании. mysql> DELETE from users WHERE surname='Karpin'; Query OK, 1 row affected (0.00 sec)

Вернем пока что Федора на место, все таки 3 – хорошее число и посчитаем количество записей в нашей таблице, это бывает необходимым.

Пользователи и привилегии Теперь про пользователей и права. До этого момента мы работали из под root. Создадим обычного пользователя (admin) и дадим ему некоторые права на базу company и все таблицы в ней (company.*).

132

Модуль 11. MySQL.


mysql> GRANT SELECT, INSERT, DELETE, UPDATE ON company.* TO 'admin'@'localhost' IDENTIFIED BY 'secret'; Query OK, 0 rows affected (0.00 sec) Теперь можно заходить из под него и работать с базой. # mysql -u admin -p mysql> SHOW GRANTS FOR 'admin'@'localhost'; Убрать права можно с помощью команды REVOKE. Убираем возможность удалять записи. mysql> REVOKE DELETE ON company.* FROM 'admin'@'localhost'; Query OK, 0 rows affected (0.00 sec) Замечу, даже если отобрать все права у пользователя он все равно будет в MySQL. Полностью удалить пользователя из базы можно так. # mysql -p mysql> DELETE FROM mysql.user WHERE USER=’admin@localhost’; Query OK, 0 rows affected (0.00 sec)

Саммари по командам и принципу работы Наша база данных расположена в /var/lib/mysql/<название БД> # ls -lh /var/lib/mysql/company/ total 40K -rw-rw---- 1 mysql mysql 65 Feb 21 12:05 db.opt -rw-rw---- 1 mysql mysql 8.6K Feb 21 19:26 users.frm -rw-rw---- 1 mysql mysql 168 Feb 21 20:40 users.MYD -rw-rw---- 1 mysql mysql 2.0K Feb 21 20:40 users.MYI Файлы в бинарном формате и нечего с ними напрямую делать не нужно. Модуль 11. MySQL.

133


Как работать с БД Создаем базу данных с помощью CREATE DATABASE Делаем её текущей с помощью USE Создаем в ней таблицу с помощью CREATE TABLE Заполняем данными с помощью INSERT INTO Работаем с БД Запросы SELECT – делаем выборку INSERT – заносим данные UPDATE – модифицируем данные DELETE – удаляем GRANT – даем привилегии пользователю REVOKE – убираем привилегии у пользователя DROP – удаляет базу или таблицу (DROP DATABASE <название базы> или DROP TABLE <название таблицы>) Команды в мониторе MySQL HELP – хорошая справка по MySQL STATUS – текущий статус MySQL SHOW DATABASES; - вывести весь список БД SHOW TABLES; - вывести список всех таблиц в базе (перед этим делаем базу активной с помощью USE) SHOW PROSESSLIST; - текущие процессы в базе Условие WHERE поможет, когда нужно работать с записями попадающими под конкретное условие

Конфигурационный файл my.cnf До этого момента мы плодотворно поработали с MySQL но даже не притронулись к конфигурационному файлу. Типового файла конфигурации хватает для решения малых и средних задач бизнеса. Как производительность различных баз данных, так и опции в этом файле (связанные с производительностью) не играют роли до определенного момента. Обычно

134

Модуль 11. MySQL.


возникает две ситуации. Малые/средние нагрузки когда вы обслуживаете MySQL. При таком раскладе приходится делать несложные запросы, резервное копирование баз, подключение веб-проектов использующих БД. Настройки не сильно влияют на производительность. И вторая ситуация – большие базы данных и большие нагрузки, скорее всего в этом случае в компании будут специалисты по БД. Вместе с MySQL поставляется пять файлов типовой конфигурации, начать лучше с них и далее корректировать под свои нужды. # find / -name my*.cnf /usr/share/doc/mysql-server-5.0.45/my-huge.cnf /usr/share/doc/mysql-server-5.0.45/my-large.cnf /usr/share/doc/mysql-server-5.0.45/my-small.cnf /usr/share/doc/mysql-server-5.0.45/my-innodb-heavy-4G.cnf /usr/share/doc/mysql-server-5.0.45/my-medium.cnf /usr/share/mysql/my-huge.cnf /usr/share/mysql/my-large.cnf /usr/share/mysql/my-small.cnf /usr/share/mysql/my-innodb-heavy-4G.cnf /usr/share/mysql/my-medium.cnf /etc/my.cnf Рабочий файл конфигурации MySQL – это /etc/my.cnf, все остальные это шаблоны которые можно использовать вместо my.cnf Пожалуй самое главное что стоит сделать – это отключить возможность подключения к БД по сети. Для этого нужно добавить строку skip-networking в /etc/my.cnf Если захочется сделать кодировку в базе cp1251 то в my.cf в секцию [mysqld] добавляем такое: [mysqld] default-character-set=cp1251 init-connect='SET NAMES cp1251'

Модуль 11. MySQL.

135


Забытый пароль администратора Чтобы сбросить пароль администратора выключаем MySQL-сервер и перезапускаем его с опцией --skip-grant-tables #service mysqld stop # mysqld_safe --skip-grant-tables & # mysql mysql>UPDATE mysql.user SET Password=PASSWORD('newpwd') WHERE user='root'; mysql>FLUSH PRIVILEGES; # service mysqld restart Вместо newpwd укажите желаемый пароль.

Резервное копирование Резервное копирование можно делать с помощью mysqldump. Скопируем нашу базу company в файл company.sql

# mysqldump --opt -p company > company.sql

--opt – Тоже самое, что и перечисление --add-drop-table --add-locks –createoptions --disable-keys --extended-insert --lock-tables --quick –set-charset. Рекомендуется использовать.

-p – запрашивает строку пароля для пользователя root, можно указать другого пользователя ключом -u

company – название нашей базы в MySQL

> company.sql – куда записать дамп базы, мы это сделали в company.sql, принято дампам MySQL давать имена с расширением sql

Комментарий: вообще в последних версиях mysqldump опции –add-drop-* добавлять необходимости нет, это происходит автоматически.

136

Модуль 11. MySQL.


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

mysql> DROP DATABASE company; Query OK, 1 row affected (0.06 sec)

Создаем её заново

mysql> CREATE DATABASE company; Query OK, 1 row affected (0.00 sec)

Закачиваем

# mysql -p company < company.sql # mysql -p mysql>USE company;

Все как мы хотели.

Проверка целостности таблиц с помощью myisamchk Иногда база отказывается грузится указывая на ошибки в таблице. Самое время запустить myisamchk. Программа предназначена для профилактики таблиц и послеаварийного восстановления. В качестве аргумента, программе нужно передать MyISAM-таблицу (*.MYI) которую мы хотим проверить. Модуль 11. MySQL.

137


# myisamchk /var/lib/mysql/company/users.MYI Checking MyISAM file: /var/lib/mysql/company/users.MYI Data records: 3 Deleted blocks: 0 - check file-size - check record delete-chain - check key delete-chain - check index reference - check data record references index: 1 - check record links Ключ -r или --recover может исправить практически все, кроме уникальных ключей, в которых есть повторения (ошибка, вероятность которой мизерна для таблиц ISAM/MyISAM). Ключ -o или --safe-recover это старый метод восстановления (читаются подряд все строки и обновляются все деревья индексов на основе найденных строк) метод весьма медлителен, но справляется с несколькими редкими случаями, непосильными для -r

Саммари по myisamchk Ключи -r или -o используются для восстановления таблиц. Рекомендуется использовать ключ -r и если он не помог, использовать -o, который на порядок медленнее работает.

Резюме Мы познакомились с СУБД MySQL, поняли как все устроено и работает. Изучили популярные SQL-запросы, которые наверно используются в 90% случаев если не больше. Это конечно только вершина айсберга, но полученных знаний и навыком достаточно чтобы решать почти любые задачи, которые могут встретиться у владельца сайта или системного администратора. Для более сложных вещей существуют администраторы БД и разработчики БД.

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

138

Модуль 11. MySQL.


Система мониторинга Nagios Nagios – это система мониторинга, позволяющая отслеживать работу не только сетевых но и системных служб. Работа Nagios основывается на многочисленных плагинах, которые добавляют в программу практически безграничный функционал. Основные возможности Nagios: – мониторинг сетевых служб (HTTP/S, SMTP, POP3, IMAP, DNS, FTP, SNMP и т.д.); – мониторинг системных служб и параметров (нагрузка на CPU, использование памяти, использование диска и т.д.); – возможность построения распределенной системы мониторинга; – легкость в построение своих плагинов; – гибкость конфигурирования; – удобный веб-интерфейс. В Nagios есть два режима проверки хоста, активный и пассивный. Активный – это когда сама система мониторинга посылает запросы к удаленному хосту и получает информацию. Пассивный – это когда специальная внешняя программа присылают всю необходимую информацию в Nagios. Пассивные проверки полезны в случае блокирования файрволом прямого доступа в нужную нам сеть. Внешние пользователи не могут попасть во внутреннею сеть а вот из внутренний сети обратиться во внешнею можно. Unix-программа которая занимается обслуживанием пассивных проверок – NSCA. Принцип ее работы показан на рисунке ниже.

Со стороны сервера мониторинга запускается служба NSCA которая принимает все пассивные запросы со стороны клиентов и передает их в Nagios. NSCA можно скачать на www.nagios.org В мониторинге сетевых служб используется обращение на определенный порт в зависимости от службы. Яркий пример такого же принципа работы это программа telnet. В случае проверки системных служб на хосте где работает Nagios все просто, информация сразу поступает в Nagios. В случае удаленных хостов на них нужно поставить специальный агент, который Модуль 12. Система мониторинга Nagios.

139


соберет информацию о локальных службах и отправит ее в Nagios. Агент для linux называется NRPE, для Windows NSClient++

Как мы видим, Nagios способен без проблем обслуживать гетерогенные сети.

Установка и настройка Nagios Убедитесь что репозиторий EPEL подключен # rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release5-3.noarch.rpm далее набираем # yum -y install nagios nagios-plugins-all Добавляем сервисы Nagios и Apache в автозагрузку # chkconfig nagios on # chkconfig httpd on Каталоги с ключевыми файлами Nagios: /etc/nagios/ /usr/bin/nagiostats /etc/init.d/nagios /etc/httpd/conf.d/ nagios.conf /usr/share/doc/ /usr/lib/nagios/ /usr/share/nagios/ /var/log/nagios/

140

Конфигурационные файлы Nagios; Программа показывающая статистику работы Nagios; Скрипт запуска/выключения сервиса; Файл подключения к Apache; Документация; Движок Nagios; Логи. Модуль 12. Система мониторинга Nagios.


Конфигурационные файлы Nagios (все они расположены в /etc/nagios/) cgi.conf

Задаем права доступа пользователям, некоторые другие опции; С какими параметрами выполняются команды, commands.cfg команды используем в localhost.cfg в директиве check_command; Файл описывающий какие сервера и как мониторим. localhost.cfg Описываем режим проверки хостов и уведомления персонала; Файл настройки самого сервера Nagios. Файл задает nagios.cfg параметры как Nagios будет функционировать; passwd Файл с логинами и паролями пользователей Nagios (заполняем с помощью htpasswd); private/resource.cfg В переменной $USER1 сохраняем путь к каталогу с нашими плагинами. Переменная активно используется в commands.cfg Все это для того чтобы напрямую не давать доступ CGI-программам.

Файл /etc/httpd/conf.d/nagios.conf p g ScriptAlias /nagios/cgi-bin/ /usr/lib/nagios/cgi-bin/ <Directory /usr/lib/nagios/cgi-bin/> Options ExecCGI Order Allow,Deny Allow From All AuthType Basic AuthUserFile /etc/nagios/passwd AuthName «nagios» Require valid-user </Directory> Alias /nagios/ /usr/share/nagios/html/ <Directory /usr/share/nagios/html/> Options None Order Allow,Deny Allow From All AuthType Basic AuthUserFile /etc/nagios/passwd AuthName «nagios» Require valid-user </Directory>

Модуль 12. Система мониторинга Nagios.

141


Примеры настройки для SSL-сервера есть в том же файле, отредактируйте их по аналогии с обычным режимом работы Apache. Заведем пользователя nagiosadmin, используя этот аккаунт мы будем попадать в веб-интерфейс Nagios # htpasswd -c /etc/nagios/passwd nagiosadmin

Конфигурационный ф ур ц файл ф /etc/nagios/cgi.cfg g g g # CGI.CFG - Sample CGI Configuration File for Nagios 2.12 # MAIN CONFIGURATION FILE # Здесь указываем где искать главный конфигурационный файл main_config_file=/etc/nagios/nagios.cfg # HTML PATH # Здесь указываем где расположены html-файлы Nagios physical_html_path=/usr/share/nagios/share # URL HTML PATH # Значение используется CGI для поиска документации и графики. Если в #Nagios вы попадаете как http://fasttech.ru/nagios то HTML PATH должен #быть /nagios url_html_path=/nagios # CONTEXT-SENSITIVE HELP # Выводить ли контекстную подсказку или нет show_context_help=0 # NAGIOS PROCESS CHECK COMMAND # Полный путь и имя программы используемой для проверки самого процесса #Nagios. Хотя если Nagios упадет вы сразу это заметите :) #nagios_check_command=/usr/lib/nagios/plugins/check_nagios #/var/log/nagios/status.dat 5 ‘/usr/sbin/nagios’ # AUTHENTICATION USAGE # Использовать ли аутентификацию для доступа в интерфейс. Однозначно #рекомендуется ее использовать! use_authentication=1 # DEFAULT USER

142

Модуль 12. Система мониторинга Nagios.


# Пользователи которые могут просматривать статистику без аутентификации # лучше избегать всех неконтролируемых событий в жизни серверов #default_user_name=guest # SYSTEM/PROCESS INFORMATION ACCESS # Каким пользователям разрешено получать статистику по этим параметрам authorized_for_system_information=nagiosadmin # CONFIGURATION INFORMATION ACCESS # Каким пользователям разрешено получать статистику по этим параметрам authorized_for_configuration_information=nagiosadmin # SYSTEM/PROCESS COMMAND ACCESS # Каким пользователям разрешено выполнять команды в интерфейсе Nagios authorized_for_system_commands=nagiosadmin # GLOBAL HOST/SERVICE VIEW ACCESS # Каким пользователям разрешено получать статистику по этим параметрам authorized_for_all_services=nagiosadmin authorized_for_all_hosts=nagiosadmin # GLOBAL HOST/SERVICE COMMAND ACCESS # Каким пользователям разрешено получать статистику по этим параметрам authorized_for_all_service_commands=nagiosadmin authorized_for_all_host_commands=nagiosadmin # STATUSMAP BACKGROUND IMAGE # Опция позволяет задать изображения в качестве бекграунда для Status Map #Предполагается что изображение находится в images path ( #/usr/share/nagios/html/images/). Поддерживаются следующие форматы #изображения - GIF, PNG, JPEG, или GD2 format. #statusmap_background_image=smbackground.gd2 # DEFAULT STATUSMAP LAYOUT METHOD # Опция задает формат отображения Status Map. Возможные значения: # 0 = User-defined coordinates # 1 = Depth layers # 2 = Collapsed tree # 3 = Balanced tree # 4 = Circular # 5 = Circular (Marked Up)

Модуль 12. Система мониторинга Nagios.

143


# Попробуйте разные и решите что вам больше нравится default_statusmap_layout=5 # DEFAULT STATUSWRL LAYOUT METHOD # Формат отображения STATUSWRL. # Возможные значения: # 0 = User-defined coordinates # 2 = Collapsed tree # 3 = Balanced tree # 4 = Circular # Для просмотра 3-D Status Map необходим браузер с поддержкой VRML. #Информацию о них можно найти в google. Сама по себе технология используется редко. default_statuswrl_layout=4 # STATUSWRL INCLUDE # Опция позволяет подключать собственные объекты в генерируемый VRML #world. Предполагается что файл расположен в HTML PATH #(/usr/share/nagios/html/). #statuswrl_include=myworld.wrl # PING SYNTAX # С какими параметрами нужно пинговать удаленный хост из WAP #интерфейса (используя statuswml cgi). В переменную $HOSTADDRESS$ #будет помещен адрес хоста. ping_syntax=/bin/ping -n -U -c 5 $HOSTADDRESS$ # REFRESH RATE # Интервал обновления страниц в секундах различных CGI-страниц (status, #statusmap, extinfo, and outages) refresh_rate=90 # SOUND OPTIONS # Здесь можно задать звуковые файлы которые будут проигрываться если в #сети что-то происходит. Компьютеры операторов Nagios должны быть #оборудованы акустикой. Звуковые файлы я бы заменил, больно они #неприятные на слух. Файлы расположены в /usr/share/nagios/html/media/ #host_unreachable_sound=hostdown.wav #host_down_sound=hostdown.wav #service_critical_sound=critical.wav #service_warning_sound=warning.wav #service_unknown_sound=warning.wav #normal_sound=noproblem.wav

144

Модуль 12. Система мониторинга Nagios.


Конфигурационный ф ур ц файл ф /etc/nagios/commands.cfg g g Я не буду приводить весь его листинг, все команды описаны по общим правилам о которых я здесь напишу. # Sample command definitions for Nagios 2.12 # Синтаксис: # # define command{ # template <templatename> # name <objectname> # command_name <commandname> # command_line <commandline> # } # # Где: # # <templatename> = Имя с описанием другой команды которая будет шаблоном # для текущей (опционально) # <objectname> = Объектное имя с описанием другой команды которая будет #шаблоном для текущей (опционально) # <commandname> = имя команды которое будет использоваться в Nagios # <commandline> = путь к выполняемой команде и аргументы # Пример рабочей команды define command{ command_name check_http command_line $USER1$/check_http -H $HOSTADDRESS$ }

Конфигурационный ф ур ц файл ф /etc/nagios/localhost.cfg g g # LOCALHOST.CFG - SAMPLE OBJECT CONFIG FILE FOR MONITORING #THIS MACHINE # # Для удобства администрирования файл разбит на несколько частей а именно: # TIME PERIODS # COMMANDS # CONTACTS # CONTACT GROUPS # HOSTS # HOST GROUPS # SERVICES # #

Модуль 12. Система мониторинга Nagios.

145


# TIME PERIODS # В начале файла описаны различные временные периоды – 24x7, workhours, #nonworkhours. В дальнейшем вы их будете использовать для того чтобы #сообщить Nagios, в какие часы отсылать уведомления если хост или сервис на #нем стали недоступны. Отредактируйте их под свои нужды и политику #мониторинга/уведомлений вашей компании. define timeperiod{ timeperiod_name 24x7 alias 24 Hours A Day, 7 Days A Week sunday 00:00-24:00 monday 00:00-24:00 tuesday 00:00-24:00 wednesday 00:00-24:00 thursday 00:00-24:00 friday 00:00-24:00 saturday 00:00-24:00 } # ‘workhours’ timeperiod definition define timeperiod{ timeperiod_name workhours alias “Normal” Working Hours monday 09:00-17:00 tuesday 09:00-17:00 wednesday 09:00-17:00 thursday 09:00-17:00 friday 09:00-17:00 } # ‘nonworkhours’ timeperiod definition define timeperiod{ timeperiod_name nonworkhours alias Non-Work Hours sunday 00:00-24:00 00:00-09:00,17:00-24:00 monday 00:00-09:00,17:00-24:00 tuesday wednesday 00:00-09:00,17:00-24:00 thursday 00:00-09:00,17:00-24:00 00:00-09:00,17:00-24:00 friday 00:00-24:00 saturday } # ‘none’ timeperiod definition define timeperiod{ timeperiod_name none alias No Time Is A Good Time }

146

Модуль 12. Система мониторинга Nagios.


# COMMANDS # Секция COMMANDS будет пустой потому что, все что нужно уже описано в # файле commands.cfg # CONTACTS # В этой секции мы указываем свои контакты. Куда отсылать уведомления о # проблемах с сервисами. define contact{ contact_name alias service_notification_period host_notification_period service_notification_options host_notification_options service_notification_commands host_notification_commands email }

nagios-admin Nagios Admin 24x7 24x7 w,u,c,r d,r notify-by-email host-notify-by-email nagios-admin@fasttech.ru

# CONTACT GROUPS # При отправке уведомления в контактную группу, все ее участники получат # сообщение. Можно удобно распределять администраторов по проектам. define contactgroup{ contactgroup_name alias members }

admins Nagios Administrators nagios-admin

# HOSTS # Базовый хост шаблон. В конце его описания стоит register = 0, что означает #не использовать его в Nagios define host{ name notifications_enabled event_handler_enabled

flap_detection_enabled

generic-host ; название host шаблона 1 ; Включать уведомления ? 1 ; Включать ли event_handler, который ; отлавливает происходящие события 1 ; Включать ли Flap detection ? ; Flap Detection наступает в случае частой ; смены состояния хоста

failure_prediction_enabled 1 ; используется в распределенном ; мониторинге

Модуль 12. Система мониторинга Nagios.

147


process_perf_data

1 ; Обрабатывать информацию о произ; водительности

retain_status_information

1 ; Сохранять статусную информацию в ; момент перезагрузки Nagios или нет. ; Опция работает только если задана другая ; опция – retain_state_information=1

retain_nonstatus_information 1 ; Сохранять ли не статусную информацию ; в момент перезагрузки Nagios ; нужна опция retain_state_information=1 notification_period

24x7 ; Период уведомлений по хостам

register

0

; Не регистрировать активность этого блока ; команд, это всего лишь шаблон для ; других хостов, чтобы не нужно было ; описывать весь этот список команд 100 ; раз :) примеры использования будут ниже

} # Linux шаблон, будем использовать его для всех наших Linux-серверов define host{ name use

check_period max_check_attempts

148

linux-server ; название шаблона generic-host ; шаблон наследует параметры generic; host который мы описали выше 24x7 10

; период проверки ; пытаться получить информацию о ; сервере не более 10 раз

check_command

check-host-alive ; команда по умолчанию для ; проверки статуса Linux-сервера

notification_period

workhours

; по Linux-серверам нас будут ; уведомлять только в рабочее ; время. Поскольку этот шаблон ; наследует все опции от generic;host а родительские опции пере;крывают собственные, то ;notification_period будет ; использован из generic-host, ;То есть 24x7! Имейте это ввиду.

notification_interval

120

; отсылать уведомления заново ; каждые 2 часа

Модуль 12. Система мониторинга Nagios.


notification_options

d,u,r

; отслылать уведомления только по ; конкретным статусам хоста ; d – down state (сервер упал), u ; UNREACHABLE state (не удается ; выяснить состояние сервера так как ; он не достижим), r – recovery state ; (восстановление после падения)

contact_groups

admins

; кому отсылать уведомления

register

0

; не регистрировать в Nagios, это ; только шаблон

} # А теперь рабочий пример define host{ use

host_name alias address }

linux-server

; название шаблона в качестве базовых ; опций для хоста. Шаблон linux-server, в ; свою очередь унаследовал все опции ; generic-host

localhost localhost 127.0.0.1

# HOST GROUPS # Группы хостов объединеных по каким либо признакам, например Linux#сервера, Windows-сервера, сервера по проектам define hostgroup{ hostgroup_name test alias Test Servers members localhost } # SERVICES # Базовый шаблон сервиса define service{ name generic-service active_checks_enabled 1 passive_checks_enabled 1 parallelize_check 1

; название шаблона ; включение активной проверки ; включение пассивной проверки ; проверка сервисов в ; параллельном режиме

Модуль 12. Система мониторинга Nagios.

149


; (отключение может повлечь за ; собой сильное понижение ; производительности) obsess_over_service

1

; разрешать ли ocsp_command ; для сервисов, что повлечет за ; собой запуск другой команды. ; Используется в распределенном ; мониторинге

check_freshness

0

; по умолчанию не проверяем ; “свежесть сервиса”. Это полезно ; при пассивных проверках ; сервисов, если мы хотим ; выяснить, так ли часто ; пассивный хост доставляет нам ; информацию о себе как мы хотим

notifications_enabled

1

; уведомление о сервисах включено

event_handler_enabled

1

; event handler сервисов включен

flap_detection_enabled

1

; Flap detection (частая смена ; статуса сервиса) включен

failure_prediction_enabled 1

; используется в распределенном ; мониторинге ; Обрабатывать информацию о ; производительности

process_perf_data

1

retain_status_information

1 ; Сохранять статусную информацию в ; момент перезагрузки Nagios или нет. ; Опция работает только если задана другая ; опция – retain_state_information=1

retain_nonstatus_information 1 ; Сохранять ли не статусную информацию ; в момент перезагрузки Nagios ? ; нужна опция retain_state_information=1 is_volatile register

0 0

; изменчивый ли сервис по своей природе ? ; не регистрировать активность, это ;всего лишь шаблон для других сервисов

} # По аналогии с linux-server этот шаблон уже “боевой”, его мы будем #использовать для конкретных хостов

150

Модуль 12. Система мониторинга Nagios.


define service{ name use

local-service generic-service

check_period

24x7

; название шаблона ; наследуем значения generic; service ; период проверки

max_check_attempts

4

; запрашивать статус сервиса до 4 ; раз

normal_check_interval

5

; в нормальном состояние ; сервис проверять каждые 5 ; минут

retry_check_interval

1

contact_groups

admins

notification_options

w,u,c,r

; перепроверка сервиса каждую ; минуты ; контактная группа ; уведомления отправлять ; только в случае w – Warning ; state, u – Unknown state, c – ; Critical state и r – Recovery state ; (события наступающее в ; момент восстановления ; работоспособности сервиса)

notification_interval

60

; отправлять заново уведомление ; о проблеме с сервисами каждый час

notification_period

24x7

; период уведомления, ; круглосуточно

register }

0

; этот блок команд - шаблон

# в конце описаны сервисы для мониторинга # пингуем локальную машину, занятие конечно бесполезное но здесь это в # качестве примера define service{ use host_name service_description check_command }

local-service ; используемый шаблон localhost PING check_ping!100.0,20%!500.0,60%

Модуль 12. Система мониторинга Nagios.

151


# проверяем свободное место в корне (/) локальной машины, если свободно #менее 20% то сервис устанавливаем в Warning state, если менее 10% то #Critical state define service{ use host_name service_description check_command }

local-service ; используемый шаблон localhost ; какой хост проверяем Root Partition ; название сервиса в Nagios check_local_disk!20%!10%!/ ; команда

# мониторинг подключенных пользователей в локальной системе, если #подключено более 20 то сервис переходит в режим Warning state, если более #50 то Critical state define service{ use host_name service_description check_command }

local-service ; используемый шаблон localhost ; какой хост проверяем Current Users ; название сервиса в Nagios check_local_users!20!50 ; команда

# мониторинг локальных процессов, если запущено более 250 то наступает #Warning state, если более 400 наступает Critical state define service{ use host_name service_description check_command }

local-service ; используемый шаблон localhost ; какой хост проверяем Total Processes ; название сервиса в Nagios check_local_procs!250!400!RSZDT ; команда

# проверяем нагрузку на локальной машине define service{ use local-service ; используемый шаблон host_name localhost ; какой хост проверяем service_description Current Load ; название сервиса в Nagios check_command check_local_load!5.0,4.0,3.0!10.0,6.0,4.0 ; команда }

Конфигурационный ф ур ц файл ф /etc/nagios/nagios.cfg g g g # NAGIOS.CFG - Sample Main Config File for Nagios 2.12 # LOG FILE # Log-файл куда пишутся все события хостов и сервисов

152

Модуль 12. Система мониторинга Nagios.


# NAGIOS.CFG - Sample Main Config File for Nagios 2.12 # LOG FILE # Log-файл куда пишутся все события хостов и сервисов # эта опция должна быть первой в конфигурационном файле! log_file=/var/log/nagios/nagios.log # OBJECT CONFIGURATION FILE(S) # Объектные файлы — это файлы в которых описываются хосты, хост группы, #контакты, группы контактов, сервисы и т.д. # все эти секции могут быть описаны в разных файлах, для этого нужно #использовать директиву cfg_file # Команды описаны в этом файле cfg_file=/etc/nagios/commands.cfg # localhost и его сервисы описаны в этом файле cfg_file=/etc/nagios/localhost.cfg # Ниже представлен пример разделения секций по разным файлам #cfg_file=/etc/nagios/contactgroups.cfg #cfg_file=/etc/nagios/contacts.cfg #cfg_file=/etc/nagios/dependencies.cfg #cfg_file=/etc/nagios/escalations.cfg #cfg_file=/etc/nagios/hostgroups.cfg #cfg_file=/etc/nagios/hosts.cfg #cfg_file=/etc/nagios/services.cfg #cfg_file=/etc/nagios/timeperiods.cfg # Nagios умеет обрабатывать все файлы с расширением .cfg в каком либо #каталоге, для этого используется директива cfg_dir #cfg_dir=/etc/nagios/servers #cfg_dir=/etc/nagios/printers #cfg_dir=/etc/nagios/switches #cfg_dir=/etc/nagios/routers # OBJECT CACHE FILE # Cache-файл Nagios. CGI — программы получают конфигурацию из него а не #напрямую из объектных файлов. Это защищает от несогласованности #конфигурации в случае, если она изменялась после старта Nagios. object_cache_file=/var/log/nagios/objects.cache # RESOURCE FILE

Модуль 12. Система мониторинга Nagios.

153


# Файл содержащий $USERx$ макросы # CGI-программы будут использовать указанный вами макрос но они не будут #знать что внутри этого макроса. Макросы стоит использовать при указание в #команде логинов/паролей и другой конфиденциальной информации. # на файл /etc/nagios/private/resource.cfg установлены права 640 resource_file=/etc/nagios/private/resource.cfg # STATUS FILE # Файл в котором сохранен текущий статус всех сервисов и хостов, он #очищается при перезагрузке Nagios status_file=/var/log/nagios/status.dat # NAGIOS USER # От какого пользователя запускать процесс Nagios в операционной системе nagios_user=nagios # NAGIOS GROUP # Рабочая группа Nagios nagios_group=nagios # EXTERNAL COMMAND OPTION # Включать ли внешние команды. Если включим то появится возможность #управлять хостами и сервисами через веб-интерфейс (включать/отключать #уведомления для них, включать/выключать пассивные проверки и т.д.). check_external_commands=0 # EXTERNAL COMMAND CHECK INTERVAL # Интервал, через который Nagios будет проверять наличие команд для себя. #Команды через веб-интерфейс выполняются не сразу а через определенный #интервал. Этот интервал мы и указываем. # Можно указать значение в секундах, например 15s а можно указать -1 что #означает проверять наличие команд так часто, как только возможно #command_check_interval=15s command_check_interval=-1 # EXTERNAL COMMAND FILE # Файл в который будут записываться команды в очередь на выполнение. Он #должен иметь права на запись для пользователя от которого выполняется #процесс веб-сервера command_file=/var/spool/nagios/cmd/nagios.cmd

154

Модуль 12. Система мониторинга Nagios.


# EXTERNAL COMMAND BUFFER SLOTS # Количество слотов для внешних команд. Значения по умолчанию более чем #достаточно external_command_buffer_slots=4096 # COMMENT FILE # Файл в котором сохраняются комментарии для хостов и сервисов comment_file=/var/log/nagios/comments.dat # DOWNTIME FILE # Файл в котором сохраняется информация о downtime-времени хостов и #сервисов, То есть времени когда они не доступны downtime_file=/var/log/nagios/downtime.dat # LOCK FILE # В этом файле хранится PID процесса Nagios. Используется сторонними #программами lock_file=/var/run/nagios.pid # TEMP FILE # Временный файл используется при обновление статус-лога, очистки #комментариев и т.д. temp_file=/var/log/nagios/nagios.tmp # EVENT BROKER OPTIONS # Благодря модулям, брокер может обслуживать различные происходящие #события в Nagios # Values: 0 = Broker nothing # -1 = Broker everything # <other> = See documentation event_broker_options=-1 # EVENT BROKER MODULE(S) # Здесь подгружаются модули брокера # Example: # # broker_module=<modulepath> [moduleargs] #broker_module=/somewhere/module1.o #broker_module=/somewhere/module2.o arg1 arg2=3 debug=0

Модуль 12. Система мониторинга Nagios.

155


# LOG ROTATION METHOD # Способы ротации главного лога Nagios # n = None - don’t rotate the log # h = Hourly rotation (top of the hour) # d = Daily rotation (midnight every day) # w = Weekly rotation (midnight on Saturday evening) # m = Monthly rotation (midnight last day of month) log_rotation_method=d # LOG ARCHIVE PATH # Расположение архива лог-файлов log_archive_path=/var/log/nagios/archives # LOGGING OPTIONS # Используем системную службу Syslog чтобы записывать логи use_syslog=1 # NOTIFICATION LOGGING OPTION # Уведомления тоже записывать в лог log_notifications=1 # SERVICE RETRY LOGGING OPTION # Повторные проверки сервисов тоже записывать в лог log_service_retries=1 # HOST RETRY LOGGING OPTION # Повторные проверки хостов тоже записывать в лог log_host_retries=1 # EVENT HANDLER LOGGING OPTION # Записываем в логи event handlers, event handlers — это опциональные программы # которые могут быть выполнены когда состояние хоста или сервиса изменяется log_event_handlers=1 # INITIAL STATES LOGGING OPTION # Записывать ли initial state в лог-файл ? Initial state — это когда хост или сервис # проверяется в первый раз, включить — 1, выключить — 0 log_initial_states=0

156

Модуль 12. Система мониторинга Nagios.


# EXTERNAL COMMANDS LOGGING OPTION # Записывать ли в лог активность внешних команд ? # Опция не включает логирование пассивных проверок, для этого есть опция о # которой ниже log_external_commands=1 # PASSIVE CHECKS LOGGING OPTION # Логирование пассивных проверок хостов и сервисов log_passive_checks=1 # GLOBAL HOST AND SERVICE EVENT HANDLERS # Опции позволяют указать команды event handler`а для хоста или сервиса, # которые будут выполняться в случае изменения их состояния. global event # handler выполняется немедленно, предшествуя event handler`у указанному в # секции хоста или сервиса. #global_host_event_handler=somecommand #global_service_event_handler=somecommand # SERVICE INTER-CHECK DELAY METHOD # Метод распределения нагрузки в момент старта мониторинга. Чтобы снизить # нагрузку на сервер мониторинга, все запросы к сервисам отсылаются не в # один момент времени а с определенным интервалом. # n = None - don’t use any delay between checks # d = Use a “dumb” delay of 1 second between checks # s = Use “smart” inter-check delay calculation # x.xx = Use an inter-check delay of x.xx seconds service_inter_check_delay_method=s # MAXIMUM SERVICE CHECK SPREAD # Временной фрейм в течение которого все первичные проверки сервисов # должны быть завершены. По умолчанию 30 минут. max_service_check_spread=30 # SERVICE CHECK INTERLEAVE FACTOR # Это значение определяет метод чередования проверок хостов и сервисов, # который позволит снизить нагрузку на удаленную машину # s = Use “smart” interleave factor calculation # x = Use an interleave factor of x, where x is a # number greater than or equal to 1. service_interleave_factor=s

Модуль 12. Система мониторинга Nagios.

157


# HOST INTER-CHECK DELAY METHOD # Метод распределения нагрузки в момент старта мониторинга. Чтобы снизить # нагрузку на сервер мониторинга, все запросы к хостам отсылаются не в один # момент времени а с определенным интервалом. # n = None - don’t use any delay between checks # d = Use a “dumb” delay of 1 second between checks # s = Use “smart” inter-check delay calculation # x.xx = Use an inter-check delay of x.xx seconds host_inter_check_delay_method=s # MAXIMUM HOST CHECK SPREAD # Временной фрейм в течение которого все первичные проверки сервисов # должны быть завершены. По умолчанию 30 минут. max_host_check_spread=30 # MAXIMUM CONCURRENT SERVICE CHECKS # Опция позволяет задать максимальное число сервисов, проверяемых # параллельно в определенный момент времени. 1 — запрещает проверку # сервисов в параллельном режиме, 0 — не ограничивает число одновременных # проверок max_concurrent_checks=0 # SERVICE CHECK REAPER FREQUENCY # Частота с которой Nagios обрабатывает результаты проверки сервисов. # Указывается в секундах. service_reaper_frequency=10 # CHECK RESULT BUFFER SLOTS # Задает число слотов для хранения результатов проверки сервисов, после # обработки результата слот освобождается. Значения по умолчанию более чем # достаточно. check_result_buffer_slots=4096 # AUTO-RESCHEDULING OPTION # Опция может помочь сбалансировать нагрузку на сервер мониторинга # автоматически переназначив проверку хостов и сервисов, распределяя # нагрузку во времени. Опция эксперементальная и ее использование на свой # страх и риск. auto_reschedule_checks=0 # AUTO-RESCHEDULING INTERVAL

158

Модуль 12. Система мониторинга Nagios.


# Интервал переназначения в секундах. auto_rescheduling_interval=30 # AUTO-RESCHEDULING WINDOW # Размер «окна» в секундах. Проверки хостов и сервисов назначенные в # следующие X секунд (размер окна) будут переназначены. auto_rescheduling_window=180 # SLEEP TIME # Время «сна» между которыми проверяются системные события и проверки # сервисов которые должны быть выполнены sleep_time=0.25 # TIMEOUT VALUES # Как много времени давать на выполнение команде, после истечения которого # она будет принудительно завершена. Значение указывается в секундах. service_check_timeout=60 host_check_timeout=30 event_handler_timeout=30 notification_timeout=30 ocsp_timeout=5 perfdata_timeout=5 # RETAIN STATE INFORMATION # Сохранять ли статусную информацию для хостов и сервисов в случае # выключения Nagios. После рестарта Nagios вся сохраненная информация # будет обратно загружена. retain_state_information=1 # STATE RETENTION FILE # Файл в котором сохраняется информация о статусе хостов и сервисов перед # выключение Nagios. Файл используется только если preserve_state_information # равен 1 state_retention_file=/var/log/nagios/retention.dat # RETENTION DATA UPDATE INTERVAL # Как часто сохранять в файл информацию о статусе хостов и сервисов пока # Nagios нормально работает. Указывается в минутах. retention_update_interval=60

Модуль 12. Система мониторинга Nagios.

159


# USE RETAINED PROGRAM STATE # Восстанавливать ли статус для хостов и сервисов из retention file. 1 — # восстанавливать, 0 - нет use_retained_program_state=1 # USE RETAINED SCHEDULING INFO # Восстанавливать ли информацию о запланированной следующей проверке из # retention file или нет. use_retained_scheduling_info=0 # INTERVAL LENGTH # Интервал проверки interval_length=60 # AGGRESSIVE HOST CHECKING OPTION # Включать ли агресивную проверку хостов. Это может занять больше времени # чем обычная. 1 — включить, 0 - выключить use_aggressive_host_checking=0 # SERVICE CHECK EXECUTION OPTION # Выполнять ли активно проверки сервисов когда они стартуют первый раз # 1 — включать активные проверки, 0 — не включать execute_service_checks=1 # PASSIVE SERVICE CHECK ACCEPTANCE OPTION # Принимать ли результаты пассивных проверок когда сервисы только # стартуют или рестартуют # 1 — принимать пассивные проверки, 0 — не принимать accept_passive_service_checks=1 # HOST CHECK EXECUTION OPTION # Выполнять ли активно проверки хостов когда они стартуют первый раз # 1 — включать активные проверки, 0 — не включать execute_host_checks=1 # PASSIVE HOST CHECK ACCEPTANCE OPTION # Принимать ли результаты пассивных проверок когда хосты только стартуют # или рестартуют accept_passive_host_checks=1

160

Модуль 12. Система мониторинга Nagios.


# NOTIFICATIONS OPTION # Уведомлять когда хост или сервис стартуют первый раз ? # 1 — да, 0 — нет enable_notifications=1 # EVENT HANDLER USE OPTION # Запускать ли event handler для только что запущенного хоста или сервиса # 1 — запускать, 0 — не запускать enable_event_handlers=1 # PROCESS PERFORMANCE DATA OPTION # Обрабатывать ли информацию о производительности полученную от хостов и # сервисов. Информация может содержать в себе задержку в проверке (разницу # с запланированной проверкой), сколько проверка заняла времени и т.д. # Проверка производительности осуществляется командами # host_perfdata_command (о ней ниже) и service_perfdata_command (о ней ниже). # 1 — обрабатывать данные о производительности, 0 — не обрабатывать process_performance_data=0 # HOST AND SERVICE PERFORMANCE DATA PROCESSING COMMANDS # Команды запускаются после того, как проверка хостов и сервисов # завершится. Команды выполняются только если enable_performance_data # равняется 1. Командный аргумент — короткое имя команды которое указано в # host configuration file #host_perfdata_command=process-host-perfdata #service_perfdata_command=process-service-perfdata # HOST AND SERVICE PERFORMANCE DATA FILES # Файлы в которые сохраняется информация о производительности хостов и # сервисов. Должна быть включена опция enable_performance_data #host_perfdata_file=/tmp/host-perfdata #service_perfdata_file=/tmp/service-perfdata # HOST AND SERVICE PERFORMANCE DATA FILE TEMPLATES # Шаблон для файлов содержащих информацию о производительности. Здесь # описаны правила по которым нужно писать информацию в файлы. Шаблоны # могут содержать макросы, специальные символы (\t — табуляция, \r — # перевод каретки, \n — новая строка) и обычный текст. Новая строка # автоматически добавляется после каждой записи в файл. Пара примеров дана # ниже. #host_perfdata_file_template=[HOSTPERFDATA]\t$TIMET$\t$HOSTNAME$\t

Модуль 12. Система мониторинга Nagios.

161


#$HOSTEXECUTIONTIME$\t$HOSTOUTPUT$\t$HOSTPERFDATA$ #service_perfdata_file_template=[SERVICEPERFDATA]\t$TIMET$\t #$HOSTNAME$\t$SERVICEDESC$\t$SERVICEEXECUTIONTIME$\t #$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$ # HOST AND SERVICE PERFORMANCE DATA FILE MODES # Режим работы с файлами # a — append (дописывать в файл), w — write (записывать). Режим по # умолчанию вполне всем хорош. #host_perfdata_file_mode=a #service_perfdata_file_mode=a # HOST AND SERVICE PERFORMANCE DATA FILE PROCESSING #INTERVAL # Как часто обрабатывать performance files командами которых указаны ниже. # Значение указывается в секундах. 0 означает что обрабатывать не нужно. #host_perfdata_file_processing_interval=0 #service_perfdata_file_processing_interval=0 # HOST AND SERVICE PERFORMANCE DATA FILE PROCESSING #COMMANDS # Используемые команды для обработки performance data files #host_perfdata_file_processing_command=process-host-perfdata-file #service_perfdata_file_processing_command=process-service-perfdata-file # OBSESS OVER SERVICE CHECKS OPTION # Если не планируется система распределенного мониторинга то опцию лучше # не включать obsess_over_services=0 # OBSESSIVE COMPULSIVE SERVICE PROCESSOR COMMAND # Команда запускаемая для каждого сервиса. Работает только если # obsess_over_services равняется 1 #ocsp_command=somecommand # ORPHANED SERVICE CHECK OPTION # Опция призвана решать редкую проблему, когда сервис не может быть # перезапущен. check_for_orphaned_services=1 # SERVICE FRESHNESS CHECK OPTION # Проверять ли «свежесть» сервисов, это полезно при пассивных проверках

162

Модуль 12. Система мониторинга Nagios.


# когда нужно убедится что информация о сервисах поступает с нормальной # переодичностью. # 1 — включить проверку, 0 — отключить check_service_freshness=1 # SERVICE FRESHNESS CHECK INTERVAL # Интервал проверки «свежести» сервисов в секундах. service_freshness_check_interval=60 # HOST FRESHNESS CHECK OPTION # Проверять ли «свежесть» хостов, это полезно при пассивных проверках # когда нужно убедится что информация о хостах поступает с нормальной # переодичностью. # 1 — включить проверку, 0 — отключить check_host_freshness=0 # HOST FRESHNESS CHECK INTERVAL # Интервал проверки «свежести» хостов в секундах. host_freshness_check_interval=60 # AGGREGATED STATUS UPDATES # Объединять обновления хостов, сервисов и данные состояния программ или # нет. Обычно результаты обновляются моментально, что может создать # большую нагрузку на сервер мониторинга. # 1 — включить объединение результатов, 0 — не включать aggregate_status_updates=1 # AGGREGATED STATUS UPDATE INTERVAL # Интервал в секундах объединенного обновления статуса хостов и сервисов status_update_interval=15 # FLAP DETECTION OPTION # Влючать или нет обнаружение частой смены состояния хоста или сервиса. # 1 — включить, 0 — выключить enable_flap_detection=0 # FLAP DETECTION THRESHOLDS FOR HOSTS AND SERVICES # Пороговые значения для flapping`а # Подробнее про это написано здесь - #http://nagios.sourceforge.net/docs/2_0/flapping.html

Модуль 12. Система мониторинга Nagios.

163


low_service_flap_threshold=5.0 high_service_flap_threshold=20.0 low_host_flap_threshold=5.0 high_host_flap_threshold=20.0 # DATE FORMAT OPTION # Формам отображения даты # us (MM-DD-YYYY HH:MM:SS) # euro (DD-MM-YYYY HH:MM:SS) # iso8601 (YYYY-MM-DD HH:MM:SS) # strict-iso8601 (YYYY-MM-DDTHH:MM:SS) date_format=euro # P1.PL FILE LOCATION # Путь к скрипту p1.pl который используется встроенными Perl интерпретатором p1_file=/usr/sbin/p1.pl # ILLEGAL OBJECT NAME CHARACTERS # Здесь можно указать символы которые не могут быть использованы в # название хостов, описание сервисов или в название других типах объектов illegal_object_name_chars=`~!$%^&*|’”<>?,()= # ILLEGAL MACRO OUTPUT CHARACTERS # Здесь можно указать символы которые будут убраны из макросов до того как # будут использованы в уведомлениях и т.д. Это не распространяется на макросы # используемые в командах проверки хостов и сервисов illegal_macro_output_chars=`~$&|’”<> # REGULAR EXPRESSION MATCHING # Использовать регулярные выражения или нет # 1 — включить, 0 — выключить use_regexp_matching=0 # “TRUE” REGULAR EXPRESSION MATCHING # Опция используется только если use_regexp_matching равняется 1. При # отключенной опции совпадение происходит только на основание маски (* # и ?), при включенной это происходит всегда, что может раздражать. # 0 — отключить, 1 — включить use_true_regexp_matching=0 # ADMINISTRATOR EMAIL ADDRESS

164

Модуль 12. Система мониторинга Nagios.


# Почтовый адрес администратора этого сервера admin_email=nagios # ADMINISTRATOR PAGER NUMBER/ADDRESS # Номер пейджера администратора этого сервера. Определенно устаревшая опция. admin_pager=pagenagios # DAEMON CORE DUMP OPTION # Разрешать создавать core dump или нет. Может использоваться для отладки. # 1 — разрешать создавать, 0 — не разрешать daemon_dumps_core=0

Конфигурационный ф ур ц файл ф /etc/nagios/private/resource.cfg g p g # RESOURCE.CFG - Sample Resource File for Nagios 2.12 # Этот файл содержит различные макросы, CGI-программы будут обращаться # именно к ним а не к этому файлу напрямую. Поэтому здесь можно # использовать все возвожные пароли и логины и не бояться утечки информации. # Макрос $USER1$ будет содержать путь к плагинам $USER1$=/usr/lib/nagios/plugins # Макрос $USER2$ будет содержать путь к event handlers #$USER2$=/usr/lib/nagios/plugins/eventhandlers # Store some usernames and passwords (hidden from the CGIs) #$USER3$=someuser #$USER4$=somepassword

# service httpd start # service nagios start Собственно все. Теперь у нас есть полнофункциональный сервер мониторинга. В файлы конфигурации можете внести изменения по своему вкусу, но опции по умолчанию вполне нормальные. Пока в нашей системе мониторинга только localhost. Допустим появилась необходимость добавить на мониторинг еще один сервер, сделать это очень легко и сейчас я это продемонстрирую. Модуль 12. Система мониторинга Nagios.

165


Добавление хостов и сервисов на мониторинг Есть linux-сервер с IP 192.168.146.135 и на нем работает веб-сервер, DHCP-сервер и SMTP-сервер. Добавим проверку этих трех служб и обычную доступность сервера Мне повезло, все нужные мне плагины поставляются с Nagios и их не пришлось искать в Интернет Добавляем в файл /etc/nagios/localhost.cfg # Чтобы поставить на мониторинг новый сервер необходимо описать секцию # host с его участием. Здесь указываем какой шаблон настроек будем # использовать, хостнейм который должен резолвится с помощью DNS или # быть указанным в /etc/hosts, альяс и IP-адрес сервера define host{ use host_name alias address }

linux-server mylinuxbox mylinuxbox 192.168.146.135

# А теперь опишим сервисы которые хотим поставить на мониторинг на этом # сервере define service{ use host_name service_description check_command }

local-service mylinuxbox PING check_ping!100.0,10%!200.0,60%

define service{ use local-service host_name mylinuxbox service_description SMTP check_command check_smtp } define service{ use host_name service_description check_command }

166

local-service mylinuxbox Apache check_http

Модуль 12. Система мониторинга Nagios.


define service{ use host_name service_description check_command }

local-service mylinuxbox DHCPD check_dhcp

Чтобы узнать какие опции можно применить к командам check_* делаем следующее # /usr/lib/nagios/plugins/check_<название плагина> -h, например # /usr/lib/nagios/plugins/check_http -h Плагин check_dhcp есть в /usr/lib/nagios/plugins но не описан в /etc/nagios/ commands.cfg поэтому внесем соответствующию запись define command{ command_name check_dhcp command_line $USER1$/check_dhcp -s $HOSTADDRESS$ }

Проверить ошибки в конфигурации можно командой #/usr/sbin/nagios -v /etc/nagios/nagios.cfg Перезагружаем Nagios # service nagios restart Все должно заработать.

Мониторинг различных параметров сервера Ниже я привел некоторые способы мониторинга основных системных параметров и служб. Думаю пригодится.

Мониторинг р свободного места Выведем список 5 пользователей занимающих наибольшее количество дискового пространства в своем домашнем каталоге. # du -cms /home/* | sort -rn | head -6 Модуль 12. Система мониторинга Nagios.

167


8200 total 6100 /home/james 900 /home/ronaldo 570 /home/neo 420 /home/tester 210 /home/mybestuser Как видим пользователь james занимает 6.1 Гб места и т.д.

Защита щ системы от пользовательских процессов р ц Пользовательские процессы без проблеммогутзанятьвседисковоепространство и тем самым положить сервер. Чтобы этого избежать воспользуемся командой ulimit и ограничим возможный размер файла до 10Мб. # ulimit -f 10000 # yes 'some shit' > shit.txt File size limit exceeded # ls -l total 10016 -rw-r--r-- 1 root root 10240000 Mar 14 21:36 shit.txt Точно также можно задавать другие опции ограничения, такие как максимальное количество файлов, максимальное количество открытых дескрипторов, процессорное время, объем виртуальной памяти доступный в shell и т.д. Просмотреть все возможные параметры # ulimit -a Ограничение в 10 Мб конечно врядли подойдет, а вот ограничить в 10 Гб уже можно. Защита от дурака так сказать.

Мониторинг р S.M.A.R.T. - параметров р р жесткого диска # smartctl -a /dev/sda Напомню, S.M.A.R.T. - это Self-Monitoring, Analysis and Reporting Technology. Технология самоконтроля и анализа, которой снабжены все современные диски. Она позволяет отслеживать основные параметры жестких дисков и прогнозировать потенциальный отказ.

168

Модуль 12. Система мониторинга Nagios.


Один из способов выяснить как ваш HDD называется в системе это выполнить команду fdisk -l, значение без цифры и будет нужным устройством.

Мониторинг р сетевых портов р в Linux Просмотреть конкретный сетевой порт можно вот так # netstat -nlp | grep :8080 tcp 0 0 :::8080 :::* LISTEN 2697/httpd Как видим на порту 8080 выполняется веб-сервер Apache Весь список активных портов # netstat -tlnp

Мониторинг р открытых р ф файлов и сокетов Для этих целей хорошо подойдет lsof. Вывод всех открытых файлов # lsof Смотрим открытые файлы работающие с сетью по IPv4 # lsof -i 4 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME portmap 2341 rpc 3u IPv4 6692 UDP *:sunrpc rpc.statd 2366 root 7u IPv4 6748 TCP *:852 (LISTEN) cupsd 2657 root 3u IPv4 7392 TCP localhost.localdomain:ipp (LISTEN) cupsd 2657 root 5u IPv4 7395 UDP *:ipp php-cgi 2662 nginx 0u IPv4 7415 TCP localhost.localdomain:cslistener (LISTEN) nginx 3915 nginx 5u IPv4 10864 TCP *:https (LISTEN) nginx 3915 nginx 6u IPv4 10865 TCP *:http (LISTEN) Список открытых файлов по NFS # lsof -N Список открытых файлов в /var/log/ Опция +d покажет открытые файлы только в этом каталоге а +D и во вложенных Модуль 12. Система мониторинга Nagios.

169


# lsof +d /var/log COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME 2289 root 1w REG 253,0 382311 3047763 /var/log/messages syslogd 2289 root 2w REG 253,0 25939 3047764 /var/log/secure syslogd 2289 root 3w REG 253,0 6285 3047765 /var/log/maillog syslogd 2289 root 4w REG 253,0 7348 3047768 /var/log/cron syslogd 2289 root 5w REG 253,0 0 3047766 /var/log/spooler syslogd 2289 root 6w REG 253,0 1532 3047767 /var/log/boot.log syslogd 2590 root 2w REG 253,0 3374 3047640 /var/log/acpid acpid nginx 3914 root 2u REG 253,0 3398 3047715 /var/log/nginx.error_log Список открытых файлов для конкретного пользователя # lsof -u james

Мониторинг р запущенных ущ процессов р ц Все процессы # ps -eF Вывести дерево процессов # ps -ejH

Мониторинг р системных рресурсов ур # top или, если хочется чтобы все было красиво (не забудьте подключить репозиторий EPEL) # yum -y install htop # htop

Мониторинг р свободного места в рразделах # df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 23G 2.4G 20G 11% /

170

Модуль 12. Система мониторинга Nagios.


/dev/sda1 tmpfs

99M 19M 75M 352M 0

21% /boot

352M 0% /dev/shm

Мониторинг р сетевой подсистемы в реальном р времени р В этом нам отлично поможет пакет ntop. Убедитесь что репозиторий EPEL подключен. Далее набираем команду: # yum -y install ntop Инициализируем ntop, нужно будет задать пароль для админа. # ntop -A u ntop -P /etc/ntop/ В файл /etc/ntop.conf добавляем наш IP-адрес в опциях --http-server и --https-server Запускаем ntop как службу # service ntop start Теперь через браузер можно получить доступ к статистики ntop. По умолчанию ntop работает на порту 3000. Пример http://192.168.146.132:3000/ Есть и консольная программа для просмотра статистики по сетевому интерфейсу. # yum -y install iftop # iftop

Мониторинг р рработы DNS-сервера р р в реальном р времени р Ставим пакет dnstop на том же сервере где и dns-сервер. # wget http://dag.wieers.com/rpm/packages/dnstop/dnstop-0.0.20070510-1. el5.rf.i386.rpm # rpm -Uvh dnstop-0.0.20070510-1.el5.rf.i386.rpm Далее запускаем dnstop и смотрим за статистикой. # dnstop eth0 Модуль 12. Система мониторинга Nagios.

171


В момент когда dnstop запущен можно нажимать на специальные клавиши и смотреть статистику различного рода. Основные кнопки: s — показать таблицу с адресами источников запросов; d — показать таблицу с пунктами назначения запросов, куда они передаются; t — показывать статистику по типам запросов; Другие опции в документации dnstop # man dnstop

Мониторинг р соединений proftpd p p в рреальном времени р # ftptop

Статистика по виртуальной р у памяти # vmstat

Статистика по процессору р ц ру и устройствам у р ввода-вывода Ставим пакет sysstat (содержит в себе программы sa, mpstat, iostat, sar) # yum -y install sysstat Информация по вводу-выводу # iostat Информация по процессору # mpstat

Резюме Мы разобрали систему мониторинга Nagios, это одна из самых популярных систем для мониторинга большего количества серверов. Также познакомились с различными инструментами, которые помогут в администрирование вашего сервера.

Домашнее задание Настройте систему мониторинга Nagios и поставьте на мониторинг пару серверов.

172

Модуль 12. Система мониторинга Nagios.


BIND BIND – это пакет содержащий программное обеспечение для построения DNS-сервера. DNS-сервер позволяет преобразовывать доменные имена к IP-адресам и наоборот. Работа в компьютерных сетях происходит с IP-адресами (уникальный идентификатор) но запомнить все нужные IP-адреса не представляется возможным и здесь на помощь приходит DNS-сервер, который позволяет обращаться к хосту по имени.

Установка Пакет bind-chroot содержит необходимую структуру каталогов для chrootокружения, пакет caching-nameserver содержит все необходимые файлы. Все остальное, что понадобится в работе будет установлено как зависимости. Ставим нужные пакеты # yum -y install bind-chroot caching-nameserver Добавляем автозагрузку при старте сервера # chkconfig named on

Инструменты Для отладки своих DNS-серверов будут очень полезны следующие утилиты.

nslookup

Позволяет производить запросы к DNS-серверу и запрашивать любые записи. По умолчанию запрашивается только запись A, чтобы запросить все записи для ya.ru наберите: # nslookup -type=any ya.ru

dig

Схожая по работе с nslookup утилита. Что бы запросить все записи для ya.ru у DNS-сервера ns1.yandex.ru наберите: # dig ya.ru @ns1.yandex.ru any

Модуль 13. DNS-сервер. BIND.

173


Базовые понятия Зона – логический узел в системе доменных имен. Файл-зоны содержит всю информацию по какому либо домену и его записям. Управление зоной можно передать другому человеку, такой процесс называется делегированием. Домен – это название зоны в системе доменных имен. Название домена Д читается слева направо, от младших доменов к старшим. Поддомен дд – это имя подчиненной зоны. Например mail.example545.com является поддоменом example545.com. example545.com – это домен второго уровня, mail.example545.com – домен третьего уровня. – к имени этой записи будет добавлен основной Относительное имя домена д домен в которой она находится. FQDN Q – полностью определенное доменное имя. В файле зоны это запись с точкой в конце доменного имени, которая говорит что имя полностью описано и нечего с ним делать больше не нужно. resolver – программа-клиент. Она вступает в работу когда пользователь пытается получить информацию от DNS-сервера. Файл конфигурации резолвера - /etc/resolv.conf DNS-запрос р (query) – запрос от клиента к серверу. Существует два типа запросов. 1. Рекурсивный – при получение рекурсивного запроса сервер должен опросить другие сервера (если нужной информации нет в своем кэше) и вернуть клиенту уже готовый ответ. С использованием рекурсивных запросов достигается лучшая производительность. Так как количество запросов к DNSсерверу заметно снижается. В свою очередь обработка запросов к другим DNS-серверам происходит вдали от вашей сети и никаких мощностей от вашего DNS-сервера не требует (трафик, процессорное время); 2. Итеративный – в случае получения такого запроса, DNS-сервер просматривает свой кэш и выдает наилучший ответ из имеющихся у него. Это может быть ссылка на другой DNS-сервер. Далее клиент сам продолжает резолвинг нужного доменного имени. Не знаю точно как сейчас, но раньше не все веб-браузеры умели обрабатывать итеративные запросы.

Правила построения DNS-системы При построение своей DNS-системы вам будет необходимо придерживаться некоторого набора правил.

174

Модуль 13. DNS-сервер. BIND.


1. Для каждой зоны должны быть не менее двух DNS-серверов, один masterсервер и один slave-сервер; 2. DNS-сервера должны быть в разных сетях класса C, что должно гарантировать работоспособность сервиса в случае потери связи одного из сегментов сети в котором находится DNS-сервер.

Режимы работы ДНС-серверов Существует несколько режимов в которых может работать DNS-сервер. Конечно самая распространенная связка – это Master/Slave. Master DNS-сервер р р – главный DNS-сервер для зоны, только он имеет право вносить в нее изменения, другие могут получать и хранить у себя, отдавая на запросы клиентов. Здесь ключевое отличие в возможности редактировать файл зоны, изменять список NS-серверов для нее и прочие записи. Slave DNS-сервер р р – вторичный DNS-сервер для зоны, их может быть несколько. Основное предназначение вторичного сервера – подстраховывать первичный (Master server) сервер (в случае, если он станет временно недоступен) и снижать нагрузку обрабатывая часть запросов. Он обслуживает запросы наравне с первичным сервером, также являясь авторитативным для зоны и пользователю должно быть все равно с какого DNS-сервера получать информацию. Slave-сервер не может вносить изменения в конфигурацию зоны. DNS-сервер Кэширующий ру щ р р – такой сервер не является авторитативным для какой либо зоны. Серверы данного вида используют для организации централизованного кэширования соответствий доменных имен и IPадресов. Идея организации кэширующего сервера состоит в том, чтобы не искать соответствие доменного имени и IP-адреса в сети, а накапливать их в своем локальном кэше и обслуживать оттуда запросы клиентов. # nslookup www.ru Server: Address:

192.168.146.2 192.168.146.2#53

Non-authoritative answer: Name: www.ru Address: 194.87.0.50 Строка “Non-authoritative answer” говорит о том, что ответ мы получили из кэша неавторитативного сервера. Модуль 13. DNS-сервер. BIND.

175


Корневые р DNS-сервера р р - сервера, которые обслуживают корневую зону (Root servers). Их место в получении отклика на запрос к системе доменных имен ключевое. Именно к одному из корневых серверов обращается локальный сервер доменных имен, если не находит в зоне своей ответственности или в своем кэше соответствия между доменным именем и IP-адресом. Посмотреть корневые сервера можно вот так: # dig . ns @198.41.0.4 ; <<>> DiG 9.3.4-P1 <<>> . ns @198.41.0.4 ; (1 server found) ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51497 ;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 14 ;; QUESTION SECTION: ;. IN NS ;; ANSWER SECTION: . 518400 IN . 518400 IN . 518400 IN . 518400 IN . 518400 IN . 518400 IN . 518400 IN . 518400 IN . 518400 IN . 518400 IN . 518400 IN . 518400 IN . 518400 IN

NS NS NS NS NS NS NS NS NS NS NS NS NS

K.ROOT-SERVERS.NET. B.ROOT-SERVERS.NET. D.ROOT-SERVERS.NET. A.ROOT-SERVERS.NET. M.ROOT-SERVERS.NET. G.ROOT-SERVERS.NET. C.ROOT-SERVERS.NET. E.ROOT-SERVERS.NET. J.ROOT-SERVERS.NET. L.ROOT-SERVERS.NET. I.ROOT-SERVERS.NET. F.ROOT-SERVERS.NET. H.ROOT-SERVERS.NET.

;; ADDITIONAL SECTION: A.ROOT-SERVERS.NET. 3600000 IN A.ROOT-SERVERS.NET. 3600000 IN B.ROOT-SERVERS.NET. 3600000 IN C.ROOT-SERVERS.NET. 3600000 IN D.ROOT-SERVERS.NET. 3600000 IN E.ROOT-SERVERS.NET. 3600000 IN F.ROOT-SERVERS.NET. 3600000 IN F.ROOT-SERVERS.NET. 3600000 IN G.ROOT-SERVERS.NET. 3600000 IN H.ROOT-SERVERS.NET. 3600000 IN H.ROOT-SERVERS.NET. 3600000 IN

176

A 198.41.0.4 AAAA 2001:503:ba3e::2:30 A 192.228.79.201 A 192.33.4.12 A 128.8.10.90 A 192.203.230.10 A 192.5.5.241 AAAA 2001:500:2f::f A 192.112.36.4 A 128.63.2.53 AAAA 2001:500:1::803f:235

Модуль 13. DNS-сервер. BIND.


I.ROOT-SERVERS.NET. J.ROOT-SERVERS.NET. J.ROOT-SERVERS.NET.

3600000 IN 3600000 IN 3600000 IN

A 192.36.148.17 A 192.58.128.30 AAAA 2001:503:c27::2:30

;; Query time: 233 msec ;; SERVER: 198.41.0.4#53(198.41.0.4) ;; WHEN: Wed Apr 8 10:51:26 2009 ;; MSG SIZE rcvd: 500

Stealth DNS-сервер р р (невидимый DNS-сервер) – такой DNS-сервер не упоминается в описание зоны. Информацию о нем нельзя получить прямыми запросами или копированием описания зоны. Данный тип сервера может быть полезен для внесения изменений в зону находясь за файрволом. В этом случае primary master можно сделать невидимым, а все остальные, в том числе и заявленные при регистрации домена, slave-серверами зоны. Это позволяет нейтрализовать атаки на зону, т.к. обновление всегда будет производиться с “невидимого” primary master.

Типы ответов DNS-серверов Авторитативный ответ (authoritative response ) - такой ответ возвращают сервера которые являются ответственными за зону. Неавторитативный ответ (non authoritative response) - возвращают серверы, которые не отвечают за зону. Необходимую информацию они получают из своего кэша или после нерекурсивного запроса к авторитативному DNSсерверу.

Виды запросов к DNS-серверу Прямой запрос (forward) – это запрос на преобразование имени хоста в IPадрес. Думаю это самый распространенный запрос. Обратный запрос (reverse) – это запрос на преобразование IP-адреса хоста в доменное имя. Почтовые сервера любят проверять наличие этой записи, что в свою очередь помогает бороться со спамом.

Способы копирования зоны с master-сервера Slave-сервер сам по себе не вносит какие либо изменения в файл-зоны, он просто копирует ее с master-сервера по истечению интервала жизни зоны (значение TTL) или когда получает уведомление о том, что были внесены изменения на master-сервере и нужно обновить ее у себя, чтобы Модуль 13. DNS-сервер. BIND.

177


оперировать с актуальной копией. Так вот существует два механизма получения обновлений с master-сервера. AXFR - полное копирование зоны. IXFR – инкрементальное копирование зоны, когда копируются только измененные данные а не весь файл целиком. Перед продолжение хочу обратить внимание на некоторые моменты. Как уже говорилось slave-сервер копирует зону с master-сервера, То есть с сервера который является авторитативным для зоны. Но slave-сервер и сам может являться авторитативным и в этом случае он будет выступать masterсервером для того кто с него копирует зону. Для того чтобы точно описать сервер, который является авторитативным для зоны и который больше не получает обновлений для нее, был введен термин primary master. Primary master находится в корне всех процедур копирования и именно на нем происходит ручное изменение зоны. Такой сервер может быть только один для зоны. За своевременное информирование slave-серверов о необходимости обновить свои данные отвечает механизм DNS NOTIFY. Принцип его работы не сложный. 1. Мы вносим изменения в зону на primary master увеличив значение поля serial на единицу; 2. После перезагрузки конфигурации primary master-сервера, он оповещает все свои slave-сервера об изменениях; 3. Slave-сервер запрашивает описание зоны с primary master-сервера и смотрит версию описания зоны, если версия отличается от его (больше) то он инициирует процесс обновления зоны; 4. После завершения обновления, slave-сервер посылает оповещение на все ему известные авторитативные сервера для этой зоны.

178

Модуль 13. DNS-сервер. BIND.


Виды записей SOA

Start of Authority. Начальная запись зоны, здесь указывают административный контакт и рабочие параметры зоны. # nslookup -type=SOA ya.ru Server: 127.0.0.1 Address: 127.0.0.1#53 Non-authoritative answer: ya.ru origin = ns1.yandex.ru mail addr = sysadmin.yandex.ru serial = 2009040300 refresh = 10800 retry = 900 expire = 2592000 minimum = 900 Authoritative answers can be found from: ya.ru nameserver = ns1.yandex.ru. ya.ru nameserver = ns5.yandex.ru. origin – первичный сервер зоны, ее primary master; mail addr – e-mail администратора зоны, обращаю внимание что вместо @ нужно указывать точку; serial – номер версии зоны, с каждым внесением изменений в зону не забывайте увеличивать это число на еденицу! Тогда slave-сервер сразу обновить ее у себя. Чтобы проще было ориентироваться используйте номер в таком формате <год><месяц><день><какое по счету изменение за день>, таким образом номер всегда будет только возрастать; refresh – интервал в секундах, через который вторичный сервер будет проверять необходимость обновления зоны; retry – интервал в секундах, через который вторичный сервер будет повторять обращения в случае неудачи; expire – интервал в секундах, через который вторичный сервер будет считать информацию о зоне устаревшей и перестанет ее использовать; minimum – значение времени жизни записи на кэширующих серверах.

Модуль 13. DNS-сервер. BIND.

179


NS А AAAA MX

Name server. Указывает на DNS-сервер для данного домена; Запись связывает имя хоста с IP-адресом; Запись связывает имя хоста с IP-адресом протокола IPv6; Mail Exchange. Адрес почтового сервера для этого домена. # nslookup -type=MX ya.ru Server: 127.0.0.1 Address: 127.0.0.1#53 Non-authoritative answer: ya.ru mail exchanger = 10 mx1.yandex.ru. ya.ru mail exchanger = 10 mx2.yandex.ru.

PTR

10 – это приоритет использования почтового сервера. Чем меньше цифра, тем больше шансов что будет выбран именно этот сервер. Pointer. Указать служит для обратного преобразования, То есть по IP-адресу узнаем доменное имя. Для обратного преобразования используется зона in-addr.arpa а IP-адрес записывается справа налево. Скорее всего данный тип записи пропишет для вас провайдер. Рекомендуется для нормальной работы почтовых серверов. # nslookup -type=PTR 213.180.204.8 Server: 127.0.0.1 Address: 127.0.0.1#53

CNAME

Non-authoritative answer: 8.204.180.213.in-addr.arpa name = ya.ru. Canonical Name. Псевдоним который ссылается на другую запись. # nslookup -type=CNAME ns1.ya.ru Server: 127.0.0.1 Address: 127.0.0.1#53

TXT HINFO RP

180

Non-authoritative answer: ns1.ya.ru canonical name = corba-http5.yandex.ru. Текст, который содержит любую информацию. Используется редко; Может содержать некоторую информацию о хосте, например тип процессора и ОС. Используется редко; В этой записи указывается ответственная персона (его e-mail). Используется редко. Модуль 13. DNS-сервер. BIND.


Структура конфигурационного файла Структуру конфигурационного можно представить как набор секций. В таблице ниже я расскажу какие секции бывают и для чего они нужны. options

Секция описывает глобальное поведение DNS-сервера, значения можно переназначить внутри других секций; logging Секция описывает режим журналирования, если на сервере используется syslog то эта секция должна присутствовать; zone Секция описывает зону которую данный DNS-сервер будет поддерживать; acl Access Control Lists, позволяет описать какую либо группу хостов а далее, при конфигурирование, уже ссылаться на эту группу; controls Описывает доступ к удаленному управлению DNS-сервером через rndc; include Позволяет подключить дополнительный файлы конфигурации; key Секция описывает ключи, используемые для аутентификации и контроля операций с Dynamic DNS и удаленного управления; lwres Секция описывает свойства DNS-сервера когда он запущен как легковесный резолвер; server Здесь описываются опции, которые DNS-сервер будет использовать при взаимодействие с другим сервером; view Позволяет описать поведение сервера для конкретных хостов/сетей; trusted-keys Описывает доверенные ключи для домена. Ну и базовая структура может выглядеть вот так: options { ... }; logging { ... }; acl { ...

Модуль 13. DNS-сервер. BIND.

181


}; zone { ... };

Настройка Итак, у нас есть следующее: Сервер с IP 192.168.146.2 – шлюз во внешние сети и DNS-сервер для двух наших сетей (192.168.146.0/24, 192.168.147.0/24); Сервер с IP 192.168.146.132 – новый сервер со свежей Linux CentOS 5.2 который мы сделаем как master dns сервер, также этот сервер будет перенаправлять все запросы на которые не сможет сам ответить на DNSсервер провайдера (192.168.146.2); Сервер с IP 192.168.147.132 – новый сервер со свежей Linux CentOS 5.2 который мы сделаем как slave dns сервер для 192.168.146.132. Настраивать named рекомендуется в chroot-окружение, это когда для сервиса создана своя рабочая среда в рамках которой он работает. Он нечего не знает о внешней системе и не может туда выбраться, и в случае проблем с безопасностью это никак не повлияет на систему в целом. Для этих целей мы и поставили пакет bind-chroot. По умолчанию, если не найден файл /var/named/chroot/etc/named.conf то будет использоваться /var/named/chroot/etc/named.caching-nameserver.conf Я предпочел скопировать шаблон файла named.conf и на его основе сделать свой файл. # cp /usr/share/doc/bind-9.3.4/sample/etc/named.conf /var/named/chroot/etc/ Ключевые файлы и каталоги пакета BIND в таблице ниже. /var/named/chroot/

Структура файловой системы и файлы которые будут использоваться в работе chrooted-bind, все что нужно редактируйте здесь; /usr/sbin/named Исполняемый файл DNS-сервера; /var/named/chroot/etc/named.conf В нормальных условиях конфигурационный файл named.conf расположен в /etc/ но мы настраиваем DNS-сервер в chroot-окружение и поэтому он будет расположен здесь, чтобы named смог его найти;

182

Модуль 13. DNS-сервер. BIND.


/var/named/ /usr/sbin/rndc /usr/sbin/named-checkzone /usr/sbin/named-checkconf /etc/rc.d/init.d/named /etc/sysconfig/named /usr/share/doc/bind-9.3.4/

Все нужные файлы для работы named расположены здесь и в подкаталогах; Утилита для управления named; Утилита для проверки корректности файла зоны; Утилита для проверки корректности конфигурационного файла; Скрипт для chkconfig, при установке из репозитория нечего с ним делать не нужно; Здесь можно задать некоторые опции с которыми будет стартовать named; Документация.

Файл /var/named/chroot/etc/named.conf options { directory «/var/named»; dump-file «data/cache_dump.db»; statistics-file «data/named_stats.txt»; memstatistics-file «data/named_mem_stats.txt»; version «Made in USSR»; listen-on {localhost; 192.168.146.132; }; allow-transfer{192.168.147.132; }; allow-query{trusted-networks; }; allow-recursion {trusted-networks; }; forwarders {192.168.146.2; }; }; logging { channel default_ch { file «data/named-base.log»; severity info; print-time yes; print-category yes; }; channel security_ch { file «data/named-security.log»; severity info; print-time yes; print-category yes; }; category default { default_ch; };

Модуль 13. DNS-сервер. BIND.

183


category security { security_ch; }; }; acl «trusted-networks» {localhost; 192.168.146.0/24; 192.168.147.0/24; }; zone «example545.com» IN { type master; file «example545.com»; }; zone «168.192.in-addr.arpa» { type master; file «168.192.rev»; }; include «/etc/named.rfc1912.zones»;

Файл зоны example545.com p ((все ф файлы зон ррасположены в /var/named/chroot/var/named)) @

IN

IN IN IN @ ns1 ns2 mail www

SOA

NS NS MX IN IN IN IN IN

A A A A A

ns1.example545.com. support.example545.com. ( 1 ; serial 28800 ; refresh 7200 ; retry 604800 ; expire 86400 ; ttl )

10

ns1.example545.com. ns2.example545.com. mail.example545.com.

192.168.146.132 192.168.146.132 192.168.147.132 192.168.146.132 192.168.146.132

Файл обратных зон для нашей сети 192.168.146.0/24 будет таким: @

184

IN

SOA

ns1.example545.com. support.example545.com. ( 1 ; serial 28800 ; refresh 7200 ; retry 604800 ; expire

Модуль 13. DNS-сервер. BIND.


86400 ; ttl ) IN IN 132.146 IN

NS NS PTR

ns1.example545.com. ns2.example545.com. example545.com.

Если сервер запускаем первый раз то выполняем команду # service named start Если он уже работает и обслуживает зоны то будет достаточно перезагрузить файл конфигурации. # rndc reload Теперь поговорим про файл зоны. IN NS ns1.example545.com. - указываем наш NS-сервер для этого домена, нужно указать хотя бы два сервера, IN – означает Internet; IN MX 10 mail.example545.com. - указываем почтовый сервер для этого домена, куда отправлять почту предназначенную для этого домена; @ IN A – запись А для нашего домена. @ – ссылка на имя нашего домена, можно было написать “example545.com. IN A 192.168.146.132” а можно вот так. Далее идут относительные записи А, относительные значит что к этому имени прибавиться еще основная часть. В результате, например, получится mail.example545.com и www.example545.com Если мы не хотим чтобы к имени что либо добавлялось, нужно явно показать что это имя является FQDN, То есть полностью описанным. Для этого после имени нужно поставить точку. Давайте в нашем файле зоны example545.com уберем точку в строке “IN MX 10 mail.example545.com.”, перезагрузим конфигурационный файл командой rndc reload и сделаем запрос к DNS-серверу: # dig example545.com @ns1.example545.com any ;; ANSWER SECTION: ... example545.com. 43200 IN MX 10 mail.example545.com.example545.com. ... Модуль 13. DNS-сервер. BIND.

185


Видите, добавилась основная часть имени домена и получилось “mail. example545.com.example545.com.”, что конечно же не правильно. Ну и попробуем по IP-адресу получить доменное имя: # nslookup 192.168.146.132 Server:

192.168.146.132

Address:

192.168.146.132#53

132.146.168.192.in-addr.arpa name = example545.com.

Опции конфигурационного файла Секция options – глобальные конфигурационные опции; directory Опция задает каталог где располагаются файлы необходимые для работы named; dump-file Опция задает расположение файла с кэшем DNSсервера; statistics-file Опция задает расположение файла с статистикой; memstatistics-file Опция задает расположение файла со статистикой по использованию памяти; version Здесь указываем значение переменной version которое будет отдаваться клиентам в ответ на их запрос версии сервера; listen-on Здесь указываем порты и IP-адреса на которых named будет принимать входящие запросы; allow-transfer Здесь указываем список IP-адресов которым разрешается передавать зону, указываем здесь slave-сервера; allow-query Здесь указываем сети запросы из которых наш DNSсервер будет обслуживать; allow-recursion Здесь указываем сети рекурсивные запросы которых наш DNS-сервер будет обслуживать; forwarders Если наш DNS-сервер не сможет ответить на запрос то он его перенаправит серверам, указанным в этой опции. Обычно, запросы перенаправляют DNSсерверам провайдера, они обслуживают сети в которых вы работаете и всегда помогут. Секция logging – журналирование работы DNS-сервера; channel Указываем название канала логирования; file Путь к файлу в который будет записываться информация из этого канала;

186

Модуль 13. DNS-сервер. BIND.


severity это уровень важности; print-time указывать время в логах или нет; print-category регистрировать категории или нет; category Какие категории в какие каналы пишем. Секция zone – определение зоны; zone Указываем название зоны; type Тип зоны, на primary master пишем master, на slaveсервере – slave; file Расположение файла зоны. В подключенном файле named.rfc1912.zones находятся служебные зоны, делать с файлом нечего не нужно. Не забываем, поскольку наш DNS-сервер будет выполняться в chrootокружение то его log-файлы будут расположены в /var/named/chroot/var/named/data DNS-сервер готов. Теперь на любом клиенте в доверенных сетях в файл /etc/ resolv.conf прописываем наш DNS-сервер и пользуемся. # cat /etc/resolv.conf nameserver 192.168.146.132

Slave-сервер Slave-сервер настраивается точно также как и master за исключением пары опций в секции zone. Ниже я приведу мою конфигурацию и пояснения. Ставим нужные пакеты # yum -y install bind-chroot caching-nameserver Добавляем в автозагрузку # chkconfig named on /var/named/chroot/etc/named.conf options { directory «/var/named»; dump-file «data/cache_dump.db»; statistics-file «data/named_stats.txt»;

Модуль 13. DNS-сервер. BIND.

187


memstatistics-file «data/named_mem_stats.txt»; version «Made in USSR»; listen-on {localhost; 192.168.147.132; }; allow-transfer{none; }; allow-query{trusted-networks; }; allow-recursion {trusted-networks; }; forwarders {192.168.146.132; }; }; logging { channel default_ch { file «data/named-base.log»; severity info; print-time yes; print-category yes; }; channel security_ch { file «data/named-security.log»; severity info; print-time yes; print-category yes; }; category default { default_ch; }; category security { security_ch; }; }; acl «trusted-networks» {localhost; 192.168.146.0/24; 192.168.147.0/24; }; zone «example545.com» IN { type slave; file «slaves/example545.com»; masters {192.168.146.132; }; }; include «/etc/named.rfc1912.zones»;

Как видите все почти тоже самое. Трансфер зоны мы делать не будем, потому что в нашей сети больше нет серверов кому ее можно передать, а master-серверу ее передавать бессмысленно, он является primary masterом для зоны. Все запросы на которые не сможем ответить сами, мы переадресуем master-серверу (он если не сможет ответить то переадресует

188

Модуль 13. DNS-сервер. BIND.


на 192.168.146.2). Ну и ключевое: type slave; - выполнять роль slave-сервера для этой зоны; masters – список master-серверов с которых ее можно получить; # rndc reload Посмотрим наш log-файл /var/named/chroot/var/named/data/named-base.log general: zone example545.com/IN: Transfer started. xfer-in: transfer of 'example545.com/IN' from 192.168.146.132#53: connected using 192.168.147.132#40241 general: zone example545.com/IN: transferred serial 1 xfer-in: transfer of 'example545.com/IN' from 192.168.146.132#53: end of transfer notify: zone example545.com/IN: sending notifies (serial 1)

Slave-сервер готов.

Неавторитативный ответ Наш DNS-сервер не поддерживает зону ya.ru поэтому не может дать авторитативный ответ. Он всего лишь сообщает клиенту то, что узнал от других DNS-серверов. Такой ответ будет неавторитативным и будет содержать строку Non-authoritative answer в своем ответе. А узнавать наш DNS-сервер будет у тех кто перечислен в опции forwarders, То есть кому перенаправлять запросы с которыми мы сами не справились. # nslookup ya.ru Server:

192.168.146.132

Address:

192.168.146.132#53

Non-authoritative answer: Name: ya.ru Address: 213.180.204.8

Авторитативный ответ В этом примере ответ будет авторитативный - мы обращаемся с запросом к нашему DNS-серверу который обслуживает эту зону. # nslookup example545.com Server:

192.168.146.132

Модуль 13. DNS-сервер. BIND.

189


Address:

192.168.146.132#53

Name: example545.com Address: 192.168.146.132

Записи в /etc/resolv.conf Файл /etc/resolv.conf служит не только для указания NS-серверов. Есть еще пара интересных опций на мой взгляд. domain – указав домен мы будем производить поиск хостов в этом домене по коротким именам, это удобно. Например “domain example545.com”. Выполнив команду “nslookup server10” мы произведем поиска хоста server10 в домене example545.com, То есть если существует хост server10.example545. com то мы получим положительный ответ. search – более функциональный механизм, он позволяет задать список доменов в котором мы будем искать свой хост по короткому имени и порядок поиска. Например: search office.example545.com outsorcers.example545.com Сначала ищем в office.example545.com и если не находим то переключаемся на поиск в outsorcers.example545.com. Поиск происходит до первого совпадения, если нечего не найдено то возвращается сообщение об ошибке.

Статистика работы Статистику работы можно посмотреть вот так: # rndc status number of zones: 7 debug level: 0 xfers running: 0 xfers deferred: 0 soa queries in progress: 0 query logging is OFF recursive clients: 0/1000 tcp clients: 0/100 server is up and running

number of zones – число поддерживаемых зон этим DNS-серверов; debug level – уровень отладки debug;

190

Модуль 13. DNS-сервер. BIND.


xfers running – сколько сейчас зон передается; xfers deffered – сколько передач зон отложено; soa queries in progress – сколько происходит запросов soa-записей в настоящий момент; query logging is OFF – журналирвоание запросов отключено; recursive clients – число обрабатываемых рекурсивных запросов; tcp clients – сколько клиентов; server is up and running – сервер запущен и функционирует. Еще один инструмент мониторинга DNS – программа dnstop. Я о ней подробнее написал в модуле “Резервное копирование”. Поставить ее можно из репозитария EPEL.

Резюме В этом модуле мы выяснили как работает DNS-сервер и как он взаимодействует с другими серверами. Разобрались с записями в файле зоны и опциями в конфигурационном файле named.conf. Это далеко не все опции которые бывают, но в случае необходимости без проблем сможете “докрутить” DNSсервер под свои нужды, так как знаете о нем достаточно чтобы эффективно администрировать его. По опыту скажу, что что-то большее может потребоваться только в крупных сетях с нагруженными серверами, и даже в этом случае чего-то сверх-ординарного от вас не потребуется.

Домашнее задание Сделайте 4 виртуальные машины. На двух делаем DNS-сервера – master и slave, на двух других достаточно будет просто Linux, они будут клиентам. Пусть первый клиент выполняет запросы через master, второй через slave. Slave работает через master, master смотрим в Интернет через вашего провайдера. Заведите зону (а лучше несколько) на master-сервере и убедитесь что она передана на slave. Ваши сервера могут быть из одной сети - правило разных сетей класса C действует в публичных сетях, в своей песочнице делайте как хотите. Модуль 13. DNS-сервер. BIND.

191


Nginx Nginx (engine x) — это очень быстрый HTTP сервер, который часто используют вместо или совместно с Apache, чтобы снизить нагрузку на сервер и увеличить скорость обработки запросов посетителей. Что сам автор говорит о Nginx: “Я начал разрабатывать nginx весной 2002 года, а осенью 2004 года вышел первый публично доступный релиз. На данный момент nginx работает на нескольких достаточно нагруженных сайтах под FreeBSD и Linux, в том числе на большинстве серверов Рамблера, и я рассматриваю версию nginx-0.6.35 как стабильную с точки зрения надёжности. Однако функциональность некоторых модулей будет меняться, вследствие чего, будут меняться и директивы, поэтому обратной совместимости до версии 1.0.0 не гарантируется.”

Преимущества Nginx Модульная архитектура Apache предоставляет большие возможности, однако они редко когда полностью востребованы. Ценой за большую функциональность является большой расход системных ресурсов. В массе своей сайты содержат больше статических объектов (HTML, изображения, файлы стилей) для обработки которых не нужен большой функционал. Запросы являются простыми и следовательно обрабатывать такие запросы нужно простым и легковесным веб-сервером, таким как Nginx. К примеру, 10 000 неактивных keep-alive соединений занимают примерно 2.5 Мб памяти.

Варианты использования Nginx standalone Самая легкая в настройке конфигурация. Nginx и Apache работают на разных портах или ip-адресах. Например, адрес всех картинок images.server.ru, этот сервер в свою очередь является Nginx-серверов. Следовательно запросы картинок и прочего статического контента направляются на Nginx-сервер. Если запросов статического контента очень много, то имеет смысл купить отдельный сервер под его обслуживание и поставить на него Nginx.

Frontend к Apache p Так называемое “акселерированное проксирование ” при котором все запросы сначала направляются на Nginx. Если происходит запрос

192

Модуль 14. HTTP сервер: Nginx.


статического контента то Nginx сам его обрабатывает, если запрос скрипта то он переадресовывается к Apache.

Nginx g + FastCGI Если скрипты сайта написаны на языке программирования интерпретатор которого понимает технологию FastCGI то Apache нам вообще не нужен. Примерами таких языков являются Perl, PHP и многие другие. Минус этого способа – возможно потребуется модификация скриптов.

Установка EPEL В базовых репозиториях CentOS 5.2 Nginx отсутствует. Для того чтобы его поставить из пакета нам нужно подключить репозиторий EPEL. EPEL - Extra Packages for Enterprise Linux, репозиторий поддерживаемый добровольцами и содержащий в себе популярные и нужные пакеты. На момент написания этих строк репозиторий содержал в себе примерно 2800 пакетов. Посмотрим что содержит в себе rpm-пакет # rpm -qpl http://download.fedora.redhat.com/pub/epel/5/i386/epel-release5-3.noarch.rpm /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel.repo /usr/share/doc/epel-release-5 /usr/share/doc/epel-release-5/GPL То есть по сути просто файл .repo который содержит в себе ссылку на новый репозиторий.

Ставим EPEL-пакет # rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release5-3.noarch.rpm Проверяем список репозиториев # yum repolist Модуль 14. HTTP сервер: Nginx.

193


Установка Nginx с поддержкой PHP. Настраиваем связку Nginx + FastCGI. Установка Nginx g и сопутствующих у у щ сервисов. р Сам по себе Nginx не умеет обрабатывать php-скрипты. Для этого нужно запустить php в режиме FastCGI-сервер и все запросы *.php направлять на него. Устанавливаем Nginx # yum -y install nginx Добавляем в автозагрузку при старте сервера # chkconfig nginx on Ставим пакет php-cli который содержит в себе php-cgi. Он то и будет обрабатывать наши php-скрипты. # yum -y install php-cli Устанавливаем CGI-сервер spawn-fcgi (входит в комплект поставки lighttpd) # yum -y install spawn-fcgi Запускаем CGI-сервер на порту 9000 # spawn-fcgi -a 127.0.0.1 -p 9000 -u nginx -g nginx -f /usr/bin/php-cgi Проверяем, слушает ли CGI-сервер нужный наш порт # netstat -nlp | grep :9000 tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN

6395/php-cgi

Готовим скрипт автоматизации работы spawn-fcgi # cat /etc/rc.d/init.d/spawn-fcgi #!/bin/bash # chkconfig: - 80 20 # description: Starts and stops FastCGI server for Nginx SPAWN=»/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u nginx -g nginx -f /usr/bin/php-cgi» RETVAL=0 case «$1» in start)

194

Модуль 14. HTTP сервер: Nginx.


$SPAWN RETVAL=$? ;; stop) killall -9 php-cgi RETVAL=$? ;; *) echo «Usage: spawn-cgi {start|stop}» exit 1 ;; esac exit $RETVAL

Добавляем spawn-fcgi в автозагрузку при старте сервера # chkconfig spawn-fcgi on Устанавливаем правильные права на скрипт # chmod 755 /etc/init.d/spawn-fcgi Мы настроили доступ к репозиторию EPEL, который содержит в себе массу полезных пакетов. Установили Nginx, PHP и spawn-fcgi который будет предоставлять FastCGI-сервис на нужном порту. Также написали скрипт автоматизации запуска и управления spawn-fcgi. Для других пакетов в этом нет необходимости так как все есть.

Конфигурирование Nginx + FastCGI Файлы Nginx и их расположение. /var/log/nginx/ /usr/sbin/nginx /usr/share/nginx /etc/rc.d/init.d/nginx /etc/logrotate.d/nginx /etc/nginx/ /etc/sysconfig/nginx /etc/php.ini /etc/php.d/

логи Nginx; программа Nginx; файлы веб-сервера; скрипт запуска Nginx; политика ротации логов для Logwatch; каталог с конфигурационными файлами Nginx; это файл содержащий в переменной путь к основному; конфигурационному файлу Nginx; файл с настройками PHP; дополнительные файлы настроек для PHP.

Наш файл nginx.conf будет таким: Модуль 14. HTTP сервер: Nginx.

195


# cat /etc/nginx/nginx.conf user nginx; worker_processes 1; # [ debug | info | notice | warn | error | crit ] error_log /var/log/nginx/error.log info; pid /var/run/nginx.pid; events { worker_connections 1024; # use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; use epoll; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] $request ' '»$status» $body_bytes_sent «$http_referer» ' '»$http_user_agent» «$http_x_forwarded_for»'; access_log /var/log/nginx/access.log main; client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; client_header_buffer_size 1k; large_client_header_buffers 4 4k; gzip on; gzip_min_length 1100; gzip_buffers 4 8k; gzip_types text/plain; output_buffers 1 32k; postpone_output 1460; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 60; include /etc/nginx/conf.d/*.conf;

196

Модуль 14. HTTP сервер: Nginx.


server { listen 80; server_name company.ru www.company.ru; location / { root /usr/share/nginx/html; index index.php index.html index.htm; ssi on; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location /status { stub_status on; access_log off; allow 192.168.146.1; deny all; } error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location /old_dir/ { rewrite ^/old_dir/(.*)$ /new_dir/$1 permanent; } location ~ /\.ht { deny all; } } # Virtual host company2.ru server { listen 80; server_name company2.ru www.company2.ru;

Модуль 14. HTTP сервер: Nginx.

197


access_log /var/log/nginx/company2.access.log; error_log /var/log/nginx/company2.error.log error; location / { root /home/company2.ru; index index.html index.php; } error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/company2.ru$fastcgi_script_name; include fastcgi_params; } } }

# service nginx start

Понижаем нагрузку на основной веб-сервер. Установка Nginx как Frontend к Apache. Принцип работы будет заключаться в следующем. Nginx работая на порту 80 будет принимать все запросы к веб-серверу. В соответствие со своим списком расширений он будет отдавать статику, все остальные запросы будет направлять к Apache который работает на порту 8080 (в моем случае на том же сервере). Если Apache и Nginx работают на одном сервер то можно писать как “Listen 127.0.0.1:8080”, в этом случае кроме Nginx доступ к вебсерверу Apache больше никто не получит. Устанавливаем Apache # yum -y install httpd httpd-devel

198

Модуль 14. HTTP сервер: Nginx.


Добавляем httpd в автозагрузку # chkconfig httpd on В конфигурационном файле /etc/httpd/conf/httpd.conf меняем директиву Listen 80 на Listen 127.0.0.1:8080 (или какой там у вас IP-адрес) Другие настройки – по вашему желанию. Listen 127.0.0.1:8080 Устанавливаем php. Настройки по вашему желанию. # yum -y install php Устанавливаваем Nginx # yum -y install nginx Добавляем Nginx в автозагрузку # chkconfig nginx on

Конфигурирование Nginx user nginx; worker_processes 1; # [ debug | info | notice | warn | error | crit ] error_log /var/log/nginx.error_log info; pid /var/run/nginx.pid; events { worker_connections 1024; # use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; use epoll; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] $request ' '»$status» $body_bytes_sent «$http_referer» ' '»$http_user_agent» «$http_x_forwarded_for»'; access_log /var/log/nginx/access.log main;

Модуль 14. HTTP сервер: Nginx.

199


client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; client_header_buffer_size 1k; large_client_header_buffers 4 4k; gzip on; gzip_min_length 1100; gzip_buffers 4 8k; gzip_types text/plain; output_buffers 1 32k; postpone_output 1460; sendfile tcp_nopush tcp_nodelay

on; on; on;

keepalive_timeout 60; include /etc/nginx/conf.d/*.conf; server { listen 80; server_name company.ru www.company.ru; location / { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 75; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } location ~* ^.+\.(jpg|gif|avi|mp3|zip|js)$ { root /var/www/html/media;

200

Модуль 14. HTTP сервер: Nginx.


access_log off; expires 30d; } error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } }

Установка mod_rpaf Запросы к Apache приходят с IP-адреса frontend-сервера, что в свою очередь не позволяет собирать статистику и вести log-файлы по посетителям. Тут нам на помощь приходит модуль mod_rpaf, который служит для замены IP-адреса Frontend-сервера на адрес посетителя и мы просто не замечаем Nginx на свое пути. Скачиваем src-пакет mod_rpaf # wget http://repo.redhat-club.org/redhat/5/SRPMS/mod_rpaf-0.6-el5.rhc.1.src.rpm Устанавливаем rpm-build, так как придется пересобрать rpm-пакет. # yum -y install rpm-build Пересобираем пакет # rpmbuild --rebuild mod_rpaf-0.6-el5.rhc.1.src.rpm Устанавливаем пересобранный пакет в систему # rpm -Uvh /usr/src/redhat/RPMS/i386/mod_rpaf-0.6-.1.i386.rpm

В /etc/httpd/conf/httpd.conf добавляем: Модуль 14. HTTP сервер: Nginx.

201


LoadModule rpaf_module modules/mod_rpaf-2.0.so RPAFenable On RPAFsethostname Off RPAFproxy_ips 127.0.0.1 192.168.146.132 RPAFheader X-Real-IP

# service httpd restart Проверка работоспособности mod_rpaf Создаем страничку index.php со следующим содержанием: <? echo $_SERVER['REMOTE_ADDR']; ?>

С включенным mod_rpaf переменная REMOTE_ADDR будет содержать ваш IP-адрес. С отключенным 127.0.0.1 Работа выполнена. Теперь любые файлы с расширениями jpg,gif,avi,mp3,zip и js будут отдаваться через Nginx. Все остальные запросы будут перенаправлены к Apache на linuxbox:8080

Включение SSL Сейчас я покажу как подключить SSL к Nginx и настроить работу с PHPскриптами (тоже самое что и не у SSL-режима). Генерируем ключ и сертификат (если нет openssl то ставим – yum -y install openssl) # openssl genrsa -des3 -out server.key.crypt 1024 # openssl rsa -in server.key.crypt -out server.key # openssl req -new -x509 -nodes -sha1 -days 365 -key server.key -out server.crt # rm -f server.key.crypt Файлы server.key и server.crt необходимо расположить в /etc/nginx/ Файл ssl.conf должен быть таким # cat /etc/nginx/conf.d/ssl.conf

202

Модуль 14. HTTP сервер: Nginx.


server { listen 443; server_name company.ru www.company.ru; ssl on; server.crt; ssl_certificate ssl_certificate_key server.key; ssl_session_timeout 10m; # ssl_protocols SSLv2 SSLv3 TLSv1; # ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; # ssl_prefer_server_ciphers on; location / { root /usr/share/nginx/html; index index.php index.html; } location ~ \.php$ { if (!-f $request_filename) { return 404; } fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }

# service nginx restart

Использование двух версий PHP в Nginx одновременно Для использования двух версий PHP одновременно, например 4 и 5 делаем следующее: http { index index.php; root /usr/share/nginx/html; # PHP 4 скрипты будут с расширением .php4 location ~ .*\.php4?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php4; } # PHP 5 скрипты будут с расширением .php5 location ~ .*\.php5$ { fastcgi_pass 127.0.0.1:9001; fastcgi_index index.php5; } }

Модуль 14. HTTP сервер: Nginx.

203


Ну и соответственно запускаем spawn-fcgi для PHP 4 и PHP 5 # /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u nginx -g nginx -f /usr/bin/php-cgi4 # /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9001 -u nginx -g nginx -f /usr/bin/php-cgi5

Примеры производительности с Nginx и без него. Здесь я приведу некоторые замеры производительности систем с Nginx и без него, чтобы стало понятно ради чего все затевалось. Хостинг-сервер обслуживающий 150 сайтов

Средняя р нагрузка ру

Использование процессора р ц р

204

Модуль 14. HTTP сервер: Nginx.


Использование памяти

Описание директив конфигурационного файла Ниже я привел описание популярных директив конфигурационного файла. user

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

worker_processes

Директива задаёт число рабочих процессов;

error_log

Директива задаёт URI, который будет показываться для указанных ошибок. Директивы наследуются с предыдущего уровня при условии, что на данном уровне не описаны свои директивы error_page. В URI можно использовать переменные;

pid

Директива задаёт файл, в котором хранится номер основного процесса;

use epoll

epoll- эффективный способ обработки соединений в Linux ядра 2.6. Рекомендуется;

include

Директивой подключаются конфигурационные файлы;

default_type

MIME-тип по умолчанию;

log_format

Задает формат лог-файла;

access_log

Указывает на файл в котором будут сохраняться сообщения о запросах;

Модуль 14. HTTP сервер: Nginx.

дополнительные

205


c l i e n t _ h e a d e r _ Директива задаёт таймаут при чтении заголовка запроса клиента. Если по истечении этого времени timeout клиент не передаст полностью заголовок запроса, то ему возвращается ошибка «Request time out” (408); client_body_timeout Директива задаёт таймаут при чтении тела запроса клиента. Таймаут устанавливается не на всю передачу тела запроса, а только между двумя операциями чтения. Если по истечении этого времени клиент ничего не передаст, то ему возвращается ошибка «Request time out” (408); send_timeout Директива задаёт таймаут при передаче ответа клиенту. Таймаут устанавливается не на всю передачу ответа, а только между двумя операциями записями. Если по истечении этого времени клиент ничего не примет, то nginx закрывает соединение; c l i e n t _ h e a d e r _ Директива задаёт размер буфера для чтения заголовка запроса клиента. Для подавляющего buffer_size большинства запросов вполне достаточно буфера размером в 1K. Однако если в запросе есть большие cookies или же запрос пришёл от wap-клиента, то он может не поместиться в 1K. Поэтому, если строка запроса или строка заголовка запроса не помещается полностью в этот буфер, то выделяются большие буферы, задаваемые директивой large_ client_header_buffers; large_client_header_ Директива задаёт максимальное число и размер буферов для чтения большого заголовка запроса buffers клиента. Строка запроса должна быть не больше размера одного буфера, иначе клиенту возвращается ошибка «Request URI too large” (414). Длинная строка заголовка запроса также должна быть не больше размера одного буфера, иначе клиенту возвращается ошибка “Bad request” (400). Буферы выделяются только по мере необходимости. По умолчанию размер одного буфера равен размеру страницы, в зависимости от платформы это или 4K, или 8K. Если по окончании обработки запроса соединение переходит в состояние keep-alive, то эти буферы освобождаются; gzip Разрешает или запрещает сжатие ответа методом gzip; gzip_min_length Устанавливает минимальную длину ответа, для которых будет выполняться сжатие ответа методом gzip. Длина определяется только из строки “Content-Length” заголовка ответа;

206

Модуль 14. HTTP сервер: Nginx.


gzip_buffers

gzip_types

sendfile tcp_nopush

tcp_nodelay

keepalive_timeout

server {...}

Директива задаёт число и размер буферов, в которые будет сжиматься ответ. По умолчанию размер одного буфера равен размеру страницы, в зависимости от платформы это или 4K, или 8K. До версии 0.7.28 по умолчанию использовалось 4 буфера размером 4K или 8K; Разрешает сжатие ответа методом gzip для указанных MIME-типов в дополнение к “text/html”. “text/html” сжимается всегда; Директива разрешает или запрещает использовать sendfile(); Директива разрешает или запрещает использовать опции TCP_NOPUSH во FreeBSD или TCP_CORK в Linux. Опции включаются только при использование sendfile. Включение опции позволяет - передавать заголовок ответа и начало файла в одном пакете в Linux и во FreeBSD 4.x; - передавать файл в полных пакетах. Директива разрешает или запрещает использовать опцию TCP_NODELAY. Опция включаются только при переходе соединения в состояние keep-alive. Директива задаёт таймаут, в течение которого keepalive соединение с клиентом не будет закрыто со стороны сервера. Второй параметр задаёт значение в строке “Keep-Alive: timeout=время” в заголовке ответа. Параметры могут отличаться друг от друга. Строку “Keep-Alive: timeout=время” понимают Mozilla и Konqueror. MSIE сам закрывает keep-alive соединение примерно через 60 секунд; Директива задаёт таймаут, в течение которого keepalive соединение с клиентом не будет закрыто со стороны сервера; Директива задаёт конфигурацию для виртуального сервера. Чёткого разделения виртуальных серверов ip-based (на основании ip-адреса) и name-based (на основании имени, передаваемого в строке “Host” заголовка запроса), нет. Вместо этого директивами listen описываются все адреса и порты, на которых нужно принимать соединения для этого сервера, и в директиве server_name указываются все имена серверов. Пример конфигурации описан в примере настройки виртуальных хостов;

Модуль 14. HTTP сервер: Nginx.

207


listen

server_name location {...} proxy_pass

proxy_redirect

proxy_set_header

client_max_body_ size

client_body_buffer_ size

proxy_connect_ timeout

proxy_send_timeout

208

Директива задаёт адрес и порт, на которых сервер принимает запросы. Можно указать только адрес или только порт, кроме того, адрес может быть именем сервера; Директива задаёт имена виртуального сервера; Директива устанавливает конфигурацию в зависимости от URI запроса; Директива задаёт адрес проксируемого сервера и URI, на который будет отображаться location. Адрес может быть указан в виде доменного имени или адреса и порта; Директива задаёт текст, который нужно изменить в строках заголовка «Location” и “Refresh” в ответе проксируемого сервера; Директива позволяет переопределять или добавлять строки заголовка запроса, передаваемые проксируемому серверу. В качестве значения можно использовать текст, переменные и их комбинации; Директива задаёт максимально допустимый размер тела запроса клиента, указываемый в строке «Content-Length” в заголовке запроса. Если размер больше заданного, то клиенту возвращается ошибка “Request Entity Too Large” (413). Следует иметь в виду, что браузеры не умеют корректно показывать эту ошибку; Директива задаёт размер буфера для чтения тела запроса клиента. Если тело запроса больше заданного буфера, то всё тело запроса или только его часть записывается во временный файл. По умолчанию размер одного буфера равен двум размерам страницы, в зависимости от платформы это или 8K, или 16K; Директива задаёт таймаут для соединения с проксированным сервером. Необходимо иметь в виду, что этот таймаут не может быть больше 75 секунд; Директива задаёт таймаут при передаче запроса проксированному серверу. Таймаут устанавливается не на всю передачу запроса, а только между двумя операциями записи. Если по истечении этого времени проксируемый сервер не примет новых данных, то nginx закрывает соединение; Модуль 14. HTTP сервер: Nginx.


proxy_read_timeout

proxy_buffer_size

proxy_buffers

root error_page

access_log

expires

Директива задаёт таймаут при чтении ответа проксированного сервера. Таймаут устанавливается не на всю передачу ответа, а только между двумя операциями чтения. Если по истечении этого времени проксируемый сервер ничего не передаст, то nginx закрывает соединение; Директива задаёт размер буфера, в который будет читаться первая часть ответа, получаемого от проксируемого сервера. В этой части ответа находится, как правило, небольшой заголовок ответа. По умолчанию размер буфера равен размеру одного буфера в директиве proxy_buffers, однако его можно сделать меньше; Директива задаёт число и размер буферов для одного соединения, в которые будет читаться ответ, получаемый от проксируемого сервера. По умолчанию размер одного буфера равен размеру страницы, в зависимости от платформы это или 4K, или 8K; Директива задаёт корневой каталог для запросов; Директива задаёт URI, который будет показываться для указанных ошибок. Директивы наследуются с предыдущего уровня при условии, что на данном уровне не описаны свои директивы error_page. В URI можно использовать переменные; Директива access_log задаёт путь, формат и размер буфера для буферизированной записи в лог. На одном уровне может использоваться несколько логов. Параметр “off ” отменяет все директивы access_log для текущего уровня. Если формат не указан, то используется предопределённый формат “combined”; Разрешает или запрещает добавлять или менять строки «Expires” и “Cache-Control” в заголовке ответа. В качестве параметра можно задать положительное или отрицательное время.

Резюме Мы выяснили что такое Nginx и зачем он нужен, разобрали способы его применения и самое главное все сами сделали на практике. Nginx может работать сам по себе, но основное предназначение – снижать нагрузку на Apache обрабатывая статику.

Домашнее задание Воспользовавшись полученными знаниями настройте Nginx в двух режимах работы. Nginx+FastCGI и Frontend/Backend. Модуль 14. HTTP сервер: Nginx.

209


Postfix Postfix – один из самых распространенных MTA на данный момент. MTA – это Mail Transfer Agent, агент по доставке почты. В этом модуле я расскажу, как настроить почтовый сервер корпоративного уровня на базе Postfix. У нас будет весь необходимый функционал, - MTA, POP3/IMAP-сервер, антивирус, антиспам, веб-интерфейс по управлению почтовым сервером и веб-интерфейс для пользователей. Классно правда ? И самое главное, что все ПО является бесплатным. Информация в модуле будет состоять из двух частей. В первой части мы все установим и настроим а во второй я приведу описание конфигурационных файлов всех наших программ.

Установка и настройка # yum -y remove sendmail

Postfix Для построение почтового сервера нужно установить и настроить набор программного обеспечения. 1. Postfix – MTA который отвечает за пересылку почты на другие почтовые сервера; 2. MySQL, именно в базе данных мы будем хранить почтовые аккаунты; 3. Dovecot, предоставляет сервисы POP3/IMAP для пользователей сервера; 4. Clamd (ClamAV Daemon), отвечает за проверку почту на наличие вирусов; 5. ClamSMTP, связывает работу Postfix и ClamAV между собой; 6. Spamassassin, отвечает за проверку почты на наличие SPAM-сообщений; 7. Postfixadmin – веб-интерфейс для управления Postfix; 8. Squirrelmail – веб-интерфейс для пользователей почтового сервера. Настраиваем наш yum на работу с новым репозиторием – rpmforge. Репозиторий содержит около 4000 тысяч пакетов, но нам оттуда понадобится только clamsmtp, SMTP-фильтр для проверки писем на вирусы, в своей работе использующий ClamAV и Spamassassin. # rpm -Uvh http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforgerelease-0.3.6-1.el5.rf.i386.rpm

210

Модуль 15. Postfix.


Postfix доступный в репозитории не имеет поддержки MySQL а именно там мы собираемся хранить всю свою базу аккаунтов пользователей, поэтому мы скачаем src-пакет, внесем в него изменения (добавим поддержку MySQL), соберем и установим. # mkdir -p /usr/src/redhat/{SOURCES,BUILD,SRPMS,RPMS/i386} # rpm -Uvh http://mirror.corbina.net/pub/Linux/centos/5.2/updates/SRPMS/ postfix-2.3.3-2.1.el5_2.src.rpm # cd /usr/src/redhat/SPECS/ В файл postfix.spec добавляем поддержку MySQL и кое какие другие опции для успешной сборки: меняем %define LDAP 2 на %define LDAP 0 меняем %define MySQL 0 на %define MySQL 1 В коде ниже меняем %define SASL 1 на %define SASL 2 %if %{LDAP} <= 1 && %{SASL} >= 2 %undefine SASL %define SASL 1 %endif

# yum -y install mysql gcc rpm-build db4-devel zlib-devel openldap-devel cyrussasl-devel pcre-devel mysql-devel openssl-devel # rpmbuild -ba postfix.spec # rpm -Uvh /usr/src/redhat/RPMS/i386/postfix-2.3.3-2.1.i386.rpm # chkconfig postfix on # chkconfig mysqld on Выполняем postconf и убеждаемся что postfix собран с поддержкой mysql # postconf -m ... mysql ... # useradd -r -u 1000 -g mail -d /var/vmail -s /sbin/nologin -c “Virtual Mailbox” vmail # mkdir /var/vmail # chmod 770 /var/vmail/ # chown vmail: /var/vmail/ Модуль 15. Postfix.

211


Конфигурационный ф ур ц файл ф /etc/postfi p x/main.cf soft_bounce = no queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix mail_owner = postfix default_privs = nobody myhostname = mail-server.company.ru mydomain = company.ru myorigin = $mydomain inet_interfaces = all mydestination = localhost.$myhostname, localhost unknown_local_recipient_reject_code = 550 local_recipient_maps = $virtual_mailbox_maps, $virtual_alias_maps mynetworks = 127.0.0.0/8, 192.168.146.0/24 #relay_domains = $mydomain alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mail_spool_directory = /var/spool/mail smtpd_banner = $myhostname ESMTP debug_peer_level = 2 debug_peer_list = 127.0.0.1 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin xxgdb $daemon_directory/$process_name $process_id & sleep 5 sendmail_path = /usr/sbin/sendmail.postfix newaliases_path = /usr/bin/newaliases.postfix mailq_path = /usr/bin/mailq.postfix setgid_group = postdrop html_directory = no manpage_directory = /usr/share/man sample_directory = /usr/share/doc/postfix-2.3.3/samples readme_directory = /usr/share/doc/postfix-2.3.3/README_FILES config_directory = /etc/postfix virtual_mailbox_domains = mysql:$config_directory/sql/vdomains.cf virtual_mailbox_base = /var/vmail virtual_mailbox_maps = mysql:$config_directory/sql/vmailbox.cf virtual_alias_maps = mysql:$config_directory/sql/valias.cf virtual_minimum_uid = 1000 virtual_uid_maps = static:1000 virtual_gid_maps = static:12 virtual_transport = dovecot dovecot_destination_recipient_limit = 1 smtpd_sasl_auth_enable = yes smtpd_sasl_exceptions_networks = $mynetworks

212

Модуль 15. Postfix.


smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_non_fqdn_recipient, reject_unverified_recipient, reject_rbl_client cbl.abuseat.org, reject_rbl_client dialups.mail-abuse.org, content_filter = scan:127.0.0.1:10025 receive_override_options = no_address_mappings

Конфигурационный ф ур ц файл ф /etc/postfi p x/master.cf # Postfix master process configuration file. # service type private unpriv chroot wakeup maxproc command + args #

(yes) (yes) (yes) (never) (100)

# ========================================================== smtp

inet n

-

n

-

-

smtpd

-o content_filter=spamfilter:dummy pickup fifo n

-

n

cleanup unix n qmgr

-

60

1

pickup

-

0

cleanup

1

qmgr

n

fifo n

-

n

300

tlsmgr unix -

-

n

1000? 1

rewrite unix -

-

n

-

bounce unix -

-

n

-

-

tlsmgr trivial-rewrite

0

bounce

defer

unix -

-

n

-

0

bounce

trace

unix -

-

n

-

0

bounce

1

verify

verify unix -

-

n

-

flush

-

n

1000? 0

unix n

proxymap unix -

-

n

-

-

flush proxymap

smtp

unix -

-

n

-

-

smtp

relay

unix -

-

n

-

-

smtp

Модуль 15. Postfix.

213


-o fallback_relay= showq error

unix n unix -

-

discard unix local

unix -

n n

-

-

showq error

-

n

-

-

discard

n

n

-

-

local

virtual unix -

n

n

-

-

virtual

lmtp

unix -

-

n

-

-

lmtp

anvil

unix -

-

n

-

1

anvil

scache unix -

-

maildrop unix -

n n

-

1

n

scache

-

-

pipe

flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient} old-cyrus unix -

n

n

-

-

pipe

flags=R user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -m ${extension} ${user} cyrus

unix -

n

n

-

-

pipe

user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -r ${sender} -m ${extension} ${user} uucp

unix -

n

n

-

-

pipe

flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient) ifmail unix -

n

n

-

-

pipe

flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient) bsmtp

unix -

n

n

-

-

pipe

flags=Fq. user=foo argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient dovecot unix

-

n

n

-

-

pipe

flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -d $(recipient) scan unix - - n - 16 smtp -o smtp_send_xforward_command=yes 127.0.0.1:10026 inet n - n - 16 smtpd -o content_filter= -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks

214

Модуль 15. Postfix.


-o smtpd_helo_restrictions= -o smtpd_client_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks_style=host -o smtpd_authorized_xforward_hosts=127.0.0.0/8 spamfilter unix - n n - - pipe flags=Rq user=spamfilter argv=/usr/local/bin/spamfilter -f ${sender} -- ${recipient}

# mkdir /etc/postfix/sql

Конфигурационный ф ур ц файл ф /etc/postfi p x/sql/valias.cf q user = postfix password = password hosts = localhost dbname = postfix table = alias select_field = goto where_field = address additional_conditions = and active = '1' query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

Конфигурационный ф ур ц файл ф /etc/postfi p x/sql/vdomains.cf q user = postfix password = password hosts = localhost dbname = postfix table = domain select_field = domain where_field = domain additional_conditions = and backupmx = '0' and active = '1' query = SELECT domain FROM domain WHERE domain='%s' AND backupmx='0' AND active='1'

Модуль 15. Postfix.

215


Конфигурационный ф ур ц файл ф /etc/postfi p x/sql/vmailbox.cf q user = postfix password = password hosts = localhost dbname = postfix table = mailbox select_field = CONCAT(domain,'/',maildir) where_field = username additional_conditions = and active = '1' query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'

MySQL MySQL – популярная система управления базами данных. В базе мы будет хранить почтовые аккаунты, то есть пользователи будут виртуальными и нет необходимости заводить их в системе. # service mysqld start Установите административный пароль на MySQL и некоторые другие опции ответив на несколько вопросов. # /usr/bin/mysql_secure_installation ... Set root password? [Y/n] y ... Remove anonymous users? [Y/n] y ... Disallow root login remotely? [Y/n] y ... Remove test database and access to it? [Y/n] y ... Reload privilege tables now? [Y/n] y ... Thanks for using MySQL! # mysql -p mysql> CREATE DATABASE postfix;

216

Модуль 15. Postfix.


Вместо password укажите свой пароль для пользователя. mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'password'; mysql> GRANT ALL PRIVILEGES ON `postfix`.* TO ‘postfix’@’localhost’; mysql> \q В файле /etc/my.cnf в секцию [mysqld] добавляем строку указанную ниже, она сообщит MySQL-серверу ожидать входящие соединения на этом IP-адресе. bind-address=127.0.0.1 # service mysqld restart

Dovecot Dovecot – популярный POP3/IMAP-сервер, стабильный и несложный в настройке. # yum -y install dovecot # chkconfig dovecot on

Конфигурационный ф ур ц файл ф /etc/dovecot.conf base_dir = /var/run/dovecot/ protocols = imap pop3 protocol imap { listen = *:143 } protocol pop3 { listen = *:110 } log_timestamp = «%Y-%m-%d %H:%M:%S» syslog_facility = mail mail_location = maildir:/var/vmail/%d/%u

Модуль 15. Postfix.

217


mail_debug = yes first_valid_uid = 1000 last_valid_uid = 1000 maildir_copy_with_hardlinks = yes protocol imap { login_executable = /usr/libexec/dovecot/imap-login mail_executable = /usr/libexec/dovecot/imap imap_max_line_length = 65536 } protocol pop3 { login_executable = /usr/libexec/dovecot/pop3-login mail_executable = /usr/libexec/dovecot/pop3 pop3_uidl_format = %08Xu%08Xv } protocol lda { postmaster_address = postmaster@company.ru sendmail_path = /usr/lib/sendmail auth_socket_path = /var/run/dovecot/auth-master } auth_verbose = yes auth_debug = yes auth_debug_passwords = yes auth default { base_dir = /var/run/dovecot/ mechanisms = plain passdb pam { }

218

Модуль 15. Postfix.


passdb sql { args = /etc/dovecot-sql.conf } userdb passwd { } userdb sql { args = /etc/dovecot-sql.conf } user = nobody socket listen { master { path = /var/run/dovecot/auth-master mode = 0660 user = vmail group = mail } client { path = /var/spool/postfix/private/auth mode = 0660 user = postfix group = postfix } } } dict { } plugin { }

Конфигурационный ф ур ц файл ф /etc/dovecot-sql.conf q driver = mysql connect = host=localhost dbname=postfix user=postfix password=password default_pass_scheme = MD5

Модуль 15. Postfix.

219


user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, 1000 AS uid, 12 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1' password_query = SELECT username as user, password, '/var/vmail/%d/%n' asuserdb_ home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 1000 as userdb_uid, 12 asuserdb_gid FROM mailbox WHERE username = '%u' AND active = '1'

Clamd Clamd - Clam AntiVirus Daemon. Сервис ожидает входящие подключения на UNIX/TCP-сокете и проверяет файлы и каталоги по запросу (например clamdscan /var). # yum -y install clamd # chkconfig clamd on

Конфигурационный ф ур ц файл ф /etc/clamd.conf LogFile /var/log/clamav/clamd.log LogFileMaxSize 0 LogTime yes LogSyslog yes PidFile /var/run/clamav/clamd.pid TemporaryDirectory /var/tmp DatabaseDirectory /var/clamav LocalSocket /var/run/clamav/clamd.sock FixStaleSocket yes TCPSocket 3310 TCPAddr 127.0.0.1 MaxConnectionQueueLength 30 MaxThreads 50 ReadTimeout 300 User clamav AllowSupplementaryGroups yes ScanPE yes ScanELF yes DetectBrokenExecutables yes ScanOLE2 yes ScanMail yes ScanHTML yes ScanArchive yes ArchiveBlockEncrypted no

220

Модуль 15. Postfix.


Популярные команды ClamAV: clamdscan clamconf clamdtop

Позволяет проверять файлы и каталоги на наличие вирусов; Конфигурационная утилита ClamSV; Clam AntiVirus Daemon Monitor.

ClamSMTP ClamSMTP – это SMTP-фильтр, который позволяет взаимодействовать Postfix и ClamAV. # rpm -Uvh http://www.inet.lt/clamsmtp/clamsmtp-1.10-1.src.rpm # cd /usr/src/redhat/SPECS # yum -y install automake autoconf # rpmbuild -ba clamsmtp.spec # rpm -Uvh /usr/src/redhat/RPMS/i386/clamsmtp-1.10-1.i386.rpm # chkconfig clamsmtpd on

Конфигурационный ф ур ц файл ф /etc/clamsmtpd.conf p OutAddress: 10026 TimeOut: 180 KeepAlives: 0 XClient: on Listen: 127.0.0.1:10025 ClamAddress: /var/run/clamav/clamd.sock Header: X-Virus-Scanned: ClamAV using ClamSMTP TempDirectory: /tmp Action: drop Quarantine: on User: clamav

Spamassassin Spamassassin – самый популярный антиспам фильтр. Настройка Spamassassin может занять у вас определенное время, прежде чем он научится эффективно справляться со спамом. Работа Spamassassin основана на ряде тестов через которые прогоняется каждое входящее письмо. Каждый тест имеет свой вес – некое целое или десятичное число, которое добавляется в общую “копилку”. Число может быть как положительным так и отрицательным. Если к концу всех тестов письмо Модуль 15. Postfix.

221


набирает больше заранее определенного лимита баллов (required_hits) то оно помечается как SPAM и к нему применяются соответствующие меры. Обычно это дописывание в тему письма сообщения о том, что это SPAM-письмо. На основание этого, пользователи могут фильтровать входящею почту в своих клиентских программах. В процессе своей работы Spamassassin обучается и пополняет так называемую Bayes-базу. Bayesian классификатор пытается определить SPAM используя bayes-базу наполненную токенами, токен – это последовательность символов или слов которые часто встречаются в SPAM-письмах. Например, вы скормили команде sa-learn 100 SPAM-писем с повторяющимися словами “увеличение груди”, 101 сообщение которое придет на почтовый сервер с текстом сообщения “увеличение” и “грудь” с очень большой долей вероятности будет помечено как SPAM-письмо. Не рекомендуется сразу удалять SPAM-письма, так как spamassassin тоже иногда ошибается. Лучше помещать весь SPAM в отдельную папку и раз в неделю разбирать ее содержимое и уже вручную с помощью sa-learn вносить корректировки в процесс обучения spamassassin. Ну а теперь давайте установим и настроим Spamassassin. # yum install spamassassin # adduser spamfilter -s /sbin/nologin Создаем файл /usr/local/bin/spamfilter с таким содержанием: #!/bin/bash /usr/bin/spamc | /usr/sbin/sendmail.postfix -i «$@» exit $?

# chown spamfilter /usr/local/bin/spamfilter # chmod 755 /usr/local/bin/spamfilter

Конфигурационный ф ур ц файл ф /etc/mail/spamassassin/local.cf p required_hits 5 rewrite_header Subject ****SPAM**** report_safe 0 use_bayes 1 bayes_path /etc/mail/spamassassin/bayes bayes_file_mode 0666 bayes_learn_to_journal 1

222

Модуль 15. Postfix.


bayes_min_ham_num 50 bayes_min_spam_num 50 score SUBJ_FULL_OF_8BITS 0.00 score HTML_COMMENT_8BITS 0.01 score HEADER_8BITS 0.00 score TO_NO_USER 0.01 score FORGED_MUA_OUTLOOK 0.5 score X_AUTH_WARNING 0.01 score SUBJ_HAS_UNIQ_ID 9.99 score HTTP_USERNAME_USED 9.99 score FORGED_YAHOO_RCVD 9.99 score FORGED_JUNO_RCVD 16 score UNWANTED_LANGUAGE_BODY 1.02 score MLM 5.55 score RCVD_NUMERIC_HELO 4.95 ok_locales en ru whitelist_from root@localhost blacklist_from *@outblaze.com auto_whitelist_path /etc/mail/spamassassin/auto-whitelist auto_whitelist_file_mode 0666 trusted_networks 192.168.146.0/24

# chkconfig spamassassin on Письма бывают двух видов, ham – чистые письма и spam – незатребованная реклама, вирусы в аттаче и т.д. Свою антиспам систему мы можем самостоятельно обучать какие письма хорошие а какие нет. Через какоето время после того, как spamassassin получить достаточно информации о типичном содержимом входящих писем, он начнет использовать полученные знания на практике, используя их при анализе всей входящей почты. По умолчанию требуется 200 ham-писем и 200 spam. Самостоятельно обучение происходит командой sa-learn. Если сообщение будет по ошибке распознано как спам мы просто запускаем команду sa-learn --ham с указанием этого письма, и наш spamassassin учтет полученный опыт в будущем.

Хорошее р письмо # sa-learn --mbox --ham <письмо>

Spam-письмо p # sa-learn --mbox --spam <письмо> Модуль 15. Postfix.

223


Команде sa-learn можно указать не только файл но и целый каталог.

Postfixadmin Postfixadmin – веб-интерфейс для управления Postfix. Здесь можно завести почтовые домены и ящики, настроить псевдонимы. Поведение самого почтового сервера задается руками в файлах main.cf и master.cf. # yum -y install httpd php php-imap php-mysql php-mbstring # chkconfig httpd on # cd /var/www/html/ http://switch.dl.sourceforge.net/sourceforge/postfixadmin/ # wget postfixadmin_2.3rc3.tar.gz # tar xzvf postfixadmin_2.3rc3.tar.gz # ln -s postfixadmin-2.3rc3/ postfixadmin # service httpd start В файле /var/www/html/postfixadmin/config.inc.php нужно внести минимум изменений чтобы Postfixadmin начал функционировать: $CONF['configured'] = false; поменять на $CONF['configured'] = true; и заполнить следующие поля: $CONF[‘database_user’] = ‘postfix’; $CONF['database_password'] = 'password'; $CONF['database_name'] = 'postfix'; Пользователь MySQL, его пароль и название БД. Все это мы задали в разделе MySQL. Заходим по адресу http://192.168.146.150/postfixadmin/setup.php и создаем суперпользователя который сможет управлять почтовым сервером через веб-интерфейс. # rm -f /var/www/html/postfixadmin-2.3rc3/setup.php http://192.168.146.150/postfixadmin/login.php Далее нужно создать почтовый домен и ящики.

224

Модуль 15. Postfix.


Squirrelmail Squirrelmail – почтовый веб-интерфейс. Простой и надежно работающий. # yum -y install squirrelmail # service httpd restart http://192.168.146.150/webmail/ Все, инсталяция ПО закончена, запускаем. # service postfix start # service dovecot start # service clamd start # service clamsmtpd start # service spamassassin start А теперь давайте проверим работоспособность нашей системы с антиспамом. Отправьте письмо какому либо пользователю нашего почтового сервера с таким содержанием: XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Отправить можно прямо из командной строки, например так: # mail -s “just test” tester@company.ru вставляем нашу спам-строку, нажимаем [Enter] Ctrl+D [Enter] Это специальный набор символов который используется для тестирования антиспам-фильтра. Если пришедшее письмо определиться как спам, значит все функционирует правильно. Отправлять нужно с другого сервера. Обновить антивирусные базы ClamAV можно командой указанной ниже. # freshclam Модуль 15. Postfix.

225


Описание конфигурационных файлов Postfix Конфигурационный файл /etc/postfix/main.cf Это главный конфигурационный файл Postfix. Практически все настраивается здесь. soft bounce

Сообщение которое не смогло быть доставлено сразу попадает в очередь, и через какое-то время попытка повторяется. Если опция отключена то отправитель сразу уведомляется что доставка невозможна и сообщение отбрасывается; queue_directory Директория для очереди сообщений; command_directory Расположение административных команд; daemon_directory Директория с дополнительными программами; mail_owner Кому принадлежит почтовая очередь и от какого пользователя выполняется большинство процессов; default_privs Права этого пользователя будут использоваться в процессе локальной доставки сообщений внешним командам или файлам; myhostname Имя системы, по умолчанию используется FQDN имя получаемое с помощью gethostname(); mydomain Доменное имя этой системы; Значение используется в адресе отправителя почты, myorigin если myorigin=company.ru то вся почта будет из @ company.ru inet_interfaces На каких сетевых интерфейсах принимать почту; mydestination Для каких доменов мы будем принимать почту; u n k n o w n _ l o c a l _ Код ответа в случае некорректного получателя recipient_reject_code сообщения; local_recipient_maps Список всех локальных получателей почты; Список доверенных сетей, клиенты из доверенных mynetworks сетей могут перенаправлять почту через почтовый сервер; relay_domains Для каких доменов мы будем релеем; alias_maps База псевдонимов используемых для локальной доставки; alias_database mail_spool_directory smtpd_banner

226

Директория где храняться почтовые ящики; Приглашение почтового сервера, код 220; Модуль 15. Postfix.


debug_peer_level debug_peer_list debugger_command sendmail_path newaliases_path mailq_path setgid_group html_directory manpage_directory sample_directory readme_directory config_directory virtual_mailbox_ domains virtual_mailbox_base virtual_mailbox_maps virtual_alias_maps virtual_minimum_uid virtual_uid_maps

Уровень отладки при достижение условия в debug_ peer_list; Для этих IP-адресов будет использоваться повышенное журналирование; Внешняя программа запускаемая в случае старта Postfix с опцией -D; Расположение команды sendmail которая помещает сообщения в очередь; Путь к программе newaliases; Путь к программе mailq, с ее помощью можно посмотреть почтовую очередь; Группа владелец set-gid команд; Директория с HTML-файлами описывающими специфичные возможности Postfix; Расположение manual pages; Директория с примерами; Директория с README файлами Postfix; Расположение main.cf и master.cf; Конечный пункт назначения для списка доменов, здесь используется такой же синтаксис как в mydestination; Префикс который используется для всех результатов из virtual_mailbox_maps; Таблица с возможными адресатами в доменах, которые отвечают virtual_mailbox_domains; Таблица псевдонимов; Минимальный UID для виртуальных аккаунтов; Поисковые таблицы с пользовательским идентификатором, который используется агентом локальной доставки при записи сообщения в почтовый ящик;

virtual_gid_maps

Поисковые таблицы с идентификаторами групп пользователей. Используется агентом локальной доставки;

virtual_transport dovecot_destination_ recipient_limit smtpd_sasl_auth_ enable s m t p d _ s a s l _ exceptions_networks

Транспорт для доставки почты; Опция Dovecot, доставлять за раз только одно письмо; Включить ли SASL-аутентификацию;

Модуль 15. Postfix.

Список сетей которым SASL AUTH предлагаться не будет;

227


smtpd_sasl_security_ options broken_sasl_auth_ clients smtpd_sasl_type

Опции для SASL-аутентификации;

Совместимость с клиентами, которые используют старую версию AUTH; Плагин который будет использоваться для аутентификации; s m t p d _ r e c i p i e n t _ Набор ограничений почтового сервера; restrictions content_filter Название транспорта который фильтрует почту после того, как она поставлена в очередь; r e c e i v e _ o v e r r i d e _ Включение или отключение проверки правильности options получателя. Конфигурационный файл master.cf Этот файл определяет как клиентская программа соединяется с сервисом и что запускать когда происходит запрос к сервису. Разберем только то, что мы меняли в базовой конфигурации. Структуру файла можно представить 8-мью столбцами.

service type private unpriv chroot wakeup maxproc command + args service type

Название сервиса; Тип сервиса, inet – сервис работает на TCP/IP-сокете, unix – сервис слушает на UNIX-сокете, fifo – именованный pipe, доступ только для локальный клиентов, pass – слушает на UNIX-сокете, принимает одно открытое подключение по запросу и доступно только для локальных пользователей; private Ограничен ли доступ к почтовой системе, тип сервиса inet не может быть приватным; unpriv Запускать от пользователя root или от mail owner в main. cf; chroot Сервис запускается в chroot-окружение или нет; wakeup Через определенное количество секунд можно отсылать запрос сервису чтобы тот “проснулся”; maxproc Максимальное количество процессов которое этот сервис может выполнять одновременно; command + args Исполняемая команда и аргументы для сервиса. Всю приходящею почту мы направляем в спам-фильтр.

228

Модуль 15. Postfix.


smtp

inet n n smtpd -o content_filter=spamfilter:dummy

Доставка почты происходит через Dovecot, он выполняет роль локального транспорта. dovecot unix n n pipe flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -d $(recipient)

Вся почта уходит на проверку в антивирус а затем возвращается обратно в postfix. scan unix - - n - 16 smtp -o smtp_send_xforward_command=yes 127.0.0.1:10026 inet n - n - 16 smtpd -o content_filter= -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks -o smtpd_helo_restrictions= -o smtpd_client_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks_style=host -o smtpd_authorized_xforward_hosts=127.0.0.0/8

Подключаем Spamassassin. spamfilter unix - n n - - pipe flags=Rq user=spamfilter argv=/usr/local/bin/spamfilter -f ${sender} -- ${recipient}

Dovecot Конфигурационный файл /etc/dovecot.conf Это основной конфигурационный файл Dovecot. base_dir protocols listen log_timestamp syslog_facility mail_location mail_debug Модуль 15. Postfix.

Рабочая директория; Обслуживаемые протоколы; Какие IP-адреса и порты слушать на входящие соединения; Формат записи логов; Указываем если используем Syslog для журналирования работы сервиса; Расположение почтовых ящиков пользователей; Режим отладки;

229


first_valid_uid Допустимые UID для пользователей; last_valid_uid m a i l d i r _ c o p y _ Dovecot будет пытаться копировать сообщения with_hardlinks с использованием hard links, это повышает производительность системы; login_executable Расположение программы выполняемой для входа в систему; mail_executable Местоположение выполняемой программы доступа к электронной почте; imap_max_line_ Максимальная длина команды IMAP в байтах; length p o p 3 _ u i d l _ Формат уникального почтового идентификатора; format p o s t m a s t e r _ Адрес postmaster`а, сюда отправляются сообщения о address невозможности доставки почты; sendmail_path Расположение программы для отправки почты; a u t h _ s o c k e t _ Расположение UNIX-сокета для аутентификации; path auth_verbose Если опция включена в журнал будет записываться больше информации связанной с аутентификацией; auth_debug Еще больше журналируемой информации, например показываются SQL-запросы к БД; a u t h _ d e b u g _ В случае несоответствия пароля регистрировать passwords в журнале, включений этой опции автоматически включает auth_debug; passdb sql / Использование SQL в своей работе, в качестве аргумента userdb sql используется путь к файлу с SQL конфигурацией; user От какого пользователя выполняется процесс; path Путь к какому либо каталогу или файлу; mode Права доступа на файл или каталог; group Группа владелец.

Clamd Конфигурационный файл /etc/clamd.conf LogFile LogFileMaxSize LogTime

230

Журналирование работы сервиса в указанный файл; Максимальный размер log-файла, 0 означает неограниченный; Указывать время для каждого сообщения; Модуль 15. Postfix.


LogSyslog

Использовать Syslog (можно одновременно использовать с LogFile); PidFile Сохранять PID главного процесса Clamd в этот файл; TemporaryDirectory Временная директория; DatabaseDirectory Путь к директории содержащей файлы БД; LocalSocket Путь к UNIX-сокету; FixStaleSocket Удалять сокет после некорректного завершения работы; TCPSocket Номер TCP-порта на котором будет работать сервис; TCPAddr IP-адрес на котором будет работать сервис; MaxConnectionQueueLength Максимальная очередь подключений ожидающих обработки; MaxThreads Максимальное число потоков в единицу времени; ReadTimeout Таймаут соединения; User Запуск Clamd от этого пользователя; AllowSupplementaryGroups Инициализация дополнительного группового доступа; ScanPE Сканировать .exe файлы или нет; ScanELF Сканировать файлы бинарного формата ELF или нет; DetectBrokenExecutables С этой опцией Clamd попытается обнаружить “сломанные” PE/ELF файлы и отметить их соответствующим флагом; ScanOLE2 Опция позволяет задать сканирование OLEобъектов, таких как документы Microsoft Office и .msi файлы; Опция позволяет задать сканирование ScanMail почтовых файлов; ScanHTML Сканирование HTML; Сканировать содержимое архивов или нет; ScanArchive Маркировать зашифрованные архивы. ArchiveBlockEncrypted

Clamsmtpp Конфигурационный файл /etc/clamsmtpd.conf OutAddress

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

Модуль 15. Postfix.

231


TimeOut

Количество секунд, в течение которых ожидаются данные от сетевых подключений; KeepAlives Опция может помочь на медленных каналах связи, когда timeout наступает быстрее чем ClamAV успевает проверить файл на вирусы; XClient Отправка команды Xclient принимающему серверу. Может быть полезно при перенаправление информации о соединение серверам, которые поддерживают эту возможность; Listen Здесь указываем адрес и порт для ожидания входящих соединений; ClamAddress Здесь указывается адрес для подключения к Clamd (Antivirus Daemon); Header Здесь указывается, что будет дописано в заголовок письма; TempDirectory Директория для временных файлов; Action Это действие будет выполнено в случае нахождения вируса, drop – удалить e-mail, bounce – отклонить письмо, pass – пропустить письмо в почтовый ящик пользователя; Quarantine Помещать ли файлы с вирусами в карантин (в директорию TempDirectory); User От какого пользователя запускать clamsmtpd, сначала сервис стартует с правами root, далее сервис начинает работать с правами указанного пользователя в этой опции.

Spamassassin p Конфигурационный файл /etc/mail/spamassassin/local.cf required_hits rewrite_header report_safe

use_bayes

232

Необходимое количество очков чтобы письмо было опознано как спам; Переписываем заголовок если письмо опознано как спам; Если опция включена входящие письма опознанные как спам не будут модифицироваться, вместо этого будет сгенерированно новое письмо с уведомлением о спаме и к нему будет добавлено оригинальное сообщение; Использовать ли Bayes классификатор, база bayes создается командой sa-learn --sync; Модуль 15. Postfix.


bayes_path bayes_file_mode bayes_learn_to_journal

Путь к базам Bayes; Права доступа на файлы; В процессе обучения, Bayes будет записывать информацию в журнал а не напрямую в базу данных; bayes_min_ham_num Сколько ham (non-spam) и spam писем должно накопиться в базе данных Bayes, прежде чем она bayes_min_spam_num будет использоваться при анализе новых писем; score Назначение определенного количества очков какой либо тесту, это может быть положительное или отрицательное число (целое или десятичное); ok_locales Какие локали считать корректными для приходящих писем, письма не попадающие в этот список будут помечены как возможный спам; Белый список адресов. Письма с этих адресов не whitelist_from будут помечены как спам; Черный список адресов. Письма с этих адресов blacklist_from будут помечены как спам. Путь к файлу auto_whitelist, auto whitelisting auto_whitelist_path вычисляет средний уровень оценки для каждого отправителя и прибавляет его к оценке очередного письма. Это позволяет не блокировать “благонадежных” отправителей если оценка отдельного письма вдруг превысит предел. auto_whitelist_file_mode Права доступа на файл; trusted_networks Список надежных сетей, проверки на наличие в черных списках никогда не будет выполняться для хостов в этих сетях.

Резюме Мы сделали полнофункциональный почтовый сервер. Построение почтовых систем по праву считается одним из самых сложных моментов в системном администрирование, но любой процесс можно разбить на ряд четких шагов, выполняя которые вы неизбежно будете получать нужный результат.

Домашнее задание Сделать почтовый сервер по данному руководству и проверить работоспособность. Модуль 15. Postfix.

233


OpenVPN OpenVPN – бесплатное программное обеспечение для построения Virtual Private Network, защищенной частной сети. VPN-сеть – это логическая сеть создаваемая поверх другой сети. Для обеспечения шифрования передаваемых данных используется библиотека OpenSSL. Пользователю предоставлен выбор способов шифрования, по умолчанию используется Blowfish. В работе OpenVPN используется два псевдоустройства – tap (ethernet tunnel software network interface, L2 ) который эмулирует ethernet интерфейс и tun (tunnel software network interface, L3 ) который работает как point-to-point интерфейс. Драйвера этих устройств присутствуют в ядре Linux и нечего дополнительно настраивать не требуется.

Основные возможности OpenVPN: 1. Аутентификация пользователей и шифрование трафика с использованием библиотеки OpenSSL; 2. Возможность работы VPN-туннеля через NAT (Network Address Translation); 3. Сжатие трафика с использованием LZO real-time compression library.

Установка Linux VPN-сервера В базовых репозиториях CentOS пакет OpenVPN отсутствует, поэтому мы подключим дополнительный репозиторий – EPEL, откуда его и поставим. # rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release5-3.noarch.rpm Устанавливаем OpenVPN # yum -y install openvpn Добавляем в автозагрузку при старте сервера # chkconfig openvpn on

234

Модуль 16. OpenVPN.


Настройка Linux VPN-сервера Расположение директорий и файлов OpenVPN. /usr/sbin/openvpn /etc/openvpn/

Расположение бинарного файла OpenVPN; Расположение конфигурационного файла и ключей/сертификатов; /usr/share/doc/openvpn-2.1/ Масса примеров конфигурационных файлов OpenVPN на все случаи жизни; /usr/share/openvpn/easy-rsa/ Расположение набора скриптов генерации необходимых файлов для работы OpenVPN; /var/run/openvpn/ Расположение PID-файла OpenVPN; /usr/lib/openvpn/plugin/lib/ Несколько динамических библиотек; /var/log/openvpn.log По умолчанию журналирование происходит в файл /var/log/messages, для OpenVPN мы заведем отдельный log-файл и расположен он будет в /var/log/ В данном модуле мы рассмотрим настройку VPN-сервера и нескольких клиентов, которые будут через него работать. Сеть 192.168.146.0/24 является обычной незащищенной сетью. В это сети расположен наш будущий VPN-сервер с IP-адресом 192.168.146.150 (на нем есть DNS-сервер) и два клиента, один Linux-клиент другой Windows-клиент (Windows XP). Сеть 10.10.10.0/24 будет нашей VPN-сетью, весь трафик в этой сети будет шифроваться. Это может быть сеть из частного набора сетей (10.0.0.0/8, 172.16.0.0/12 или 192.168.0.0/16, определенных в документах RFC 1918 и RFC 4193 найти которые можно на ietf.org) и которую вы еще не используете. Когда в настройках OpenVPN сервера мы определяем VPN-сеть то первый IP-адрес из этой сети будет назначен VPN-серверу. Мы сделаем чтобы весь трафик клиентов ходил через VPN-сервер. При настройке VPN-сети мы сгенерируем несколько ключей и сертификатов, которые будут использоваться для аутентификации. OpenVPN обладает большим функционалом, но вполне распространенная конфигурация может занимать 15-20 строчек для сервера и 10 строчек для клиента и вы это немного позже увидите. В каталог /etc/openvpn/ скопируем набор скриптов для быстрой и легкой генерации всех необходимых ключей и сертификатов. # cp -R /usr/share/openvpn/easy-rsa/2.0/ /etc/openvpn/ Модуль 16. OpenVPN.

235


Переходим в каталог # cd /etc/openvpn/2.0/ Открываем на редактирование файл vars и в самом его конце приводим переменные к такому виду: export KEY_COUNTRY=»RU» export KEY_PROVINCE=»RU» export KEY_CITY=»Moscow» export KEY_ORG=»company.ru» export KEY_EMAIL=»support@company.ru»

Инициализируем переменные # source ./vars Очищаем директорию keys от старых файлов # ./clean-all Создаем ROOT CERTIFICATE AUTHORITY (CA) сертификат/ключ (в директории /etc/openvpn/2.0/keys/ будут созданы файлы ca.crt и ca.key) # ./build-ca Создаем ключ и сертификат для сервера (в директории /etc/openvpn/2.0/ keys/ будут созданы файлы server.crt, server.key и server.csr). Формат команды: ./build-key-server ServerName – где ServerName это название сервера. # ./build-key-server server Генерируем Diffie Hellman parameters для сервера. Суть алгоритма Diffie Hellman в том, чтобы наладить защищенное соединение по незащищенным каналам связи. По умолчанию длина файла 1024 бита, что очень даже достаточно. После выполнения этой команды будет создан файл /etc/ openvpn/2.0/keys/dh1024.pem # ./build-dh С генерацией файлов для сервера закончено, теперь можно добавлять клиентов вот такой командой (будут созданы файлы client1.crt, client1.key и client1.csr). Благодаря тому, что мы уже отредактировали файл vars и указали значения переменных по умолчанию, нам в большинстве запросов на ввод

236

Модуль 16. OpenVPN.


данных достаточно будет просто нажать Enter. # ./build-key client1 Generating a 1024 bit RSA private key ......++++++ .................++++++ writing new private key to 'client1.key' ----You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----Country Name (2 letter code) [RU]: [Enter] State or Province Name (full name) [RU]: [Enter] Locality Name (eg, city) [Moscow]: [Enter] Organization Name (eg, company) [company.ru]: [Enter] Organizational Unit Name (eg, section) []:IT Dept Common Name (eg, your name or your server’s hostname) [client1]: [Enter] Name []:[Enter] Email Address [support@company.ru]: [Enter] Please enter the following ‘extra’ attributes to be sent with your certificate request A challenge password []: [Enter] An optional company name []: [Enter] Using configuration from /etc/openvpn/2.0/openssl.cnf Check that the request matches the signature Signature ok The Subject’s Distinguished Name is as follows countryName :PRINTABLE:’RU’ stateOrProvinceName :PRINTABLE:’RU’ localityName :PRINTABLE:’Moscow’ organizationName :PRINTABLE:’company.ru’ organizationalUnitName :PRINTABLE:’IT Dept’ commonName :PRINTABLE:’client1’ emailAddress :IA5STRING:’support@company.ru’ Certificate is to be certified until Apr 21 11:16:28 2019 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated

Common Name должно быть уникальным для всех. Модуль 16. OpenVPN.

237


Все необходимые файлы для VPN-сервера будут расположены в /etc/ openvpn/ поэтому скопируем их туда из директории /etc/openvpn/2.0/keys/ # cp keys/{ca.crt,ca.key,server.crt,server.key,dh1024.pem} ../ Копируем шаблон конфигурационного файла VPN-сервера в /etc/openvpn/ и приводим его к конфигурации указанной ниже. # cp /usr/share/doc/openvpn-2.1/sample-config-files/server.conf /etc/openvpn/ openvpn.conf Содержание конфигурационного openvpn.conf ):

файла

VPN-сервера

(/etc/openvpn/

local 192.168.146.150 port 1194 proto tcp dev tun ca ca.crt cert server.crt key server.key dh dh1024.pem server 10.10.10.0 255.255.255.0 ifconfig-pool-persist ipp.txt push «route 0.0.0.0 255.255.255.0» push «dhcp-option DNS 192.168.146.150» push «redirect-gateway» client-to-client keepalive 10 120 comp-lzo user nobody group nobody persist-key persist-tun status openvpn-status.log log /var/log/openvpn.log verb 3 mute 10

Маршрут по умолчанию я переписываю удаляя старый, для этого я использовал “redirect-gateway”, если захотите чтобы старый тоже остался то строчка push «redirect-gateway»

должна быть такой: push «redirect-gateway def1»

238

Модуль 16. OpenVPN.


На VPN-сервере необходимо включить IP Forwarding, так как наш сервер будет маршрутизировать трафик. # echo ‘1’ > /proc/sys/net/ipv4/ip_forward Команда выше позволит сразу же начать маршрутизировать трафик, но состояние опции в момент перезагрузки сервера не сохраняется. Для того чтобы IP forwarding включить на постоянной основе необходимо отредактировать файл /etc/sysctl.conf В файле /etc/sysctl.conf находим такую строку: net.ipv4.ip_forward = 0

и меняем ее на: net.ipv4.ip_forward = 1

Для того чтобы трафик VPN-клиентов достигший нашего сервера мог попадать в другие сети и успешно возвращаться нам нужно включить трансляцию сетевых адресов (NAT). Мы это сделаем с помощью iptables вот такой командой: # iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE В ключе -o указан наш сетевой интерфейс во внешние сети, в ключе -s указываем нашу VPN-сеть, у вас она может быть и другой. Также интересный момент – для моих Linux-клиентов NAT не понадобился, а вот если у вас есть Windows-клиенты то команда iptables необходима. Настройка VPN-сервера закончена и мы можем его запустить. # service openvpn start Теперь сгенерированные файлы необходимо перенести на клиентскую машину. Крайне желательно это делать безопасным способом, чтобы файлы не были перехвачены злоумышленниками. На Linux-клиент файлы можно перенести с помощью команды scp, в этом случае весь передаваемые трафик будет зашифрован. Находясь в директории /etc/openvpn/ выполните такую команду: # scp ca.crt 2.0/keys/client1.key 2.0/keys/client1.crt client1@192.168.146.134:~ где client1 – ваш логин на удаленной машине а 192.168.146.134 – ее IPадрес. В результате выполнения этой команды на удаленный компьютер мы Модуль 16. OpenVPN.

239


скопируем файл ca.crt – сертификат CA и сертификат/ключ клиента, они ему понадобятся чтобы подключаться к VPN-серверу. Далее эти файлы нужно переместить в /etc/openvpn/ из под пользователя root или другого имеющего право на запись в этом каталоге.

Linux VPN-клиент Подключаем репозиторий EPEL откуда мы поставим OpenVPN. # rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release5-3.noarch.rpm Устанавливаем OpenVPN # yum -y install openvpn Добавляем OpenVPN в автозагрузку при старте компьютера # chkconfig openvpn on В каталог /etc/openvpn/ копируем шаблон файла конфигурации OpenVPN-клиента # cp /usr/share/doc/openvpn-2.1/sample-config-files/client.conf /etc/openvpn/ client.conf И приводим его к следующему виду Конфигурационный файл client.conf на Linux VPN-клиенте. client dev tun proto tcp remote 192.168.146.150 1194 resolv-retry infinite user nobody group nobody persist-key persist-tun ca ca.crt cert client1.crt key client1.key ns-cert-type server log-append /var/log/openvpn.log comp-lzo verb 3

240

Модуль 16. OpenVPN.


Файл конфигурации подразумевает, что в каталог /etc/openvpn/ клиента были закачены файлы ca.crt, client1.crt и client1.key с сервера. Как их можно безопасно перенести объяснялось выше. На этом все, настройка OpenVPN-клиента закончена. Запускаем OpenVPN. # service openvpn start Пингуем наш VPN-сервер: # ping 10.10.10.1 PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data. 64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=4.97 ms 64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=3.96 ms 64 bytes from 10.10.10.1: icmp_seq=3 ttl=64 time=2.03 ms --- 10.10.10.1 ping statistics --3 packets transmitted, 3 received, 0% packet loss, time 2001ms rtt min/avg/max/mdev = 2.036/3.658/4.978/1.222 ms

Пингуем других VPN-клиентов если они у вас уже есть (у меня есть): # ping 10.10.10.10 PING 10.10.10.10 (10.10.10.10) 56(84) bytes of data. 64 bytes from 10.10.10.10: icmp_seq=1 ttl=64 time=0.680 ms 64 bytes from 10.10.10.10: icmp_seq=2 ttl=64 time=0.994 ms --- 10.10.10.10 ping statistics --2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 0.680/0.837/0.994/0.157 ms

Проверяем, что весь наш трафик ходит через VPN-сервер: # tracert www.ru traceroute to www.ru (194.87.0.50), 30 hops max, 40 byte packets 1 10.10.10.1 (10.10.10.1) 0.769 ms 1.486 ms 40.849 ms 2 192.168.146.2 (192.168.146.2) 40.821 ms 40.791 ms 40.760 ms 3 www.ru (194.87.0.50) 40.721 ms 40.689 ms 40.659 ms

10.10.10.1 – VPN-сервер 192.168.146.2 – мой шлюз во внешние сети www.ru – пункт назначения для наших пакетов. Как видим весь трафик проходит через наш VPN-сервер. Модуль 16. OpenVPN.

241


Windows VPN-клиент Скачиваем пакет OpenVPN для Windows + OpenVPN GUI (графический интерфейс) и устанавливаем его. http://openvpn.se/files/install_packages/openvpn-2.0.9-gui-1.0.3-install.exe На этот клиент закачиваем его сертификат и ключ (client2.crt и client2.key) а также сертификат сервера – ca.crt. Все эти файлы я расположил в директории c:\vpn\ В директории C:\Program Files\OpenVPN\config\ создаем конфигурационный файл client.ovpn с таким содержанием: client dev tun proto tcp remote 192.168.146.150 1194 resolv-retry infinite persist-key persist-tun ca c:\\vpn\\ca.crt cert c:\\vpn\\client2.crt key c:\\vpn\\client2.key comp-lzo verb 3

Внимание! В путях к файлам не опечатка, так и должно быть – по два бекслеша. Далее, в системном трее нажимаем правой клавишей мыши на иконку с изображением 2 компьютеров и выбираем пункт “Connect”. Windows-клиент должен подключиться к VPN-серверу и можно работать. Посмотреть настройки сетевого интерфейса и маршрутов на Windowsмашине можно вот так: Пуск -> Выполнить -> пишем команду ”cmd” нажимаем Enter -> ipconfig /all – посмотреть сетевые интерфейсы route print – посмотреть таблицу маршрутизации Попингуйте VPN-сервер и сделайте трасировку (tracert) до www.ru

242

Модуль 16. OpenVPN.


Добавление клиентов На сервере заходим в директорию /etc/openvpn/2.0/ # cd /etc/openvpn/2.0/ Генерируем ключ для client3 (имя может быть другим) # build-key client3 Далее, ca.crt и client3.crt/client3.key переносим на компьютер client3 в директорию /etc/openvpn/ или другой если используем Windows. Файл конфигурации как у клиентов выше в зависимости от ОС.

Таблица предназначения ключей и сертификатов Для полноты ясности в таблице ниже приведен список всех файлов которые мы сгенерировали. Секретные файлы держите в дали от посторонних глаз. Файл ca.crt ca.key dh1024.pem server.crt server.key client1.crt client1.key

Где используется Сервер + клиенты Сервер Сервер Сервер Сервер Клиент1 Клиент1

Назначение Root CA Certificate Root CA Key Diffie Hellman parameters Server Certificate Server Key Client1 Certificate Client1 key

Секретность Нет Да Нет Нет Да Нет Да

На все последующие файлы вида clientN.* распространяются такие же условия, что и на client1.*

Конфигурационный файл openvpn.conf на Linux VPN-сервере Самые важные и популярные опции используемые в настройке VPNсервера. local

port proto Модуль 16. OpenVPN.

Позволяет задать IP-адрес на котором нужно слушать входящие соединения. Если эта опция в файле не определенна то принимаются соединения на всех интерфейсах; Официальный порт OpenVPN – 1194 и менять его не стоит; Какой протокол использовать, я предпочитаю tcp;

243


dev

dev-node ca cert key dh server ifconfig-pool-persist

server-bridge

push “route ...”

client-config-dir ccd

Устройство которое будем использовать. tun – создает маршрутизируемый IP-тунель, tap – создает ethernet (L2) тунель, который может использоваться если все клиенты в одной подсети; В Windows нужно указать имя адаптера; Расположение SSL/TLS Root Certificate; Задает расположение сертификата сервера; Задает расположение ключа сервера; Задает расположение Diffie Hellman parameters файла; Задает VPN-сеть, VPN-сервер получит самый первый IP-адрес в этой сети; Опция определяет файл в котором будут храниться значения client <-> VPN IP-адрес, в случае перезагрузки VPN-сервера клиенты получат теже самые IP-адреса которые у них были до этого; Конфигурирование ethernet бриджинга. Бриджинг позволяет на одном физическом интерфейсе объединить несколько виртуальных TAP интерфейсов, по сути реализуя физический ethernet switch. При использование моста между двумя сетями, обе сети выглядят как одна большая, это позволяет программам широковещательной передачи данных работать через такой VPN-туннель; Опция позволяет отправить клиенту информацию о маршрутах. Маршрут помещается в таблицу маршрутизации клиента; Задает директорию с файлами сетевых настроек для клиентов. К примеру если мы захотим назначить клиенту client1 (Certificate Common Name = client1) фиксированный IP-адрес, делаем следующее: openvpn.conf: client-config-dir ccd route 10.10.10.0 255.255.255.0 ccd/client1: ifconfig-push 10.10.10.1 10.10.10.2

244

Модуль 16. OpenVPN.


push «redirect-gateway”

Опция назначает шлюз по умолчанию для клиентов. Старый маршрут будет удален. С опцией def1 (push «redirect-gateway def1”) старый маршрут будет просто заменен, без удаления из таблицы маршрутизации. Если VPNсервер и клиенты в одной подсети то пригодится опция local (push «redirect-gateway local def1»); push «dhcp-option DNS ...” Назначение DNS-сервера клиентам; push «dhcp-option WINS ...” Назначение WINS-сервера клиентам; client-to-client Разрешать ли видить клиентам друг друга, по умолчанию они видят только сервер; duplicate-cn Позволяет разрешить подключаться к VPNсерверу клиентам с одинаковыми ключами и сертификатами. Рекомендуется чтобы у каждого клиента была своя пара ключ/сертификат; keepalive 10 120 Пинговать противоположный конец туннеля каждые 10 секунд, при отсутствие встречных пингов в течение 120 секунд считать соединение потерянным и запускать пересоединение; tls-auth Для максимальной безопасности можно воспользоваться функционалом SSL/TLS и создать «HMAC firewall» для борьбы с DOSатаками и UDP port flooding. Для этого необходимо сгенерировать ключ, которые будет на сервере и клиенте. # openvpn --genkey --secret ta.key На сервере строчка в конфигурационном файле должна быть такой: tls-auth ta.key 0

cipher

comp-lzo max-clients user group Модуль 16. OpenVPN.

на клиенте: tls-auth ta.key 1 Файл является секретным. Позволяет задать криптографический шифр. По умолчанию используется Blowfish и менять его врядли вам захочется; Включение компрессии VPN линка. Максимальное количество клиентов на VPNсервере одновременно; Пользователь и группа от которых будет работать OpenVPN;

245


persist-tun

persist-key status

log log-append verb

mute

Не закрывать и переоткрывать TUN/TAP устройство или запускать/отключать скрипты через SIGUSR1 сигнал или --ping-restart (на деле лучше использовать keepalive); Не перечитывать файлы ключей через SIGUSR1 сигнал или --ping-restart; В этот файл будет сохраняться текущая информация по статусу VPN-соединений и обновляться каждую минуту (файл расположен в /etc/openvpn/); Расположение log-файла, при старте OpenVPN он будет очищаться от старых записей; Расположение log-файла, при старте OpenVPN он будет пополняться свежими записями; Опция задает уровень журналирования в logфайл: 0 – только фатальные ошибки; 4 – разумно для общего использования; 5 и 6 – позволяют обнаружить проблемы с подключениями; 9 – максимальная отладочная информация; Ограничивает журналирование однотипных сообщений в log-файл, по умолчанию не более 20 сообщений одной категории, остальные будут отбрасываться;

Конфигурационный файл client.conf на Linux-клиентах Опции которые можно встретить в настройках клиента. Некоторые являются обязательными. client remote remote-random

resolv-retry infinite

246

Сообщает о том, что данная машина является VPNклиентом; Задает IP-адрес VPN-сервера и порт подключения. Серверов может быть указано много; Позволяет случайным образом выбрать сервер для подключения определенный в опции remote. Это сделано для распределения нагрузки; Постоянно резолвить hostname VPN-сервера, это полезно на клиентах подключенных к сети на непостоянной основе, таких как ноутбуки;

Модуль 16. OpenVPN.


nobind

http-proxy mute-replay-warnings ns-cert-type

Использовать динамический порт на клиенте, актуально только для UDP, так как при использование TCP порт всегда динамический; Позволяет задать http-proxy для подключения к VPN-серверу; Беспроводные сети очень много дублируют пакеты, опция позволит ограничить это; Опция для увеличения безопасности, она позволяет гарантировать что сервер, к которому происходит подключение действительно им является. Для этого будет проверено поле nsCertType, которое должно содержать значение “server”;

Конфигурационный файл client.ovpn на Windows-клиенте Почти тоже самое что и на Linux-клиентах. Не будет user/group опций и пути к файлам с учетом файловой системы Windows. Также, для того чтобы OpenVPN-клиент заработал в Windows Vista в конфигурационный файл клиента нужно добавить следующее: route-method exe route-delay 2

В процессе настройки не забывайте, что если вы используете firewall то OpenVPN необходимо в нем разрешить. Делается это примерно вот так: # Allow TUN interface connections to OpenVPN server iptables -A INPUT -i tun+ -j ACCEPT # Allow TUN interface connections to be forwarded through other interfaces iptables -A FORWARD -i tun+ -j ACCEPT # Allow TAP interface connections to OpenVPN server iptables -A INPUT -i tap+ -j ACCEPT # Allow TAP interface connections to be forwarded through other interfaces iptables -A FORWARD -i tap+ -j ACCEPT

Резюме Мы установили и настроили VPN-сервер и несколько VPN-клиентов. Клиент может использовать ОС Linux или Windows, мы знаем как производить настройку на обеих ОС. Весь трафик клиентов проходит через VPN-сервер, благодаря заданию опции redirect-gateway и назначению маршрута по умолчанию.

Домашнее задание Развернуть три виртуальные машины – VPN-сервер и два клиента, Linuxклиент и Windows-клиент. Произвести настройку виртуальных машин в соответствие с руководством в этом модуле. Убедиться, что все работает. Модуль 16. OpenVPN.

247


Отказоустойчивый кластер Кластер – это группа компьютеров объединенных в одну систему для выполнения совместных вычислений. Есть три вида кластеров: 1. Отказоустойчивые кластеры (HA, High-availability clusters) – задача таких кластеров обеспечивать бесприбойность работы сервисов, которые он обслуживает. При реализации такого кластера необходимо задействовать не менее двух серверов, каждая нода дублирует другую и в случае ее выхода из строя сразу же берет работу на себя и обслуживает запросы; 2. Высокопроизводительные кластеры (HPC, High-performance clusters) – задача таких кластеров увеличивать скорость вычисления. Все вычисления разбиваются на параллельно выполняющиеся потоки. Программное обеспечение должно поддерживать работу в таком режиме; 3. Кластеры с распределением нагрузки (LB, Load balancing clusters) – принцип работы таких кластеров заключается в распределение нагрузки. Входящие запросы проходят через первичный узел (Director) который занимается распределением нагрузки между вычислительными нодами. В этом модуле мы сделаем отказоустойчивый кластер состоящий из двух нод и запустим на нем веб-сервер Apache. Программное обеспечение которое нам понадобится – это DRBD, для зеркалирования разделов между двумя нодами, ведь при выходе одной ноды из строя вторая должна сразу включиться в работу и начать обслуживать запросы. А значит на ней всегда должна быть актуальная версия контента, в этом как раз DRBD нам и поможет, он работает по принципу RAID 1, при записи данных на основной ноде, они сразу же будут записаны и на вторую. Вторая программа – Heartbeat, она занимается интеллектуальной работой, следит за состоянием нод и принимает решения. Подробнее об этих программах ниже.

Принцип работы нашего кластера Принцип работы отказоустойчивого кластера можно разбить на три этапа. 1. На постоянной основе происходит репликация данных с первичной ноды на вторичную, в этом нам помогает DRBD. Таким образом в любой момент времени контент приложений, на первичной ноде и вторичной полностью идентичен; 2. Для предоставления сервиса используется специально для этого выделенный IP-адрес, shared IP-адрес. Средствами Heartbeat он прописывается как алиас на первичной ноде;

248

Модуль 17. Отказоустойчивый кластер.


3. В случае выхода из строя первичной ноды, вторичная нода переключается в режим первичной и назначает себе shared IP. С этого момента все запросы обслуживает вторичная нода (теперь став первичной). Конечный пользователь не заметит изменений в работе сервиса, так как переключение происходит достаточно быстро + контент является полностью актуальным.

DRBD DRBD (Distributed Replicated Block Device) – распределенное и синхронизированное блочное устройство, это программное обеспечение для зеркалирования контента блочных устройств (HDD, partitions, logical volumes...). По своей работе, DRBD очень похож на RAID1, данные на разных нодах также реплицируются в режиме реального времени. В свою очередь для приложений DRBD полностью прозрачен и они даже не догадываются о том, что фактически их данные хранятся на нескольких серверах. Запись данных на носитель может происходит двумя способами – синхронный, когда записывающее приложение уведомляется о том, что запись завершена только после того как данные будут записаны на все ноды, и асинхронный – это когда записывающее приложение уведомляется сразу после записи на локальном носителе, не дожидаясь аналогичных действий на peer-системе.

Место DRBD в стеке ввода/вывода Linux Модуль 17. Отказоустойчивый кластер.

249


Программы входящие в состав пакета DRBD drbdadm

drbdsetup

drbdmeta

Основная программа администрирования DRBD, все параметры она получает из конфигурационного файла /etc/drbd.conf. drbdadm выступает в качестве фронтенда для такие программ как drbdsetup и drbdmeta; Программа конфигурирования модуля DRBD, параметры задаются из командной строки что делает программу гибкой, но повышает сложность для новичков, используется редко; Программа позволяет создавать, резервировать и восстанавливать DRBD meta data structures, используется редко.

Для описания устройства хранения (storage) используется понятие ресурса, которое описывает все его аспекты, такие как: Имя ресурса – имя не должно содержать пробелы, в последствие мы будет использовать это имя чтобы ссылаться на какое либо устройство. DRBD устройство – это виртуальное блочное устройство управляемое DRDB. Ассоциированное блочное устройство всегда именуется как /dev/drbdm, где m – младший номер устройства, который начинается с 0. Старший номер устройства равняется 147. Disk configuration – физический диск или раздел содержащий данные. Network configuration – IP-адрес и порт дублирующей ноды. В DRBD каждый ресурс играет свою роль, - первичную (primary) или вторичную (secondary). В случае если DRBD устройство является primary, оно может читать и записывать данные без ограничений, создавать и монтировать файловые системы и т.д. Если DRBD устройство является secondary то оно получает все обновления данных с primary (любые добавления, изменения или удаления данных) но не дает прямой доступ к устройству. То есть приложения не смогут читать и писать данные на устройство. Роль ресурса может изменяться вручную или автоматически. DRBD поддерживает три режима репликации. Protocol A. Протокол асинхронной репликации, данные на primary node считаются полностью записанными тогда, когда запись завершается на локальном носители и пакет отправлен в TCP буфер отправки. Этот режим может повлечь за собой потерю данных, если сбой произойдет раньше чем данные будут продублированы на вторичной ноде. Protocol B. Протокол полусинхронной репликации (Memory synchronous),

250

Модуль 17. Отказоустойчивый кластер.


данные считаются полностью записанными тогда, когда запись завершается на локальном носители и пакет достигает удаленной системы (peer node). Protocol C. Протокол синхронной репликации, данные на primary node считаются полностью записанными тогда, когда запись завершается на локальном носителе и получено подтверждение о том, что данные успешно записаны на удаленной ноде. Конечно и с этим протоколом возможна потеря данных, если данные на обоих узлах будут разрушены одновременно.

Heartbeat Heartbeat – это сервис для управления узлами кластера. Который занимается запуском/остановом сервисов, мониторингом доступности систем в кластере и сменой владельца общего IP-адреса если primary node приходит в неработоспособное состояние. Heartbeat может обслуживать веб-сервера, почтовые сервера, DNS-сервера, сервера баз данных и т.д.

Именование серверов Наш кластер будет состоять из двух нод, названных node1.company.ru (192.168.146.150) и node2.company.ru (192.168.146.134). В конфигурационных файлах DRBD и Heartbeat должны использоваться имена нод выводимых по команде uname -n Указать hostname для сервера можно в файле /etc/sysconfig/network в опции HOSTNAME, после этого нужно перезагрузить сервер. Если использование DNS не предполагается то укажите соответствие IPадресов к именам в файле /etc/hosts обоих серверов # cat /etc/hosts 127.0.0.1 localhost.localdomain localhost ::1 localhost6.localdomain6 localhost6 192.168.146.134 node2.company.ru 192.168.146.150 node1.company.ru

Установка ПО Пару лет назад в репозиторий CentOS были включены пакеты drbd и heartbeat, теперь установка и настройка кластера стала еще проше. Устанавливаем HeartBeat, DRBD и модуль для DRBD - kmod-drbd, дополнительно как зависимости будут установлены пакеты heartbeat-pils и heartbeat-stonith. # yum -y install heartbeat drbd kmod-drbd Модуль 17. Отказоустойчивый кластер.

251


Обращаю внимание что heartbeat может не установиться с первого раза выдав такую ошибку: error: %pre(heartbeat-2.1.3-3.el5.centos.i386) scriptlet failed, exit status 9 error: install: %pre scriptlet failed (2), skipping heartbeat-2.1.3-3.el5.centos

Просто повторите установку heartbeat командой # yum -y install heartbeat Добавляем Heartbeat в автозагрузку при старте сервера. Для DRBD это не требуется так как добавление происходит автоматические при установке пакета. # chkconfig heartbeat on Собственно на этом установка подошла к концу, веб-сервер Apache мы установим и настроим позже, после того сделаем наш кластер.

Настройка DRBD Первым шагом мы настроим DRBD и убедимся что он работает правильно. В нашей системе два HDD, /dev/sda и /dev/sdb. /dev/sda – это системный диск на котором установлена ОС, /dev/sdb мы будем использовать в качестве устройства DRBD, постоянно реплицируя его с аналогичным диском на другой ноде. # fdisk -l Disk /dev/sda: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot /dev/sda1 * /dev/sda2

Start 1 979

End Blocks Id System 978 7855753+ 83 Linux 1043 522112+ 82 Linux swap / Solaris

Disk /dev/sdb: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/sdb doesn't contain a valid partition table

DRBD управляется с помощью одного конфигурационного файла – /etc/drbd. conf. Структуру файла можно представить тремя секциями. Global section – секция может быть описана только один раз и содержит в

252

Модуль 17. Отказоустойчивый кластер.


себе глобальные настройки распространяемые на все ресурсы. Common section – секция полезна если используется несколько ресурсов и необходимо предоставлять ряд настроек для конкретных ресурсов. Resource section – секция описания ресурса, в ней также должна быть подсекция on host, для каждой кластерной ноды. Конфигурационный ф ур ц ф файл /etc/drbd.conf на обеих нодах д global { usage-count yes; } common { syncer { rate 20M; } } resource r0 { protocol C; startup { } disk { on-io-error detach; } net { } on node1.company.ru { device /dev/drbd0; disk /dev/sdb; address 192.168.146.150:7789; meta-disk internal; } on node2.company.ru { device /dev/drbd0; disk /dev/sdb; address 192.168.146.134:7789; meta-disk internal; } }

[root@node1 ~]# drbdadm create-md r0 [root@node2 ~]# drbdadm create-md r0 v08 Magic number not found v07 Magic number not found v07 Magic number not found v08 Magic number not found Writing meta data... initialising activity log NOT initialized bitmap New drbd meta data block sucessfully created. success

Модуль 17. Отказоустойчивый кластер.

253


Не обращайте внимание на сообщения “not found”. [root@node1 ~]# service drbd start После запуска DRBD на первичной ноде она перейдет в режим ожидания вторичной, и не запуститься пока не получит от нее отклик. *************************************************************** DRBD's startup script waits for the peer node(s) to appear. - In case this node was already a degraded cluster before the reboot the timeout is 0 seconds. [degr-wfc-timeout] - If the peer was available before the reboot the timeout will expire after 0 seconds. [wfc-timeout] (These values are for resource 'r0'; 0 sec -> wait forever) To abort waiting enter 'yes' [ 58]:

[root@node2 ~]# service drbd start [root@node1 ~]# cat /proc/drbd version: 8.0.13 (api:86/proto:86) GIT-hash: ee3ad77563d2e87171a3da17cc002ddfd1677dbe build by buildsvn@c5-i386build, 2008-10-02 13:31:44 0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r--ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 resync: used:0/61 hits:0 misses:0 starving:0 dirty:0 changed:0 act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0

Если видим строку 0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r---

то все хорошо, продолжаем. st: означает статус, обе ноды в secondary режиме, нам необходимо node1 перевести в primary, делается это вот такой командой: [root@node1 ~]# drbdadm -- --overwrite-data-of-peer primary r0 После этого начнется процесс синхронизации нод. Запустив 'watch cat /proc/drbd' на отдельной консоли можем в реальном времени наблюдать за процессом синхронизации наших разделов. [root@node1 ~]# watch cat /proc/drbd

254

Модуль 17. Отказоустойчивый кластер.


Every 2.0s: cat /proc/drbd

Sun Apr 26 20:04:58 2009

version: 8.0.13 (api:86/proto:86) GIT-hash: ee3ad77563d2e87171a3da17cc002ddfd1677dbe build by buildsvn@c5-i386build, 2008-10-02 13:31:44 0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r--ns:1936384 nr:0 dw:0 dr:1936384 al:0 bm:118 lo:0 pe:0 ua:0 ap:0 [===>................] sync'ed: 23.1% (6300/8191)M finish: 0:09:28 speed: 11,304 (10,244) K/sec resync: used:0/61 hits:120905 misses:119 starving:0 dirty:0 changed:119 act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0

После завершения синхронизации убедимся, что статус устройства изменился. [root@node1 ~]# cat /proc/drbd version: 8.0.13 (api:86/proto:86) GIT-hash: ee3ad77563d2e87171a3da17cc002ddfd1677dbe build by buildsvn@c5-i386build, 2008-10-02 13:31:44 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r--ns:8388316 nr:0 dw:0 dr:8388316 al:0 bm:512 lo:0 pe:0 ua:0 ap:0 resync: used:0/61 hits:523758 misses:512 starving:0 dirty:0 changed:512 act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0

Также, статус можно посмотреть с помощью команды drbdadm. [root@node1 ~]# drbdadm dstate r0 UpToDate/UpToDate [root@node2 ~]# drbdadm dstate r0 UpToDate/UpToDate Ресурс полностью синхронизирован и готов к работе! Создаем файловую систему на нашем диске. [root@node1 ~]# mkfs -t ext3 /dev/drbd0 Создаем точку монтирования для нашего диска. [root@node1 ~]# mkdir /mnt/drbd0 Монтируем диск [root@node1 ~]# mount /dev/drbd0 /mnt/drbd0/ Модуль 17. Отказоустойчивый кластер.

255


Запросив статус DRBD мы можем выяснить смонтировано ли устройство или нет. [root@node1 ~]# service drbd status drbd driver loaded OK; device status: version: 8.0.13 (api:86/proto:86) GIT-hash: ee3ad77563d2e87171a3da17cc002ddfd1677dbe build by buildsvn@c5-i386build, 2008-10-02 13:31:44 m:res cs st ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C /mnt/drbd0 ext3

Ну а теперь давайте поработаем с нашей файловой системой. Создадим файл. [root@node1 ~]# echo ‘test content’ > /mnt/drbd0/testfile Итак, мы установили DRBD, настроили, синхронизировали ноды, сделали node1 primary node, создали там контент. Нам только осталось выяснить происходит ли репликация, в случае выхода из строя primary node сможет ли secondary продолжить работу? Для того чтобы это выяснить делаем следующее. Отмонтируем устройство [root@node1 ~]# umount /mnt/drbd0/ Понижаем роль node1 до вторичной ноды [root@node1 ~]# drbdadm secondary r0 Повышаем роль node2 до первичной ноды [root@node2 ~]# drbdadm primary r0 Создаем директорию куда мы будем монтировать устройство. Очевидно раз программное обеспечение на обеих нодах будет выполнять одну работу с одними файлами конфигурации то расположение контента должно быть идентичным.

256

Модуль 17. Отказоустойчивый кластер.


[root@node2 ~]# mkdir /mnt/drbd0 Монтируем устройство [root@node2 ~]# mount /dev/drbd0 /mnt/drbd0 Проверяем статус, как мы видим устройство успешно примонтировано. [root@node2 ~]# service drbd status drbd driver loaded OK; device status: version: 8.0.13 (api:86/proto:86) GIT-hash: ee3ad77563d2e87171a3da17cc002ddfd1677dbe build by buildsvn@c5-i386build, 2008-10-02 13:31:44 m:res cs st ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C /mnt/drbd0 ext3

Ну что там в нашем файле ? :) [root@node2 ~]# cat /mnt/drbd0/testfile test content

Волшебство, весь контент в самом свежем виде присутствует на node2. Все функционирует должным образом. Теперь вернем обратно роль первичного сервера node1 и продолжим настройку кластера, будем настраивать Heartbeat. [root@node2 ~]# umount /mnt/drbd0/ [root@node2 ~]# drbdadm secondary r0 [root@node1 ~]# drbdadm primary r0 [root@node1 ~]# mount /dev/drbd0 /mnt/drbd0 Активность DRBD можно наблюдать в log-файле [root@node1 ~]# cat /var/log/messages

Настройка Heartbeat Файлы конфигурации Heartbeat на обеих нодах должны быть идентичными. Копируем шаблоны файлов конфигурации в /etc/ha.d/ # cp /usr/share/doc/heartbeat-2.1.3/{ha.cf,authkeys,haresources} /etc/ha.d/ Конфигурационные файлы Heartbeat. Модуль 17. Отказоустойчивый кластер.

257


ha.cf haresources authkeys

Главный конфигурационный файл; Файл ресурсов; Файл аутентификации.

Необходимо убедиться, что название нод указанное в конфигурационных файлах соответствует содержимому команды uname -n. [root@node1 ~]# uname -n node1.company.ru [root@node2 ~]# uname -n node2.company.ru

Конфигурационный ф ур ц файл ф /etc/ha.d/authkeys y В файле конфигурации мы выбираем режим аутентификации и указываем секретную фразу по которой она будет происходить. Секретная фраза должна быть одинаковой на обеих нодах. Далее на этот файл необходимо установить право на чтение только пользователю root, для этого выполните команду chmod указанную ниже. Рекомендуется использовать sha1 как в примере. auth 2 2 sha1 NoOneKnowsIt

# chmod 600 /etc/ha.d/authkeys

Конфигурационный ф ур ц файл ф /etc/ha.d/ha.cf Это главный конфигурационный файл и поведение Heartbeat задается здесь. logfacility local0 keepalive 2 deadtime 30 initdead 120 bcast eth0 auto_failback on node node1.company.ru node node2.company.ru respawn hacluster /usr/lib/heartbeat/ipfail use_logd yes logfile /var/log/ha.log debugfile /var/log/ha-debug.log

После того, как файл конфигурации готов создадим log-файлы.

258

Модуль 17. Отказоустойчивый кластер.


# touch /var/log/{ha.log,ha-debug.log}

Конфигурационный ф ур ц файл ф /etc/ha.d/haresources В этом файле описываются наши ресурсы для управления с помощью Heartbeat. node1.company.ru IPaddr::192.168.146.140/24 drbddisk::r0 \ Filesystem::/dev/drbd0::/mnt/drbd0::ext3::defaults httpd

Содержимое файла можно прочитать вот так: При старте Heartbeat, node1 будет primary node с shared IP-адресом 192.168.146.140, drbddisk – это диск описанный в ресурсе r0 (/etc/drbd. conf ), устройство /dev/drbd0, файловая система /mnt/drbd0, это именно та файловая система которая будет доступна для приложений, используется тип файловой системы ext3 с опциями по умолчанию, после монтирования ФС необходимо запустить сервис httpd. Как мы видим именно здесь задается shared IP-адрес, это тот самый IPадрес по которому пользователи должны обращаться к вашим сервисам. Если первичная нода станет недоступна то этот IP-адрес будет назначен вторичной ноде которая станет первичной и начнет обрабатывать запросы. Такой подмены пользователи не заметят и сервис будет предоставляться без перебоев, а именно это нам и нужно. Укажите здесь любой свободный IP-адрес из вашей сети и закрепите его за кластером. После того как файлы конфигурации Heartbeat на обеих нодах будут готовы, можно запускать сервис. Наш кластер почти готов, как вы помните повышать отказоустойчивость мы будем веб-сервера, поскольку DRBD и Heartbeat готовы к работе, самое время установить Apache. # yum -y install httpd Настройки в httpd.conf по умолчанию или те, которые освещаются в модуле про Apache. Для нас самое главное – это секция виртуального хоста, в которой мы опишем сайт нашей компании. В конец файла /etc/httpd/conf/ httpd.conf добавляем секцию виртуального хоста Модуль 17. Отказоустойчивый кластер.

259


<VirtualHost *:80> ServerAdmin support@company.ru DocumentRoot /mnt/drbd0/ ServerName company.ru ServerAlias www.company.ru DirectoryIndex index.html ScriptAlias /cgi-bin/ /mnt/drbd0/cgi-bin/ ErrorLog /mnt/drbd0/logs/error_log CustomLog /mnt/drbd0/logs/access_log common RewriteLog /mnt/drbd0/logs//rewrite.log RewriteLogLevel 1 </VirtualHost>

Создаем структуру папок для веб-сервера. [root@node1 ~]# mkdir /mnt/drbd0/{logs,cgi-bin} Создаем log-файлы [root@node1 ~]# touch /mnt/drbd0/logs/{access.log,error.log,rewrite.log} Создаем индексный файл [root@node1 ~]# echo 'High-availability Page' > /mnt/drbd0/index.html Запускаем Heartbeat, при старте он запустит Apache. [root@node1 ~]# service heartbeat start Starting High-Availability services: 2009/04/26_21:29:04 INFO: Resource is stopped [ OK ]

В выводе команды ifconfig вы заметите что был создан сетевой алиас (eth0:0), это виртуальный интерфейс с назначенным ему IP-адресом. В случае выхода первичной ноды он будет переназначен на вторичной и она став первичной будет обрабатывать запросы! [root@node1 ~]# ifconfig

260

Модуль 17. Отказоустойчивый кластер.


eth0

Link encap:Ethernet HWaddr 00:0C:29:77:9C:9C inet addr:192.168.146.150 Bcast:192.168.146.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe77:9c9c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2743855 errors:0 dropped:0 overruns:0 frame:0 TX packets:6180468 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:203601157 (194.1 MiB) TX bytes:691044303 (659.0 MiB) Interrupt:59 Base address:0x2000

eth0:0 Link encap:Ethernet HWaddr 00:0C:29:77:9C:9C inet addr:192.168.146.140 Bcast:192.168.146.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:59 Base address:0x2000 lo

Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:32 errors:0 dropped:0 overruns:0 frame:0 TX packets:32 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3637 (3.5 KiB) TX bytes:3637 (3.5 KiB)

[root@node2 ~]# service heartbeat start Попробуйте в браузере обратиться к нашему веб-серверу. Чтобы веб-сервер понял что от него хотят заголовок запроса должен содержать нужный нам хост. Пропишете в файл hosts такую запись: 192.168.146.140 company.ru 192.168.146.140 www.company.ru

Файл hosts в Linux находится в /etc/, в Windows C:\WINDOWS\system32\ drivers\etc Вы должны увидеть нашу страницу index.html с текстом “High-availability Page ”. Если это так то продолжаем, если она не показывается то внимательно перечитываем все выше написанное. Теперь надо убедится что при недоступности одной ноды работу будет выполнять вторая. Берем и просто отключаем Heartbeat на node1, в свою очередь он выключит веб-сервер и перейдет в режим secondary node. [root@node1 ~]# service heartbeat stop Еще раз запрашиваем страницу в браузере и замечаем что все продолжает работать. Модуль 17. Отказоустойчивый кластер.

261


Виртуальный интерфейс переместился на Node2, там же запустился Apache и начал сразу же обрабатывать запросы. Вторичная нода стала первичной. [root@node2 ~]# service drbd status drbd driver loaded OK; device status: version: 8.0.13 (api:86/proto:86) GIT-hash: ee3ad77563d2e87171a3da17cc002ddfd1677dbe build by buildsvn@c5-i386build, 2008-10-02 13:31:44 m:res cs st ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C /mnt/drbd0 ext3

[root@node2 ~]# ifconfig eth0

Link encap:Ethernet HWaddr 00:0C:29:25:04:55 inet addr:192.168.146.134 Bcast:192.168.146.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe25:455/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:6180400 errors:2 dropped:2 overruns:0 frame:0 TX packets:2742239 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:693847272 (661.7 MiB) TX bytes:200769641 (191.4 MiB) Interrupt:59 Base address:0x2000

eth0:0 Link encap:Ethernet HWaddr 00:0C:29:25:04:55 inet addr:192.168.146.140 Bcast:192.168.146.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:59 Base address:0x2000 lo

Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:34 errors:0 dropped:0 overruns:0 frame:0 TX packets:34 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3798 (3.7 KiB) TX bytes:3798 (3.7 KiB)

После того как node1 будет починена ее можно вернуть на первичную роль. [root@node1 ~]# service heartbeat start [root@node2 ~]# service heartbeat stop [root@node2 ~]# service heartbeat start Теперь проведем более жесткий тест. Сделаем имитацию потери подключения ноды к сети. Выдерните сетевой кабель из node1, если это

262

Модуль 17. Отказоустойчивый кластер.


физический сервер или просто наберите команду ниже: [root@node1 ~]# ifdown eth0 В течение нескольких секунд виртуальный интерфейс должен мигрировать на node2 и работа веб-сервера продолжится. После того, как вы это заметите, верните подключение на node1: [root@node1 ~]# ifup eth0 Через несколько секунд node1 опять станет primary node и начнет обслуживать подключения, потому что “auto_fallback on”. На этом построение отказоустойчивого кластера подошло к успешному завершению.

Конфигурационный ф ур ц файл ф /etc/drbd.conf minor-count

По умолчанию модуль DRBD загружается с minorcount 32, если используется много устройств и номеров не хватает их можно явно указать здесь; dialog-refresh Обновление экрана каждые n секунд, может быть полезно при подключение к серверу по последовательному интерфейсу; disable-ip-verification Позволяет отключить одну из проверок drbdadm; usage-count Участвовать в глобальном подсчете пользователей DRBD или нет; common {...} Секция, опции которой наследуют все ресурсы; syncer Позволяет задать пропускную способность при синхронизации устройств по сети, разработчики рекомендуют использовать 30% от возможностей сети. Например, если у вас 100 Мбит сеть, то 100 * 0.3 = 30 Мб; resource r0 {...} Секция описания ресурса; protocol Задает протокол для DRBD, подробнее о них написано выше; handlers {...} Задает обработчики, например что делать в случае потери соединения первичной ноды; startup {...} Секция для опций используемых в процессе загрузки DRBD; wfc-timeout Ожидание таймаута соединения; degr-wfc-timeout Ожидание таймаута подключения, в случае если в кластере одна рабочая нода; Модуль 17. Отказоустойчивый кластер.

263


wait-after-sb

disk {...}

on-io-error detach fencing

Ожидание после split brain, ситуация когда все ноды могут попытаться запустить сервис одновременно, думая что другие ноды недоступны. В свою очередь это может повлечь за собой повреждение данных; Секция с настройками оповещения верхних уровней, если замечено, что происходят I/O ошибки при обращение к диску; Нода перестает работать с носителем данных если на нем происходят I/O ошибки; Процесс блокировки ресурсов с нод статус которых сомнителен;

net {...}

Секция задает различные опции сети, такие как размеры буфера, максимальное число запросов обрабатываемых DRBD. В обычных ситуациях значений по умолчанию достаточно;

on host {...}

Секция описания нод;

device

Указывает на устройство DRBD, они расположены в /dev/ и начинаются с 0;

disk

Физический диск или раздел, который будет задействован в работе DRBD;

address

IP-адрес и порт этой ноды, нужно указывать именно ее IP-адрес а не shared IP;

meta-disk

Meta данные могут храниться на отдельном разделе/ диске а могут на диске описанном в опции disk;

max-buffers

Число буферов используемых для хранения данных, пока те записываются на диск;

max-epoch-size

Максимальное число запросов на запись. Должно соответствовать max-buffers;

timeout ping-int

Эти значения можно повысить если наблюдаются обрывы связи;

Значения опций в выводе cat /proc/drbd Информация о ресурсе cs ro ds ns

264

connection state roles disk states network send

Модуль 17. Отказоустойчивый кластер.


nr dw dr al bm lo pe ua ap

network receive disk write disk read activity log bit map local count pending unacknowledged application pending

Возможный статус соединения StandAlone

Disconnecting Unconnected

Timeout BrokenPipe NetworkFailure

ProtocolError

TearDown WFConnection WFReportParams Connected StartingSyncS

Не доступна сетевая конфигурация. Этот ресурс еще не был подключен или был административно отключен (drbdadm disconnect), или сбросил сетевое подключение из за не пройденной аутентификации или split brain; Временное состояние пока происходит отключение, следующее состояние – StandAlone; Временное состояние до попытки подключения. Следующее возможное состояние – WFConnection или WFReportParams; Временное состояние после перерыва связи с peer-ом. Следующее возможное состояние – Unconnected; Временное состояние после потери связи с peer-ом. Следующее возможное состояние – Unconnected; Временное состояние после потери связи с партнером. Следующее возможное состояние – Unconnected; Временное состояние после потери связи с партнером. Следующее возможное состояние – Unconnected; Временное состояние, peer закрывает соединение. Следующее возможное состояние – Unconnected; Нода ожидает пока peer станет виден в сети; TCP соединение было установлено, нода ожидает первый сетевой пакет от peer-ра; DRBD соединение установлено, зеркалирование данных активно. Это нормальное состояние; Начата полная синхронизация, выполняется администратором. Следующее возможное состояние – SyncSource или PausedSyncS;

Модуль 17. Отказоустойчивый кластер.

265


StartingSyncT

WFBitMapS WFBitMapT WFSyncUUID SyncSource SyncTarget PausedSyncS PausedSyncT VerifyS VerifyT

Начата полная синхронизация, выполняется администратором. Следующее возможное состояние – WFSyncUUID; Частичная синхронизация начата. Следующее возможное состояние – SyncSource или PausedSyncS; Частичная синхронизация начата. Следующее возможное состояние – WFSyncUUID; Синхронизация скоро начнется. Следующее возможное состояние – SyncTarget или PausedSyncT; Синхронизация запускается, локальная нода является источником синхронизации; Синхронизация запускается, локальная нода является целью синхронизации; Локальная нода источник синхронизации, но синхронизация находится в режиме паузы; Локальная нода является целью синхронизации, но синхронизация находится в режиме паузы; Запускается онлайн верификация, локальная нода является источником верификации; Запускается онлайн верификация, локальная нода является целью верификации.

Роли ресурсов Primary Secondary Unknown

Primary node; Secondary node; Роль ресурса неизвестна. Локальный ресурс не бывает в этой роли. Она отображается только для ресурса peer-ра в отключенном режиме.

Возможное состояние диска Diskless Attaching Failed

Negotiating Inconsistent

Драйверу DRBD не назначено блочное устройство; Переходное состояние пока считываются meta данные; Переходное состояние последовавшее за I/O ошибкой локального блочного устройства, следующее возможное состояние – Diskless; Переходное состояние пока налаживается соединение; Данные непоследовательны. Это статус нового ресурса;

Outdated

Данные ресурса последовательны но устарели;

266

Модуль 17. Отказоустойчивый кластер.


DUnknown Consistent

UpToDate

Статус используется для peer-ра если не доступно сетевое подключение; Последовательные данные ноды без сетевого подключения. После подключения будет решено, данные являются актуальными или устаревшими; Все данные в актуальном состояние. Это нормально состояние.

Конфигурационный ф ур ц файл ф /etc/ha.d/ha.cf debugfile logfile logfacility keepalive deadtime warntime initdead

udpport baud serial bcast mcast ucast auto_failback

stonith watchdog

Задает расположение файла для записи отладочной информации; Задает расположение файла для записи всей остальной информации; Опция для Syslog; Как часто проверять состояние другой ноды, указывается в секундах; Как быстро нужно решить, что удаленная нода вышла из строя, указывается в секундах; Через какой промежуток времени после последнего ответа от удаленной ноды генерировать предупреждение; На некоторых серверах и ОС, сетевой интерфейс начинает работать правильно только после перезагрузки, для корректной обработки ситуации введен дополнительный счетчик; UDP порт для broadcast/unicast запросов; Скорость для последовательного соединения; Устройство для последовательного соединения; Через какой интерфейс отправлять broadcast-запросы Heartbeat; Интерфейс для multicast-запросов, если используется; Интерфейс для unicast-запросов, если используется; Переключаться ли обратно на primary node после ее восстановления: on – переключаться; off – secondary node продолжит работать как primary node; legacy – включать auto_failback в системах, где все ноды еще не поддерживают опцию auto_failback; Опция используется только в первой версии Heartbeat; Позволяет включить Watchdog timer, если наш собственный Heartbeat не ответит в течение минуты то сервер будет перезагружен;

Модуль 17. Отказоустойчивый кластер.

267


node ping

Задает ноду; Позволяет пинговать сетевое устройство, например свой шлюз, используется для определения работоспособности сети; respawn Процессы стартуют и останавливаются вместе с Heartbeat, ipfail определяет какая нода имеет лучшее сетевое подключение, в случае если нода теряет сетевое подключение или испытывает большие затруднения в передаче трафика, ipfail заметит это и роль primary node может быть передана другой ноде; apiauth API authorization directive; debug Задает уровень отладки; use_logd Использовать ли logging daemon; conn_logd_time Интервал переподключения к logd; compression Здесь указывается модуль компрессии. Таблица ниже позволяет оценить доступность сервиса в процентах в год. Доступность сервиса в % в год Недоступность сервиса в мин./часах в год 99.9999% 99.999% 99.99% 99.9% 99%

30 сек 5 минут 52 минуты 9 часов 3 с половиной дня

Резюме В этом модуле мы выяснили какие виды кластеров бывают. Подробнее разобрали принцип работы отказоустойчивого кластера, узнали о программном обеспечение которое нам может помочь в его построение и удачно воспользовались им. Мы установили и настроили наш кластер на базе DRBD и Heartbeat, далее развернули веб-сервер Apache и протестировали его работу. Это была простая конфигурация кластера, но полученный опыт является хорошим фундаментом для дальнейших исследований.

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

268

Модуль 17. Отказоустойчивый кластер.


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.