Вы находитесь на странице: 1из 98

№11(24) ноябрь 2004

подписной индекс 81655


www.samag.ru

Утилита nLite:
формируем свой дистрибутив
Windows XP/2000/2003
Мониторинг UNIX-серверов
c помощью Nagios и SNMP
Использование бездисковых
Linux-станций с загрузкой по сети
Пакетный фильтр OpenBSD
Танцуем самбу
Linare – настольный дистрибутив Linux
Иммунная система для компьютера
Пассивный перехват трафика
№11(24) ноябрь 2004

Запись дисков CD-R/RW в Linux


Создание и настройка
сервера терминалов
оглавление

АДМИНИСТРИРОВАНИЕ СЕТИ
Мониторинг UNIX-серверов Пассивный перехват трафика
c помощью Nagios и SNMP
Павел Закляков
Андрей Бешков amdk7@mail.ru 52
tigrisha@sysadmins.ru 4
HARDWARE
Использование бездисковых
Linux-станций с загрузкой по сети Запись дисков CD-R/RW в Linux
Часть 1
Андрей Маркелов
andrew@markelov.net 12 Владимир Мешков
ubob@mail.ru 56
Пакетный фильтр OpenBSD
ПРОГРАММИРОВАНИЕ
Денис Назаров
pheonix@sysattack.com 16 Создаем кроссплатформенное
приложение на основе FLTK
Виртуальные войны
Сравнительное тестирование VMWare Workstation Антон Борисов
и Cooperative Linux. a.borisov@tesv.tmb.ru 64
Михаил Платов ОБРАЗОВАНИЕ
platov@cs.vsu.ru 21
Class Server 3.0. – новое решение
Обзор эмулятора mips64emul Microsoft в области образования
Александр Байрак Андрей Филиппович
x01mer@pisem.net 26 fil@ics.bmstu.ru 71
Лейся песня, Файловая система NTFS извне и изнутри
или Сервер потокового аудио Часть 1
своими руками
Крис Касперски
Сергей Яремчук kk@sendmail.ru 72
grinder@ua.fm 28
Разработка сценария регистрации
Танцуем самбу пользователей в сети
Часть 1
Роман Гребенников
grv@cs.vsu.ru 32 Иван Коробко
ikorobko@prosv.ru 78
Заметки о Linare
Создание и настройка сервера
Валентин Синицын терминалов
val@linuxcenter.ru 39
Роман Марков
Использование программы nLite stepan-razin@newmail.ru 90
Максим Костышин
Maxim_kostyshin@mail.ru 42 BUGTRAQ 63

БЕЗОПАСНОСТЬ
Иммунная система для компьютера
Сергей Яремчук
grinder@ua.fm 48
№11(24), ноябрь 2004 1
администрирование

МОНИТОРИНГ UNIX-СЕРВЕРОВ
C ПОМОЩЬЮ NAGIOS И SNMP
АНДРЕЙ БЕШКОВ
В предыдущей статье этого цикла [1] мы говорили о том, что программа работает на 90% при условии компиляции с
как научить Nagios следить за Windows-серверами, пользу- помощью Visual C++ и cygwin32.
ясь сведениями, предоставляемыми SNMP. Теперь пришла Отсюда можно сделать вывод, что, приложив некото-
пора рассказать, как можно собирать данные о жизнедея- рые усилия, мы смогли бы мониторить любую из этих опе-
тельности серверов, работающих под управлением разных рационных систем, благо процедуры установки и настрой-
диалектов UNIX. Для этого мы будем снова использовать ки net-snmp для каждой из них почти не отличаются друг от
SNMP. Если вас мучают вопросы, что такое этот преслову- друга.
тый SNMP, как он работает и для чего предназначен, то, Первым делом на сервере мониторинга, работающем
наверное, стоит ознакомиться с RFC 1156, 1157, 1213, 1146, под FreeBSD, устанавливаем самую новую версию пакетов
2571, 2574 и заодно прочитать предыдущую статью [1]. Пе- net-snmp и nagios-plugins.
ред началом повествования следует сказать, что система
мониторинга, на которой будут выполняться все действия, # cd /usr/ports/net-mgmt/net-snmp
# make install clean
описанные ниже, у меня работает под управлением
FreeBSD. За время, прошедшее с момента публикации пре- # cd /usr/ports/net-mgmt/nagios-plugins
# make install clean
дыдущей статьи, Nagios дорос до версии 1.2, также изме-
нилась с 4.7 на 4.10 версия системы FreeBSD, используе- Пакет net-snmp4, все еще присутствующий в дереве пор-
мой на моем сервере. Теперь уже нет необходимости ком- тов, устанавливать не стоит из-за сильной устарелости.
пилировать Nagios из исходников, все прекрасно ставится На подопытных серверах также необходимо проинстал-
из портов. Впрочем, стоит, как всегда, сделать традицион- лировать net-snmp. Для FreeBSD это делается вышеуказан-
ную оговорку: все, что я рассказывал в предыдущих стать- ным способом, но nagios-plugins ставить не следует. Для
ях о Nagios и о чем буду говорить впредь, вполне надежно ALT Linux 2.3 требуется выполнить следующие команды.
работает и под управлением других UNIX-подобных опера-
ционных систем. # apt-get update
# apt-get install net-snmp net-snmp-utils
Вдобавок необходимо заметить, что пакет usd-snmp, ис-
пользовавшийся нами для работы с SNMP прежде, теперь На этом процедуру инсталляции можно считать завер-
превратился в net-snmp версии 5.1.1. шенной. Для того чтобы система могла отвечать на SNMP-
Перейдем к задаче на сегодня. Необходимо настроить запросы, внутри нее должен работать демон snmpd. Ему,
мониторинг серверов, работающих под управлением как и всем порядочным программам, для успешного функ-
FreeBSD 4.10 и ALT Linux 2.3. Соответственно, для приме- ционирования необходимо иметь конфигурационный файл.
ра им даны имена reddaemon и penguin. Впрочем, стоит В качестве такового обычно выступает snmpd.conf. При ра-
заметить, что net-snmp успешно работает и на многих дру- боте с Linux он, как правило, располагается в /etc/snmp/, а
гих UNIX-подобных системах: для FreeBSD соответственно актуальна директория /usr/
! HP-UX (9.0, 10.20, 11.0); local/etc/.
! Ultrix (от 4.2 до 4.5); Файл конфигурации одинаков для всех систем, поэто-
! OSF (3.2, 4.0); му мы изучим его на примере, используемом для Linux.
! Solaris (SPARC/ULTRA от 2.3 до 2.8) (Intel 2.9) SunOS
(4.1.4 и выше); # Ìåñòîíàõîæäåíèå ñèñòåìû â ðåàëüíîì ìèðå
syslocation Rostov-on-Don Kranoarmejskaya str. ↵
! NetBSD (от 1.0 до 1.5 alpha); Building 1 testlab 407
! FreeBSD (от 2.2 и выше); # Êîíòàêòû àäìèíèñòðàòîðà
! Linux (ядра от 1.3 и выше); syscontact Andrew Beshkov admin@example.com tel. 390-34-89
! BSDI (от 2.1 до 4.0.1); # Ñåðâèñû, ïðåäîñòàâëÿåìûå ñèñòåìîé
! AIX (3.2.5, 4.1.5); sysservices = 79
! OpenBSD (2.6, 2.8);
! OS X (10.1.1, 10.1.2); Думаю, что есть необходимость подробно объяснить
! Irix (от 5.1 до 6.5); процедуру, с помощью которой рассчитывается содержи-
! QNX 6.2.1A; мое переменной sysservices. Нужно выбрать из списка уро-
! Dynix/PTX 4.4. вень и подставить его номер вместо L в формулу 2L-1.
! 1 – physical (концентраторы);
На данный момент идут работы по портированию net- ! 2 – datalink/subnetwork (мосты);
snmp на Windows. В результате уже сейчас можно сказать, ! 3 – internet (IP-шлюзы);

4
администрирование
! 4 – end-to-end (IP-хост); # /usr/local/etc/rc.d/snmpd.s
! 5 – OSI (протоколы OSI);
! 6 – OSI (протоколы OSI); Стоит отметить тот факт, что, кроме snmpd, в комплект
! 7 – applications (SMTP, POP3 и прочие сервисы). net-snmp входит демон snmptrapd, отвечающий за обработку
SNMP-ловушек. По умолчанию он выключен, стоит помнить,
К примеру, для маршрутизатора расчет будет выглядеть что в системе не должно работать ненужного программно-
так: 23-1=4. А для обычного хоста 24-1 + 27-1 = 72. Если вы го обеспечения, поэтому без особой надобности не будем
хотите мониторить все уровни, то лучше всего использо- его включать. Говорить о том, как можно использовать эти
вать цифру 79. самые ловушки, мы будем в следующей статье.
Можно создать файлы конфигурации с помощью про- Теперь можно проверить, что за сведения предоставля-
граммы snmpconf, но я предпочитаю делать все самостоя- ют наши сервера. Сделать это можно как минимум двумя
тельно. По крайней мере, так достигается глубинное пони- способами. C помощью утилит командной строки snmpget
мание механизмов работы используемого программного или snmpwalk.
обеспечения.
Следующим интересным моментом является безопас- # snmpwalk –m ALL -c InK12345 -v1 penguin ↵
.iso.org.dod.internet.mgmt.mib-2.system
ность. В традиционном SNMP для версий протокола 1 и 2с
SNMPv2-MIB::sysDescr.0 = STRING: Linux altlinux.unreal.net 2.4.27-std-up-alt1
за нее отвечают строки сообществ (community strings). Их #1 Sun Oct 17 22:42:45 MSD 2004 i686
стоит воспринимать как своеобразные аналоги паролей. Со- SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
SNMPv2-MIB::sysUpTime.0 = Timeticks: (1751738) 4:51:57.38
общества бывают двух видов – private и public. Отличаются SNMPv2-MIB::sysContact.0 = STRING: Andrew Beshkov <admin@example.com>
SNMPv2-MIB::sysName.0 = STRING: penguin.example.com
они друг от друга лишь тем, что первое позволяет изме- SNMPv2-MIB::sysLocation.0 = STRING: Rostov-on-Don Kranoarmejskaya str.
нять данные внутри наблюдаемого устройства, а второе Building 1 testlab 407
SNMPv2-MIB::sysServices.0 = INTEGER: 0
дает возможность только просматривать их. Самым про- SNMPv2-MIB::sysORLastChange.0 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORID.1 = OID: IF-MIB::ifMIB
стым способом определить эти сообщества является вне- SNMPv2-MIB::sysORID.2 = OID: SNMPv2-MIB::snmpMIB
сение в конфигурационный файл следующих строк: SNMPv2-MIB::sysORID.3 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.4 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.5 = OID: UDP-MIB::udpMIB
rocommunity InK12345 SNMPv2-MIB::sysORID.6 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
rwcommunity 12r341289j SNMPv2-MIB::sysORID.7 = OID:
SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.8 = OID: SNMP-MPD-MIB::snmpMPDCompliance
Как вы уже могли догадаться, rocommunity дает право SNMPv2-MIB::sysORID.9 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
читать данные, а rwcommunity предоставляет полный дос- SNMPv2-MIB::sysORDescr.1 = STRING:
The MIB module to describe generic objects for network interface sub-layers
туп. Впрочем rwcommunity тоже можно удалить, если вы не SNMPv2-MIB::sysORDescr.2 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.3 = STRING:
собираетесь изменять данные внутри устройства с помо- The MIB module for managing TCP implementations
щью snmp. Вышеприведенные опции составляют минималь- SNMPv2-MIB::sysORDescr.4 = STRING:
The MIB module for managing IP and ICMP implementations
ный рабочий файл конфигурации. Но квалифицированные SNMPv2-MIB::sysORDescr.5 = STRING:
The MIB module for managing UDP implementations
системные администраторы обычно так не делают, потому SNMPv2-MIB::sysORDescr.6 = STRING: View-based Access Control Model for SNMP.
что иначе будет трудно различать это устройство среди ог- SNMPv2-MIB::sysORDescr.7 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.8 = STRING:
ромного множества других SNMP-приборов. The MIB for Message Processing and Dispatching.
Итак, давайте посмотрим, что за сведения могут предо- SNMPv2-MIB::sysORDescr.9 = STRING:
The management information definitions for the SNMP User-based Security Model.
ставить нам подопытные устройства. Для этого запускаем
на них демон snmpd. Чтобы это сделать, кладем на Linux- Опция –m ALL указывает, что нужно показать все дере-
машине файл snmpd.conf в /etc/snmp и затем выполняем во ниже выбранного OID, после -с располагается комьюни-
следующую команду: ти string, затем идут версия snmp-протокола, имя машины
и OID запрашиваемой ветви. Стоит отметить, что OID мож-
# service snmpd start но записывать разными способами. В большинстве случа-
ев префикс iso.org.dod.internet.mgmt.mib-2. можно не писать,
Если есть желание, чтобы демон стартовал автоматичес- так как он предполагается по умолчанию, соответственно
ки при запуске машины, выполняем еще и такую команду: мы получим тот же самый результат, если напишем просто
system. Для указания OID вместо длинных названий можно
# chkconfig snmpd on использовать цифровые идентификаторы. К примеру, этот
же куст дерева можно адресовать следующей комбинаци-
И обязательно убеждаемся в успешности выполнения ей цифр .1.3.6.1.2.1.1. Если есть желание увидеть все MIB-
предыдущей команды с помощью: дерево, то можно выполнить вышеуказанную команду, вов-
се не указывая OID. Думаю, вы будете впечатлены разме-
# chkconfig snmpd --list рами листингов, которые система выведет вам. Использо-
вать командный интерфейс полезно, но, к сожалению, это
Для FreeBSD файл с настройками должен находиться в не всегда помогает получить правильное представление о
/usr/local/etc/snmp/. Кроме этого, нужно включить запуск де- строении MIB-дерева.
мона в скрипте /usr/local/etc/rc.d/snmpd.sh. Чтобы это сделать, В этом нам помогут утилиты, называемые MIB-браузе-
ищем внутри него строку snmpd_enable= «NO» и вписыва- рами. Для Linux и FreeBSD лучше всего подойдет програм-
ем в нее слово «YES». Затем вручную запускаем демон. ма mbrowse. Обычно она по умолчанию входит во многие

№11(24), ноябрь 2004 5


администрирование
дистрибутивы. В действии эта программа выглядит следу- репили за ним право передавать SNMP-команды только с
ющим образом. помощью версии протокола 2с. Следующей строкой созда-
ли вид на определенную область SNMP-дерева. В данном
случае с помощью запросов можно просматривать все, что
лежит ниже .1 или .iso. Пользуясь этой опцией, можно ог-
раничить дерево, доступное запросу до одной ветки или
даже до единственного OID. И заключительной строкой ука-
зываем настройки безопасности для нашей группы
MyROGroup. После этого не забываем перезапустить де-
мон SNMP и проверить, как все работает.

# snmpwalk –m ALL -c InK12345 -v2ñ penguin ↵


.iso.org.dod.internet.mgmt.mib-2.system

Обратите внимание на опцию –v2c. Если все прошло


нормально, выполняем ту же команду с –v1 и убеждаемся,
что она не возвращает никаких сведений. Как вы, навер-
ное, уже догадались, мы полностью отключили возможность
Для систем Windows существует достаточно много по- вносить извне изменения в данные, находящиеся внутри
добных утилит. О том, какую из них и почему стоит выб- наблюдаемого объекта. Выполняем проверку того, как ра-
рать, я подробно рассказывал в предыдущей статье [1]. ботает модуль check_snmp, установленный на сервере
Конечно, обилие доступных данных поражает, но все Nagios. К примеру, неплохо было бы посмотреть Uptime
же хотелось бы точно знать, как это использовать с наи- системы:
большей выгодой. Давайте вновь вернемся к предмету на-
шего разговора. Кроме стандартных ветвей, net-snmp со- # /usr/local/nagios/libexec/check_snmp -H penguin ↵
-o .1.3.6.1.2.1.1.3.0 -C InK12345 -P 2c
здает свою собственную ветвь .iso.org.dod.internet.private.
Invalid SNMP version 2c
enterprises.ucdavis, которая содержит в себе все необходи-
мые данные. В цифровом формате адрес этой ветви выг- По каким-то странным причинам автор забыл включить
лядит так: .1.3.6.1.4.1.2021. Стоит отметить, что в некото- в него возможность работы с протоколом версии 2с. Ошиб-
рых snmp-браузерах данная ветка может быть недоступна ка, говорящая, что эта версия не поддерживается, – не со-
через свое символьное обозначение, но в то же время зап- всем то, что мы ожидали получить, поэтому давайте возьмем
росы, выполняемые с помощью цифровых OID, будут впол- в руки большой напильник и самостоятельно поправим мо-
не работоспособны. Думаю, вы со мной согласитесь, что дуль check_snmp. Для этого нужно отредактировать файл
это немного неудобно, поэтому, чтобы включить распозна- /usr/ports/net-mgmt/nagios-plugins/work/nagios-plugins-1.3.1/
вание символьных имен, нам нужно будет скопировать MIB- plugins/check_snmp.c. Ищем в нем следующую строку:
базы из /usr/share/snmp/mibs/ в рабочую директорию исполь-
зуемого браузера. -P, --protocol=[1|3]\n\
Как показывают тесты, все работает достаточно непло-
хо, но, к сожалению, наша система сейчас отвечает на и заменяем ее на:
SNMP-запросы, приходящие с любого IP-адреса. К тому же,
по умолчанию используется первая версия протокола SNMP, -P, --protocol=[1|2c|3]\n\
которая передает все данные в открытом виде. Необходи-
мо это исправить и заодно поднять уровень безопасности. Затем, найдя условие такого вида:
Для этого вносим в файл snmpd.conf следующие строки
вместо rocommunity и rwcommunity: if (proto == NULL || (strcmp(proto,DEFAULT_PROTOCOL) == ↵
0) ) { /* default protocol version */
asprintf(&proto, DEFAULT_PROTOCOL);
com2sec nagios 10.10.21.55/32 InK12345 asprintf(&authpriv, "%s%s", "-c ", community);
group MyROGroup v2c nagios }
view all included .1 80
access MyROGroup "" any noauth exact all ↵ Вставляем после него вот такие строки:
none none

Стоит отметить, что опции rocommunity и rwcommunity – else if ( strcmp (proto, "2c") == 0 ) { ↵
/* snmpv2c args */
всего лишь оболочки вокруг более мощного набора команд asprintf(&proto, "%s", "2c");
VACM (Version-based Access Control Module), которым мы asprintf(&authpriv, "%s%s", "-c ", community);
}
воспользовались ранее.
Таким образом, мы сказали, что система, подвергаемая Проводим перекомпиляцию, а затем и замену старого
мониторингу, может принимать SNMP-запросы лишь от ма- модуля новым.
шины с адресом 10.10.21.55, которая является сервером
мониторинга, и привязали этот адрес к внутреннему имени # make install
системы безопасности «nagios». Затем разрешили этому
имени символизировать группу MyROGroup, а заодно зак- После этого команда с ключом -P 2c должна отработать

6
администрирование
нормально. Вписываем в файл checkcommands.cfg описа- normal_check_interval 1
ние команды check_snmp_oid, с помощью которой будем retry_check_interval 1
contact_groups onix-admins
проводить мониторинг и вызывать модуль check_snmp. register 0
}
define command{ Данный сервис показывает время работы системы с мо-
command_name check_snmp_oid
command_line $USER1$/check_snmp -H $HOSTADDRESS$ ↵ мента последней перезагрузки. Для этого используется OID
-o $ARG1$ -C $ARG2$ -w $ARG3$ -c $ARG4$ ↵ .iso.org.dod.internet.mgmt.mib-2.system.sysUpTime.0. Почти
-u $ARG5$ -l "" -P $ARG6$
} такого же эффекта можно добиться с помощью .iso.org.dod
.internet.mgmt.mib-2.host.hrSystem.hrSystemUptime.0. Хотя
Затем в файле hosts.cfg рассказываем о наших серве- тут стоит сделать маленькое примечание: второй OID по-
рах. казывает не время, прошедшее с последнего перезапуска
системы, а момент последней инициализации SNMP.
# Îïèñûâàåì øàáëîí õîñòà
define host{ define service{
name generic-host use generic-service
notifications_enabled 1
event_handler_enabled 1 host_name Linux
service_description System Uptime
flap_detection_enabled 1 is_volatile 0
process_perf_data 1
retain_status_information 1 check_period 24x7
check_command check_snmp_oid ↵
retain_nonstatus_information 1 !.1.3.6.1.2.1.1.3.0!InK12345! ""! ""! ""!2c
max_check_attempts 10
notification_interval 120 }
notification_period 24x7
notification_options d,u,r Следующим интересным для нас моментом будет сово-
register 0
} купность сервисов, отображающих количество занятых бло-
ков разделов /, home, и совокупный процент использован-
define host{
use generic-host ных блоков физической и своп-памяти. Для того чтобы по-
host_name Linux нять, где находятся необходимые сведения, посмотрите вет-
alias Standard Linux Server
address penguin ку .iso.org.dod.internet.mgmt.mib-2.host.hrStorage.hrStorage
check_command check-host-alive Table. Принцип анализа ветви довольно прост. В hrStorage
}
Index содержится список уникальных идентификаторов, опи-
define host{ сывающих каждое устройство. А hrStorageType в свою оче-
use generic-host
host_name FreeBSD редь хранит типы устройств. hrStorageDesc заполнен тек-
alias Standart FreeBSD Server стовыми описаниями объектов. Для моей системы это выг-
address reddaemon
check_command check-host-alive лядит так:
}
hrStorageDescr.2 = STRING: Real Memory
hrStorageDescr.3 = STRING: Swap Space
И, конечно же, не забываем причислить их к группе хо- hrStorageDescr.4 = STRING: /
стов onix-servers, внеся следующие строки в файл host hrStorageDescr.5 = STRING: /home
hrStorageDescr.6 = STRING: /proc/bus/usb
groups.cfg
В hrStorageAllocationUnits указан размер блока для каж-
define hostgroup{ дого из устройств:
hostgroup_name onix-servers
alias Onix Servers
contact_groups onix-admins hrStorageAllocationUnits.2 = INTEGER: 1024 Bytes
members Linux, FreeBSD hrStorageAllocationUnits.3 = INTEGER: 1024 Bytes
} hrStorageAllocationUnits.4 = INTEGER: 4096 Bytes
hrStorageAllocationUnits.5 = INTEGER: 4096 Bytes
hrStorageAllocationUnits.6 = INTEGER: 1024 Bytes
Настройку оповещений и контактов пропускаем, так как
эта тема обсуждалась ранее неоднократно. Самое время за- Ну а hrStorageSize указывает, сколько блоков в каждом
няться описанием сервисов, за которыми мы будем следить. устройстве.

# Îïèñûâàåì øàáëîí ñåðâèñà hrStorageSize.2 = INTEGER: 54156


define service{ hrStorageSize.3 = INTEGER: 216836
name generic-service hrStorageSize.4 = INTEGER: 273087
active_checks_enabled 1 hrStorageSize.5 = INTEGER: 196780
passive_checks_enabled 1 hrStorageSize.6 = INTEGER: 0
parallelize_check 1
obsess_over_service 1 И наконец, самое интересное. Как вы уже, наверное,
check_freshness 0
notifications_enabled 1 догадались, hrStorageUsed содержит данные о том, сколь-
event_handler_enabled 1 ко блоков занято на каждом из устройств.
flap_detection_enabled 1
process_perf_data 1
retain_status_information 1 hrStorageUsed.2 = INTEGER: 52564
retain_nonstatus_information 1 hrStorageUsed.3 = INTEGER: 11220
notification_interval 120 hrStorageUsed.4 = INTEGER: 235014
notification_period 24x7 hrStorageUsed.5 = INTEGER: 8755
notification_options w,u,c,r hrStorageUsed.6 = INTEGER: 0
max_check_attempts 3

№11(24), ноябрь 2004 7


администрирование
Теперь дело за малым: высчитать, сколько блоков со- Но это не очень удобно, так как в этом случае у систе-
ответствуют заполнению устройств на 80% и 90%. И затем мы есть лишь два состояния – «нормальное» и «критичес-
создать на основе этих данных правила проверки. кое». Соответственно, нет промежуточного перехода в виде
В качестве примера приведем описание сервиса, пока- состояния «предупреждение». Разобравшись с теорией,
зывающего, как обстоят дела с заполнением корневого давайте создадим сервис, который будет контролировать
раздела. состояние раздела / новым способом.

define service{ define service{


use generic-service use generic-service
host_name Linux host_name Linux
service_description Space on / service_description Space on / check 2
is_volatile 0 is_volatile 0
check_period 24x7 check_period 24x7
check_command check_snmp_oid ↵ check_command check_snmp_oid ↵
!.1.3.6.1.2.1.25.2.3.1.6.4! ↵ !.1.3.6.1.4.1.2021.9.1.9.1!InK12345!80!90!%
InK12345!218470!245778!blocks!2c }
}
Думаю, создать сервисы, выполняющие проверку ос-
Надеюсь, что на основе приведенного примера вы смо- тальных разделов, вы сможете сами. Идем дальше. Если
жете создать описание всех необходимых сервисов. В мире мы хотим следить за загрузкой процессора, добавляем в
UNIX-систем большинство задач можно решить разными snmpd.conf вот это:
способами. Сейчас вы в этом убедитесь. Давайте в оче-
редной раз расширим функциональность демона snmpd, load 12 20 30
внеся в snmpd.conf следующие строчки.
Этой строкой мы говорим демону, что желаем видеть
disk / 180000 статистику нагрузки на процессор за последнюю минуту,
disk /home 760000
за пять и пятнадцать минут. К сожалению, интервалы жес-
Таким образом, мы указываем, что хотим следить за тко закодированы, и изменить их невозможно. И, как обыч-
свободным местом на разделах / и home еще одним спосо- но, указываем необязательные пороговые ограничения в
бом. Вышеуказанные строки говорят демону snmp, что мы 12%, 20% и 30%, при превышении которых snmpd будет
хотим установить флаг ошибки в случае, если на разделе / устанавливать флаг ошибки. Смотрим ветку .iso.org.dod.
занято 180 Мб, а /home заполнен на 760 Мб. Впрочем, ни- internet.private.enterprises.ucdavis.laTable.laEntry и понима-
чего страшного не случится, если ограничения не устанав- ем, что нам наиболее интересны подветви laLoad, laLoadInt,
ливать вовсе. Кстати, стоит отметить, что ограничение мож- laLoadFloat.
но описывать не только в килобайтах, но и в процентах. В этих подветках содержатся одни и те же данные, но с
Теперь интересующие нас данные находятся внутри ветви разным округлением. Соответственно сервис для провер-
.iso.org.dod.internet.private.enterprises.ucdavis.dskTable.dskEntry. ки загрузки процессора за последнюю минуту будет выгля-
Принцип построения таблицы стандартен. Идентификатор деть вот так:
dskPath содержит данные об именах разделов.
define service{
dskPath.1 = STRING: / use generic-service
dskPath.2 = STRING: /home host_name Linux
service_description CPU Load 1 min
is_volatile 0
dskDevice устанавливает соответствие между раздела- check_period 24x7
ми и физическими устройствами диска. check_command check_snmp_oid ↵
!.1.3.6.1.4.1.2021.10.1.5.1!InK12345!60!90!%
}
dskDevice.1 = STRING: /dev/sda1
dskDevice.2 = STRING: /dev/sda6
Следующей интересной для нас особенностью являет-
В dskMinimum dskMinPercent содержатся пороговые зна- ся возможность запускать сторонние скрипты при получе-
чения для поднятия флага ошибки. Соответственно, dskTotal, нии того или иного SNMP-запроса. И опять добавляем в
dskAvail, dskUsed отображают общее, доступное и задей- snmpd.conf новые строки:
ствованное пространство дисков. Следующая ветвь, назы-
ваемая dskPercent, для нас наиболее интересна, так как exec users /bin/sh /usr/bin/count_users.sh
exec mailqueue /bin/sh /usr/bin/count_mail.sh
содержит величину заполнения дисков в процентах.
Затем создаем файлы count_users.sh count_mail.sh:, с
dskPercent.1 = INTEGER: 86 их помощью мы будем считать количество пользователей,
dskPercent.2 = INTEGER: 4
работающих на данный момент в системе, и размер почто-
Именно ее мы и будем контролировать. Конечно, можно вой очереди postfix.
контролировать состояние ветвей dskErrorFlag и dskErrorMsg. Содержимое файла count_users.sh:

dskErrorFlag.1 = INTEGER: 1 who | wc -l


dskErrorFlag.2 = INTEGER: 0 exit 0
dskErrorMsg.1 = STRING: /: less than 80% free (= 86%)
dskErrorMsg.2 = STRING: Содержимое файла count_mail.sh:

8
администрирование
mailq | tail -n 1 | cut -f5 -d " " echo "first line"
exit 0 echo "second line"
exit 5
Теперь смотрим, что у нас находится внутри ветки
.iso.org.dod.internet.private.enterprises.ucdavis.extTable.extEntry. В результате осмотра ветви .1.3.6.1.4.1.2021.50 можно
увидеть следующие данные:
extNames.1 = STRING: users
extNames.2 = STRING: mailqueue .1.3.6.1.4.1.2021.50.1.1 = INTEGER: 1
extCommand.1 = STRING: /bin/sh /usr/bin /count_users.sh .1.3.6.1.4.1.2021.50.2.1 = STRING: "multi_line_test"
extCommand.2 = STRING: /bin/sh / usr/bin/count_mail.sh
extResult.1 = INTEGER: 0 .1.3.6.1.4.1.2021.50.3.1 = STRING: "/bin/sh /tmp/mytest.sh"
.1.3.6.1.4.1.2021.50.100.1 = INTEGER: 5
extResult.2 = INTEGER: 0 .1.3.6.1.4.1.2021.50.101.1 = STRING: "first line"
extOutput.1 = STRING: 1
extOutput.2 = STRING: 2 .1.3.6.1.4.1.2021.50.101.2 = STRING: "second line"
.1.3.6.1.4.1.2021.50.102.1 = INTEGER: 0
extErrFix.1 = INTEGER: 0 .1.3.6.1.4.1.2021.50.103.1 = ""
extErrFix.2 = INTEGER: 0
extErrFixCmd.1 = STRING:
extErrFixCmd.2 = STRING: Как видите, и такой функционал нам вполне доступен.
Следующая возможность, на которую хотелось бы обратить
Нас интересует extOutput, в которой находится первая ваше внимание, – функция проверки размера файла. Итак,
строка из того, что скрипт выводит на экран, и extResult с добавляем в snmpd.conf вот такую надпись:
кодом возврата скрипта, переданным командой exit. Судя
по приведенному выше списку значений, у нас в системе file /tmp/tinka.txt 12
находится один пользователь, а в почтовой очереди есть
два письма. Сервисы для проверки результатов работы тем самым указывая, что файл не должен быть более 12 Кб.
обоих скриптов будут выглядеть так: Затем смотрим, что хранит в себе ветка .iso.org.dod.internet
.private.enterprises.ucdavis.fileTable.fileEntry:
define service{
use generic-service fileIndex.1 = INTEGER: 1
host_name Linux fileName.1 = STRING: /tmp/tinka.txt
service_description Users
is_volatile 0 fileSize.1 = INTEGER: 15 kB
fileMax.1 = INTEGER: 12 kB
check_period 24x7 fileErrorFlag.1 = INTEGER: true(1)
check_command check_snmp_oid ↵
!.1.3.6.1.4.1.2021.8.1.101.1!InK12345!20!30!users fileErrorMsg.1 = STRING: /tmp/tinka.txt: ↵
size exceeds 12kb (= 15kb)
}
define service{
use generic-service Написать соответствующий сервис, в общем-то, неслож-
host_name Linux но, если мы хотим самостоятельно проверять размер фай-
service_description Mail queue
is_volatile 0 ла.
check_period 24x7
check_command check_snmp_oid ↵ define service{
!.1.3.6.1.4.1.2021.8.1.101.2!InK12345!40!80!messages use generic-service
}
host_name Linux
service_description size of /tmp/tinka.txt
is_volatile 0
Конечно, в реальном мире скрипты-проверки могут быть check_period 24x7
гораздо сложнее и возвращать с помощью команды exit check_command check_snmp_oid ↵
!.1.3.6.1.4.1.2021.15.1.3.1!InK12345!12!20!kbytes
коды, указывающие на те или иные проблемы в сети. В этом }
случае есть возможность с помощью добавочной опции
execfix указывать на программу, запускаемую snmpd и от- Но есть и другой путь: можно опереться на появление
вечающую за попытки автоматического исправления оши- кода и сообщения об ошибке в fileErrorFlag и fileErrorMsg. И
бок, обнаруженных проверочным скриптом. К примеру, та- все же мне кажется, что это не очень удобно.
ким образом можно описать программу исправления ава- Напоследок хотелось бы рассказать о возможности сле-
рийного положения с почтовой очередью. жения за количеством процессов того или иного приложе-
ния, работающих в системе.
execfix mailqueue /bin/sh /usr/bin/repair_mailqueue.sh
proc httpd 3 6
proc automount 1 1
Конечно, эта возможность опциональна, но упомянуть proc csserver 2
о ней все же стоило. Любопытный читатель может спро-
сить, а что делать, если мой скрипт выводит несколько строк Этими строками мы указываем snmpd, что в системе дол-
полезной информации, и мне нужно считать их все до еди- жно быть от двух до четырех процессов httpd и только один
ной. Я отвечу, что это не проблема. Нужно всего лишь до- automount. В то же время программа csserver вообще может
бавить в snmpd.conf вот такую строку: быть не запущена, но если она все же работает, то процес-
сов не должно быть более двух. Если же минимальный и
exec .1.3.6.1.4.1.2021.50 multi_line_test /bin/sh ↵ максимальный пороги не указаны, то процессов может быть
/tmp/mytest.sh
сколько угодно. Давайте посмотрим, что snmpd нам скажет
И создать скрипт /tmp/mytest.sh следующего содержа- в ответ на такие приказания. Для этого открываем ветвь
ния. .iso.org.dod.internet.private.enterprises.ucdavis.prTable.prEntry.

№11(24), ноябрь 2004 9


администрирование
prIndex.1 = INTEGER: 1 is_volatile 0
prIndex.2 = INTEGER: 2 check_period 24x7
prIndex.3 = INTEGER: 3 check_command check_snmp_oid ↵
prNames.1 = STRING: httpd !.1.3.6.1.4.1.2021.4.6.0!InK12345!""!""!kbytes!2c
prNames.2 = STRING: automount }
prNames.3 = STRING: csserver
prMin.1 = INTEGER: 3 И соответственно мониторинг заполнения свопа можно
prMin.2 = INTEGER: 1 реализовать так же. Но это решение, на мой взгляд, не очень
prMin.3 = INTEGER: 0
prMax.1 = INTEGER: 6 изящно. Можно сделать гораздо лучше. Давайте будем сле-
prMax.2 = INTEGER: 1 дить за показателем memTotalFree, который показывает об-
prMax.3 = INTEGER: 3
prCount.1 = INTEGER: 1 щее количество свободной памяти системы. Это весьма удоб-
prCount.2 = INTEGER: 1 но, так как он равен сумме memAvailReal и memAvailSwap.
prCount.3 = INTEGER: 0
prErrorFlag.1 = INTEGER: 1 Тут возникает некоторая проблема с нетривиальностью про-
prErrorFlag.2 = INTEGER: 0 верки. Обычно ситуация обстоит так, что чем больше про-
prErrorFlag.3 = INTEGER: 0
prErrMessage.1 = STRING: Too few httpd running (# = 1) веряемая величина, тем ближе мы к критическому порогу,
prErrMessage.2 = STRING: но сейчас все наоборот. Необходимо сказать модулю, что,
prErrMessage.3 = STRING:
prErrFix.1 = INTEGER: 0 чем больше памяти нам доступно, тем лучше. Поэтому сер-
prErrFix.2 = INTEGER: 0 вис будет выглядеть так:
prErrFix.3 = INTEGER: 0
prErrFixCmd.1 = STRING:
prErrFixCmd.2 = STRING: define service{
prErrFixCmd.3 = STRING: use generic-service
host_name Linux
Надеюсь, смысл приведенных данных всем ясен. Тут, service_description Total memory Free
is_volatile 0
как всегда, возможно два пути для слежения: самим конт- check_period 24x7
ролировать значения из подветви prCount, либо опираться check_command check_snmp_oid ↵
!.1.3.6.1.4.1.2021.4.11.0!InK12345!20000:10000 ↵
на код ошибки prErrorFlag и сообщение в prErrMessage. По !9999:0!kbytes!2c
аналогии с execfix можно использовать ключевое слово }
procfix для описания программы, запускаемой в случае, если
с тем или иным процессом стряслось что-то неладное. Я Таким образом, сигнал «предупреждение» будет отправ-
думаю, что на основе примеров, приведенных выше, вы ляться, если свободной памяти останется от двадцати до
сможете легко самостоятельно написать определения нуж- десяти тысяч байт, а критические оповещения появятся, как
ных сервисов. Следующей интересной для нас веткой яв- только планка опустится еще ниже.
ляется .iso.org.dod.internet.private.enterprises.ucdavis.memory. Также неплохо было бы следить за сетевыми интерфей-
В ней хранятся подробные данные о состоянии оператив- сами с помощью ветки .iso.org.dod.internet.mgmt.mib-2.
ной памяти. Для моей машины эта ветвь выглядит так: interfaces.ifTable.ifEntry. Думаю, что примеров, приведенных
в статье, достаточно, чтобы сделать это самостоятельно.
memIndex.0 = INTEGER: 0 Разобравшись с проверками сервисов, работающих че-
memErrorName.0 = STRING: swap
memTotalSwap.0 = INTEGER: 216836 рез snmp 2c, давайте посмотрим, как выполнить все то же
memAvailSwap.0 = INTEGER: 209784 самое с помощью третьей версии протокола. Зачем нам это
memTotalReal.0 = INTEGER: 54156
memAvailReal.0 = INTEGER: 9320 нужно? Все очень просто: с точки зрения безопасности snmp
memTotalFree.0 = INTEGER: 219104 2с существенно лучше, чем версия 1, но, несмотря на это,
memMinimumSwap.0 = INTEGER: 16000
memShared.0 = INTEGER: 0 в ней все же есть недостатки. Дело в том, что при ее ис-
memBuffer.0 = INTEGER: 5728 пользовании строки сообществ передаются по сети в от-
memCached.0 = INTEGER: 13832
memSwapError.0 = INTEGER: 0 крытом виде. Думаю, это не то, что нам хотелось бы полу-
memSwapErrorMsg.0 = STRING: чить. Изумленный читатель может сказать: «Давайте со-
всем откажемся от использования 2с». К сожалению, та-
Наибольший интерес вызывают OID memTotalSwap mem кой идеалистический подход не всегда возможно воплотить
AvailSwap, означающие общий размер свопа и его свобод- в жизнь. Иногда приходится использовать именно 2с, пото-
ную часть. Затем стоит обратить внимание на memTotalReal му что не во всем имеющемся оборудовании есть поддер-
и memAvailReal, указывающие на размер физической па- жка третьей версии. К тому же, настройка snmpd для рабо-
мяти. Перспективнее всего следить за memAvailReal и ты с третьей версией snmp – дело весьма нетривиальное.
memAvailSwap. Но тут есть определенные проблемы. Дело Ниже я расскажу как этого добиться «малой кровью».
в том, что исчерпание физической памяти еще не означает Итак, приступим. В основе идеологии безопасности для
для системы каких-то ужасных последствий, все ненужное третьей версии лежит понятие модуля безопасности пользо-
в данный момент будет складироваться в своп. Поэтому вы- вателей USM (User-based Security Module). Он отвечает за
водить предупреждения по поводу того, что физическая па- хранение списка пользователей и их атрибутов. Соответ-
мять закончилась, не стоит. Сервис, следящей за этим ком- ственно каждый пользователь обозначается уникальным
понентом системы, должен выглядеть так: именем в терминах snmp, оно называется securityName. К
нему привязываются протокол аутентификации и ключ аутен-
define service{ тификации, соответственно, authProtocol и authKey. Вдоба-
use generic-service
host_name Linux вок к этому существует протокол шифрования privProtocol
service_description Physical memory Free и ключ шифрования privKey. Стоит отметить, что authKey и

10
администрирование
privKey генерируются на основе пароля, переданного поль- Затем удаляем из snmpd.conf все упоминания о пользо-
зователем. Пароль должен содержать не менее восьми сим- вателей initial, а также все строки с MyRWGroup и rwuser.
волов. Тем самым мы лишили пользователя initial всех прав и ото-
Стандарт snmp версии 3 описывает три вида пакетов. брали у пользователя nagios возможность внесения изме-
Первый не подписывается и не шифруется. Второй: отправ- нений в данные snmp. Не забываем перезапустить демона
ляющая сторона подписывает пакет ключем authKey с по- snmpd, чтобы новые настройки вступили в силу. На серве-
мощью протокола authProtocol. В качестве протокола гене- ре мониторинга для проверки выполняем команду:
рации подписи на данный момент могут выступать алго-
ритмы MD5 или SHA. Третий: подписывает и плюс к этому $ snmpget -v3 -u nagios -n "" -a MD5 -A R18nm12KDM ↵
-x DES 10.10.21.75 sysUpTime.0
данные пакета могут шифроваться с помощью протокола
system.sysUpTime.0 = Timeticks: (71318) 0:11:53.18
privProtocol и ключа privKey. В качестве протокола шифро-
вания пока можно использовать только DES. Из полученного ответа можно сделать вывод, что пере-
Ознакомиться подробнее с идеями, лежащими в осно- дача и обработка шифрованных и подписанных snmp паке-
ве USM, можно в RFC 2574. тов работает как следует. Теперь давайте протестируем как
Одной из самых странных идей, с которой приходится модуль check_snmp умеет выполнять запросы с помощью
сталкиваться, является способ управлением пользователя- третьей версии snmp.
ми, применяемый для третьей версии протокола. Для этого
существует утилита snmpusm, но создать с ее помощью $ /usr/local/nagios/libexec/check_snmp -H 10.10.21.75 ↵
-o sysUpTime.0 -L authPriv -U nagios_user1 -a MD5 ↵
пользователя с нуля невозможно. Она позволяет лишь кло- -A R18nm12KDM -X R18nm12KDM -P 3
нировать настройки существующего пользователя в атри- system.sysUpTime.0 = Timeticks: (71352) 0:11:54.10
буты вновь создаваемого. Налицо проблема курицы и яйца.
Нужно создать первого пользователя, но утилита для уп- Теперь осталось создать описание своей команды
равления пользователями делать это не умеет. check_snmp_oid_v3 в файле checkcommands.cfg. С помо-
Несколько раз перечитав man snmpusm, понимаем, что щью нее мы будем проводить мониторинг и вызывать мо-
созданием легендарного первопользователя должен зани- дуль check_snmp.
маться демон snmpd. Ничего не скажешь, весьма сильный
ход и главное – какой нечеловеческой логикой это продик- define command{
command_name check_snmp_oid_v3
товано. command_line $USER1$/check_snmp -H $HOSTADDRESS$ ↵
Итак, нам нужно внести в snmp такие строки: -o $ARG1$ -w $ARG2$ -c $ARG3$ -L $ARG4$ ↵
-U $ARG5$ -a $ARG6$ -A $ARG7$ -X $ARG8$ ↵
-u $ARG9$ -l "" -P $ARG10$
rwuser initial }
rwuser nagios
rouser nagios
createUser initial MD5 t2inKES10er DES Теперь давайте создадим сервис Total Memory Free v3
для демонстрации того, как нужно использовать команду
Или их аналог с расширенным описанием VACM: check_snmp_oid_v3. Записываем в services.cfg следующие
строки:
group MyRWGroup usm nagios
group MyROGroup usm nagios define service{
group MyRWGroup usm initial use generic-service
access MyRWGroup "" any noauth exact all all none
createUser initial MD5 t2inKES10er DES host_name Linux
service_description Total memory Free v3
is_volatile 0
Затем перезапускаем snmpd. Пользователь initial будет check_period 24x7
создан автоматически. В качестве пароля ему указано check_command check_snmp_oid_v3! ↵
.1.3.6.1.4.1.2021.4.11.0!20000:10000!9000:0! ↵
t2inKES10er, алгоритмом подписи пакетов назначаем MD5, authPriv!nagios!MD5!R18nm12KDM!R18nm12KDM!kbytes!3
а для шифрования данных используется DES. Создав пер- }
вого пользователя, мы могли бы на этом остановиться. Но
делать этого все же не стоит из соображений безопаснос- Теперь данные будут доставляться к нам в шифрован-
ти. Поэтому с помощью клонирования создаем нового ном виде. Напоследок стоит сказать, что все описания сер-
пользователя по имени nagios. висов, предназначенные для сервера Linux, можно скопи-
ровать и, изменив имя машины, следить за FreeBSD.
# snmpusm -v3 -u initial -n "" -l authNoPriv -a MD5 ↵ На этой радостной ноте хотелось бы попрощаться, а
-A t2inKES10er localhost create nagios initial
заодно пообещать, что в следующей статье мы будем изу-
User successfully created.
чать настройку системы мониторинга для слежения за обо-
Так как он унаследовал все настройки от initial, сразу рудованием знаменитой фирмы CISCO.
же меняем ему пароль на что-нибудь труднозапоминаемое
вроде R18nm12KDM. Литература:
1. Бешков А. Мониторинг Windows-серверов с помощью
# snmpusm -v3 -u nagios_user -n "" -l authNoPriv -a MD5 ↵ Nagios. Часть 2. – Журнал «Системный администратор»,
-A t2inKES10er localhost passwd t2inKES10er R18nm12KDM
№8, август 2003 г. или http://onix.opennet.ru/monitoring/
SNMPv3 Key(s) successfully changed. nagios_win_2.html

№11(24), ноябрь 2004 11


администрирование

ИСПОЛЬЗОВАНИЕ
БЕЗДИСКОВЫХ LINUX-СТАНЦИЙ
С ЗАГРУЗКОЙ ПО СЕТИ

АНДРЕЙ МАРКЕЛОВ
Постановка задачи
Работа сотрудника отдела автоматизации – это постоянная Когда с серверной частью все определилось, встал воп-
борьба с проблемами и решение задач, которые поперемен- рос по клиентской составляющей системы. В первую оче-
но подкидывают пользователи, разработчики эксплуатируе- редь хотелось бы снизить необходимость в администриро-
мого программного обеспечения и руководство организации. вании пользовательских машин, так как постоянное присут-
И если два первых направления работы – это просто «борь- ствие системного администратора на удаленных площадках
ба за живучесть корабля», то последнее, как правило, – по- не планировалось. Кроме того, желательным представлялось
ступательное движение вперед. Как раз в ходе решения од- уменьшить стоимость решения, которая возросла из-за необ-
ной из таких задач и появилась на свет данная статья. ходимости покупки терминальных лицензий. Также необхо-
Итак, перед отделом автоматизации была поставлена димо было учесть намерение разместить в офисах устарев-
задача в короткие сроки ввести в строй два новых удален- шие компьютеры класса Celeron-400 с ОЗУ от 32 до 64 Мб.
ных офиса, каждый численностью в пять-десять человек. Оба Идеальным со всех точек зрения оказалось использо-
офиса и «голову» связали посредством технологий VPN в вание в качестве рабочих мест бездисковых станций с заг-
одну сеть. Минимальная ширина канала между тремя точка- рузкой по сети. При этом единственным компьютером, тре-
ми составила 256 Кбит, что вполне удовлетворило наши по- бующим внимания администратора, становится дополни-
требности. В каждом из офисов был развернут дополнитель- тельный контроллер домена в каждом офисе, управляемый
ный контроллер домена Windows 2000, а для минимизации по VNC. Само собой, что в рамках данной статьи я остав-
трафика домен разделили на несколько сайтов. Все выше- ляю за пределами внимания оборудование и ПО, обеспе-
описанное является стандартным решением, и здесь я не чивающее шифрование трафика, доступ в Интернет и т. д.
ожидал никаких сюрпризов. Главным вопросом для нас было, В роли ОС, которая будет по сети загружаться на рабо-
как поведет себя основной инструмент работы сотрудников чие станции, я выбрал Linux – что обеспечивает лицензи-
организации – комплексная система автоматизации, при онную чистоту решения (по крайней мере на сегодняшний
работе с которой и в пределах одной площадки хватало про- момент). Доступ к рабочему столу Windows 2003 должен
блем. Изначально ориентированная на Novell/BTRIVE 6.15 был осуществляться при помощи разработки проекта
после миграции сети на Windows, она работала под Windows/ www.rdesktop.org, который стал стандартом для решения
Pervasive.SQL 7. данной задачи. В качестве же необходимых для такой заг-
После недели тестирования этого основного бизнес-при- рузки серверов DHCP и TFTP логично было бы использо-
ложения организации, оказалось, что разработчик и вовсе вать уже имеющиеся в каждом сайте дополнительные кон-
не оставил нам выбора, так как использование встроенного троллеры домена Windows 2000. Благо существуют как бес-
терминального режима автоматизированной системы по платные реализации DHCP/TFTP под эту операционную
ряду причин нас не устроило. Опять же, из-за особенностей систему, так и встроенные сервера. При этом TFTP нали-
функционирования в качестве терминального сервера была чествует в рамках службы Remote Installation Services (RIS).
выбрана платформа Microsoft Windows Server. Тестирование Сетевые карты клиентских машин, естественно, долж-
же решений компании Citrix мы не проводили, так как рабо- ны поддерживать возможность загрузки по Etherboot/PXE.
та с «родными» терминальными службами Windows нас впол- В отдельных случаях из-за несовместимости оборудования
не удовлетворила, а использование надстроек только уве- я допускал использование загрузчика, расположенного на
личивает стоимость всей системы. дискете.

12
администрирование
Выбор реализации Linux Итак, первым делом запускаем самораспаковывающий-
При выборе варианта ОС Linux с возможностью загрузки по ся архив thinstation.nbi (autoextract).exe, содержащий один-
сети в первую очередь я обратил внимание на уже готовые единственный файл thinstation.nbi, архив сделан для того,
дистрибутивы подобной направленности со встроенным па- чтобы у вас была возможность ознакомиться с «CITRIX(R)
кетом rdesktop. Наиболее известный из них – NetStation LICENSE AGREEMENT».
(netstation.sourceforge.net), который застыл в виде бета-вер- Теперь копируем TFtp и TftpdRoot на Windows-сервер в
сии с конца 2002 года, и его наследники: PXES (pxes.source нашем сегменте сети. В качестве такого сервера при ис-
forge.net), Thinstation (thinstation.sourceforge.net), и DIET-PC пользовании Tftpd32 может выступать любая Windows-ма-
(diet-pc.sourceforge.net). При этом DIET-PC предназначен для шина со статическим IP-адресом.
пользователей, хорошо знакомых с ОС Linux, что сразу ис- Допустим, мы скопировали обе директории на диск C:\.
ключает его из области рассмотрения. Поскольку процеду- Запускаем на исполнение C:\TFtp\Tftpd32.exe. Внешний вид
ра его настройки весьма кропотлива, и в DIET-PC присут- окна программы представлен на рис. 1. Необходимо задать
ствует достаточно много настроек, которые простому смер- параметры сервера. Нажимаем кнопку «Settings» и пропи-
тному, не Linux-гуру, никогда не пригодятся. PXES является сываем в качестве «Base directory» значение «C:\TftpdRoot».
наиболее «продвинутым» с большим числом дополнитель- Далее идем на вкладку «DHCP server». Там необходимо ука-
ных возможностей, включая собственную графическую сре- зать начальный IP-адрес, выделяемый DHCP-сервером («IP
ду, что также лишнее в моем случае. В моей конфигурации pool starting address»), размер пула адресов («Size of pool»),
клиент, минуя промежуточные меню, должен был сразу заг- маск у подсети («Mask»), имя файла с Etherboot-
ружать удаленный рабочий стол и выходить на окно ввода загрузчиком(«Boot file»), в нашем случае это thinstation.
пароля Windows 2003 Server. Таким образом, я обратил вни- nbi.zpxe. Нажимаем кнопку «Save» для сохранения настро-
мание на оставшийся дистрибутив – Thinstation. ек и сворачиваем приложение.
Кратко рассмотрим его возможности:
! поддержка протоколов X, RDP, VNC, SSH, Telnet, ICA и
Tarantella;
! возможность использовать браузер Firefox;
! загрузка по сети при помощи Etherboot, PXE (при помо-
щи Etherboot-загрузчика или PXELinux), HDD, CD или
floppy-диска. К сожалению, отсутствует поддержка USB-
flash;
! работа на ПК класса x86-100 МГц c ОЗУ 16 Мб;
! наличие pre-build образа, и возможность самостоятель-
ной сборки через веб-интерфейс;
! поддержка локальных дисков, USB- и LPT-принтеров.

Из всех вариантов загрузки наиболее простой – это PXE


при помощи Etherboot-загрузчика. В рамках этой статьи мы Ðèñóíîê 1. TFTP/DHCP-ñåðâåð Tftpd32, êîòîðûé óäîáåí ïðè
пойдем по самому простому пути будем использовать за- ïåðâîíà÷àëüíîé íàñòðîéêå
ранее скомпилированный образ. Все готово для работы. Вы можете попробовать вклю-
чить одну из машин с сетевой картой, поддерживающей
Установка и первоначальная настройка загрузку по протоколу PXE, не забыв выставить порядок
Начнем с того, что скачаем со странички http://struktur. загрузки в BIOS станции. При включении машина должна
kemi.dtu.dk/thinstation/download, доступной по ссылке с офи- получить IP-адрес из выделенного диапазона и загрузить
циального сайта, последний из архивов, в моем случае – это по протоколу TFTP файл thinstation.nbi.zpxe. Он содержит
был Thinstation-2.0.2-prebuilt-NetBoot.zip. Архив содержит в загрузчик, эмулирующий работу сетевой карты с поддерж-
себе все, что необходимо, включая TFTP/DHCP-сервер кой Etherboot. Затем управление передается загрузчику,
Tftpd32, который удобен при первоначальной настройке и который в свою очередь еще раз запрашивает по DHCP
конфигурировании. Если вы будете его использовать, то я адрес, и загружает файл с именем, совпадающим с назва-
бы порекомендовал сразу же обновить его с домашней стра- нием файла самого загрузчика минус расширение zpxe, то
нички, где имеется более свежая версия. Кстати, Tftpd32 есть thinstation.nbi. Данный файл и есть образ Thinstation.
(http://tftpd32.jounin.net) – сама по себе отличная програм- Когда образ загружен, Thinstation пытается загрузить из
ма. Причем настолько, что даже рекомендуется Cisco для корневой директории TFTP-сервера конфигурационный
некоторых потребностей клиентов компании. файл thinstation.conf-<MAC-адрес клиента>, затем thin
Развернув архив, мы получаем пять директорий: station.conf-<IP-адрес клиента>. Если такие файлы найде-
! BootDisk – образ дискеты с Etherboot-загрузчиком, для ны, то Thinstation объединяет их содержимое с общим кон-
ПК, с неподдерживаемыми сетевыми картами; фигурационным файлом thinstation.conf.network, который в
! BootPXE – загрузчик через PXE для эмуляции Etherboot; отличие от двух вышеперечисленных обязан присутство-
! BuildFiles – примеры конфигурационных файлов; вать на TFTP-сервере.
! TFtp – сервер Tftpd32; Постарайтесь избежать конфликтов между главным
! TftpdRoot – корневая директория TFTP-сервера. файлом настроек и специфическим к группе или конкрет-

№11(24), ноябрь 2004 13


администрирование
ной станции. Кроме того, можно объединять одним конфи- (16 bit color depth)"
гурационным файлом целые группы IP- и MAC-адресов. Это SESSION_0_TYPE=rdesktop
SESSION_0_RDESKTOP_SERVER=192.168.0.1
делается при помощи файла thinstation.hosts, имеющего SESSION_0_RDESKTOP_OPTIONS="-u Administrator ↵
следующий формат: -p password -a 16"

SESSION_1_TITLE="VNC server"
# HOST MAC GROUPS COMMENTS SESSION_1_TYPE=vncviewer
ws-oper1 0002B3655065 hi_res # Îïåðàöèîíèñò ¹1 SESSION_1_VNCVIEWER_SERVER=192.168.0.2
ws-oper2 0002B3651075 hi_res # Îïåðàöèîíèñò ¹2
ws-oper3 0002B365A021 hi_res ssh_en # Îïåðàöèîíèñò ¹3 SESSION_2_TITLE="Telnet server"
SESSION_2_TYPE=telnet
SESSION_2_TELNET_SERVER=192.168.0.3
В данном примере предполагается, что имеются два SESSION_3_TITLE="SSH server"
файла thinstation.conf.group-hi_res и thinstation.conf.group- SESSION_3_TYPE=ssh
ssh_en. SESSION_3_SSH_SERVER=192.168.0.4
Настройки, прописанные в первом файле, применяют- # Îáùèå îïöèè
ся ко всем трем станциям, а настройки из второго – только #
# Ðàñêëàäêà êëàâèàòóðû.  ñëó÷àå ðàáîòû ñ rdesktop îíà
к компьютеру ws-oper3. # ðîëè íå èãðàåò
То, как отображаются сессии терминальных клиентов в KEYBOARD_MAP=en_us
оснастке диспетчера терминальных служб, вы можете уви- # Îïöèè XServer
деть на рис. 2. #
SCREEN_RESOLUTION="1024x768"
SCREEN_COLOR_DEPTH="16"
SCREEN_HORIZSYNC="30-64"
SCREEN_VERTREFRESH="56-87"
MOUSE_RESOLUTION=100
# Îïöèè ïå÷àòè
#
PRINTER_0_NAME=usb
PRINTER_0_DEVICE=/dev/usb/lp0
PRINTER_2_TYPE=U

В заключение статьи, хочу сказать, что после отладки


работы с терминальными клиентами, лучше всего передать
функции TFTP- и DHCP-серверов программному обеспече-
Ðèñóíîê 2. Ñåññèè òîíêèõ êëèåíòîâ â îñíàñòêå äèñïåò÷åðà нию, способному работать в режиме службы на Windows
òåðìèíàëüíûõ ñëóæá NT/2000/2003/XP, например, как я уже говорил, «родным»
Клиенты с именами вида ts_<MAC-адрес> – это как раз службам Windows, либо воспользоваться соответствующи-
клиентские терминалы, работающие под управлением ми сервисами любой другой операционной системы.
Thinstation. Клиенты с именами вида P<IP-адрес> работа- Кроме того, на сайте проекта thinstation.sourceforge.net
ют под управлением дистрибутива PXES, рассмотрение при помощи веб-интерфейса вы можете самостоятельно
которого выходит за рамки данной статьи. перекомпилировать образ Thinstation без загрузки исход-
ных кодов, включив какие-либо отсутствующие в prebuild
образе функции, например браузер, или исключив ненуж-
ные модули.

Ðèñóíîê 3. Ìåíþ Thincstation


Далее я приведу простой, но вполне работоспособный
вариант конфигурационного файла с комментариями.

# Îïöèè ñåññèé
#
# Ïåðâàÿ ñåññèÿ äîëæíà îáÿçàòåëüíî íà÷èíàòüñÿ ñ íîìåðà 0.
# Ïðè îòñóòñòâèè íåîáõîäèìîñòè âûáîðà ñåññèè, íàïðèìåð,
# êîãäà âû èñïîëüçóåòå òîëüêî rdesktop, ìîæíî ñíÿòü
# êîììåíòàðèé ñî ñëåäóþùåãî ïàðàìåòðà, è èñêëþ÷èòü ìåíþ
# âûáîðà ñåññèé.
#AUTOSTART=On
Ðèñóíîê 4. Ñàìîñòîÿòåëüíîå ïîñòðîåíèå îáðàçà ÷åðåç âåá-
SESSION_0_TITLE="Windows 2003 terminal server ↵ èíòåðôåéñ TS-O-Matic

14
администрирование

ПАКЕТНЫЙ ФИЛЬТР OpenBSD

ДЕНИС НАЗАРОВ
Позвольте мне поведать вам вновь об уникальных возмож- резервированные слова (pass, block, in, out и т. д.). Привы-
ностях операционной системы OpenBSD1. На сей раз мой кайте сразу использовать макросы, это хороший стиль.
рассказ будет о пакетном фильтре, входящем в стандарт- Следование ему в дальнейшем позволит избежать многих
ный дистрибутив данной системы, начиная с версии 3.0. проблем с пониманием работы и настройки фильтра.
Зачем вообще нужны пакетные фильтры? Любой из вас,
наверное, знает о неприятностях, существующих в просто- Таблицы
рах сети, и не раз сталкивался с ними. Читая «Hacking Именные структуры, хранящие адреса хостов и сетей. Ис-
Exposed 3th edition», я наткнулся на фразу: «2.13 AM, Do пользование таблиц предпочтительнее использования мак-
you know who is on your network?». Да, именно так, ведь вы, росов в тех случаях, когда необходимо описать огромное
будучи администратором сети, не можете постоянно сле- количество адресов. Для обработки правил, использующих
дить за тем, как и что проходит через вашу сеть. Однако вы таблицы, требуется меньше ресурсов, чем для обычных пра-
можете контролировать данный процесс, используя пакет- вил, решающих ту же задачу.
ные фильтры. Итак, прошу любить и жаловать – OpenBSD’s Таблицы также могут использоваться совместно с scrub
Packet Filter (PF). (нормализация трафика), rdr (перенаправление пакетов), nat
Конфигурация находится в файле /etc/pf.conf. Однако (трансляция адресов). И могут быть определены следую-
фильтр отключен по умолчанию в только что установлен- щими способами:
ном дистрибутиве, и существует 2 способа включить его: ! Вручную. Постоянные таблицы могут быть созданы ко-
! Отредактировать файл /etc/rc.conf, изменив значение мандой add или replace утилиты pfctl до или после заг-
pf=NO на pf=YES, также стоит сразу проверить путь к рузки набора правил.
конфигурационному файлу в директиве pf_rules=/etc/ ! pf.conf – для описания таблиц в файле используется ди-
pf.conf и перезагрузить систему. ректива table. Таблица, инициализированная с пустым
! Дать команду pfctl –e, которая заставит ядро включить листом { }, будет очищена при загрузке.
фильтр с пустыми настройками и без перезагрузки сис-
темы. Таблицы бывают двух видов:
! persist – этот флаг заставляет ядро хранить содержа-
Приступаем к конфигурации фильтра. Что же он уме- ние таблицы, даже если она не используется никакими
ет? Практически все. PF является очень серьезной альтер- правилами. Если таблица не помечена таким флагом,
нативой таким монстрам, как Checkpoint Firewall и Sun то ядро уничтожит ее после того, как последнее прави-
Screen, однако полностью бесплатен. ло, ссылающееся на нее, будет удалено.
Итак, PF имеет следующие возможности. ! const – этот флаг запрещает изменять содержание таб-
лицы после того, как она была создана.
Макросы
Макрос – очень удобная вещь, которая может сократить и Например:
оптимизировать ваш конфигурационный файл и избавит
вас от проблем с частым использованием обьемных и час- table <localz> const “{ 192.168.0.0/24, 192.186.13.0/24 }”
table <badhosts> persist
то повторяющихся директив. Я практически не представ-
ляю себе написание конфигурационных файлов для PF без block in quick log on $ext_if from <badhosts> to any
pass in on $int_if from <localz> to $internal_addr keep state
использования макросов.
Например, определение макросов: Данный фрагмент конфигурационного файла создаст
2 таблицы. В первой, <localz>, будут содержаться адреса
ext_if = “fxp0” наших внутренних сетей, а <badhosts> будет пустой. Таб-
external_addr = “{ 192.168.0.13/32, 192.168.0.113/32 }”
лица <localz> не может быть изменена или дополнена, т.к
И их использование: при создании использовался флаг const.
Правила фильтрации отбрасывают любые пакеты, при-
pass in on $ext_if from any to $external_addr keep state ходящие на внешний интерфейс ($ext_if) от хостов из таб-
pass out on $ext_if from $external_addr to any port 1337 ↵
keep state лицы <badhosts>, и пропускающие любые пакеты на внут-
реннем интерфейсе ($int_if), приходящие от хостов из таб-
В качестве имени макроса не могут использоваться за- лицы <localz>.

1
Предыдущие статьи автора: «Введение в OpenBSD», №6, 2003 г., «OpenBSD. Первые шаги», №8, 2003 г.

16
администрирование
# pfctl –t badhosts –T add 81.146.13.16 Это основные понятия о Statetul Inspection.
Теперь давайте рассмотрим дополнительные настрой-
Теперь добавим в таблицу <badhosts> хост с адресом ки, которые мы можем использовать совместно с возмож-
81.146.13.16, и все пакеты от данного хоста будут отверг- ностью Stateful Inspection. Дело в том, что при стандартных
нуты. Таблицу <badhosts> лучше иметь всегда, т.к. в слу- установках фильтр будет работать, однако часто бывает,
чае чего – это очень быстрый способ отвергнуть то, что что для идеального функционирования сети данные пара-
может причинить боль вашей сети. метры следует основательно подправить.
Таблицы могут заполняться списком адресов из како- set timeout <option>, где <option>:
го-либо файла. Синтаксис команды, выполняющей это дей- ! interval – интервал перед удалением истекших (expired)
ствие, таков: state и фрагментов.
! frag – секунды перед тем, как неассемблированный па-
table <spam> persts file “/etc/pf/spam” file “/etc/pf/openrelays” кет будет помечен как истекший.
block from <spam> to any port 25
! sc.track – время, в течение которого адрес отправителя
Файлы /etc/pf/spam и /etc/pf/openrelay содержат список будет продолжать отслеживаться, даже после того как
IP-адресов в формате: последнее «состояние» для этого адреса будет оконче-
но.
/etc/pf/spam
204.168.0.13
! tcp.first – «состояние» после первого пакета.
213.145.168.2 ! tcp.opening – «состояние» перед тем, как удаленный хост
пошлет первый пакет.
/etc/openrelay
213.146.16.0/24 ! tcp.estabished – «состояние» для TCP Three Way Hand
166.15.13.5/28 shake (установленного соединения).
! tcp.finwait – «состояние» после того, как оба хоста об-
Допускается использование FQDN вместо IP-адреса. Пе- менялись пакетами с установлеными FIN-флагами и
ред занесением в таблицу имя будет переведено в IP-ад- соединение считается закрытым.
рес с помощью функции gethostbyname(). ! tcp.closed – «состояние» после того, как один из хостов
посылает пакет с флагом RST.
Stateful Inspection
Прошу внимательно прочитать данный параграф, в нем я Протоколы ICMP и UDP настраиваются так же, как и TCP,
попытаюсь дать базовые понятия о Stateful Inspection – за- только с гораздо меньшим набором states.
чем это надо и почему полезно. ! udp.first – «состояние» после первого пришедшего па-
State – «состояние, положение» в переводе с английс- кета.
кого. PF Stateful – пакетный фильтр, а это означает, что он ! udp.single – «состояние», если удаленный хост послал
отслеживает состояние соединения. Вместо того чтобы про- больше чем один пакет, а хост назначения не послал в
пускать весь трафик, например, на порт 25 через все ин- ответ ни одного.
станции (читай фильтрацию) легче пропустить первый па- ! udp.multiple – «состояние» после того, как оба хоста по-
кет и затем просто следить за соединением. Фильтр не сор- слали пакеты.
тирует трафик – он уже предупрежден об этом соединении ! icmp.first – «состояние» после первого пришедшего па-
и значит, просто следит за его состоянием. кета.
Если пакет попадает под pass … keep state, фильтр со- ! icmp.error – state на любое сообщение об ошибке, воз-
здает state для этого соединения и автоматически пропус- вращенное ICMP-прокотолом.
кает весь трафик, принадлежащий данному соединению.
Перед тем как правила будут применены к данному па- Любые другие протоколы могут настраиваться так же,
кету, фильтр проверяет наличие state для данного пакета, но используя:
и если находит – пакет будет пропущен без проверки пра- ! other.first;
вилами. State удаляются сразу же по закрытии соединения ! other.sigle;
или же по истечении тайм-аута. ! other.multiple.
Это дает некоторые преимущества. Сравнение пакета
с таблицей states подразумевает проверку его sequence но- Время timeout может изменяться в зависимости от коли-
мера. Если номер вне диапазона ограниченного окна – па- чества state в той или иной группе, а также от нагрузки на
кет будет отброшен. Это позволяет избежать атак с подме- сеть, за это отвечают параметры adaptive.start и adaptive.end.
ной адреса (spoofed attacks). ! adaptive.start – когда количество «состояний» достига-
Также поиск среди states гораздо быстрее, чем полная ет данного порога, все timeout начинают изменять свои
фильтрация пакета по правилам. значения по формуле:
Использовать Stateful Inspection, еще раз напомню, по-
зволяет директива keep state. (adaptive.end – number of states) /
(adaptive.end – adaprive.start)
Например:
! adaptive.end – когда количество «состояний» достигает
block all данного порога, все timeout-значения обнуляются и уда-
pass out proto tcp from any to any flags S/SA keep state
pass in proto tcp from any to any port 25 flags S/SA keep state ляют за собой все «состояния».

№11(24), ноябрь 2004 17


администрирование
Все вышеперечисленные значения могут быть опреде- число IP-адресов, для которых будут создаваться «состоя-
лены как глобально, так и для каждого правила в отдель- ния». Используется опять же для тонкой настройки фильт-
ности, это затронет и «состояния», созданные такими пра- ра, генерируется sticky-address и source-track опциями в
вилами. правилах.
Например: Наконец, все это можно обьединить в одну строчку:

set timeout tcp.first 120 set limit { states 20000, frags 20000, src-nodes 2000 }
set timeout tcp.established 86400
set timeout { adaptive.start 6000, adaptive.end 12000 }
set limit states 10000 set optimization – опция, которая позволяет оптимизиро-
вать работу вашего фильтра для сетей следующего типа:
Как только таблица будет содержать 9000 state, значе- ! normal – обычная сеть, подходит для большинства се-
ния timeout снизятся до 50% (tcp.first 60, tcp.established тей.
43200). ! high-latency – соединение с большими обьемами трафи-
Манипуляция данными значениями позволяет очень тон- ка (например, спутниковое).
ко настроить работу вашего фильтра в тех или иных ситуа- ! satellite – синоним для high-latency.
циях. Это полезно для больших сетей или сетей, через ко- ! aggressive – аргессивный режим, позволяет очень силь-
торые проходят огромные обьемы трафика. но уменьшить использование памяти, однако ценой
set loginterface – опция, которая позволяет указать, для сбрасывания соединений, находящихся в состоянии idle,
какого интерфейса вы будете получать статистику по ко- работает быстрее, чем обычная.
манде. ! conservative – обратное от aggressive. Соотвественно
Например, у меня статистика выглядит так: грузим больше – живем дольше.
# pfctl -s i
Status: Enabled for 0 days 04:16:28 Debug: Urgent Я предпочитаю использовать на всех довольно загру-
женных серверах (порядка 150 Гб трафика в день на каж-
Hostid: 0xd5f48ad7
дом) режим aggressive, в то время как в обычных сетях, ко-
Interface Stats for em1 IPv4 IPv6 нечно же, я использую normal.
Bytes In 219620287 72
Вы спросите, а зачем это надо? Зачем нужны те лими-
Bytes Out 62229416 352
Packets In ты и тайм-ауты, которые я описывал выше? Ответ очеви-
Passed 759343 0 ден, PF может быть настроен так тонко, как не каждый па-
Blocked 1273 1
Packets Out кетный фильтр, существующий ныне. Порой стандартных
Passed 807867 2 уровней оптимизации либо «слишком мало», либо «очень
Blocked 3 3 много», вот и приходится играть с тайм-аутами и лимита-
State Table Total Rate ми, чтобы достичь идеальной производительности и мак-
current entries 344 симальной отдачи.
searches 3286659 213.6/s
inserts 37555 2.4/s set block-policy – определить, каким же будет ответ филь-
removals 37211 2.4/s тра для действия block в правилах.
Counters
match 182069 11.8/s
! drop – пакет просто отбрасывается.
bad-offset 0 0.0/s ! return – фильтр ответит пакетом с флагом RST для TCP
fragment 0 0.0/s или же пакетом ICMP UNREACHEBLE для UDP, и все
short 0 0.0/s
normalize 0 0.0/s
остальные пакеты будут просто отброшены.
memory 0 0.0/s
bad-timestamp 0 0.0/s set require-order – определить порядок обслуживания.
Идем дальше: По умолчанию фильтр пропускает пакет по следующей це-
set limit – позволяет установить жесткое ограничение на почке: Options → Normalization → Queueing → Translation →
количество областей в памяти с фиксированным размером, Filtering. То есть сначала применяются настройки для филь-
используемых пакетным фильтром. Например: тра, потом нормализация трафика, затем распределение
по очередям, дальше трансляция адреса и, наконец, сама
set limit states 20000 фильтрация.
Данная цепочка является идеальной с точки зрения раз-
устанавливает максимальное значение для количества эле- работчиков фильтра, но они оставляют вам возможность
ментов, используемых для «состояний». исправить ее на ваше усмотрение.
set fingerprints – указать системе, где находится файл с
set limit frags 20000 определениями отпечатков (fingerprints) для различных опе-
рационных систем. Ну где вы еще видели пакетный фильтр,
устанавливает максимальное значение для количества эле- который умеет пропускать наружу или внутрь пакеты, при-
ментов, используемых для «fragment reassembly», генери- ходящие от Linux, а от Windows 2003 отбрасывать? Мелочь,
руется при помощи scrub. а очень приятно. Например:

set limit scr-nodes 2000 set fingerprints "/etc/pf.os.devel"

18
администрирование
set debug – уровень дебага для фильтра. ! binat – полную двухстороннюю замену между внутрен-
Опции: ним и внешним IP-блоком;
! none – никаких сообщений; ! nat – обычную трансляцию;
! urgent – сообщения только для серьезных ошибок; ! rdr – пакет перенаправляется на любой порт и любой
! misc – для различных ошибок; хост. Маленькое дополнение: если пакет перенаправля-
! loud – для всего подряд. ется во внутренную сеть, то помимо rdr надо сделать и
nat для хоста, который будет отвечать во внешний мир
Нормализация трафика на данные перенаправленные пакеты.
Не секрет, что нестандартными пакетами (например, раз-
мер или набор флагов) можно заставить некоторые серви- Пример:
сы перестать работать и еще много каких гадостей натво-
рить в сети. rdr on em1 inet proto tcp to port 80 -> $web_server port 80
scrub – директива, отвечающая за нормализацию тра-
фика.
Дополнительные параметры: Фильтрация пакетов
! no-df – убирает флаг «Don’t fragment» из заголовка па- Фильтрация протекает стандартно – создаются правила.
кета. Позволяет избавить вашу сеть от проблем со спе- Правила могут иметь 2 результата:
циально засланными пакетами огромного размера. ! block – пакет будет отброшен, используя следующие спо-
! min-ttl <number> – меняет минимальное значение TTL собы:
для IP-пакета. ! drop – пакет просто удаляется и никаких данных в
! max-mss <number> – меняет максимальное значение ответ не посылается.
MSS для TCP-пакета. ! return-rst – только для TCP-пакетов, отсылается пакет
! random-id – меняет IP identification-поле в заголовке па- с флагом RST, который прекращает соединение не-
кета для защиты TCP-соединения от вторжения мето- медленно.
дом подбора значения, передаваемого в данном поле, ! return-icmp (return-icmp6) – возвращается сообщение
применяется только к исходящим соединениям. ICMP UNREACHABLE, однако данное значение мож-
! fragment reassemble – позволяет держать в памяти фраг- но переопределить любым кодом ошибки ICMP-про-
менты пакетов до того момента, пока пакет не будет пол- токола.
ностью составлен. Гарантирует вам отсутствие лишне- ! return – автоматически TCP RST будет возвращен для
го трафика и нагрузки на сеть. TCP-пакетов и ICMP UNREACHABLE для UDP- и дру-
! fragment crop – стандартный метод, фрагменты пакетов гих протоколов.
пропускаются в сеть, где уже сами хосты пытаются со- ! pass – пакет будет пропущен фильтром.
брать их в целый пакет. Данный метод неэффективен с
точки зрения нагрузки на сеть. Если ни одно правило не подходит, то пакет будет про-
! fragment drop-ovl – то же самое, что и предыдущее, раз- пущен.
ница лишь в том, что одинаковые фрагменты, пришед- Итак, параметры фильтрации:
ние по какой-либо ошибке, будут отброшены фильтром. ! in или out – пакет идет к нам или от нас соотвественно.
! reassemble tcp – нормализация TCP-соединений. Допол- Если не определено, то считается, что направление двух-
нительные возможности – ttl, timeout modulation, extended стороннее.
PAWS checks. Данные темы я рассмотрю в следующих ! log – записывать информацию о пакетах, однако будут
статьях, т.к это относится непосредственно к протоко- записаны только пакеты, которые попадают в «состоя-
лу, а не к пакетному фильтру. ния».
! log-all – записывать информацию о всех приходящих па-
Например: кетах, независимо от того, попал он в state или нет.
! quick – если пакет попадает под это правило, то даль-
scrub in all нейшие правила не применяются. Полезно, например,
использовать с таблицей <badhosts>.
и все, фильтр сам подберет оптимальные параметры и раз- ! on <interface> – правила применяются только в случае,
берется со всеми потенциально опасными пакетами. если пакет идет с указанного интерфейса.
! proto <protocol> – правила применяются только к паке-
Распределение по очередям там данного протокола. Например, ICMP, TCP, UDP. Пол-
В этой статье я не буду описывать возможности PF при ра- ный список протоколов находится в /etc/protocols.
боте с контролем полосы пропускания, об этом в следую-
щих статьях. Скажу только, что в фильтр встроен ALTQ и from <source> port <sourceport> to <dest> port <destport>
механизмы cbq, priq, hfsc.
NAT – Network Address Translation – трансляция адре- Примерно понятно? Откуда, с какого порта, куда, на
сов. Определяет, как адреса будут транслироваться или какой порт.
перенаправляться относительно других адресов. Опции следующие:
Фильтр позволяет осуществить: ! any – любой адрес.

№11(24), ноябрь 2004 19


администрирование
! no route – адреса, которые вне таблицы роутинга. ! show – показать хосты в таблице;
! <table> – адреса из таблицы «table». ! test – проверить, попадает ли данный адрес в таблицу;
! zero – обнулить статистику таблицы;
Порты могут указываться с использованием стандарт- ! load – загрузить таблицы только из файла конфигу-
ных операторов (=, !=, <, <=, >, >=, :, ><, <>). рации. Обычно используется так:

! flags <a>/<b> | <b> – данные правила применяются толь- # pfctl –T load –f /etc/pf.conf
ко для пакетов с установленными флагами <a> перед
флагами <b>. Флаги F(IN), S(YN), R(ST), P(USH), A(CK), ! -t указывает имя таблицы, в которой обрабатываются
(U)RG, E(CE), C(W)R. команды для -T.

Комбинировать флаги можно по-разному, однако опыт Вот, в общем, основные команды для pfctl. Думаю, с этой
показывает, что оптимальным является сочетание flags S/ утилитой вы разберетесь очень быстро.
SA. Это значит, что перед тем как отправлять пакеты с фла-
гами SYN+ACK (соединение установлено), хост обязан от- Заключение
править пакет с флагом SYN. Данный набор идеален для В следующей статье я обязательно расскажу вам обо всех
обычных TCP/IP-сетей, где не проводят никаких сетевых эк- вещах, не затронутых в этой статье, таких как контроль
спериментов, а просто потихонечку выкачивают весь Ин- полосы пропускания, роутинг и т. д. И с удовольствием от-
тернет к себе на жесткие диски. вечу на все ваши вопросы относительно пакетного фильт-
ра OpenBSD.
Утилита управления Напоследок привожу пример конфигурационного фай-
пакетным фильтром pfctl ла, в котором использованы все те возможности, о кото-
Pfctl – довольно мощное средство, предоставляемое вам рых я писал.
для управления фильтром. И, кстати, единственное.
Используется для выполнения следующих операций: ext_if="{ rl0 }"
external_addr="{ 192.168.0.13/32, 192.168.0.113/32 }"
! -e – включить фильтр.
! -d – выключить фильтр (статистика по pfctl –s i обнуля- allowed_tcps = "{ 22, 25, 80 }"
allowed_udps="53"
ется).
! -F modifier – обнулить значения для: insecure_tcps="{ 21, 53, 110 }"
#insecure_udps=
! nat – таблицы трансляций;
! queue – очередей; insecure_tcp_hosts = "{ 192.168.9.13/32, 192.168.13.13/32 }"
#insecure_udp_hosts
! rules – правил фильтрации;
! state – «состояний»; set timeout { interval 30, frag 10 }
set timeout { tcp.first 120, tcp.opening 30, ↵
! Sources – таблицы отслеживания адресов отправи- tcp.established 86400 }
телей; set timeout { tcp.closing 900, tcp.finwait 45, ↵
tcp.closed 90 }
! info – статистики; set timeout { udp.first 60, udp.single 30, udp.multiple 60 }
! Tables – таблиц; set timeout { icmp.first 20, icmp.error 10 }
set timeout { other.first 60, other.single 30, ↵
! osfp – отпечатков операционных систем; other.multiple 60 }
! all – очистить все вышеперечисленное. set limit { states 10000, frags 5000 }
set loginterface rl0
! -f file – путь к конфигурационному файлу. set optimization normal
! -i interface – правила будут применены только к указан- set block-policy drop
set require-order yes
ному интерфейсу.
! -o – включить «оптимизатор» для правил. Новая воз- scrub in all
можность фильтра позволяет: table <spamd> persist
! удалить повторяющиеся правила; table <spamd-white> persist
rdr pass inet proto tcp from <spamd> to ↵
! удалить правила, которые являются частью другого any port smtp -> 127.0.0.1 port 8025
правила; rdr pass inet proto tcp from !<spamd-white> to ↵
any port smtp -> 127.0.0.1 port 8025
! скомбинировать разные правила в таблицу с общи-
ми частями; block in log all
pass out proto { tcp, udp, icmp } all keep state
! переопределить порядок правил для улучшения
фильтрации. pass in on lo0 all
pass out on lo0 all
! -s modifier – то же самое, что и -F, только не обнуляет, а
показывает информацию, modifiers – все то же. pass in inet proto icmp all icmp-type echoreq keep state
pass in on $ext_if proto tcp from any to ↵
! -T command – используется для управления таблица- $ext_if port $allowed_tcps flags S/SA keep state
ми: pass in on $ext_if proto udp from any to ↵
$ext_if port $allowed_udps keep state
! kill – удалить таблицу; pass in on $ext_if proto tcp from $insecure_tcp_hosts to ↵
! flush – очистить таблицу; $ext_if port $insecure_tcps flags S/SA keep state
! add – добавить один или несколько хостов в таблицу; pass in on $ext_if proto tcp from any to ↵
! replace – заменить адрес; any port > 49151 keep state

20
администрирование

ВИРТУАЛЬНЫЕ ВОЙНЫ
Сравнительное тестирование
VMWare Workstation и Cooperative Linux There are three kinds of lies:
lies, damned lies and benchmarks1

МИХАИЛ ПЛАТОВ
В рассмотрении работы любых систем, в том числе и вир- туальных машин, было принято решение использовать уже
туальных машин, значительную роль играет производитель- существующие и «проверенные» тестовые пакеты. В каче-
ность. Ведь для любой системы, работающей в реальных стве основы для методики проведения тестов использова-
условиях, важна не только ее функциональность, но и об- лись Linux Benchmarking Toolkit (LBT) и Scalable Test Platform
щая скорость работы, в том числе и в сравнении с другими (STP), которые по необходимости дополнялись специфич-
решениями, присутствующими на рынке. Для оценки про- ными тестами.
изводительности, как правило, используются пакеты, со- В итоге тестируемые системы были изучены при помо-
стоящие из различных тестов, измеряющих производитель- щи следующих тестовых пакетов:
ность всех основных компонентов системы. Тесты могут из- ! Компиляция ядра Linux 2.4.27 (стандартная конфигура-
мерять как абсолютную производительность того или ино- ция).
го компонента (синтетические тесты), так и скорость рабо- ! lm_bench 3.0_alpha3.
ты определенной программы (тесты-приложения). Тесты ! nbench 2.2.1.
первой категории позволяют измерить пиковую произво- ! ttcp 1.12.
дительность системы, которая, скорее всего, никогда не бу- ! tiobench-0.3.3-r1.
дет достигнута при работе реальных программ. Тесты-при- ! bonnie++ 1.93c.
ложения, напротив, показывают, насколько полно та или
иная программа использует потенциал рассматриваемой Этот набор включает как синтетические тесты, измеря-
системы. ющие производительность основных подсистем (целочис-
В данной статье эти и другие «азы тестирования» будут ленная и плавающая арифметика, производительность под-
применены на практике. Речь пойдет о сравнительном тес- системы памяти и жесткого диска, операции ввода-вывода
тировании VMWare и Cooperative Linux. Кроме того, их ре- и т. д.), так и тесты приложений (компиляция ядра). Более
зультаты будут также соотнесены с производительностью подробно с методикой тестирования в рамках LBT можно
обычного Linux, работающего в монопольном режиме. ознакомиться на странице http://www.tldp.org/HOWTO/
Benchmarking-HOWTO-3.html.
Методика тестирования Тесты выполнялись на компьютере следующей конфи-
Идея тестирования, в том числе и Linux, не нова. За все гурации:
время своего существования Linux обзавелся огромным ! Процессор – AMD Duron XP 1800 МГц.
количеством тестов, измеряющих производительность не ! Материнская плата – ECS K7S6A (SIS 745).
только различных компонентов системы, но и работающих ! ОЗУ – DDR SDRAM 512 Мб.
в нем приложений. Некоторые из этих тестов уже де-факто ! Память, выделяемая гостевой ОС – 128 Мб.
стали стандартами тестирования, в то время как другие ! Жесткий диск Samsung SP0802Т (для основной ОС).
лишь завоевывают себе место под солнцем. ! Жесткий диск Samsung SV0411N (для тестируемых си-
Поэтому для того, чтобы в n-й раз не изобретать вело- стем).
сипед, разрабатывая пакеты тестов, специфичные для вир- ! Сетевая плата Intel PRO 100VE.
1
«В компьютерном мире есть три вида лжи: ложь, наглая ложь и тесты производительности». (c) Бенжамин Дизраэли, Марк Твен и
компьютерное сообщество.

№11(24), ноябрь 2004 21


администрирование
Следует отметить, что ввиду архитектурных особенно- С точки зрения производительности остальных компо-
стей при тестах coLinux использовалось ядро Linux, моди- нентов ситуация неоднозначна. С одной стороны, VMWare –
фицированное патчами coLinux (описание архитектуры типичная виртуальная машина (к тому же работающая на
coLinux можно найти в статье [1]). Для VMWare и «чистой» большом количестве платформ), поэтому ей должны быть
системы использовалось ядро 2.4.27, собранное в конфи- присущи некоторые накладные расходы, вызванные необ-
гурации по умолчанию. ходимостью эмуляции «слоя виртуализации», обеспечива-
При проведении тестов основной акцент делался не на ющего интерфейс «известного» оборудования.
измерении производительности систем в абстрактных «по- Ситуация с coLinux несколько иная. Компьютер эмули-
пугаях», а на определении того, какая из них выполняет руется не полностью (в отличие от VMWare). Ядро содер-
тот или иной тест наиболее эффективно. жит минимум функциональности для работы с оборудова-
нием, поэтому скорость работы системы во многом зави-
Теоретическое отступление сит от эффективности используемых драйверов и скорос-
Прежде чем приступить к рассмотрению реальных тестов ти работы самой ОС Windows. В случае VMWare произво-
и их результатов посмотрим более подробно на сегодняш- дительность, конечно, тоже зависит от производительнос-
них претендентов. ти Windows, однако она также во многом зависит и от ско-
Итак: рости работы самого ядра «гостевой» системы. Поэтому
! VMWare Workstation – коммерческий продукт представ- для достижения наибольшей производительности в VMWare,
ляет собой типичную виртуальную машину. Для «госте- необходимо скомпилировать ядро с поддержкой «виртуаль-
вой» ОС VMWare предоставляет «известный» аппарат- ного» оборудования. Теоретически подход, используемый
ный интерфейс (chipset – Intel 440BX, LAN – AMD PCnet32 coLinux, может обеспечить большую производительность (за
и т. д.). Это позволяет запускать в виртуальной машине счет отсутствия слоя виртуализации). Так это или нет, про-
практически все известные ОС, работающие на эмули- верим на тестах.
руемом оборудовании. (DOS, Windows, Linux, Solaris,
FreeBSD, NetWare). Производительность процессора
! Cooperative Linux – Open Source продукт, распространя- Многие пользователи Linux-систем для определения про-
емый по лицензии GPL. В его состав входит патч Linux- изводительности процессора используют BogoMIPS – внут-
ядра, позволяющий запустить ядро ОС Linux из Windows. реннюю переменную ядра, косвенно отражающую скорость
В качестве гостевой ОС может выступать только Linux, работы процессора. Сами разработчики ядра утверждают,
причем ядро должно быть соответствующим образом что BogoMIPS не является показателем производительно-
«пропатчено». Так, используемое в coLinux ядро не ра- сти процессора и относиться к нему как тесту сколь-нибудь
ботает с оборудованием в привычном для нас понима- серьезно нельзя. Тесты рассматриваемых сегодня систем
нии: оно не поддерживает Plug&Play, ACPI, PCI, видео и это только подтверждают: на всех виртуальных машинах
звуковые карты, жесткие диски, USB и т. д. Работа со число BogoMIPS абсолютно одинаково – 3696. Ну что же,
всем жизненно важным оборудованием производится давайте посмотрим, что скажут тестовые пакеты.
через специальные драйверы (Cooperative PIC, CoLinux nbench – данный пакет измеряет, во сколько раз пока-
Block Device, WinPCAP, TAP), работающие с оборудова- затели производительности данной системы превосходят
нием через драйверы Windows. эталонную (Pentium-90 и K6-233). Результатом его работы
является набор индексов производительности подсистемы
У каждого из этих подходов есть свои «за» и «против». памяти, целочисленных операций и операций с плавающей
Так, для того чтобы запустить ОС в VMWare, не требуется точкой. Тест запускался с параметрами по умолчанию.
прикладывать практически никаких усилий. С другой сто- В целях экономии места приведены данные относитель-
роны, для запуска существующего Linux из coLinux, при про- но эталона K6-233 (для Pentium-90 ситуация выглядит ана-
чих равных, придется как минимум пересобрать ядро с пат- логично) (см. рис. 1).
чами coLinux. Кроме того, coLinux не поддерживает таких Что же, процессор, он и есть процессор. Все три рас-
вещей, как «прямая работа с USB-устройствами», видео- сматриваемые системы идут практически вровень.
карты и оборудование вообще. И если с USB-устройства-
ми все-таки можно работать (через интерфейс блочных
устройств), то о запуске X-сервера непосредственно на
coLinux можно забыть. Конечно, в качестве X-cервера мож-
но использовать какой-нибудь Cygwin/X, XWin-PRO, Mi-X
или HumningBird Exceed, установленный на Windows. Од-
нако мой опыт работы с Windows X-серверами показал, что
такое решение на данный момент слабо пригодно для ежед-
невного использования – уж очень низка производитель-
ность X-приложений. Справедливости ради нужно сказать,
что субъективная скорость работы X-сервера в VMWare
тоже далека от совершенства. Однако, безусловно, этот
вопрос требует дальнейшего изучения, которое выходит за
рамки данной статьи. Ðèñóíîê 1

22
администрирование
Подсистема памяти а именно эмуляцией контроллера IDE чипсета Intel i440BX.
Для измерения производительности подсистемы памяти ис- С coLinux же ситуация обстоит несколько иначе: он не ра-
пользовался низкоуровневый пакет синтетических тестов ботает с устройствами напрямую (ядро собирается без под-
lm_bench. В состав данного пакета входит несколько ути- держки шины PCI и соответственно без контроллера IDE).
лит, измеряющих производительность базовых операций Диск эмулируется специальным драйвером блочных уст-
(чтение, запись, копирование, произвольное чтение и т. д.) ройств, работающих с Windows-демоном coLinux. По этой
применительно к различным компонентам ОС (подсистема причине было принято решение в пользу измерения произ-
памяти, tcp, pipes, sockets и т. д.). водительности диска не низкоуровневыми утилитами (на-
пример, hdparm), а измерением скорости работы с файло-
вой системой. Однако для того, чтобы уменьшить влияние
файловой системы на результаты тестов, использовалась
нежурналируемая (и соответственно более быстрая) фай-
ловая система ext2fs.
При построении «виртуальной» системы можно исполь-
зовать два основных подхода:
! создать образ root-файловой системы в файле на су-
ществующем ntfs- или fat-разделе;
! создать (или использовать уже существующий) ext2-
раздел и работать с ним напрямую.

Ðèñóíîê 2 В первом случае на производительность дисковых опе-


Для тестирования подсистемы памяти использовалась раций в Linux накладывается дополнительное влияние фай-
утилита bw_mem. При запуске ей передавались следующие ловой системы (скорость доступа, фрагментация и т. д.) и
параметры: ее драйвера. Второй случай этих проблем лишен, поэтому
производительность «виртуальных» систем на отдельном
# bw_mem -P 1 -W 1 1024K rd|wr|cp разделе должна быть выше. Итак, перейдем к первому те-
сту – последовательное чтение блока данных. В данном те-
Для каждой машины измерялась скорость чтения (rd), сте с диска последовательно считывается файл размером
записи (wr) и копирования (cp). Для тестирования в услови- 256 Мб (блоками по 4 Кб). Для имитирования ситуации мно-
ях многопоточности тест на каждой машине запускался для гозадачности тест проводится для 1, 2, 4 и 8 потоков.
трех параметров P – 1, 10 и 50. (Так как расхождение резуль-
татов для 1 и 50 потоков составило менее 1%, на диаграмме
приводится усредненное значение всех трех экспериментов).
Итак, все рассматриваемые «виртуальные» машины
одинаково эффективно работают с памятью. При чтении
coLinux оказался несколько быстрее VMWare, однако вы-
игрыш является настолько несущественным, что вполне мо-
жет быть списан на погрешности измерения.

Дисковая подсистема
Для тестирования дисковой подсистемы использовался вто-
рой жесткий диск, разбитый на два раздела. Первый раз-
дел был отформатирован в файловую систему ext2 (3 Гб),
на которую был записан Gentoo-Linux из образа, взятого с
сайта coLinux. Этот раздел использовался при тестирова-
нии Linux, VMWare и coLinux (в тестах обозначена как Ðèñóíîê 3
«*_part»). Второй раздел был отформатирован в ntfs (10 Гб) Быстрее всех с диском работает «чистый» Linux, затем
и использовался для измерения производительности дис- идут VMWare и coLinux, работающие с выделенным разде-
ковой подсистемы coLinux и VMWare в случае, если образ лом. В случае одного потока производительность vmware
файловой системы хранится в виде файла. При проведе- выше coLinux, однако с увеличением количества потоков
нии тестов в Linux добавлялась поддержка чипсета SIS5513, coLinux несколько вырывается вперед. Медленнее всего ра-
в VMWare – чипсета PIIX. В обоих случаях при тестирова- ботают VMWare и coLinux, использующие образ root-фай-
нии были включены режим DMA и 32-битный режим рабо- ловой системы на существующем разделе, хотя VMWare
ты с диском. Виртуальный диск в файл-образе в тесте с все же показывает чуть более высокую производительность
VMWare подключался к интерфейсу IDE. (см. рис .4).
В организации дисковых подсистем наших подопытных При произвольном чтении ситуация несколько меняет-
есть некоторые отличия. Как было отмечено выше, VMWare – ся. Явно лидирует «чистый» Linux, все виртуальные маши-
типичный представитель виртуальных машин, и дисковая ны показывают примерно одинаковую и достаточно низкую
подсистема в ней реализована соответствующим образом, скорость.

№11(24), ноябрь 2004 23


администрирование

Ðèñóíîê 4
В следующем тесте измеряется скорость последова- Ðèñóíîê 7
тельной записи на диск.
Производительность TCP/IP
Как VMWare, так и coLinux поддерживают различные типы
организации взаимодействия между реальной и виртуаль-
ной машинами. Основными являются bridged и NAT (более
подробное описание можно найти в статье [1]). Для получе-
ния более полного представления об обоих исследуемых
виртуальных системах тестирование каждой их них прово-
дилось как в режиме bridged, так и NAT.
Отличительной особенностью «сетевых» тестов являет-
ся то, что для измерения производительности всегда тре-
буется «вторая сторона», выступающая при передаче в ка-
честве партнера.
Причем крайне желательно, чтобы такой партнер был
Ðèñóíîê 5 заведомо быстрее, при этом он не будет являться узким
«Чистый» Linux, как всегда, впереди. За ним идут coLinux местом и его производительность не окажет существенно-
и VMWare в различных конфигурациях дисковой подсисте- го влияния на производительность измеряемой системы. В
мы. С увеличением количества потоков производительность роли такого партнера в данном тесте использовался заве-
всех систем сравнивается. домо более быстрый компьютер – Pentium-4 – 2.4 ГГц (се-
Тест произвольной записи: тевой интерфейс Intel PRO 100), также работающий под уп-
равлением Linux (дистрибутив Gentoo).
В тестах использовался пакет ttcp, измеряющий произ-
водительность TCP- и UDP-передач. Тест запускался 5 раз,
в качестве результата приводится среднее значение.

Ðèñóíîê 6
А вот и первая неожиданность: скорость записи у coLinux
и VMWare оказалась больше, чем у «чистого» Linux. Причи-
ной этому, скорее всего, является кэширование обращений Ðèñóíîê 8
к диску, производимое ОС Windows. Для проверки этой ги- Первыми в данном тесте пришли Linux и VMWare в ре-
потезы проведем тест с помощью другой утилиты – bonnie++ жиме bridged. Их скорость (91 Мбит/с) оказалась близка к
(sequential output, per block, size 300 Мб) (см. рис. 7). максимальной теоретически достижимой. На третьем мес-
Ситуация в целом такая же, хотя и имеются некие рас- те оказался coLinux в режиме NAT (скорость составила око-
хождения, причина которых, скорее всего, кроется в высо- ло 42 Мбит/с). Самыми медленными оказались coLinux в
коуровневой природе тестов. режиме bridged и VMWare в режиме NAT.

24
администрирование
Производительность каналов (pipes) Быстрее всех с задачей справился «чистый» Linux – 6
Канал (Pipe) – способ межпроцессного взаимодействия, минут и 5 секунд. Вторым финишировал coLinux – 6 минут
реализованный во всех популярных системах (Windows, 32 секунды. На последнем месте (с достаточно большим от-
Linux и др.), активно используемый многими приложения- рывом) оказалась VMWare Workstation– 9 минут 13 секунд.
ми. Для тестирования производительности каналов исполь-
зовался тест bw_pipe, входящий в пакет lmbench. Данный Выводы
тест создавал канал между двумя процессами и блоками Итак, несколько слов о результатах. В тестах процессора и
64 Кб передавал по нему 32 Мб данных: подсистемы памяти все тестируемые сегодня системы пока-
зали практически равные результаты, так что если главной
# bw_pipe -P 1 -W1 -M 32768K для вас задачей, решаемой Linux, является задача вычисли-
тельная, то можете смело использовать любую из систем. В
Результаты теста отражены в таблице: качестве дисковой подсистемы для виртуальной машины
можно использовать как выделенный Linux-раздел, так и
файл-образ на уже существующем fat или ntfs-разделе (хотя
первый вариант все-таки выглядит более привлекательно).
Ethernet. Если же вам необходим полноценный 100 Мбит
сетевой интерфейс в виртуальном Linux, то следует обра-
тить внимание на VMWare Workstation. Разработчики bridged-
драйвера VMWare действительно поработали на славу, обес-
печив производительность, практически не уступающую «чи-
стой» Linux-системе. Производительность сетевой подсис-
темы coLinux можно назвать приемлемой только в режиме
NAT. В режимах coLinux-bridged и VMWare-NAT «серьезно»
использовать сеть, скорее всего, не получится – уж больно
Ðèñóíîê 9 низка производительность.
Linux, как ему и положено, держится впереди. coLinux в И напоследок позвольте сказать еще несколько слов.
данном тесте опережает VMWare более чем в 2 раза. Решение о том, использовать ту или иную систему или нет,
всегда должно приниматься с учетом условий и реалий ре-
Компиляция ядра шаемой задачи, главное при этом не забывать, что «There
Для оценки общей производительности системы выполня- are three kinds of lies: lies, damned lies and benchmarks».
лась привычная многим операция – компиляция ядра Linux.
Этот тест ценен не только достаточно показательным прак- Литература, ссылки:
тическим результатом (в процессе компиляции активно ис- 1. Платов М. Знакомство с Cooperative Linux. – Журнал
пользуются процессор, память и дисковая подсистема), но «Системный администратор», №10, октябрь 2004 г.
и тем, что практически все люди, активно работающие с 2. LBT: http://www.tldp.org/HOWTO/Benchmarking-HOWTO-
Linux, время от времени пересобирают ядро. В качестве «по- 3.html.
допытного» использовалось ядро версии 2.4.27 со стандар- 3. STP: http://www.osdl.org/lab_activities/kernel_testing/stp.
тными опциями конфигурации ядра (make oldconfig). 4. VMWare Worksatation: http://www.vmware.com/products/
При тестировании в VMWare и coLinux root-файловая си- desktop/ws_features.html.
стема находилась на ext2-разделе второго жесткого диска. 5. Cooperative Linux: http://www.colinux.org.
Время компиляции ядра измерялось с помощью утилиты 6. lmbench: http://www.bitmover.com/lmbench.
time (время выполнения make dep не учитывалось): 7. ttcp: http://www.pcausa.com/Utilities/pcattcp.htm.
8. netperf: http://www.netperf.org/netperf/NetperfPage.html.
# time make vmlinux 9. tiobench: http://sourceforge.net/projects/tiobench.
10. bonnie++, http://www.coker.com.au/bonnie++.
Тест в каждой системе выполнялся 3 раза, на диаграм-
ме приводится усредненное время компиляции (чем мень-
ше, тем лучше): Уважаемые читатели!
Теперь вы можете приобретать новые и старые
номера журнала через интернет-магазин

Стоимость 1 экземпляра – 140 рублей

Доставка почтой БЕСПЛАТНО в любую точку России


Ðèñóíîê 10

№11(24), ноябрь 2004 25


администрирование

ОБЗОР ЭМУЛЯТОРА mips64emul

АЛЕКСАНДР
АЛЕКСАНДР БАЙРАК
БАЙРАК
В этой статье я хотел бы вам рассказать об одном очень граммы. Я использовал версию 0.2. Процесс установки
интересном эмуляторе – mips64emul. В последнее время mips64emul очень прост и каких-либо затруднений не выз-
меня заинтересовала тема эмуляции во всех ее проявле- вал:
ниях. Начиная от эмулирования системных вызовов какой-
либо ОС, заканчивая полноценными виртуальными маши- ./configure – help
нами. В конечном итоге виртуальная машина – это тот же
самый эмулятор, отличие лишь в том, что эмулируется весь Внимательно читаем, может быть, вам понадобится для
компьютер целиком. Самые известные представители ряда своих нужд добавить какие-либо опции.
виртуальных машин – VMWare, Bochs, Virtual PC. И вот тут
мы подходим к самому интересному, все вышеперечислен- ./configure
gmake
ные программы эмулируют архитектуру x86. Соответствен- gmake install
но под ними у нас есть возможность запустить ОС, создан-
ные для этой архитектуры. Но ведь есть и другие архитек- mips64emul поддерживает эмуляция достаточно боль-
туры – PPC, m68k, SPARC, MIPS, и т. д. Потратив некото- шого количества компьютеров с mips-процессорами:
рое время на поиски программ, способных эмулировать ! DEC Station: PMAX(3100), 3MAX(5000), 3MIN(5000),
процессоры, отличные от x86, я нашел много чего интерес- 3MAX+(5000,5900), 5800, 5400, MAXINE(5000), 5500,
ного. Изыскания относительно одной из находок перед 5100(MIPSMATE).
вами. ! ARC: NEC-RD94, PICA-61, NEC-R94, Deskstation Tyne.
Официальный сайт проекта mips64emul – www.mdstud. ! Sony Playstation 2 (CPU R5900).
chalmers.se/~md1gavan/mips64emul. Как ясно из названия, ! Cobalt (CPU RM5200).
он эмулирует процессоры MIPS. Данная программа способ- ! Различные машины от SGI (IPxx ).
на эмулировать как 64-, так и 32-битные процессоры MIPS. ! Некоторые карманные компьютеры с MIPS-процессора-
MIPS в настоящее время используются достаточно широ- ми.
ко: 90% всех компьютеров от Silicon Graphics используют
эти процессоры, также они используются в игровой пристав- Поддерживаемые типы процессоров:
ке Sony Play Station 2 и во многих других устройствах. ! R2000, R2000A, R3000, R3000A, R4000.
Перейдем от теории к практике. Все свои эксперимен- ! R4300, R4400, R4600, R4700, R5000.
ты я проводил на P3-550 МГц/320 Мб RAM под управлени- ! RM5200, R5900, VR5432, R6000, RM 7000.
ем ОС FreeBSD 4.10. Также ее можно использовать под уп- ! R8000, R10000, R12000, R14000, 5K.
равлением другой BSD-системы или Linux.
Берем с сайта разработчика последнюю версию про- Далее, для каждого компьютера нужна ОС. На сайте раз-

26
администрирование
работчика я прочитал, что на данный момент под эмулято- После чего запустить mips64emul:
ром можно свободно запустить следующие ОС:
! NetBSD/pmax; mips64emul –X –D2 –d disk.img netbsd-INSTALL
! OpenBSD/pmax;
! Ultrix/RISC; Так же в случае процесса установки по сети придется
! Sprite. настроить сеть. Сетевой интерфейс будет называться le0.
Настройка сети каких-либо проблем не вызывает, вам нуж-
С последними двумя я, к сожалению, не работал, и, как но лишь указать имя хоста, IP-адрес, маску сети, адрес шлю-
следствие, дистрибутивов этих ОС у меня нет. Если при- за и IP DNS-сервера.
нять во внимание, что это коммерческие ОС, уже офици- Процесс инсталляции ОС занимает достаточно продол-
ально не поддерживаемые производителем, я не стал тра- жительное время, так на моей системе он занял чуть боль-
тить время на поиск дистрибутивов и для дальнейших экс- ше четырех часов. Да, к сожалению, уже на этом этапе мож-
периментов выбрал NetBSD. Во-первых, с ней я рабо- но заметить, что работает все медленнее, чем хотелось бы.
таю чаще, нежели с OpenBSD, во-вторых, поддержка архи- После того как процесс установки завершен, можно посмот-
тектуры pmax в OpenBSD была закончена в версии 2.9 (она реть, что у нас получилось:
вышла 1 июня 2001 года). А последняя версия NetBSD (на
момент написания – 1.6.2) отлично поддерживает pmax и mips64emul –X –M64 –D2 –d disk.img
по сей день.
Не буду подробно останавливаться на процессе уста- Все опции запуска нам уже знакомы, за исключением –
новки NetBSD, потому как есть замечательная статья Анд- M. Это опция служит для задания количества оперативной
рея Бешкова [1]. памяти, т.е. в данном случае я указал, что на эмулируемом
Для начала нам нужно создать виртуальный жесткий компьютере установлено 64 Мб памяти.
диск, на который мы будем устанавливать ОС. Система загружается порядка 5 минут. Я никогда не
работал на настоящей DEC Station 5000/200, но думаю, что
dd if=/dev/zero of=/disk.img bs=1 count=512 seek=1100000000 на ней загрузка системы ничуть не быстрее, потому как
тактовая частота процессора всего 25 МГц. После запуска,
После выполнения команды у нас получится файл раз- без дополнительной настройки мы можем запустить X-
мером 1050 Мб. Естественно, размер диска вы можете windows, выполнив команду startx. В качестве window
уменьшить или увеличить в зависимости от своих потреб- manager используется стандартный twm. Более подробно о
ностей. настройке NetBSD вы можете прочитать в моей статье [2].
Далее нам нужно определиться с методом установки: Исходя из документации к mips64emul, помимо вышеука-
NetBSD можно поставить непосредственно с boot CD-дис- занных ОС, можно запустить другие системы, созданные для
ка либо по сети, перед этим загрузившись с помощью ус- процессоров MIPS. Например, NetBSD/sgimips, NetBSD/arc,
тановочной дискеты. Я выбрал первый вариант. Берем с NetBSD/cobalt, NetBSD/playstation2 (www.netbsd.org), Linux/
ftp://ftp.netbsd.org/pub/NetBSD/iso/1.6.2/pmaxcd.iso. SGI (http://www.linux-mips.org). И некоторые другие малоиз-
Его размер около 75 Мб. Далее запускаем наш эмуля- вестные реализации Linux для MIPS-процессоров. Ради
тор, указав ему грузиться с диска: справедливости нужно заметить, что поддержка всего вы-
шеперечисленного пока находится в экспериментальном ре-
mips64emul –X –D2 –d disk.img –d bc:pmaxcd.iso –j netbsd.pmax жиме. Но судя по тому, как динамично развивается проект
(а ему меньше двух лет), можно предположить, что все эти
Давайте разберемся с опциями, которые мы указыва- ОС в скором времени можно будет запускать абсолютно
ем: спокойно.
! -X – использовать X11. А какая практическая польза от использования этого
! -D2 – эмулировать DEC Station 5000/200. эмулятора, спросите вы. Я лично использую его исключи-
! -d disk.img – указываем файл, который является нашим тельно из «спортивного» интереса. Но он окажется очень
виртуальным диском. полезным для программистов, пишущих приложения, на-
! -d bc:pmaxcd.iso – указываем загрузочный диск. целенные на MIPS-процессоры, но по какой-либо причине
! b – boot; не имеющие его под рукой. Также это отличный полигон
! c – CD-ROM. для изучения данной архитектуры в академических целях.
! -j – указываем имя ядра. Буду рад услышать описания ваших экспериментов, свя-
занных с этим эмулятором. Пишите!
Для тех, кто решил устанавливать систему по сети, со-
общаю порядок действий. Литература:
Сначала нужно списать образ загрузочной дискеты c 1. Бешков А. NetBSD: установка и настройка. – Журнал
ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-1.6.2/pmax/binary/ «Системный администратор», №9, август 2003г., также
kernel/netbsd-INSTALL.gz. Далее нужно распаковать полу- доступна электронная версия – http://onix.opennet.ru/
ченный архив: netbsd/netbsd.html.
2. Байрак А. Первые шаги в NetBSD. Часть 1. – Журнал
gunzip netbsd-INSTALL.gz «Системный администратор», №6, июнь 2004 г.

№11(24), ноябрь 2004 27


администрирование

ЛЕЙСЯ ПЕСНЯ,
ИЛИ
СЕРВЕР ПОТОКОВОГО АУДИО
СВОИМИ РУКАМИ
СЕРГЕЙ ЯРЕМЧУК
Чтобы покончить с бардаком, нужно возглавить его само- ределимся с терминами. Любой сервер аудиопотоков, будь
му. Если пользователи по утрам, вместо того чтобы рабо- то Icecast или SHOUTcast, предназначен только для транс-
тать, выходят в Интернет в поисках новостей, что подчас ляции и работы с клиентами, которые подсоединяются, что-
съедает большую долю трафика, то почему бы не органи- бы послушать музыку. Сервер не занимается поиском ин-
зовать свою ленту новостей на корпоративном сайте, по- формации на жестком диске, кодированием и прочим, как
немногу пользователи привыкнут, и нагрузка на внешний это происходит с серверами, занимающимися трансляци-
канал уменьшится. Но новости и прочая текстовая инфор- ей видео. Необходимую информацию ему нужно сначала
мация еще ничего по сравнению с гигабайтами музыки, ви- переслать. Причем есть два варианта. Первый – использо-
део и прочего материала, который хотят протащить в сеть вать аналогичный сервер (впрочем, не все серверы на 100%
через узкий канал. Можно организовать фильтрацию, ус- совместимы между собой) в качестве источника информа-
тановить лимиты, все это иногда помогает, но гигабайты ции. Такой сервер называется master relay. Можно забрать
информации, при этом часто одинаковой, все равно соби- весь поток с сервера и перетранслировать его полностью
раются на жестких дисках компьютера, затрудняя архива- или забрать только часть точек монтирования. Последний
цию. вариант также может понадобиться при неполной совмес-
Сегодня разберемся как создать сервер, который будет тимости серверов. Например, если в качестве мастер-сер-
транслировать аудиопотоки. вера для icecast будет выступать SHOUTcast, то весь поток
В настоящее время существует достаточно большое ко- забрать не получится, необходимо указывать отдельные
личество приложений, позволяющих организовать такую точки монтирования. Да, что такое точка монтирования?
трансляцию. Написаны они на разных языках программи- Точка монтирования – это ресурс на сервере, который пред-
рования, работающих под управлением разных операци- ставляет один поток трансляции. Например, клиент хочет
онных систем, отличающихся лицензией, поддерживаемы- послушать музыку, запустив XMMS, нажимает <Ctrl + L>,
ми форматами и прочими характеристиками. Самый боль- вводит http://cal.icecast.net:8630/prog1.ogg (ссылка рабочая)
шой список, который мне удалось найти, размещен на стра- и слушает себе музыку. Параметр cal.icecast.net указывает
нице http://sound.condorow.net/netaudio.html. Наиболее из- на сервер, 8630 – на порт, используемый для трансляции
вестным решением является использование веб-сервера (по умолчанию на большинстве серверов – 8000), а
Apache, модуль и необходимую информацию о настройках prog1.ogg на источник информации, это и есть точка мон-
которого можно найти по адресам: http://www.tangent.org/ тирования. Причем если для mp3-потока указывать расши-
mod_mp3 и http://sander.vanzoest.com/apachecon/2001. Дру- рение не обязательно, то для ogg это требуется. Конечно
гим не менее популярным решением является SHOUTcast же и наш сервер также может быть источником информа-
от компании Nullsoft, подарившей миру WinAMP. Есть тяже- ции для других slave relay серверов. Такая схема принята
ловес jetCast Server (http://jetaudio.com/download/jetcast.html), по нескольким причинам, чтобы равномерно распределить
поддерживающий большое количество форматов, или про- клиентов, избежать дублирования информации на жестких
стой в настройке и совместимый практически со всеми по- дисках, не перегружать каналы, ведь проще забрать поток
добными серверами – AnaloxX SimpleServer:Shout (http:// и перетранслировать его самому, чем позволить всем
analox.com). Как видите, выбор есть. пользователям тащить это в одиночку. Другим источником
В статье мы познакомимся с наиболее популярным Open информации для сервера могут быть так называемые source
Source-решением – Icecast (http://www.icecast.org). На дан- client или broadcasting tools. Но о них позже.
ный момент Icecast поддерживает форматы Ogg Vorbis и
MP3, при особой необходимости любой другой формат мо- Установка Icecast
жет быть добавлен без проблем, работает под управлени- Для установки понадобятся: libxml2 (http://xmlsoft.org/
ем как Windows, так и UNIX-подобных систем, гибок и ле- downloads.html), libxslt (http://xmlsoft.org/XSLT/downloads.html),
гок в настройке, имеет толковую документацию, распрост- опционально curl (http://curl.haxx.se/download.html) и для ра-
раняется в исходных кодах. боты с OggVorbis библиотеки с http://www.vorbis.com. Но не
спешите скачивать, скорее всего, это уже есть в дистрибу-
Кто есть кто тиве. После скачиваем архив с icecast (670 Кб), распаковы-
Механизм трансляции аудиопотоков имеет свои особенно- ваем: ./configure, make, make install. После чего в каталоге
сти, поэтому сначала разберемся, как это работает, и оп- /usr/local/bin/ появится исполняемый файл icecast, конфи-

28
администрирование
гурационный файл icecast.xml в /usr/local/etc/, докумен- вера, трогать их не стоит, но проверьте наличие всех ката-
тация и файлы для администрирования будут положены логов на пути к файлам. Единственно интересным пара-
в /usr/local/share/icecast/. метром является «alias source», позволяющий создать не-
сколько разных точек монтирования из одной. И в security
Конфигурируем Icecast устанавливаются параметры, позволяющие повысить защи-
Единственный конфигурационный файл icecast.xml имеет щенность системы, так, chroot позволит выполняться Icecast
одинаковую структуру как для Linux, так и для Windows. Со- в ограниченной среде и в случае взлома злоумышленник
стоит из нескольких секций, в которых сгруппированы па- дальше указанного каталога не пойдет, а в changeowner
раметры, схожие по назначению. Значения всех парамет- нужно указать имя пользователя и группу, от имени кото-
ров описывать вряд ли целесообразно, т.к. название гово- рых будет работать процесс сервера.
рит само за себя, остановлюсь лишь на краткой характери-
стике и тех параметрах, на которые следует обратить вни- Настраиваем источник информации
мание. Первая секция файла называется limits, в ней опи- В принципе можно присоединиться к любому серверу транс-
сываются параметры подключения клиентов, таких как ляций, прописав параметры в секции relay, и больше ни о
максимальное их число, тайм-аут, после которого клиент чем не беспокоиться. Но будем разбираться, как организо-
отключается, если связь с ним прервалась, размер очере- вать трансляцию самому.
ди, и пр. Изменять их стоит только при большом количе- Список (далеко не полный) совместимых клиентов и про-
стве пользователей и плохих каналах (в перегруженных игрывателей для прослушивания потоков можно найти на
сетях). Следующая секция authentication содержит пароли странице http://www.icecast.org/3rdparty.php.
и пользователей, имеющих доступ к серверу для тех или Родным source-клиентом для Icecast является IceS (http:/
иных целей. В поле source-password прописывается неза- /www.icecast.org/ices.php), недавно появилась версия 2.0,
шифрованный пароль для source client, имя пользователя, работает только под UNIX (точнее, под Linux, FreeBSD,
используемое источниками «source», поле relay-password OpenBSD, Solaris) системами. Среди других, с которыми уда-
на данный момент не используется, поля admin-user и admin- лось немного поэкспериментировать, понравился Darkice
password содержат имя пользователя и пароль для адми- (http://darkice.sourceforge.net), работающий также только под
нистрирования сервера. UNIX, но умеющий поставлять информацию для Iceсast вер-
Далее описываются параметры подключения источни- сий 1 и 2 и SHOUTcast или iceplay (http://icecast.linuxpower.org),
ков информации (source client). Так, если на компьютере одна работающий только с mp2-файлами. Для пользователей
сетевая плата, то для работы достаточно в параметре Windows пригодится SAM2 (http://www.spacialaudio.com) или
hostname указать имя компьютера (или localhost, если ис- ezstream (http://www.icecast.org/ezstream.php), который рабо-
точник находится на том же компьютере), в ином случае тает также и в UNIX-системах. Есть утилита, написанная и
директивой bind-address указываем на сетевой интерфейс, для Mac OSX – Nicecast (http://www.rogueamoeba.com/nicecast).
параметр port при этом укажет на IP-порт (по умолчанию Как видите, выбирать есть из чего.
8000), который будет открыт для подключения источников. Кстати, источник информации не обязательно должен
Обратите внимание, что возможно задание нескольких пор- находиться на одном и том же компьютере. Для примера
тов директивой listen-socket. Директивами master-server, займемся настройкой IceS. На данный момент имеются две
master-server-port, master-update-interval и master-password версии IceS. Версия 0.3, развитие которой приостановле-
устанавливаются параметры master relay сервера, с кото- но, предназначена для создания mp3-потоков, и версия 2.0,
рого будет получаться весь аудиопоток, транслируемый сер- умеющая транслировать только OggVorbis, по причине ма-
вером, если нет такого сервера, то оставляем как есть, т.е. лого спроса поддержка mp3 была убрана. Если есть необ-
закомментированными. Если нет необходимости в получе- ходимость работы как с mp3, так и OggVorbis, то возможно
нии всего аудиопотока с мастер-сервера для использова- использование этих двух программ параллельно.
ния отдельных точек монтирования, используется секция Другой вариант, взять ezstream, поддерживающий два
relay, в которой параметры server и port указывают на мас- формата (как понимаете, один источник – одна точка мон-
тер-сервер, mount и local-mount указывают соответственно тирования) и к тому же очень простой в настройках. Для
на экспортируемую и локальную точку монтирования. При установки, помимо вышеперечисленных библиотек, пона-
работе с сервером SHOUTcast, для того чтобы передавать и добится libshout 2.0, ссылку на которую найдете на сайте
метаданные в опции relay-shoutcast-metadata установите 1. IceCast. Далее устанавливаем библиотеку и IceS обычным
В секциях mount, устанавливаются специфические парамет- образом, никаких особенностей здесь нет. Источником дан-
ры для точки монтирования, указанной в mount-name. Эти- ных для IceS может служить компакт-диск, файлы на жест-
ми параметрами могут быть имя пользователя и пароль ком диске и любое устройство, с которого можно снять ин-
(username и password), которым позволено соединяться, формацию.
максимальное количество пользователей (max-listeners), Здесь стоит отметить, что почти все source clients по-
необязательный параметр dump-file устанавливает файл, зволяют взять информацию со своего стандартного входа,
куда будет записываться поток, а в случае если с точкой обработать и выдать на стримсервер. Для настройки пара-
монтирования что-то произойдет, то клиенты могут быть метров IceS используется файл в формате XML, образцы
автоматически переброшены на другую точку, указанную которого после установки вы найдете в /usr/local/share/ices.
в параметре fallback-mount. В секциях paths и logging ука- Здесь их два: ices-live.xml содержит базовые настройки для
зываются файлы и каталоги, необходимые для работы сер- Live-трансляции (микрофон, СD-ROM и пр.), а в ices-

№11(24), ноябрь 2004 29


администрирование
playlist.xml вы найдете шаблон, используемый при транс- <param name="rate">44100</param>
ляции из файлов, записанных в плейлист. Отличаются они <param name="channels">2</param>
<param name="device">/dev/dsp</param>
только разделом input, в котором описывается источник ин- <param name="metadata">1</param>
формации. Все описывать тоже не буду, остановлюсь лишь <param name="metadatafilename">test</param>
</input>
на параметрах, требующих пояснения.
Для запуска в качестве демона устанавливаем back Далее следует большая секция instance, описывающая
ground в 1. подключение к стримсерверу. При этом возможно задание
нескольких параметров, что позволит отсылать информа-
<background>1</background> цию нескольким таким серверам или создавать несколько
точек монтирования с разными параметрами на одном сер-
Далее описываются параметры вывода логов, при пер- вере.
воначальной отладке установите consolelog в 1, при этом
все ошибки будут выводиться на консоль. <instance>

<consolelog>1</consolelog> Ниже определяем имя узла, порт и пароль, последний


должен совпадать со значением в секциях source-password
Секция stream описывает передаваемый поток. файла icecast.xml.

<stream> <hostname> Çäåñü ïèøåì àäðåñ èëè èìÿ, êóäà îòïðàâëÿåì


<metadata> ïîòîê </hostname>
<name> Çäåñü âïèøèòå íàçâàíèå ïîòîêà, îíî áóäåò <port>8000</port>
âèäíî â ïðîèãðûâàòåëå </name> <password>passwd</password>
<genre> Æàíð ìåëîäèé </genre> <mount>/example.ogg</mount>
<description> Êðàòêîå îïèñàíèå ïîòîêà </description>
</metadata> А здесь точка монтирования, которая будет видна
пользователям, желающим послушать музыку.
Модуль input задает параметры, откуда брать инфор- Ниже параметры повторной попытки, если не удается
мацию. сразу подключиться к серверу.
Ниже пример для плейлиста, обратите внимание: режим
задается тегом module – playlist. <reconnectdelay>2</reconnectdelay>
<reconnectattempts>5</reconnectattempts>
<input> Параметр буферизации потока (лучше не трогать).
<module>playlist</module>
<param name="type">basic</param>
<maxqueuelength>80</maxqueuelength>
Тип плейлиста может быть basic (простой текстовый
ASCII-файл, содержащий список Ogg Vorbis) или script, при Параметры перекодирования, которые могут понадо-
этом указанная программа генерирует его динамически. биться, например, для уменьшения нагрузки на сеть, долж-
ны соответствовать принятым значениям, входным данным
<param name="file">playlist.txt</param> и частотам дискретизации, иначе можно попортить каче-
ство материала.
Это для статического плейлиста, при динамической ге-
нерации списка песен используется конструкция: <encode>
<nominal-bitrate>64000</nominal-bitrate>
<samplerate>44100</samplerate>
<param name='program'></param> <channels>2</channels>
</encode>
</instance>
Далее следуют параметры random (перемешивание
списка), restart-after-reread (перезапускает программу для Вот и все. Теперь собираем файлы в плейлист.
пересчитывания списка) и once (при 1 проигрывает список
только один раз, и работа заканчивается). #find /home/sound -name *.ogg > ↵
/usr/local/share/ices/playlist.txt
</input> В результате файл должен состоять из списка вида:

Для считывания входящей информации, например, с /home/sound/Song.ogg


микрофона, или других устройств применяется другая кон-
струкция. Теперь запускаем IceCast.
# /usr/local/bin/icecast -b -c /usr/local/etc/icecast.xml
<input> Changed groupid to 65534.
<module>oss</module>
Changed userid to 65534.

module может быть также alsa (device обычно plughw:0,0), И подаем информацию.
stdinpcm (при считывании со стандартного входа, секции
device не надо) и sun при работе Sun Solaris DSP. # ices /usr/share/ices/ices-playlist.xml

30
администрирование
Теперь, набрав в строке любимого проигрывателя: то может выясниться, что такого каталога не существует,
создайте его командой:
http://èìÿ_óçëà:8000/example.ogg
mkdir /var/log/ices
должны услышать музыку. На эту роль подходят как XMMS
и WinAMP, так и консольные ogg123 и mpg123. Если все равно ничего не получается, то загляните в
И пару слов об ошибках, с которыми удалось столкнуть- лог-файлы, в них выводится достаточно информации, что-
ся. Например, при запуске IceCast из-под root программа бы разобраться с проблемой. Например, в одном из доку-
выдала такую информацию. ментов я нашел информацию о том, что вторая версия
# /usr/local/bin/icecast -c /usr/local/etc/icecast.xml
IceCast все-таки работает с mp3-файлами. Не работает. А
WARNING: You should not run icecast2 as root в логах это выглядело так.
Use the changeowner directive in the config file
[2004-06-21 14:48:19] INFO playlist-builtin/playlist_read
Все просто: в целях безопасности под root сервер не Currently playing "/usr/share/ices/music/alisa/lodka.ìð3"
запускается, а директива changeowner в конфигурацион- [2004-06-21 14:48:19] WARN playlist-builtin/playlist_read
Corrupt or missing data in file (usr/share/ices/music/alisa/lodka.ìð3)
ном файле по умолчанию закомментирована. Исправьте,
только проследите, чтобы такой пользователь и группа в А при загрузке OggVorbis-файла все нормально.
системе были.
[2004-06-21 14:49:11] INFO playlist-builtin/playlist_read
Далее возможны ошибки из-за невнимательности, свя- Currently playing "/usr/share/ices/rammstein/Sonne.ogg"
занные с отсутствием каталогов, прописанных в конфигу- [2004-06-21 14:49:11] INFO stream/ices_instance_stream
рационных файлах, например, процесс может создать лог- Connected to server: 127.0.0.1:8000/example.ogg
[2004-06-21 14:49:12] DBUG reencode/reencode_page
файл, но попутных каталогов создать не может. Например, Reinitialising reencoder for new logical stream
при запуске IceS выскочила такая ошибка: [2004-06-21 14:49:12] INFO encode/encode_initialise
Encoder initialising in VBR mode: 2 channels, 44100 Hz, nominal 64000
unable to open log /var/log/ices/ices.log
Вот и все. Как видите, создать свой сервер трансляции
Если проверить командой: аудиопотоков не так уже и сложно. При внимательности на
все про все у вас уйдет от силы час-два.
ls /var/log/ices/ Успехов.

№11(24), ноябрь 2004 31


администрирование конкурсная статья

ТАНЦУЕМ САМБУ

РОМАН ГРЕБЕННИКОВ
Любая операционная система имеет сильные и слабые сто- Но не окнами едиными жив этот мир. Существует боль-
роны. В чем-то она получается удачнее других, в чем-то – шое количество задач, работу которых по тем или иным
нет, поэтому никогда нельзя однозначно расставить раз- причинам не доверяют этим операционным системам. По-
ные ОС по рангам. На таком «пьедестале почета» участни- рой просто нет необходимости или возможности заводить
ки могут казаться идеальным решением для одной сферы какой-нибудь www- или ftp-сервер на мощном в плане же-
применения, но в других областях на них вряд ли можно леза компьютере, так как последние версии Windows весь-
смотреть серьезно. ма требовательно относятся к аппаратной конфигурации
Среди людей, вращающихся в IT-сфере, уже много лет своего места жительства. Появление сервера на базе лю-
идет религиозная война между сторонниками UNIX-подоб- бой UNIX-подобной операционной системы в сети с доме-
ных и Windows-систем. Это является неотъемлемой чертой ном может пошатнуть всю идею самой централизации, ведь
человеческой натуры, которая выражается в бесконечном UNIX – это другой мир, в котором все работает иначе, и к
поиске идеала. Если же этот идеал вдруг находится, то зак- любой проблеме уже неприменимы те решения, которые
рываются глаза на все его отрицательные качества – ведь существовали раньше.
совершенству не положено их иметь. В случае, если с появившейся в сети «белой вороной»
Несомненно, рациональнее всего беспристрастно смот- общается только системный администратор и информация,
реть на вещи и не бросаться в гущу сражений на вечную с которой работают сервисы на этой машине, не требует
тему. Ведь если есть возможность использовать преиму- синхронизации с данными, находящимися в домене, то осо-
щества разных операционных систем в рамках одной сети, бенно изощренная настройка серверу не нужна. Здесь ра-
к чему нужны все эти религиозные предрассудки? ботает правило, гласящее, что чем проще система, тем
Главным и основным качеством любого системного ад- меньше вероятность выхода ее из строя.
министратора по всеобщему признанию является чувство Но если вдруг неожиданно потребуется открыть доступ
лени – стоит один раз правильно настроить систему, а даль- на данный сервер доменным пользователям, то сразу же
ше останется только пить чай, наблюдая за тем, как все возникнет масса проблем, которые быстро решить не уда-
работает без постороннего вмешательства. Шутка шуткой, ется:
но удобство работы очень часто влияет на результат в луч- ! Заводить для каждого нового пользователя отдельную
шую сторону. Как показывает практика, в первую очередь учетную запись неудобно.
оно зависит от размера подконтрольной сети, причем чем ! Среднестатистический пользователь не в состоянии за-
больше компьютерная сеть, тем грамотнее следует проду- помнить больше одного пароля.
мывать ее внутреннее устройство в плане удобства после- ! У сервисов на UNIX-машине могут возникать проблемы
дующего администрирования. В случае маленькой комна- с доступом к данным, находящимся под управлением
ты с дюжиной компьютеров при возникновении какой-ни- доменных политик.
будь проблемы вполне реально подойти и лично с ней ра- ! И еще какая-нибудь проблема, возникшая именно на ва-
зобраться или поменять требуемую настройку вручную на шей системе, причем, скорее всего, не одна.
каждой машине, если есть такая необходимость. Но если
компьютеров в сети далеко за сотню, а пользователей и Выход из сложившейся ситуации один – необходимо
того больше, то всех четырех рук системного администра- интегрировать UNIX-сервер в Windows-домен, чтобы он был
тора не хватит, с какой бы скоростью он не размахивал ими. способен проводить аутентификацию пользователей на кон-
В этом случае необходима мощная централизованная сис- троллере домена. При должной настройке сразу исчезнут
тема управления и контроля за работой сети. все проблемы, возникавшие раньше с синхронизацией ин-
Стандартным решением в случае большого количества формации о пользователях, – теперь данные о них будут
пользователей и рабочих станций является объединение едины и для Windows-систем, и для UNIX.
всех их в единый домен. В данной статье я старался не привязываться к какой-
Для этого, если верить статистике, чаще всего исполь- то конкретной реализации UNIX и попытался дать доста-
зуются программные решения компании Microsoft. Понятие точно обобщенные советы в плане настроек. Дело в том,
«домен» в последнее время стало неразрывно связано с что все перечисленные программные пакеты не являются
сетями под управлением Windows. большой редкостью, официально поддерживаются на боль-

32
администрирование
шом количестве *nix-систем и конфигурируются одинаково
на разных платформах.
Однако, как бы я ни старался сделать статью универсаль-
ной, хочу сразу заметить, что существовала базовая плат-
форма, на которой проводилось все тестирование перед
пересадкой на боевую конфигурацию: Gentoo Linux 2004.2, ! KDC расшифровывает этот блок известным ему клю-
и вся статья основана именно на ней. чом клиента и сравнивает время, извлеченное из аутен-
Чтобы убедиться в том, что на вашей системе предло- тификатора, с локальным. Если разница между ними
женное решение будет работать, требуется удостовериться, составляет менее двух минут, то он может быть уверен
что она поддерживает работу со следующими пакетами: в том, что клиент знает секретный ключ.
! Samba 3; ! KDC отправляет клиенту точно такой же ответ с зашиф-
! Kerberos 5; рованным блоком – своим именем и временем из пер-
! Библиотеки PAM. вого запроса. Первое поле здесь необходимо для того,
чтобы избежать возможности простого копирования зло-
Если эти программные пакеты работают, то с большой умышленником аутентификатора из запроса клиента.
вероятностью можно сказать, что и предложенная связка ! Клиент дешифрует полученный ответ, и если время из
заработает, все зависит только от вас. него совпадает с отправленным, то и клиент, и KDC мо-
гут быть уверены в личности друг друга.
Алгоритм Kerberos
Информация, которую UNIX-машина получает от контрол- Далее, если клиент хочет обратиться к серверу:
лера домена, не должна ходить по сети в открытом виде, ! Клиент отправляет запрос на подключение к серверу.
так как она представляет большую ценность как для полу-
чателя, так и для возможных злоумышленников, поэтому
для поддержания должного уровня безопасности системы
в любом случае нужно использовать какую-либо криптог-
рафическую схему. В среде Windows ею является Kerberos5.
В реальной жизни два человека могут быть уверены в ! KDC отправляет ему в ответ сеансовый ключ (ключ, ко-
личности друг друга при наличии паспортов у обоих. В дан- торый будет использоваться в дальнейшем для иденти-
ной ситуации человек доверяет не собеседнику, а паспорт- фикации клиента) и блок данных под названием сеан-
ному столу, выдавшему документ. Это позволяет ему удос- совый мандат (session ticket), в составе которого есть
товериться в том, что он говорит именно с тем, кем являет- тот же сеансовый ключ для сервера и информация о
ся собеседник на самом деле. В Kerberos используется та- клиенте. Мандат шифруется секретным ключом серве-
кая же схема: между сервером и клиентом есть посредник ра, а все сообщение – секретным ключом клиента.
под названием Центр распределения ключей (KDC, Key ! Клиент извлекает из ответа сеансовый мандат и свою
Distribution Center), которому доверяют оба компьютера. копию сеансового ключа. При обращении к серверу он
KDC также известны их секретные ключи. Криптографичес- отправляет ему сеансовый мандат, по-прежнему зашиф-
кий алгоритм, в котором они используются, является сим- рованный секретным ключом сервера, и свой аутенти-
метричным, т.е. один и тот же ключ может быть использо- фикатор, зашифрованный сеансовым ключом.
ван как для кодирования, так и для декодирования сооб- ! Сервер, получив сообщение клиента, извлекает из ман-
щения. дата сеансовый ключ, которым расшифровывает аутен-
Для начала KDC и клиент должны удостовериться в лич- тификатор клиента. Если время, извлеченное из него,
ности друг друга: соответствует текущему, то сервер может быть уверен
! Клиент шлет KDC сообщение, в котором указывает свое в личности клиента.
имя открытым текстом и зашифрованный секретным
ключом блок данных (аутентификатор) с двумя полями: Для того чтобы клиент постоянно не использовал свой
именем и текущим временем. секретный ключ для связи с Центром распределения клю-

№11(24), ноябрь 2004 33


администрирование
чей, KDC выдает ему мандат на выдачу мандатов (ticket Тогда в переменной окружения HOSTNAME UNIX-маши-
granting ticket, TGT): ны должна находиться строчка «nix». В моем случае это
! Клиент посылает запрос KDC. потребовало исправления файла /etc/hostname.
! KDC отвечает специальным мандатом на самого себя, Не забудьте проверить, видят ли машины DNS-имена
в составе которого, как и в случае обычного сеансового друг друга и нет ли проблем с firewall.
мандата, находятся две копии сеансового ключа, одна Теперь можно приступить к созданию конфигурацион-
из них зашифрована секретным ключом клиента, вто- ного файла для библиотек kerberos, находящегося по ад-
рая – KDC. ресу /etc/krb5.conf. Сам файл состоит из пяти секций, каж-
! Клиент расшифровывает сеансовый ключ, после чего дая из которых может включать в себя либо имена и значе-
для связи между ним и KDC используется именно он, а ния отдельных переменных, например:
секретный ключ клиента удаляется из памяти.
[section]
key = value
Теперь система связи между клиентом и сервером выг- boolean1 = true
лядит так: boolean2 = false
! Клиент извлекает из TGT сеансовый ключ для связи с
KDC и отправляет запрос на сеансовый мандат для свя- либо информацию, объединенную в структуру с определен-
зи с сервером и зашифрованные им TGT с собствен- ным именем:
ным аутентификатором.
! Сервер в случае успеха отвечает требуемым сеансовым [section]
struct = {
мандатом, сеансовый ключ из которого будет впослед- key1 = value1
ствии использован клиентом для связи с сервером. key2 = value2
...
}
Как видите, для нормальной работы этой системы аутен-
тификации обязательно требуется синхронизация време-
ни на всех ее элементах. В журнале «Системный админис-
тратор» №4 за 2004 год была подробная статья Михаила
Платова о настройке сервера времени «NTP – атомные часы
на каждом столе».

Настройка Kerberos
Для UNIX-систем существует две реализации kerberos5,
совместимых со стандартом: Heimdal и MIT. В настройке
они отличаются не очень сильно, но второй гораздо более
популярен, поэтому будем рассматривать именно его. Уч-
тите, что на старых версиях MIT Kerberos (меньших или рав-
ных 1.3.1) возникали проблемы с Windows Kerberos Service
на Win2003, поэтому рекомендую использовать последнюю
доступную на данный момент версию. Пример файла:
В качестве открыто указанного имени клиента в описы-
ваемой связке Kerberos+Samba+AD используется доменное [logging]
default = FILE:/var/log/krb5libs.log
имя машины. Но зачастую бывает так, что ее реальное DNS- kdc = FILE:/var/log/krb5kdc.log
имя не соответствует тому, кем она себя считает. Предпо- admin_server = FILE:/var/log/kadmind.log
ложим, что nslookup говорит нам следующее: [libdefaults]
default_realm = DOMAIN.RU
C:\>nslookup 192.168.1.14 dns_lookup_kdc = false
Server: dns.domain.ru dns_lookup_realm = false
Address: 192.168.1.10
[realms]
Name: nix.domain.ru DOMAIN.RU = {
Address: 192.168.1.14 kdc = controller.domain.ru

34
администрирование
admin_server = controller.domain.ru где:
default_domain = domain.ru
} ! host/NIX$@DOMAIN.RU – строка, обозначающая имя ма-
шины в терминологии kerberos. Знак доллара является
[domain_realm]
.domain.ru = DOMAIN.RU признаком машинного аккаунта в Active Directory, и его
domain.ru = DOMAIN.RU забывать не следует. DOMAIN.RU – домен, на контрол-
domain = DOMAIN.RU
DOMAIN = DOMAIN.RU лере которого вы сейчас работаете;
! unixuser – имя создаваемой учетной записи;
Следующим шагом создадим пользователя в Active ! SuperPass667 – соответственно его пароль;
Directory, имя которого UNIX-машина будет использовать ! nix.keytab – имя файла, в который производится экспорт.
для Kerberos-аутентификации себя. Для этого на контрол-
лере домена в меню «Пуск» откройте «Administrative Tools → Теперь требуется переместить полученный файл на
Active directory Users and Computers», выберите нужный кон- UNIX-машину любым возможным способом. Это можно сде-
тейнер и создайте там пользователя. В качестве парамет- лать через ftp/sftp или забросить через веб-сервер, как вам
ров можно запретить ему менять пароль (галочка «User больше нравится. В консоли UNIX запустите программу ktutil
cannot change password») и убрать необходимость его ме- и в ее командной строке импортируйте keytab-файл:
нять со временем (галочка «Password never expires»). До-
# ktutil
пустим, что вы создали пользователя с именем unixuser и > rkt /root/nix.keytab
паролем SuperPass667. > list
slot KVNO Principal
---- ---- -------------------------------------
1 3 host/NIX$@DOMAIN.RU
> wkt /etc/krb5.keytab
> quit

где /root/nix.keytab – путь к импортируемому файлу, а /etc/


krb5.keytab – файл со всеми секретными ключами для дан-
ного клиента.
После всех этих длительных манипуляций можно про-
верить работу клиентской части kerberos, выполнив следу-
ющую команду:

# kinit DomainUser

где DomainUser – имя любого доменного пользователя. Если


после этого не появилось сообщений об ошибках, значит,
библиотека функционирует исправно. Однако помните, что
эта команда не использует секретный ключ из /etc/krb5.keytab,
а генерирует свой на основе введенного вами пароля, так
что если на этом этапе ошибок не появилось, то это еще не
означает, что они не возникнут в дальнейшем.

Настройка samba
При установке этого программного продукта проблем воз-
никнуть не должно, поэтому конкретных указаний по уста-
новке здесь дано не будет, и вы можете руководствоваться
своими собственными вкусами: собирать из исходников
вручную, использовать готовые бинарные пакеты или за-
пускать специализированные программы обновления ваше-
го дистрибутива.
После установки следует создать конфигурационный
файл для самбы по адресу /etc/samba/smb.conf. Его струк-
тура содержит два блока:
! описание глобальных настроек сервера;
! параметры для отдельных shares.

Далее создаем файл, в который экспортируем секрет- Сами настройки рассмотрим на примере:
ный ключ: для этого в консоли cmd.exe на контроллере до-
мена требуется выполнить команду: # Èìÿ äîìåíà, ñ êîòîðûì òðåáóåòñÿ ðàáîòàòü
workgroup = DOMAIN
C:\>ktpass -princ host/NIX$@DOMAIN.RU -mapuser unixuser ↵ # Äîìåííîå èìÿ ìàøèíû, êîòîðîå äîëæíî ñîâïàäàòü ñ dns-èìåíåì
-pass SuperPass667 -out nix.keytab # è ïåðåìåííîé ñðåäû HOSTNAME
netbios name = NIX

№11(24), ноябрь 2004 35


администрирование
# Îïèñàíèå ñåðâåðà, âèäèìîå â «Ñåòåâîì îêðóæåíèè» # Âëàäåëåö ôàéëà ïðè çàïèñè â ïàïêó
server string = Unix Server force user = root
# Ãðóïïà, íàçíà÷àåìàÿ ôàéëó ïðè çàïèñè
# Ðàçäåëèòåëü íàçâàíèÿ äîìåíà è ó÷åòíîé çàïèñè.  Windows force group = apache
# ýòî çíàê «\», íî â ýòîì ñëó÷àå îí ìîæåò âûçâàòü ïðîáëåìû
# êàê ñèìâîë íà÷àëà escape-ïîñëåäîâàòåëüíîñòè, ïîýòîìó # Ìîæíî ëè çàéòè íà ïàïêó áåç ïàðîëÿ
# åãî ïîòðåáóåòñÿ çàìåíèòü. Ïî óìîë÷àíèþ èäåò çíàê «+», public = no
# íî «/» ïðèâû÷íåå
winbind separator = / # Ìîæíî ëè â íåå ïèñàòü
writable = yes
# Èñïîëüçîâàòü äîìåí ïî óìîë÷àíèþ. Âíåøíå áóäåò ïðîÿâëÿòüñÿ
# îòñóòñòâèåì äîìåííîãî ïðåôèêñà ïåðåä ó÷åòíîé çàïèñüþ # ßâëÿåòñÿ ëè ïàïêà ïðèíòåðîì
winbind use default domain = yes printable = no
# Îáëàñòü èäåíòèôèêàòîðîâ ïîëüçîâàòåëåé, íà êîòîðóþ áóäóò # Ìàñêà ñîçäàâàåìûõ ôàéëîâ
# îòîáðàæàòüñÿ äîìåííûå àêêàóíòû create mask = 0640
idmap uid = 7000-10000
# Ïîëüçîâàòåëè, èìåþùèå ïîëíûé êîíòðîëü íàä ïàïêîé
# Îáëàñòü èäåíòèôèêàòîðîâ ãðóïï, íà êîòîðóþ áóäóò admin users = @"DOMAIN/Domain Admins"
# îòîáðàæàòüñÿ äîìåííûå ãðóïïû
idmap gid = 7000-10000
На следующем шаге потребуется проверить, не оста-
# Àâòîìàòè÷åñêè íóìåðîâàòü ïîëüçîâàòåëåé è ãðóïïû лось ли в Active Directory записей для подопытной машины.
winbind enum users = yes
winbind enum groups = yes Для этого просмотрите ветку Computers.
# Øàáëîí äîìàøíåãî êàòàëîãà äëÿ äîìåííûõ ïîëüçîâàòåëåé.
После этого включаем UNIX-машину в домен, исполнив
# Âïîñëåäñòâèè áóäåò ñîçäàâàòüñÿ àâòîìàòè÷åñêè на ней команду:
template homedir = /home/DOMAIN/%U

# Øàáëîí êîìàíäíîãî èíòåðïðåòàòîðà äëÿ äîìåííûõ ïîëüçîâàòåëåé # net ads join -U DomainAdministrator
template shell = /bin/bash

# Ðåæèì áåçîïàñíîñòè. Â ðåæèìå ads äëÿ àóòåíòèôèêàöèè Если в результате исполнения этой команды вы увиди-
# samba èñïîëüçóåò èñêëþ÷èòåëüíî Active Directory, те строчку «Joined domain DOMAIN.», то появился повод
# íå îáðàùàÿ âíèìàíèÿ íà ëîêàëüíûå àêêàóíòû
security = ads открывать шампанское. Но в большинстве случаев на этом
# Øèôðîâàòü ëè ïàðîëè. Ïî óìîë÷àíèþ êîíòðîëëåð äîìåíà
шаге всплывают все ошибки, допущенные на предыдущих
# íå ðàáîòàåò ñ îòêðûòûìè ïàðîëÿìè. этапах.
encrypt passwords = yes Вот несколько советов:
# Ðåàëì Kerberos, èñïîëüçóåìûé äëÿ àóòåíòèôèêàöèè ! Проверьте, нет ли сильного расхождения во времени у
realm = DOMAIN.RU UNIX-машины и контроллера домена.
# Ïàðàìåòð, âêëþ÷àþùèé ïîääåðæêó âûáîðà àëãîðèòìîâ øèôðàöèè ! Правильно ли был создан keytab-файл (тот ли пароль,
# â ïðîöåññå ðàáîòû. Íåîáõîäèìîñòü èñïîëüçîâàíèÿ çàâèñèò совпадает ли имя машины, нет ли различий между зна-
# îò íàñòðîåê êîíòðîëëåðà äîìåíà. Íà Win2003 âêëþ÷åí
# ïî óìîë÷àíèþ чением переменной HOSTNAME и доменным именем).
client use spnego = yes ! Нет ли в Active Directory уже существующего машинно-
# Àäðåñ êîíòðîëëåðà äîìåíà го аккаунта для подопытной UNIX-машины.
password server = controller.domain.ru ! Что остается в файлах протоколов самбы и системных
# Øàáëîí èìåí ôàéëîâ ëîãîâ, ãäå %m – èìÿ ìàøèíû логах контроллера домена.
log file = /var/log/samba3/%m.log
# Óðîâåíü ïîäðîáíîñòè ëîãîâ. Íà ïåðâûõ ïîðàõ æåëàòåëüíî
# ïîäíÿòü ýòî çíà÷åíèå äî 4, ÷òî ïîçâîëèò äîñòàòî÷íî òî÷íî
# äèàãíîñòèðîâàòü ïðîáëåìó.
log level = 2

# Ìàêñèìàëüíûé ðàçìåð ëîã-ôàéëîâ. 0 – íåîãðàíè÷åíî.


max log size = 0

# Ñïèñîê ñåòåâûõ èíòåðôåéñîâ, ñ êîòîðûìè áóäåò ðàáîòàòü


# äåìîí
interfaces = 192.168.1.14
# Íå òðîãàòü îñòàëüíûå ñåòåâûå èíòåðôåéñû
bind interfaces only = yes
# Ïðèìåð ïàïêè
# Íàçâàíèå
[html]
# Ñïèñîê ïîëüçîâàòåëåé, ó êîòîðûõ åñòü ïðàâî èñïîëüçîâàòü
# ýòó ïàïêó.  äàííîì ñëó÷àå ýòî âñå äîìåííûå ïîëüçîâàòåëè.
# Çíàê @ îáîçíà÷àåò ãðóïïó.
valid users = @"DOMAIN/Domain Users"
# Ïóòü, íà êîòîðûé ññûëàåòñÿ ñàìà ïàïêà
path = /var/www/htdocs

# ×óâñòâèòåëüíà ëè ïàïêà ê ðåãèñòðó áóêâ


case sensitive = no

# Áóäåò ëè âèäíà ïàïêà â «Ñåòåâîì îêðóæåíèè»


Если все прошло успешно, то самое время осуществить
browseable = yes первый запуск самбы. Как показывает практика, лучше для

36
администрирование
этого использовать стартовые скрипты системы в /etc/init.d, работы с доменными аккаунтами, следует привести этот
чтобы не изобретать велосипед при загрузке. файл к следующему виду:
Для корректной работы всей системы должны старто-
вать следующие демоны: passwd: files winbind
group: files winbind
! smbd shadow: files
! nmbd
! winbindd Теперь пора проверить работоспособность всей настра-
иваемой системы – умеет ли подопытная машина полно-
Настройка запуска именно трех демонов вместо обыч- ценно работать с доменными аккаунтами (перед выполне-
ных двух (smbd и nmbd) зависит от дистрибутива, в Gentoo нием следующей команды не помешает на всякий случай
для этого следует отредактировать файл /etc/conf.d/samba, перезапустить samba):
руководствуясь находящимися в нем комментариями. Так-
же можно включить режим отладки, добавив в опции за- # getent passwd
пуска всех трех демонов ключ -D с параметром, который
определяет количество отладочной информации, записы- Если на экране консоли, как в «Матрице», замелькала
ваемой в логи. Больше 4 его делать не стоит, так как в разная информация, по структуре своей напоминающая
противном случае логи станут очень быстро разрастать- файл /etc/passwd, причем среди записей попадаются до-
ся. В случае, если что-то не запустилось, то читаем лог менные аккаунты, то проверка прошла успешно, с этих пор
снова, исправляем выявленные ошибки, и запускаем – компьютер не знает различий между доменными и локаль-
этот цикл придется повторять до тех пор, пока все не прой- ными пользователями. Но есть одно небольшое но.
дет успешно. Дело в том, что на многих UNIX-системах для аутенти-
Теперь можно проверить, нормально ли работают рас- фикации пользователей и назначения им идентификаторов
шаренные папки, зайдя по адресу file://nix.domain.ru с лю- используется библиотека PAM (Pluggable Authentication
бой Windows-машины, являющейся членом домена. Modules). По умолчанию она настроена так, что проходить
аутентификацию имеют право только локальные пользова-
Аутентификация в системе тели, да и то не все и не везде. Как видно из названия,
На данный момент с аутентификацией в Active Directory библиотека построена по модульному принципу, причем за
полноценно работает только самба, остальные сервисы на каждым сервисом, требующим аутентификации, можно зак-
подопытной UNIX-машине о ней не ведают. реплять свой список используемых модулей.
Проблема управления большим количеством аккаунтов Настройка PAM специфична для каждого дистрибутива
возникла значительно раньше появления AD, да и, пожа- Linux, не говоря уже о BSD и прочих реализациях UNIX, так
луй, появления Windows-систем в целом. Во времена рас- что предлагать готовое решение для чего-то одного было
света UNIX возникла идея централизованного хранения бы несправедливо. По этой причине рассмотрим основы
информации о пользователях, чтобы избежать ее дубли- конфигурации, а конкретное их применение ка