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

№4(5) апрель 2003

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


журнал для cистемных администраторов,
вебмастеров и программистов

Настройка
RADIUS-сервера
Создаем VPN
на основе vtun
Система фильтрации
интернет-трафика
Компиляция FreeBSD
LIDS
Криптографическая
защита информации
оглавление

АДМИНИСТРИРОВАНИЕ Разводной мост на Linux


(Bridging Firewalls)
RADIUS Создание межсетевого экрана – моста, считающего
В статье детально описана настройка популярных и фильтрующего пакеты.
серверов протокола RADIUS, используемого для цен- Павел Закляков
трализованной аутентификации dial-in пользователей. amdk7@mail.ru 42
Radius предоставляет широкие возможности управ-
ления пользователями и создания системы учёта FreeBSD. Компиляция
(биллинга). Александр Прокошев
Всеволод Стахов ap@ap.kirov.ru 56
CEBKA@smtp.ru 4
Абсолютно все о АТМ
Создаем VPN на основе vtun Основные концепции технологии АТМ.
Нужна надежная, безопасная и защищенная от «под- Сергей Ропчан
глядывания» система связи? Единственная возмож- fenix@sit-ua.com 60
ность выполнить все предъявленные требования – со-
здание VPN.
Андрей Бешков БЕЗОПАСНОСТЬ
tigrisha@sysadmins.ru 14
LIDS
Настройка Incoming Connections в Linux Инструмент администрирования LIDS:
Настройка удаленного доступа к серверу. защита компьютера под управлением Linux.
Сергей Ропчан Сергей Яремчук
fenix@sit-ua.com 22 grinder@ua.fm 74
Борьба за системные ресурсы Система криптографической защиты
Статья будет полезна системным администраторам, информации
работающим в ОС Linux и желающим повысить произ- Владимир Мешков
водительность сервера и сети в целом. ubob@mail.ru 78
Денис Колисниченко
dhsilabs@mail.ru 24
WEB
Система фильтрации интернет-трафика
Экономим трафик. Настройка системы фильтрации на Интернет-операционные системы
основе FreeBSD 4.5 + Squid + SquidGuard + Berkeley Игорь Тетерин
DB 3.2.9 + Apache. keks_revda@uraltc.ru 88
Андрей Бешков
tigrisha@sysadmins.ru 30 Выбор веб-сервера: почему Apache?
Дмитрий Галышев
Установка и настройка сервера Jabber info@samag.ru 92
на платформе Linux
Практическое руководство. BUGTRAQ 2, 55
Сергей Индлин
indlin@abc92.ru 38 FAQ Shell 13, 37, 41

Уважаемые читатели!

Рады сообщить вам, что с 1 апреля началась подписка на 2-ое полугодие 2003 года.
Обратите внимание: подписной индекс по каталогу «Роспечать»
со 2-го полугодия единый для организаций и частных лиц – 81655.
Оформить подписку можно в любом почтовом отделении связи или через Интернет.
Вы также можете получить журналы за 1-ое полугодие, прислав заявку на редакционную под-
писку по факсу 928-82-53 или на info@samag.ru
Более подробная информация на нашем сайте
www.samag.ru

Желаем успехов!

№4(5), апрель 2003 1


BUGTRAQ
Продолжение исследования уязвимости Вышел в свет эксплоит для ptrace
в IIS (WebDAV) Данный эксплоит работает за счет проблемы с ptrace в
Выпущенный патч против недавно обнаруженной уязви- ядре ОС Линукс. На данный момент не существует офи-
мости латает дырку в самом ядре операционной систе- циального патча для линуксовых ядер, кроме как для вер-
мы. Ее можно было использовать через переполнение, сии 2.4.20, что делает проблему еще более актуальной.
вызываемое WebDAV-запросом, однако это только один Пример использования:
из способов. Сама проблема гораздо шире, чем может
показаться, и касается не только серверов на IIS. gcc kernelptrace.c .
/a.out
NGSSoftware провела небольшое исследование, в резуль- [+] Attached to 24983
тате которого были обнаружены и другие пути атаки. [+] Waiting for signal
[+] Signal caught
В основе использования уязвимости по IIS-направле- [+] Shellcode placed at 0xccfd9ef0
нию лежало отсутствие ограничения на длину имени [-] Unable to write shellcode: Input/output error
Killed
файла при WebDAV-запросе. При обработке этого зап- ./a.out
роса используются методы: PROPFIND, LOCK, SEARCH [+] Attached to 24986
[+] Waiting for signal
и GET с заголовком «Translate: f». Запрос проходит че- [+] Signal caught
рез несколько функций, одной из которых является [+] Shellcode placed at 0xccfd9ef0
[-] Unable to write shellcode: Input/output error
GetFileAttributesExW. В свою очередь, из нее вызывается Killed
функция RtlDosPathNameToNtPathName_U, экспортируемая ./a.out
[+] Attached to 24989
из ntdll.dll. Собственно, она и является основой проблемы. [+] Waiting for signal
RtlDosPathNameToNtPathName_U неправильно обраба- [+] Signal caught
[+] Shellcode placed at 0x4000e8fd
тывает длину передаваемых строк. Неопределенные пере- [+] Now wait for suid shell...
менные являются 16-ти битными, следовательно, могут хра- sh-2.05a#
нить значения от 0 до 65535. Если строка будет иметь длину
65536 байт, то будет считаться, что строка имеет длину 1, Теперь о способах защиты. Именно от этого эксплои-
хотя реально она гораздо длиннее. Вот корень проблемы. та поможет простое «chmod 700 /proc», так как этот эксп-
GetFileAttributesExW не единственная функция, вызы- лоит пытается открыть /proc/self/exe. Кроме того, можно
вающая RtlDosPathNameToNtPathName_U, вот еще не- воспользоваться модулем ядра, который расположен по
сколько: GetShortPathNameW, CopyFileW, MoveFileW, Move- адресу: http://www.austin2600.org/mirrors/004560.html.
FileExW, ReplaceFileW, CreateMailslotW, GetFileAttributesW,
FindFirstFileExW, CreateFileW, GetVolumeInformationW, Dele- Анализ ntdll.dll эксплоита для WebDAV
teFileW, GetDriveTypeW, GetFileAttributesExW, Create- Эксплоит для NTDLL.DLL впервые был опробован на во-
DirectoryW, FindFirstChangeNotificationW, GetBinaryTypeW, енном (military) сервере 17 марта сего года. Это было пер-
CreateNamedPipeW, SetFileAttributesW, MoveFileWithProg- вое зарегистрированное использование «неопубликован-
ressW, GetVolumeNameForVolumeMountPointW, GetDisk- ного» эксплоита; Bugtraq лишь отчитался о ставшей из-
FreeSpaceW, CreateDirectoryExW, DefineDosDeviceW, вестной уязвимости и о существующем эксплоите для неё.
PrivMoveFileIdentityW, GetCompressedFileSizeW, SetVolu- Это был случай, когда «незарелизенный» или «zero-day»
meLabelW, CreateHardLinkW, RemoveDirectoryW. эксплоит был использован для взлома до его публикации
Как вы можете видеть, большинство функций исполь- широким массам.
зуются для работы с файловой системой, атакующий мо- За серьезной проблемой в Microsoft’s Internet Information
жет вызвать переполнение в любой из них, следователь- Server (IIS) фактически стояла уязвимость в NTDLL.DLL,
но, все, что их использует, уязвимо. Но этим дело не за- динамической библиотеке Windows, используемой всеми
канчивается, ряд библиотек импортирует RtlDosPathName- версиями Windows 2000, библиотеке, отвечающей непос-
ToNtPathName_U из ntdll.dll, к ним относятся: acledit.dll, редственно за работу с ядром системы. IIS web server –
advapi32.dll, cscdll.dll, csrsrv.dll, dskquoui.dll, eventlog.dll, одно из множества приложений Windows 2000, использую-
gdi32.dll, ifsutil.dll, lsasrv.dll, ntdll.dll, ntmarta.dll, ole32.dll, щих библиотеку NTDLL.
perfproc.dll, query.dll, rshx32.dll, scesrv.dll, sdbapiu.dll, WebDAV расшифровывается как «Web-based Distributed
setupdll.dll, sfc.dll, shell32.dll, shim.dll, srvsvc.dll, svcpack.dll, Authoring and Versioning». И является расширением
trkwks.dll, ulib.dll, wow32.dll. HTTP-протокола, позволяющим пользователям безопас-
Следовательно, существует достаточное количество но редактировать и управлять файлами на удаленном
вариантов проведения атаки, которые не обязательно веб-сервере [wbdvorg].
должны касаться IIS, это могут быть и другие win32 веб, После публикации в Bugtraq, CERT дал описание уяз-
ftp, IMAP-сервера, антивирусное ПО и т. д. вимости и линк на патч от Microsoft. Windows 2000 предо-
ставляет поддержку протокола WebDAV, который исполь-
Новый RFC кардинально решает проблему зуется по умолчанию веб-сервером IIS. Пользователь, по-
сетевых атак славший специально сформированный HTTP-запрос на
Все гениальное, как всегда, просто – в протоколе IP v.4 машину под IIS, может удаленно выполнять команды на
достаточно незадействованных битов в поле флагов, один сервере, в контексте IIS-сервиса.
из которых предлагается использовать для отделения ха- MS классифицировала эту уязвимость как Critical.
керских пакетов от обычных.

2
ВСЕВОЛОД СТАХОВ
администрирование
Протокол radius (Remote Authentication Dial In User Service) Рассмотрим, как отреагирует NAS при поступлении
служит для аутентификации dial-up пользователей. Обыч- запроса пользователя на аутентификацию:
но radius используется маршрутизаторами Cisco для орга-  пользователь пытается пройти аутентификацию на NAS;
низации модемных линий, но возможны и варианты связки  NAS смотрит в первый попавшийся radius-сервер и по-
radius и pppd. В дальнейшем любого клиента radius я буду сылает пакет для установки связи (запрос на доступ);
называть NAS (network access server – сервер, предостав-  если ответ не получен в течение определённого тайм-
ляющий доступ в сеть). Если кто интересуется, чем же та- аута, то NAS либо опрашивает radius-сервер ещё раз,
ким примечателен radius, то отвечу: данный протокол, с либо ищет альтернативный сервер;
моей точки зрения, является логическим продолжением  radius-сервер смотрит IP-адрес NAS и проверяет ключ
традиций tacacs-сервера, но он поддерживает больше воз- симметричного шифрования, если IP-адрес и ключ со-
можностей и организован намного лучше. Особенно мне ответствуют тому, что написано в конфигурационном
понравилась возможность проверки различных NAS по клю- файле, то связь продолжается, иначе клиенту посыла-
чу и IP-адресу. Огорчает только относительная молодость ется пакет Invalid Key. Проверка осуществляется гене-
протокола, отсутствие качественной документации по бес- рацией и шифрацией случайной строки. Затем данные,
платным серверам, отсутствие поддержки протокола ста- передаваемые между клиентом и сервером radius,
рыми NAS. Последний пункт меня особенно опечалил: мои шифруются этим ключом;
любимые коммутаторы Cisco Catalyst, что прекрасно рабо-  сервер radius проверяет пароль пользователя (по сети
тали с tacacs-сервером, наотрез отказались от работы с передается md5-хеш пароля), помимо пароля сервер
radius. Но в последних моделях Cisco и многие другие про- может также проверить IP-адрес и порт NAS, если эти
изводители NAS поддерживают этот протокол. данные неверны, то сервер посылает NAS пакет «Дос-
Для начала определюсь с терминологией: туп запрещён», содержащий код ошибки и иногда её
 AV-пара – пара атрибут=значение. текстовое описание, отображаемое для пользователя;
 Авторизация – процесс проверки AV-пар пользовате-  если же данные пользователя верны, то сервер по-
ля. В ходе авторизации могут также устанавливаться сылает NAS пакет «Доступ разрешён», содержащий
определённые AV-пары (для сервера freeradius), смысл данные о сервисе (PPP, SLIP, login) и некоторые его
авторизации заключается в проверке достаточности специфические параметры, например, IP-адрес, но-
информации, предоставленной пользователем, для мер подсети, MTU для PPP-сервиса в виде пар пара-
того чтобы пользователь мог пройти аутентификацию. метр=значение (AV-пар).
 Аутентификация – процесс опроса внешних источни-
ков данных radius-сервером для сравнения AV-пар, пре- После краткого теоретического отступления перейду
доставленных пользователем, и пар, хранящихся во к описанию настройки серверов. Для начала сразу же
внешнем источнике; выбор метода аутентификации оп- определюсь: я не ставлю своей целью рассказать о каж-
ределяется AV-парой Auth-Type. дой опции и возможности, я просто описываю, как оно
 Аккаунтинг (или учёт) – процесс посылки на radius-сер- работает у меня. Настройки livingston и freeradius силь-
вер пакетов NAS, которые содержат информацию о те- но различаются, поэтому рассматривать их я буду по от-
кущем соединении (время, количество переданного дельности. Radiusd-livingston является более ранним сер-
трафика и т. д.), на основании этой информации скрип- вером и проще в настройке, чем freeradius, поэтому о
ты счетчиков или биллинговой системы могут выпол- нем – в первую очередь.
нять различные действия по ограничению доступа Конфигурация сервера хранится в каталоге /etc/raddb
пользователей на NAS. (или в $PREFIX/etc/raddb) и представляет собой несколь-
ко файлов, отвечающих за работу отдельных механиз-
Из серверов, доступных в сети, я выбрал freeradius мов сервера:
(http://www.freeradius.org) – новая версия популярного cistron  clients – определения NAS (ключ и IP-адрес) для про-
radius, который особенно меня порадовал тем, что он со- верки подлинности клиента;
держит значительное количество модулей аутентификации  users – файл, описывающий dial-in пользователей;
(например, sql, ldap, unix-passwd, samba-passwd) и стандар-  proxy – настройки перенаправления запросов клиен-
тный (обладающий меньшими возможностями) radiusd- тов другим radius-серверам, если аутентификация на
livingston (ftp://ftp.livingston.com/pub/le/radius/radius21.tar.Z). данном прошла неудачно (возможность роуминга или
Эти два сервера распространяются бесплатно, и их компи- распределения пользователей);
ляция не вызывает затруднений:  dictionary – словарь определений AV-пар для работы с
клиентом.
$./configure
$make
#make install Далее я приведу примеры конфигурационных файлов
с комментариями:
Теперь самое время рассказать поподробнее о самом
протоколе radius. clients:
Сервер radius использует протокол UDP для работы. # Â äàííîì ôàéëå íàõîäèòñÿ ñïèñîê êëèåíòîâ (NAS), êîòîðûå
Стандартно radius-сервер прослушивает 1812 порт. Для # ìîãóò ïðîõîäèòü àóòåíòèôèêàöèþ. Êëèåíò ïðîõîäèò ïðîâåðêó
# èìåíè è êëþ÷à. Ôàéë èìååò ñîîòâåòñòâóþùóþ ñòðóêòóðó:
аккаунтинга используется другой порт – 1813 (radius-acct). # ïîëå èìåíè è ïîëå êëþ÷à:

№4(5), апрель 2003 5


администрирование
#Èìÿ êëèåíòà Êëþ÷ DEFAULT Auth-Type = System, Prefix = "S"
#---------------- ------------------- Service-Type = Framed-User,
NAS1 123456789cba Framed-Protocol = SLIP,
NAS2:call 987654321abc Framed-IP-Address = 255.255.255.254,
Framed-Compression = None
proxy:
# Êîìïðåññèÿ òðàôèêà - ïðåôèêñ C
# Â ýòîì ôàéëå îïèñûâàþòñÿ radius-ñåðâåðû, íà êîòîðûå DEFAULT Auth-Type = System, Prefix = "C"
# äàííûé ìîæåò ïåðåíàïðàâëÿòü çàïðîñû NAS. Òàêîå ïîâåäåíèå, Service-Type = Framed-User,
# íàïðèìåð, ïîëåçíî äëÿ îðãàíèçàöèè ðîóìèíãà. Ïðåäñòàâèì Framed-Protocol = SLIP,
# ñèòóàöèþ: ñóùåñòâóåò 2 ïðîâàéäåðà À è Á, îíè õîòÿò, ÷òîáû Framed-IP-Address = 255.255.255.254,
# êëèåíò, çàêëþ÷èâøèé äîãîâîð ñ îäíèì èç íèõ, ìîã áåñïðå- Framed-Compression = Van-Jacobson-TCP-IP
# ïÿòñòâåííî çàõîäèòü è íà äðóãîé.  äàííîì ñëó÷àå â ôàéëå
# ïðîïèñûâàåòñÿ radius-ñåðâåð âòîðîãî ïðîâàéäåðà, íà êîòîðûé # Çäåñü èñïîëüçóåòñÿ ñóôôèêñ %ppp, ñèãíàëèçèðóùèé
# áóäåò îñóùåñòâëÿòüñÿ ïåðåíàïðàâëåíèå. Íàëè÷èå êëþ÷åé # èñïîëüçîâàíèå ïðîòîêîëà PPP
# ïîçâîëÿåò çàùèòèòü ñåðâåðà äîñòóïà îò ïîäìåíû äàííûõ. DEFAULT Auth-Type = System, Suffix = "%ppp"
# Ðàññìàòðèâàåìûé ôàéë ñîäåðæèò ÷åòûðå ïîëÿ: èìÿ ñåðâåðà, Service-Type = Framed-User,
# êëþ÷ äîñòóïà ê ñåðâåðó (íà óäàë¸ííîì ñåðâåðå íåîáõîäèìî Framed-Protocol = PPP,
# âíåñòè çàïèñü â clients, ñîîòâåòñòâóþùóþ ñåðâåðó, îñóùå- Framed-IP-Address = 255.255.255.254,
# ñòâèâøåìó ïåðåíàïðàâëåíèå), îáëàñòü äåéñòâèÿ ñåðâåðà Framed-MTU = 1500
# (ò.å. êàêèõ êëèåíòîâ ñëåäóåò ïåðåíàïðàâëÿòü íà äàííûé
# ñåðâåð, îïðåäåëÿåòñÿ èìåíåì êëèåíòà ïîñëå çíàêà @, íà- # Äëÿ ïîëüçîâàòåëÿ, íå ñîîòâåòñòâóþùåãî äðóãèì îïðåäåëåíèÿì,
# ïðèìåð, user@test.ru), íåîáÿçàòåëüíûå îïöèè è íîìåðà # çàïóñêàåì ïðîòîêîë PPP
# ïîðòîâ. Äîñòóïíûå îïöèè âûãëÿäÿò ñëåäóþùèì îáðàçîì: old – DEFAULT Auth-Type = System, Framed-Protocol = PPP
# óäàëåíèå îáëàñòè äåéñòâèÿ è ñîñòîÿíèÿ ïðîêñè èç çàãîëîâêà Service-Type = Framed-User,
# ñîîáùåíèÿ îò NAS, secure – âîçìîæíîñòü ïåðåñûëêè çàïðîñîâ Framed-Protocol = PPP,
# íà äîñòóï ñ ïðèâèëåãèÿìè àäìèíèñòðàòîðà, ipass – Framed-IP-Address = 255.255.255.254,
# èñïîëüçîâàíèå ïðîòîêîëà ipass (íåïåðåâîäèìîå ñëîâî). Framed-MTU = 1500
rad.test.ru somekey test.ru
radius.ru.net papakeyyer com.net 1645 1646 secure dictionary:
users: # Äàííûé ôàéë ñîäåðæèò îïèñàíèÿ àòðèáóòîâ è çíà÷åíèé.
# Êîíå÷íî æå, ÿ íå áóäó ïðèâîäèòü åãî öåëèêîì, ïðèâåäó
# Ýòî îñíîâíîé ôàéë, ãäå õðàíÿòñÿ äàííûå î ïîëüçîâàòåëÿõ. # ïðèìåð òîëüêî îñíîâíûõ AV: ATTRIBUTE èìÿ_àòðèáóòà
# Îïèñàíèå èä¸ò òàê: âíà÷àëå áåç îòñòóïà èìÿ ïîëüçîâàòåëÿ, # ÷èñëî_ñîîòâåòñòâóþùåå_àòðèáóòó òèï_àòðèáóòà. ×èñëî äëÿ
# çàòåì, îòñòóïàÿ íà òàáóëÿöèþ, èäóò AV-ïàðû (ïåðâîé # àòðèáóòà èñïîëüçóåòñÿ êàê ñèíîíèì òåêñòà, ìîæíî íàïèñàòü
# ïàðîé èä¸ò ïàðîëü). AV-ïàðû äîëæíû îïèñûâàòüñÿ â ôàéëå # Password="text", ÷òî èäåíòè÷íî 2="text". Òèï àòðèáóòà
# ñëîâàðÿ dictionary. Ñóùåñòâóåò òàêæå ñïåöèàëüíûé ïîëüçî- # ìîæåò ïðèíèìàòü ñëåäóþùèå çíà÷åíèÿ:
# âàòåëü ïî óìîë÷àíèþ, êîòîðûé èìååò ñïåöèàëüíîå èìÿ # string – ñòðîêà äëèíîé îò 0 äî 253 ñèìâîëîâ;
# DEFAULT. Îáû÷íî ïîëüçîâàòåëü ïî óìîë÷àíèþ ïðèìåíÿåòñÿ, # ipaddr – IP-àäðåñ, 4 áàéòà â ñåòåâîì ïîðÿäêå;
# êîãäà îïèñàíèÿ ïîëüçîâàòåëåé íàõîäÿòñÿ íå â äàííîì ôàéëå, # integer – 32-õ áèòíîå öåëîå â èíòåëîâñêîì ïîðÿäêå áàéò;
# à â /etc/passwd, íî îá ýòîì ÿ ðàññêàæó äàëåå. Äëÿ íà÷àëà # date – 32-õ áèòíîå ÷èñëî, îçíà÷àþùåå òåêóùóþ äàòó è âðåìÿ;
# ïðèâåäó íåñêîëüêî ïðèìåðîâ îïèñàíèÿ ïîëüçîâàòåëåé (äëÿ ATTRIBUTE User-Name 1 string
# ïîëó÷åíèÿ ïîëíîãî ñïèñêà AV-ïàð ñìîòðèòå ôàéë ñëîâàðÿ). ATTRIBUTE Password 2 string
# Åù¸ ó÷òèòå, ÷òî èìÿ ïîëüçîâàòåëÿ ìîæåò èìåòü ìàêñèìóì 8 ATTRIBUTE Framed-IP-Address 8 ipaddr
# ñèìâîëîâ â äëèíó, ïàðîëü â ïðèíöèïå äî 254 ñèìâîëîâ, íî ATTRIBUTE Expiration 21 date
# ÿ ÷àñòî ñëûøàë ïðî îãðàíè÷åíèå â 31 ñèìâîë (÷åñòíî ãîâîðÿ, # Îïèñàíèÿ çíà÷åíèé: VALUE èìÿ_çíà÷åíèÿ èìÿ_àòðèáóòà íîìåð.
# ïðåäñòàâèòü ñåáå íå ìîãó, êîãäà ìîæåò ïîíàäîáèòüñÿ ïàðîëü # Ýòè îïèñàíèÿ îáû÷íî ñëóæàò äëÿ óñòàíîâëåíèÿ ñîîòâåòñòâèÿ
# äëèííåå 31 ñèìâîëà!) # ñòðîêà-íîìåð. Òàê, íàïðèìåð, çíà÷åíèå ïðîòîêîëà èìååò
user1 Password = "testing", Expiration = "Dec 24 1995" # ÷èñëîâîé âèä, íî äëÿ óïðîùåíèÿ ñîñòàâëåíèÿ ôàéëà
Service-Type = Framed-User, # êîíôèãóðàöèè íåêîòîðûì ÷èñëàì ñîïîñòàâëåíû ÷èñëîâûå
Framed-Protocol = PPP, # êîíñòàíòû (ìîæíî ïðèâåñòè àíàëîãèþ #define MACRO 1 â ñè):
Framed-IP-Address = 255.255.255.254, VALUE Service-Type Login-User 1
Framed-Routing = None, VALUE Service-Type Framed-User 2
Filter-Id = "std.ppp", VALUE Service-Type Callback-Login-User 3
Framed-MTU = 1500, VALUE Service-Type Callback-Framed-User 4
Framed-Compression = Van-Jacobson-TCP-IP VALUE Service-Type Outbound-User 5
VALUE Service-Type Administrative-User 6
user2 Password = "moretest" VALUE Framed-Protocol PPP 1
Service-Type = Login-User, VALUE Framed-Protocol SLIP 2
Login-IP-Host = 192.168.2.7, VALUE Framed-Protocol ARAP 3
Login-Service = PortMaster VALUE Login-Service Telnet 0
VALUE Login-Service Rlogin 1
user3 Password = "callme" VALUE Login-Service TCP-Clear 2
Service-Type = Callback-Login-User, VALUE Login-Service PortMaster 3
Login-IP-Host = timeshare1,
Login-Service = PortMaster, Для проверки работы radius-сервера используется спе-
Callback-Number = "1231234"
# Â êîíöå ôàéëà ìîæåò áûòü îïèñàíèå ïîëüçîâàòåëÿ ïî óìîë- циальная программа -rad_test, но о ней я расскажу далее
# ÷àíèþ DEFAULT.  äàííîì ñëó÷àå èñïîëüçóåòñÿ àóòåíòèôèêàöèÿ при описании сервера freeradius (в livingston она точно
# ÷åðåç ïàðîëè â /etc/passwd, äëÿ ýòîãî ïðèìåíÿåòñÿ äèðåê-
# òèâà Auth-Type = System. Çíà÷åíèå ïðåôèêñà èëè ñóôôèêñà такая же).
# äëÿ èìåíè ïîëüçîâàòåëÿ îçíà÷àåò, ÷òî ïðîèçâîäèòñÿ ïîèñê Сервер freeradius отличается исключительной функци-
# äàííîãî ïðåôèêñà èëè ñóôôèêñà, à îñòàëüíàÿ ÷àñòü èìåíè
# èñïîëüçóåòñÿ íåïîñðåäñòâåííî êàê èìÿ ïîëüçîâàòåëÿ. Ýòî ональностью. Он может работать с SQL-серверами (в на-
# óäîáíî äëÿ äîáàâëåíèÿ ðàçëè÷íûõ òèïîâ äîñòóïà äëÿ ïîëüçî- стоящее время поддерживаются mysql, postgresql, oracle),
# âàòåëÿ â çàâèñèìîñòè îò ïðåôèêñà èëè ñóôôèêñà.
# Ðàññìîòðèì ïðèìåð: LDAP-сервером, содержит в себе достаточно много AV-сло-
варей, отличается комплексной настройкой, поддержива-
# Äëÿ ïîëüçîâàòåëåé, íà÷èíàþùèõñÿ ñ áóêâû P (Pusername)
# èñïîëüçóåòñÿ ñåðâèñ PPP ет дополнительные модули, имеет веб-интерфейс для на-
DEFAULT Auth-Type = System, Prefix = "P" стройки и несколько весьма полезных скриптов. Конфигу-
Service-Type = Framed-User,
Framed-Protocol = PPP, рация freeradius несколько похожа на настройку livingston,
Framed-IP-Address = 255.255.255.254, поэтому я буду рассказывать преимущественно о работе
Framed-MTU = 1500
аутентификации пользователей radius через mysql.
# Äëÿ ïðåôèêñà S - SLIP Общие настройки сервера размещаются в файле

6
администрирование
radiusd.conf. Я приведу здесь несколько опций, показав- # êëèåíòà: client èìÿ_èëè_ip_àäðåñ, çàòåì èä¸ò ñïèñîê AV-ïàð
# äëÿ äàííîãî êëèåíòà, çàêëþ÷¸ííûé â ôèãóðíûå ñêîáêè. Ïðèâåäó
шихся мне полезными: # íåñêîëüêî ïðèìåðîâ:
client 127.0.0.1 {
radiusd.conf # Ïàðîëü äëÿ èäåíòèôèêàöèè êëèåíòà è îáìåíà ñ íèì
# Îáùàÿ ñõåìà ôàéëîâ êîíôèãóðàöèè freeradius ïîçâîëÿåò # äàííûìè. Äàííûì êëþ÷îì òàêæå îñóùåñòâëÿåòñÿ ïðîâåðêà
# èñïîëüçîâàòü ñïåöèàëüíóþ äèðåêòèâó $INCLUDE äëÿ âêëþ÷åíèÿ # íåèçìåííîñòè ïåðåäàâàåìûõ ïàêåòîâ (ïîäïèñü).
# êîíôèãóðàöèîííûõ ôàéëîâ â äàííûé (ôîðìàò .conf) secret = some_strange_secret
$INCLUDE ${confdir}/proxy.conf
$INCLUDE ${confdir}/clients.conf # Êðàòêîå èìÿ äëÿ êëèåíòà.
# Ïîëåçíî áóäåò óêàçàòü ïîëüçîâàòåëÿ è ãðóïïó, ïîä êîòîðûìè shortname = localhost
# áóäåò ðàáîòàòü ñåðâåð. Â ïðèíöèïå ëó÷øå, ÷òîáû ïðèâèëåãèé
# áûëî ïîìåíüøå. Åñëè æå èñïîëüçîâàòü àóòåíòèôèêàöèþ mysql, # Ñëåäóþùèå òðè ïîëÿ íåîáÿçàòåëüíû, íî îíè ïîëåçíû äëÿ
# òî âûáîð nobody:nobody, íà ìîé âçãëÿä, ÿâëÿåòñÿ ñàìûì # ðàáîòû ñêðèïòà checkrad.pl (ïðîâåðêà ðàáîòû ïðîöåññîâ
# íàèëó÷øèì. # ñåðâåðà)
user = nobody # Ïîëå òèïà NAS ìîæåò ïðèíèìàòü ñëåäóþùèå çíà÷åíèÿ:
group = nobody
# Ìàêñèìàëüíîå âðåìÿ îáðàáîòêè çàïðîñà (â ñåêóíäàõ), ïî # Õîòÿ çà÷åì ýòî íóæíî, ÿ òàê è íå ïîíÿë.
# èñòå÷åíèè êîòîðîãî êëèåíòó áóäåò ïîñëàí ïàêåò, ñèãíàëè- # cisco
# çèðóþùèé ðàçðûâ ñîåäèíåíèÿ. # computone
max_request_time = 30 # livingston
# Ìàêñèìàëüíîå êîëè÷åñòâî ñîåäèíåíèé äëÿ äàííîãî ñåðâåðà # max40xx
# ïîëó÷àåòñÿ óìíîæåíèåì ÷èñëà NAS â ñåòè íà 256. Íàïðèìåð, # multitech
# äëÿ 4 êëèåíòîâ, çíà÷åíèå áóäåò 4*256=1024 # netserver
max_requests = 1024 # pathras
# patton
# Çàíîñèòü â ëîã äàííûå î ïîëíîì èìåíè ïîëüçîâàòåëÿ # portslave
log_stripped_names = yes # tc
# Çàíîñèòü ëè â ëîã èíôîðìàöèþ î çàïðîñàõ íà àóòåíòèôèêàöèþ # usrhiper
log_auth = no # other
# Çàíîñèòü ëè â ëîã äàííûå î ïåðåäàííûõ ïàðîëÿõ nastype = other # localhost îáû÷íî íå ÿâëÿåòñÿ NAS
# (íåïðàâèëüíûõ è ïðàâèëüíûõ ñîîòâåòñòâåííî)
log_auth_badpass = yes # Äâå ñëåäóþùèå ñòðî÷êè çàðåçåðâèðîâàíû íà áóäóùåå.
log_auth_goodpass = no # Âîîáùå-òî îíè äîëæíû èñïîëüçîâàòüñÿ äëÿ ïðîâåðêè
# Ïðèâîäèòü ëè ê íèæíåìó ðåãèñòðó âñå èìåíà ïîëüçîâàòåëåé # èìåíè ïîëüçîâàòåëÿ è ïàðîëÿ äëÿ äàííîãî NAS
# è ïàðîëè (âåñüìà ïîëåçíî äëÿ íåêîòîðûõ ïîëüçîâàòåëåé). # login = !root
# Âîçìîæíûå çíà÷åíèÿ: no – ÷óâñòâèòåëüíûå ê ðåãèñòðó # password = someadminpas
# ïàðîëü/èìÿ, before – âíà÷àëå ïðèâîäèì ê íèæíåìó ðåãèñòðó, }
# ïîòîì ïðîâîäèì àóòåíòèôèêàöèþ, after – âíà÷àëå ïðîâåðÿåì client some.test.ru {
# àóòåíòèôèêàöèþ êàê åñòü, åñëè íå ïîëó÷èëîñü, òî ïðèâîäèì secret = some_host_secret
# ê íèæíåìó ðåãèñòðó è ïîâòîðÿåì ïîïûòêó. shortname = somenas
lower_user = no }
lower_pass = no # Òàêæå ìîæíî îïðåäåëÿòü ïàðîëü äëÿ âñåõ êëèåíòîâ
# Óáèðàåì ïðîáåëû èç èìåíè ïîëüçîâàòåëÿ è ïàðîëÿ. Ïîëåçíî # íåêîòîðîé ïîäñåòè (÷åì ìåíüøå ïîäñåòü, òåì ëó÷øå, à
# äëÿ èì¸í è ïàðîëåé, ñîäåðæàùèõ ïðîáåëû. Âîçìîæíûå # âîîáùå, íà ìîé âçãëÿä, ýòî íå åñòü õîðîøî èç
# çíà÷åíèÿ àíàëîãè÷íû ïðåäûäóùåìó ñëó÷àþ. # ñîîáðàæåíèé áåçîïàñíîñòè)
nospace_user = no client 192.168.0.0/24 {
nospace_pass = no secret = a_very_long_passwd
shortname = private-network
# Âåñüìà ïîëåçíûå ïàðàìåòðû ìîäóëÿ áåçîïàñíîñòè ñåðâåðà: }
security {
# Ìàêñèìàëüíîå ÷èñëî AV-ïàð â ïàêåòå. Åñëè ÷èñëî ïàð Далее я кратко остановлюсь на особенностях настрой-
# áîëüøå, òî ïàêåò íå îáðàáàòûâàåòñÿ. Åñëè óêàçàòü ки файла proxy.conf. В отличие от сервера livingston во
# äàííûé ïàðàìåòð ðàâíûì íóëþ, òî áóäóò îáðàáàòûâàòüñÿ
# ëþáûå ïàêåòû. freeradius опять же используется собственный конфигу-
max_attributes = 200 рационный формат. Из нововведений особенно бросает-
# Ïàêåò îòêàçà äîñòóïà ìîæåò áûòü îòïðàâëåí ñ íåêîòîðîé ся в глаза новая директива – realm, определяющая об-
# çàäåðæêîé (â ñåêóíäàõ). Òàêîå ïîâåäåíèå ïðåäîòâðàùàåò ласть перенаправления. Дабы не быть голословным опять
# ïðèìåíåíèå DoS-àòàêè. Åñëè æå óêàçàòü çíà÷åíèå, ðàâíîå
# íóëþ, òî îòêàç áóäåò ïîñûëàòüñÿ áåç çàäåðæêè. же приведу несложный пример:
reject_delay = 1
proxy.conf
# Ïîñûëàòü îòâåò íà çàïðîñ NAS î ñòàòóñå ñåðâåðà. Òàêîå
# ïîâåäåíèå íå îïèñàíî â rfc, ïîýòîìó ïî óìîë÷àíèþ – no
# (êàê íàïèñàíî â êîììåíòàðèÿõ, «ìîæåò ïðèãîäèòüñÿ äëÿ # Äàííûé ôàéë ñîñòîèò èç äâóõ ðàçäåëîâ: îïèñàíèå íàñòðîåê
# ñàìîãî ïðîêñè-ñåðâåðà è îïèñàíèå îáëàñòåé ïåðåíàïðàâëåíèÿ.
# íåêîòîðûõ îñîáûõ NAS») # Íà êîíôèãóðàöèè ðàáîòû ñàìîãî ïðîêñè-ñåðâåðà ÿ îñòàíàâ-
status_server = no
} # ëèâàòüñÿ íå áóäó, à ñðàçó æå ïåðåéäó ê îïèñàíèþ äèðåêòèâû
# îïðåäåëåíèÿ îáëàñòè realm. Îíà âûãëÿäèò ñëåäóþùèì îáðàçîì:
# Îáðàáàòûâàòü ïåðåíàïðàâëåíèå çàïðîñîâ. Åñëè ïåðåíàïðàâëåíèå # realm èìÿ_îáëàñòè. Èìÿ îáëàñòè äîëæíî ÿâëÿòüñÿ èìåíåì
# îòêëþ÷åíî, òî íåîáõîäèìî îòêëþ÷èòü ôàéë proxy.conf, äàáû
# èçáåæàòü îøèáîê êîíôèãóðàöèè (çàêîììåíòèðîâàòü äèðåêòèâó # äîìåíà, êîòîðûé ýòîé îáëàñòüþ îïèñûâàåòñÿ. Åñëè âìåñòî
# èìåíè îáëàñòè óïîòðåáëÿåòñÿ ñëîâî DEFAULT, òî â äàííóþ
# $INCLUDE ${confdir}/proxy.conf). # îáëàñòü áóäóò ïåðåíàïðàâëÿòüñÿ çàïðîñû, íå ñîîòâåòñòâóþùèå
proxy_requests = yes
# Äàëåå ñëåäóþò îïèñàíèÿ ìíîãî÷èñëåííûõ ìîäóëåé freeradius, # íè îäíîìó ïàðàìåòðó. Ïîÿñíþ ýòî íà ïðèìåðàõ:
realm isp2.ru {
# ïîçâîëÿþùèå íàñòðîèòü, ê ïðèìåðó, ìåòîäû øèôðàöèè ïàðîëåé # Òèï ñåðâåðà
# èëè ðàáîòó ðàçëè÷íûõ àóòåíòèôèêàöèîííûõ ïðîòîêîëîâ (PAP,
# CHAP, MS-CHAP), íî îïèñûâàòü çäåñü âñ¸ ÿ íå íàìåðåí: äóìàþ, type = radius
# Ñåðâåð radius äëÿ àóòåíòèôèêàöèè
# ÷òî â ïðèìåðàõ âñå è òàê î÷åíü ïîäðîáíî îáüÿñíåíî è authhost = radius.isp2.com:1645
# ðàçîáðàòüñÿ íå ñîñòàâèò òðóäà.
# Ñåðâåð radius äëÿ àóòåíòèôèêàöèè (îáû÷íî äðóãîé ïîðò)
accthost = radius.isp2.com:1646
# Ñåêðåò äëÿ ñâÿçè
Настройка клиентов производится в файле clients.conf: secret = our_concurents_key
# Íå óáèðàòü ñóôôèêñ èëè ïðåôèêñ îáëàñòè èç èìåíè ïîëüçîâàòåëÿ
clients.conf nostrip
# Â äàííîì ôàéëå îïèñûâàþòñÿ êëèåíòû aka NAS. Ôîðìàò ôàéëà }
# Åñëè ïåðåíàïðàâèòü çàïðîñ íà äàííûé ñåðâåð íå óäàëîñü,
# íàïîìèíàåò ôàéë íàñòðîéêè tacacs+. Âíà÷àëå èä¸ò îïðåäåëåíèå

№4(5), апрель 2003 7


администрирование
# òî ïðîèñõîäèò âûáîðêà äðóãîãî ñåðâåðà äëÿ äàííîé îáëàñòè Пример:
# èëè ñåðâåðà ïî óìîë÷àíèþ. Òàêæå ñóùåñòâóåò ñïåöèàëüíàÿ
# îáëàñòü NULL äëÿ êëèåíòîâ, êîòîðûå íå îïðåäåëèëè îáëàñòü
# äåéñòâèÿ, íàïðèìåð, ïðîñòî user (ñðàâíèòå user@isp2.ru) # Çäåñü äèðåêòèâà Strip-User-Name îïðåäåëÿåò, óäàëÿòü ëè
realm NULL { # ïðåôèêñ èëè ñóôôèêñ èç èìåíè
type = radius DEFAULT Suffix = ".ppp", Strip-User-Name = Yes
authhost = radius.test.ru Hint = "PPP",
accthost = radius.test.ru Service-Type = Framed-User,
secret = our_secret_key Framed-Protocol = PPP
} DEFAULT Prefix = "P", Strip-User-Name = Yes
# Íó à äëÿ òåõ ïîëüçîâàòåëåé, ÷üÿ îáëàñòü íå îïðåäåëåíà, Hint = "PPP",
# èñïîëüçóåòñÿ ñåðâåð ïî óìîë÷àíèþ: Service-Type = Framed-User,
realm DEFAULT { Framed-Protocol = PPP
type = radius
authhost = radius.test.ru
accthost
secret
= radius.test.ru
= our_secret_key
 proxy.conf – информация об областях.
}  sql.conf – настройки работы с mysql (к этому файлу я
# Ó÷òèòå: â äâóõ ïîñëåäíèõ ïðèìåðàõ ïðè ïåðåíàïðàâëåíèè еще вернусь).
# çàïðîñà ê âòîðè÷íûì ñåðâåðàì radius èç èìåíè ïîëüçîâàòåëÿ
# âûðåçàåòñÿ èìÿ îáëàñòè, ò.ê. íå îïðåäåëåíà îïöèÿ nostrip.  users – а вот этот файл очень важен для последующе-
го изложения, он описывает пользователей. Описание
Теперь для любопытствующих кратко опишу назначе- пользователей аналогично livingston-radius:
ние остальных конфигурационных файлов freeradius:
 acct_users – содержит установки учёта (аккаунтинга). user Auth-Type := Local, User-Password == "testing"
Service-Type = Framed-User,
Framed-Protocol = PPP,
Обычно используется для задания начальных и конечных Framed-IP-Address = 172.16.3.33,
Framed-IP-Netmask = 255.255.255.0,
скриптов для пользователя и областей репликации (см. при- Framed-Routing = Broadcast-Listen,
мер). В скрипты можно передавать специальные переменные: Framed-MTU = 1500,
Framed-Compression = Van-Jacobsen-TCP-IP
 %a Protocol (SLIP/PPP)
 %c Callback-Number но есть и отличие: использование специальных операто-
 %d request day (DD) ров присваивания и сравнения (в linvingston был только
 %f Framed IP address один «=»). Приведу список «новых» операторов:
 %i Calling Station ID Атрибут посылается NAS, его значение равно Value:
 %l request timestamp  «Attribute = Value»
 %m request month (MM) Если данный атрибут не определён, то он принимает
 %n NAS IP address указанное значение:
 %p Port number  «Attribute := Value»
 %s Speed (PW_CONNECT_INFO) Используется только для проверки значения атрибута:
 %t request in ctime format  «Attribute == Value»
 %u User name Добавление нового значения атрибуту:
 %A radacct_dir  «Attribute += Value»
 %C clientname Различные операции сравнения:
 %D request date (YYYYMMDD)  «Attribute != Value»
 %H request hour  «Attribute > Value»
 %L radlog_dir  «Attribute >= Value»
 %M MTU  «Attribute < Value»
 %R radius_dir  «Attribute <= Value»
 %S request timestamp in SQL format Проверка соответствия значения атрибута определён-
 %T request timestamp in database format ному регулярному выражению:
 %U Stripped User name  «Attribute =~ Expression»
 %V Request-Authenticator (Verified/None)  «Attribute !~ Expression»
 %Y request year (YYYY) Проверка, содержит ли запрос данный атрибут, зна-
чение не играет роли:
Пример:  «Attribute =* Value»
 «Attribute !* Value»
DEFAULT Acct-Status-Type == Start
Exec-Program = "/path/to/exec/acct/start %U"
DEFAULT Acct-Status-Type == Stop Однако если вы намереваетесь работать с большим
Exec-Program = "/path/to/exec/acct/stop %U %n %a" числом пользователей, то файл users не подойдет (он це-
ликом помещается в память). В качестве альтернативы
 attrs – информация об AV-парах по умолчанию для каж- можно взять сервера LDAP или MySQL (PostgreSQL,
дой области действия. Oracle). LDAP, на мой взгляд, несколько практичнее, но я
 clients.conf – настройки NAS. прекрасно понимаю, что MySQL распространён намного
 dictionary – данные об известных AV-парах. больше, поэтому о его использовании я и поведу речь.
 hints – информация о суффиксах и префиксах имён Для начала устанавливаем mysql (этот процесс я не
пользователей. описываю). Обязательно устанавливаем (если работаем

8
администрирование
с пакетами) пакет mysql-dev. После этого перекомпили- ствляется модулем, который определён в AV-паре Auth-
руем radius (configure скрипт сам обнаружит mysql и вклю- Type (в таблице radcheck можно присвоить пользовате-
чит в makefile нужный модуль). После этого создаём базу лю это поле по умолчанию с помощью оператора “:=”).
в mysql: Существует много типов аутентификации (см. соответ-
ствующие значения атрибутов в словаре dictionary), боль-
$mysql -uroot -proot_passwd шинство из них определяют пароль из mysql. Здесь при-
mysql> create database radius
мере для простоты приведён пример типа аутентифика-
После этого выполняем mysql-сценарий для создания ции Accept, который сразу же возвращает пакет разре-
таблиц в базе. Для этого заходим в каталог модуля mysql: шения доступа, применять этот тип следует лишь в тес-
тирующих целях. Другие распространённые методы
$cd {PATH_TO_RADIUS_SRC}/src/modules/rlm_sql/drivers ↵ аутентификации:
rlm_sql_mysql
 System – системная аутентификация (для pap-протоко-
ла), обычно нужна запись в /etc/passwd для проверки
и передаём mysql-сценарий: пароля, другой вариант – использование файла users.
 Chap – аутентификация протокола chap (пароль пере-
$mysql -uroot -proot_passwd radius < db_mysql.sql даётся в открытом виде).
 Reject – отклонение доступа пользователя.
База состоит из 5-и таблиц:  Ms-Chap Ldap – проверка пароля через службу ката-
 Usergroup – данные о группах пользователей, например: логов ldap (необходимо поправить подсекцию ldap в
mysql> select * from usergroup; секции modules файла radiusd.conf).

Важно знать, что для некоторых типов аутентифика-


ции (system) можно использовать зашифрованные па-
2 rows in set (0.00 sec) роли – Crypt-Password в формате Unix crypt. Для Ms-Chap
 Radcheck – AV-пары для проверки пользователя (обыч- необходимо использовать параметры LM-Password и NT-
но пароль), например: Password. Для изучения других параметров полезно по-
читать файл словаря dictionary. И ещё: иногда очень по-
лезно взять пользователя по умолчанию DEFAULT для
сообщения некоторых AV-пар, общих для всех пользо-
2 rows in set (0.02 sec) вателей.
 Radgroupcheck – проверка атрибутов для группы (не Для настройки radiusd необходимо проверить следую-
знаю, зачем это нужно). щие пункты radiusd.conf:
 Radreply – таблица, содержащая AV-пары, передаю-  секция modules, дабы убедиться, что файл конфигу-
щиеся клиенту сервером при прохождении аутентифи- рации mysql включен:
кации, например:
mysql> select * from radreply; modules {
# Âêëþ÷åíèå ôàéëà äëÿ ðàáîòû ñ mysql, äëÿ ðàáîòû
# ñ äðóãèìè ÑÓÁÄ èñïîëüçóþòñÿ ôàéëû
# Postgresql: ${confdir}/postgresql.conf
# MS-SQL: ${confdir}/mssql.conf
$INCLUDE ${confdir}/sql.conf
}
 секция авторизации, настроенная для использования
ldap и mysql:
6 rows in set (0.01 sec)
 Radgroupreply – AV-пары, содержащиеся в ответе сер- authorize {
preprocess
вера для данной группы, например: chap
mschap
mysql> select * from radgroupreply; suffix
files
sql
ldap
}

Настройка данных методов проводится в соответствую-


щих подсекциях секции modules. В разделе аутентифика-
ции можно также объявлять собственные методы, например:

authenticate {
authtype my_dialup {
pap
12 rows in set (0.01 sec) chap
ldap
Учтите тот факт, что mysql применяется для автори- }
зации пользователя, парольная аутентификация осуще- }

№4(5), апрель 2003 9


администрирование
и использовать их в поле Auth-Type. В файле sql.conf так- пользователях и паролях будет намного удобнее и эффек-
же делаются некоторые изменения для указания серверу тивнее. Для этого правим файл radiusd.conf:
radius информации о поиске данных в mysql:
ldap {
sql { server = "ldap.test.ru"
# Ýòîò ïîëüçîâàòåëü äîëæåí èìåòü ïðàâî ÷èòàòü ïàðîëè,
# ïîýòîìó íåîáõîäèìî äîáàâèòü ñîîòâåòñòâóþùèé acl â ôàéë
# Òèï áàçû äàííûõ # êîíôèãóðàöèè ldap-ñåðâåðà (îá ýòîì ðàññêàçàíî â ìîåé
driver = "rlm_sql_mysql"
# ñòàòüå «OpenLDAP». – æóðíàë
# «Ñèñòåìíûé àäìèíèñòðàòîð». – 2003, ¹2(3). ñ.74-84.)
# Ïàðàìåòðû ñîåäèíåíèÿ identity = "cn=proxy,dc=test,dc=ru"
server = "localhost"
login = "root" password = mypass
basedn = "o=test,c=ru"
password = "mysql_passwd" filter = "(uid=%{Stripped-User-Name:-%{User-Name}})"
# Áàçà äàííûõ, èñïîëüçóåìàÿ radius # Âêëþ÷àåì áåçîïàñíîå ñîåäèíåíèå, íå ìåíÿÿ ïîðò
radius_db = "radius" start_tls = yes
# Ïåðâàÿ òàáëèöà õðàíèò çàïèñè íà÷àëà ñîåäèíåíèÿ (start), # Áîã çíàåò ÷òî, íî âðîäå ýòî çàñòàâëÿåò øèôðîâàòü
# äàííûå ïðè çàïðîñå ê ñåðâåðó
# âòîðàÿ – çàïèñè îêîí÷àíèÿ ñîåäèíåíèÿ (stop). Åñëè îíè tls_mode = yes
# ñîâïàäàþò, òî õðàíÿòñÿ â îäíîé òàáëèöå.
acct_table1 = "radacct" # Â äàííîé âåòâè õðàíÿòñÿ ïðîôèëè ïîëüçîâàòåëåé
default_profile = "cn=radprofile,ou=dialup,dc=test,dc=ru"
acct_table2 = "radacct" # profile_attribute = "radiusProfileDn"
# Òàáëèöà àâòîðèçàöèè è óñòàíîâêè òèïà àóòåíòèôèêàöèè
access_attr = "dialupAccess"
# Â äàííîì àòðèáóòå ïðåäïîëàãàåòñÿ õðàíåíèå ïàðîëÿ
authcheck_table = "radcheck" # ïîëüçîâàòåëÿ
authreply_table = "radreply"
# Ãðóïïîâûå òàáëèöû password_attribute = "userPassword"
# Àòðèáóòû äëÿ ïåðåâîäà ôîðìàòà çíà÷åíèé ldap => radius
groupcheck_table = "radgroupcheck" dictionary_mapping = ${raddbdir}/ldap.attrmap
groupreply_table = "radgroupreply"
# Ñîîòâåòñòâèå ïîëüçîâàòåëåé ãðóïïàì # Îñòàëüíàÿ ÷àñòü óáðàíà, ò.ê. íå çàñëóæèâàåò îòäåëüíîãî
# âíèìàíèÿ
usergroup_table = "usergroup" }
# Remove stale session if checkrad does not see a
# double login Учтите ещё, что при компиляции radius с ldap надо иметь
deletestalesessions = yes нужные библиотеки, иначе модуль не скомпилируется. Ну
# Âñå sql-çàïðîñû âûâîäÿòñÿ â ðåæèìå îòëàäêè radiusd -x и конечно же, нужно включить аутентификацию через ldap.
sqltrace = yes Делается это стандартным раскомментированием строк
sqltracefile = /usr/local/var/log/radius/sqltrace.sql
ldap в секциях authorize и authenticate (см. описание рабо-
# Êîëè÷åñòâî ñîåäèíåíèé ñ ñåðâåðîì. Ïðè áîëüøîé çàãðóçêå ты через sql). Для указания использования аутентифика-
# ðåêîìåíäóåòñÿ óâåëè÷èòü.
num_sql_socks = 5 ции через ldap данного пользователя необходимо устанав-
ливать AV-пару Auth-Type = ldap. В частности, можно для
# ×èñëî ñåêóíä, ïåðåä òåì êàê ñåðâåð ïðåäïðèíèìàåò
# ïîâòîðíóþ ïîïûòêó ñîåäèíåíèÿ, åñëè ïðîèçîø¸ë ñáîé этого применить оператор Auth-Type := ldap. Заметьте так-
# ñîåäèíåíèÿ ñ mysql. же, что ldap не различает регистр символов, поэтому воз-
connect_failure_retry_delay = 60
можно возникновение проблем. Для этого в radius.conf надо
Для проверки сервера используется утилита radtest включить «lower_user = yes» и «lower_time = before» в ос-
(она присутствует во всех проверенных мною серверах). новной секции (см. выше). Кроме этого, в сервер ldap не-
Формат её использования таков: обходимо включить файл схемы RADIUS-LDAPv3.schema
(находится в исходниках в подкаталоге doc).
radtest user_name password radius_server nas_port secret Отдельного разговора заслуживает тема учёта или
аккаунтинга. Фактически сервер radius состоит из двух
Например, если существует пользователь testuser с па- частей: сервера авторизации и аутентификации и серве-
ролем testing, то формат команды будет таков: ра учёта. Учёт может выполняться через различные ис-
точники, например, через sql или простые файлы. Един-
$radtest testuser testing radius.test.ru 1 radius_secret ственное условие для работы аккаунтинга – правильная
настройка NAS (далее приведён пример конфигурации
Если же у вас что-то не работает (знаю по опыту – так маршрутизатора Cisco). Аккаунтинг может выполняться
бывает часто, даже если всё вроде правильно сделал, на- либо через внешние скрипты (файл acct_users, для
пишешь что-нибудь вроде dev/null, вместо /dev/null, а по- livingston-radius этот метод является единственным), либо
том ищешь недостающий файл), то очень может помочь через внутренние настройки. Далее будет рассматривать-
опция отладки radiusd -x. При этом radius не вызывает fork, ся лишь второй способ, т.к. о структуре файла acct_users
и все отладочные данные выводятся на терминал. В та- я уже говорил выше. В файле radiusd.conf существует
ком режиме как сервер он работать практически не мо- секция accounting, у меня она выглядит так:
жет, зато будет ясно, какие файлы он прочитал и что он
делает. Вкупе с утилитой radtest это может помочь решить accounting {
# Äàííûé ìîäóëü èñïîëüçóåòñÿ äëÿ ñîçäàíèÿ óíèêàëüíîãî
любые проблемы. Ещё советую включить в файле # èäåíòèôèêàòîðà ïàêåòà àêêàóíòèíãà, ò.ê. ýòî òðåáóþò
radiusd.conf запись в логи, это поможет выявить пробле- # ìíîãèå NAS, ïîýòîìó ýòîò ìîäóëü îáû÷íî íåîáõîäèìî âêëþ÷àòü
acct_unique
мы безопасности. Иногда более целесообразно применять # Äàííûé ìîäóëü ïîçâîëÿåò ñîçäàâàòü êàæäûé ÷àñ ôàéë ñ
совместно с radius ldap, т.к. при большом количестве # èíôîðìàöèåé î ïîëüçîâàòåëå. Ôàéëû ñîçäàþòñÿ ïî óìîë÷àíèþ
# â ôîðìàòå
пользователей наличие единого источника данных о #detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d

10
администрирование
# detail таблица учёта создаётся автоматически при создании
# Ìîäóëü ñ÷åò÷èêà - çàñëóæèâàåò îòäåëüíîãî ðàçãîâîðà
# counter структуры базы данных radius (описано выше).
# Ñòàíäàðòíûé wtmp-ôîðìàò После настройки собственно учёта необходимо про-
# unix
# utmp-ôàéë, ñîäåðæàùèé èìåíà ïîëüçîâàòåëåé è ïîðòû NAS думать политику ограничения доступа. Для этого суще-
# radutmp ствуют счётчики. Здесь я приведу пример счётчика sql.
# utmp ôàéë, íå ñîäåðæàùèé èì¸í ïîëüçîâàòåëåé, ïîýòîìó
# äîñòóïíûé âñåì äëÿ ÷òåíèÿ Счётчик работает по принципу периодической проверки
# sradutmp данных учёта и на основании этого принимается реше-
# Ìîäóëü àêêàóíòèíãà ÷åðåç sql
sql ние о дальнейшей работе пользователя. Для этого счёт-
} чик должен быть добавлен в секцию authorize файла
radiusd.conf. Конфигурацию счётчика будем хранить в
Чтобы разобраться подробнее, необходимо выяснить, файле sqlcounter.conf, имеющим приблизительно такой
что же содержится в пакетах аккаунтинга (взято из доку- формат (взято из документации к серверу freeradius):
ментации к серверу radacct, о котором будет рассказано
далее). Следующие атрибуты пакета Accounting-Request # Ñ÷¸ò÷èê îáùåãî âðåìåíè
sqlcounter noresetcounter {
считаются обязательными: counter-name = Max-All-Session-Time
 Acct-Status-Type – подтип пакета: Start (начало сессии), # Ïðîâåðêà îïðåäåë¸ííîãî àòðèáóòà â òàáëèöå radcheck
check-name = Max-All-Session
Stop (конец сессии) или Alive; # Èñïîëüçóåìûé ïðîöåññ sql
 NAS-IP-Address – IP-адрес NAS; sqlmod-inst = sql
# Ïîëå, ïî êîòîðîìó ïðîèñõîäèò ðàñ÷¸ò âðåìåíè
 Acct-Session-Id – идентификатор сессии NAS; key = User-Name
 User-Name – идентификатор пользователя (с возмож- # Ñáðîñ ñ÷¸ò÷èêà, â äàííîì ñëó÷àå ñ÷¸ò÷èê íå ñáðàñûâàåòñÿ
reset = never
ным префиксом или суффиксом); # SQL-çàïðîñ, âûïîëíÿåìûé ñ÷¸ò÷èêîì
 NAS-Port – номер порта NAS. query = "SELECT SUM(AcctSessionTime) FROM radacct
WHERE UserName='%{%k}'"

Используются также следующие опциональные атри- }


# Ñ÷åò÷èê ñáðàñûâàåòñÿ åæåäíåâíî
буты, динамически изменяемые в процессе сессии: sqlcounter dailycounter {
 NAS-Port-Type – тип порта NAS, по умолчанию – Async; driver = "rlm_sqlcounter"
counter-name = Daily-Session-Time
 Service-Type – тип сервиса, по умолчанию – Login; check-name = Max-Daily-Session
 Framed-Protocol – протокол, по умолчанию – PPP sqlmod-inst = sql
key = User-Name
(Service-Type=Framed); # Ñáðîñ ñ÷¸ò÷èêà åæåäíåâíî
 Framed-IP-Address – IP-адрес клиента (Service- reset = daily
Type=Framed); query = "SELECT SUM(AcctSessionTime - GREATEST
 Login-IP-Host – IP-адрес сервера (Service-Type=Login); ((%b - UNIX_TIMESTAMP(AcctStartTime)), 0))
FROM radacct WHERE UserName='%{%k}' AND
 Acct-Delay-Time – задержка в предоставлении сервиса; UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%b'"
 Called-Station-Id – идентификатор вызываемой сторо- }
ны (номер телефона?); sqlcounter monthlycounter {
 Calling-Station-Id – идентификатор вызывающей сто- counter-name = Monthly-Session-Time
check-name = Max-Monthly-Session
роны (номер телефона?). sqlmod-inst = sql
Следующие атрибуты определяются по окончании сессии: key = User-Name
reset = monthly
 Acct-Session-Time – время занятия в текущей сессии;
 Acct-Input-Octets – количество принятых байт; query = "SELECT SUM(AcctSessionTime - GREATEST
((%b - UNIX_TIMESTAMP(AcctStartTime)), 0))
 Acct-Output-Octets – количество отосланных байт; FROM radacct WHERE UserName='%{%k}' AND
 Acct-Input-Packets – количество принятых пакетов; }
UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%b'"
 Acct-Output-Packets – количество отосланных пакетов.
После этого в radiusd.conf включаем файл sqlcounter.conf
После этого можно понять общие принципы работы в секции modules:
системы учёта – при успешной аутентификации пользо-
вателя на radius-сервере NAS инициирует сессию аккаун- modules {
тинга, по завершении которой выдаются итоговые дан- $INCLUDE ${confdir}/sqlcounter.conf
ные. Данные учёта могут анализироваться внешними си-
стемами или самим radius-сервером. Приведу простой и включаем счётчик в секцию авторизации:
пример – организацию учёта через mysql:
 в секции аккаунтинга файла radiusd.conf должен быть authorize {
...
модуль sql; noresetcounter
 в настройках mysql (sql.conf) должна быть определена dailycounter
monthlycounter
таблица для учёта: }

# Äëÿ çàïèñåé î íà÷àëå ñåññèè После этого счётчик не будет давать проходить авто-
acct_table1 = "radacct"
# Äëÿ çàïèñåé î êîíöå ñåññèè ризацию пользователям, исчерпавшим свой лимит вре-
acct_table2 = "radacct" мени. Для установления граничных значений счётчиков

№4(5), апрель 2003 11


администрирование
используется таблица radcheck. Приведу некоторые при- заставить с radius работать?» Но это как раз одна из са-
меры применения этой таблицы: мых тривиальных частей настройки. Для начала добавля-
Пользователь test1 может работать 15 часов (54000 се- ем запись в clients.conf, соответствующую IP-адресу дан-
кунд), тогда запись проверки данного пользователя долж- ного маршрутизатора и на последнем указываем пара-
ны выглядеть примерно так: метры radius-сервера (учтите, что ключ симметрического
шифрования aka secret должен совпадать на маршрути-
test1 Max-All-Session := 54000, User-Password == "<cut>" заторе и в файле clients.conf):
Service-Type = Framed-User,
Framed-Protocol = PPP
# configure terminal
# aaa new-model
Вносим AV-пару Max-All-Session для пользователя: # ip radius source-interface Ethernet0
# radius-server host {hostname | ip-address} [auth-port ↵
port-number]
> INSERT into radcheck VALUES ('','test1', ↵
'Max-All-Session',':=','54000'); [acct-port port-number] [timeout seconds] [retransmit ↵
retries] [key string]
Отметьте использование оператора :=. Таким образом # aaa authorization network radius
атрибут Max-All-Session будет приобретать значение по # aaa authorization exec radius
# aaa authentication login radius_auth local radius
умолчанию 54000. Можно также устанавливать пороги # aaa authentication ppp ppp_auth radius
счетчика не для одного пользователя, а для группы – для # line [console | tty | vty] line-number [ending-line-number]
(line)# login authentication radius_auth
этого используется таблица radgroupcheck. В общем, ос- (line)# exit
новной смысл записей в таблицах – установка значения # interface async 6
(interface)# ppp authentication {chap | pap} ppp_auth
атрибута, заданного в параметре счётчика check-name. (interface)# exit
Ещё учтите, что модуль sqlcounter работает, только если # aaa accounting network start-stop radius
# aaa accounting connection start-stop radius
данные аккаунтинга направляются в sql. # aaa accounting update periodic 1
Кроме sqlcounter есть ещё обыкновенный счётчик –
counter. Его использование очень похоже на sqlcounter, Ну вот, собственно, и всё. Список полезных сайтов:
за исключением того, что обыкновенный счётчик выпол- http://www.freeradius.org – сайт одноимённого radius-
няет функции модуля аккаунтинга и авторизации одно- сервера, есть интересные ссылки на другие ресурсы и
временно. Я не буду подробно останавливаться на этой списки рассылок.
теме по ряду причин. Желающие могут прочитать в кон- http://www.cisco.com – поиск слова radius выдаёт
фигурационном файле radiusd.conf подробные коммен- жидковатенький список, где, впрочем, есть весьма по-
тарии к этому модулю. лезный документ «Configuring RADIUS Servers». Здесь
Очень важным недостатком вышеописанных счётчи- данная уважаемая фирма даёт свои рекомендации по
ков является отсутствие возможности отключить пользо- настройке своего оборудования для работы с radius, а
вателя во время сессии при исчерпании его активов. Как также свои соображения о применимости radius в той
было отмечено, счётчики работают на этапе авторизации, или иной ситуации. Советую почитать всем сомневаю-
но никто не помешает пользователю, допустим, начать щимся.
сессию и просидеть в день 24 часа из положенных 3-х. На http://soft.risp.ru/index.html – radacct сервер + много
следующий день счётчик может сброситься, и пользова- дополнительных утилит для ISP.
тель будет работать дальше. Не думаю, что это хорошо. ftp://ftp.inep.net/pub/unix/radpppd.tgz – pppd для
Для решения этой проблемы используются различные FreeBSD с поддержкой radius.
биллинговые системы, основанные на управлении NAS http://sply.piter.net – ещё один патч для pppd для под-
при помощи SNMP. Одним из решений является исполь- держки radius (в том числе системы учёта).
зование отдельного сервера аккаунтинга (а затем на- http://www.google.com – STFW! Протокол молодой, по-
строить соответствующим образом перенаправление па- этому информацию приходится собирать с миру по нитке.
кетов аккаунтинга в файле proxy.conf с помощью дирек- Если вы ищете качественный коммерческий сервер, то
тивы accthost). Одним из таких серверов является radacct вам прямой путь сюда.
(http://soft.risp.ru/index.html). Отличительной особеннос-
тью является возможность работы с любым radius-сер- Всем, кто решил работать с radius, советую подпи-
вером (учтите, что radacct не должен использовать тот саться на рассылки (см. www.freeradius.org), где очень
же порт, что и radius-сервер) и замечательная докумен- много отзывчивых людей и, что меня удивило, доволь-
тация на русском языке (http://soft.risp.ru/radacct/ но много русских (хотя это не повод писать в рассылку
docs.shtml). Сервер действительно рабочий и компили- по-русски).
руется без проблем после ручной правки Makefile (нуж- P.S. Данная статья написана в стиле HOWTO. Я не
но раскомментировать строки, касающиеся вашей сис- привожу готовых примеров работы и не даю шаблонов
темы). Так как radacct написан нашими программиста- для действия. Моя статья – попытка соединить разроз-
ми и имеет русскую документацию, то описывать его в ненную документацию и собственный опыт. Искренне
данной статье я не буду. надеюсь, что мой HOWTO поможет кому-нибудь в на-
На этом можно было бы и завершить, но... Некоторые стройке своего radius-сервера. Ещё надеюсь, что кто-
зададут совершенно закономерный вопрос: «А что нам с нибудь из администраторов ISP поделится готовым при-
этого, у меня маршрутизатор в коробке лежит, а как его мером работы radius.

12
FAQ Shell

ВОПРОС: ВОПРОС:
Как присвоить переменной результат выполнения коман- Как выполнять арифметические действия над перемен-
ды? ными?
ОТВЕТ: ОТВЕТ:
Вопрос можно истолковать по-разному. Если имеется в Все переменные в shell являются строками, но существует
виду присвоить переменной код завершения програм- возможность оценки числовых выражений. Для объявления
мы, то используется следующий синтаксис: числовой переменной можно воспользоваться командой let:

./some_prog let a=6


RESULT=$? let b=a*2
let c=a%4
let d=c/2
echo a=$a
На практике чаще используется проверка правильнос- echo b=$b
ти выполнения последней команды с помощью перемен- echo c=$c
echo d=$d
ной $? (при успешном завершении обычно возвращает-
ся нуль): Результат работы:

./some_prog a=6
if [ $? ne 0 ] b=12
then c=2
echo Bad exit code d=1
exit
fi
Второй способ – оценка cтроковых выражений командой
У некоторых возникнет искушение сделать нечто подоб- expr:
ное:
$a=2
echo Error!!! $b=2
exit $? expr $a + $b

Но к сожалению, такой вариант всегда возвращает нуль, Выведет число 4. Заметьте, что просто $a + $b будет пре-
т.к. последней командой было echo. В качестве реше- образовано в 2 + 2.
ния проблемы можно присваивать код завершения со-
мнительной программы некой переменной, а потом без- ВОПРОС:
боязненно с ней обращаться (учтите, операторы провер- Что означают перенаправления в циклах?
ки [] также изменяют код завершения). Если же в дан- ОТВЕТ:
ном вопросе имелся в виду не код завершения програм- Смысл такой: после каждого шага цикла значение пере-
мы, а то что было выведено программой в stdout, тогда менной цикла считывается или передаётся в конвейер.
необходимо заключить команду в обратные кавычки: Пример удаления всех исполняемых файлов, если им со-
ответствуют файлы .c (т.е. удаление объектных файлов):
DATE=`date`
for x in *; do [ -x $x -a -f $x.c ] && echo $x; done |
xargs rm -f
ВОПРОС:
Заметьте, что если последняя команда цикла ложна, то
Где можно найти полное описание встроенных перемен-
перенаправления переменной цикла не происходит. В
ных bash?
данном примере используется именно эта возможность.
ОТВЕТ:
ht tp://ln.com.ua/~openxs/projects/man/solaris8/
ВОПРОС:
bash.html#variables
Как экранировать кавычки?
ОТВЕТ:
ВОПРОС:
Вопрос заслуживает отдельного внимания, например, ког-
Существует ли простой способ программно создать файл,
да внутри кавычек есть другие кавычки:
содержащий несколько строк?
 двойные(") – экранируются обратным слэшем, напри-
ОТВЕТ:
мер echo "\"" выведет просто символ ";
Да, существует. Это очень часто употребляемый прием
 одинарные(') – обратный слэш не спасает – приходит-
для создания многострочных файлов с возможностью под-
ся использовать восьмеричный код символа 047: echo
становки переменных скрипта:
'\047$PATH\047' выведет '$PATH', в Linux необходимо
cat > cfg <<EOT для echo указать опцию -е;
name = $a
And this file was generated with $EDITOR many other
 обратные(`) – экранируются аналогично двойным, т.е.
lines... ... обратным слэшем.
EOT
Составил Всеволод Стахов

№4(5), апрель 2003 13


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

СОЗДАЕМ
VPN

НА ОСНОВЕ
VTUN
14
администрирование
Компания, в которой я работаю, довольно быстро разви-
вается, появляются новые филиалы, соответственно, уве-
личивается количество внутренних сетей. Настал момент,
когда появилась необходимость соединить эти разрознен-
ные сети в единое пространство. Нам нужна надежная,
безопасная и защищенная от «подглядывания» система
связи. Единственной возможностью выполнить все
предъявленные требования является создание своей кор-
поративной VPN. В сети так много сайтов, объясняющих
каждому, как престижно иметь в своем распоряжении
VPN. Но ни один из них не публикует детального описа-
ния, как этого добиться. Побродив несколько дней по про-
сторам Интернета, но так и не найдя подробного описа-
ния процесса развертывания VPN, решил написать об
этом сам.
Я буду использовать vtun, написанный Максимом Крас-
нянским на основе пакета VPPP. Главная страница про-
екта vtun находится по адресу: http://vtun.sourceforge.net.
Вы можете спросить, почему именно vtun. Ведь можно
было использовать что-либо вроде PPP поверх SSH,
IPSEC или GRE. Возможно, в ближайшее время я напишу
о работе с IPSEC или OpenVPN. Главными достоинства-
ми vtun являются простота в установке, гибкость настрой-
ки и отличная документация. Vtun достаточно хорошо за-
щищает от атак, основанных на действиях злоумышлен-
ника, находящегося между двумя машинами туннеля. Этот
тип атак обычно называют MIM (Men In the Middle), чаще
всего злоумышленник пытается выполнить одно или не-
сколько из следующих действий – изменить содержимое
передаваемых пакетов, повторно проиграть записанную
последовательность пакетов, выдать себя за одну из сто-
рон, участвующих в передаче данных.
Поддерживаются разнообразные типы туннелей IP,
Ethernet, PPP, SLIP. В качестве туннеля можно использо-
вать даже pipe и TTY. Для шифрования потока данных
используется OpenSSL. Доступны алгоритмы blowfish с
ключом в 128 бит или MD5 с ключом той же длины. Комп-
рессия потока производится с помощью библиотек lzo или
zlib. Следует отметить, что zlib работает только с tcp-тун-
нелями. Если в вашей операционной системе нет библио-
тек zlib или lzo, и вы не смогли установить их самостоя-
тельно, значит придется отключить компрессию. Это сни-
зит скорость передачи данных. Но все же не окажет ре-
шающего влияния на работу vtun. Официально vtun рабо-
тает на следующих операционных системах: Linux, Solaris,
FreeBSD, NetBSD, OpenBSD и другие BSD-клоны. В прин-
ципе vtun должен работать на любой платформе, для ко-
торой есть универсальный драйвер tun/tap. Устройство tun
используется для туннелирования IP-фреймов, а tap со-
ответственно для Ethernet-фреймов. С помощью tun/tap
пользовательские программы получают возможность са-
мостоятельно обрабатывать IP-пакеты. Для некоторых
операционных систем необходимо перекомпилировать
ядро с поддержкой tun/tap-устройств. Vtun работает на
основе клиент-серверной модели. Соответственно, для
создания туннеля на одном из хостов, демон vtun должен
быть запущен как сервер, а на другом как клиент.
АНДРЕЙ БЕШКОВ Если между клиентом и сервером находится брандма-
уэр, значит необходимо разрешить прохождение пакетов,

№4(5), апрель 2003 15


администрирование
адресованных на порт 5000. Попытки провести vpn-тун- ние будет особо заостряться на отличиях. Это должно дать
нель через систему с NAT, скорее всего, завершатся фа- возможность легко поставить и настроить vtun для любой
тально. Проблема в том, что NAT изменяет содержимое из трех обсуждаемых систем.
проходящих пакетов. Поэтому ни один пакет не пройдет Под FreeBSD установить vtun можно тремя способа-
проверку контрольной суммы. ми: с помощью пакетов, через порты или ручным спосо-
После запуска демон, выполняющий роль сервера, по бом. Мне больше нравится третий вариант, так как он дает
умолчанию начинает слушать порт 5000. При попытке гораздо большую возможность для контроля над проис-
подсоединиться на этот порт происходит аутентификация ходящим. Итак, приступим к установке программного
клиента на основе пароля, записанного в конфигураци- обеспечения по третьему способу.
онном файле /usr/local/etc/vtund.conf. Пароль применяет- Берем исходник портированной библиотеки lzo отсю-
ся для аутентификации клиента всего лишь один раз на да http://www.freebsd.org/cgi/pds.cgi?ports/archivers/lzo.
протяжении всей сессии. После успешной аутентифика- Если не удалось скачать, то берем дистрибутив здесь:
ции сервер с помощью функции fork запускается еще один http://www.oberhumer.com/opensource/lzo/. Распаковываем
демон vtun, которому передается клиентское соединение. и собираем в комплектации по умолчанию.
Новый демон будет существовать до тех пор, пока соеди-
нение не будет разорвано. В то же время родительский # tar zxvf lzo-1.08.tar.gz
# cd lzo-1.08
демон продолжает ждать новых соединений. Это значит, # ./configure
что единственный демон может обслуживать множество # make
# make check
одновременных подключений. Количество поддерживае- # make test
мых соединений зависит только от мощности процессора # make install
и наличия оперативной памяти.
С помощью ключей командной строки можно указать Скачиваем исходный код vtun. Конфигурируем его c
другое местоположение конфигурационного файла. Это указанием, где искать библиотеки и заголовочные фай-
дает нам возможность запустить на одном хосте несколь- лы библиотеки lzo.
ко демонов vtun, ожидающих соединений на разных пор-
тах. Каждый из демонов будет использовать собственные # tar zxvf vtun-2.5.tar.gz
# cd vtun
настройки. Соответственно, некоторые из них могут быть # ./configure —with-lzo-headers=/usr/local/include/ —
серверами, а другие клиентами. Это дает нам возмож- with-lzo-lib=/usr/local/lib
ность развернуть множество не пересекающихся между
собой VPN. Случается, что команда ./configure завершается с

Давайте представим, что у нас есть филиал, магазин


и офис, использующие адреса из пространства частных
сетей. Необходимо эти подразделения соединить с помо-
щью VPN. Для этих целей мы будем использовать реаль-
ные IP-адреса, выданные нам провайдером из сети
80.80.20.0. Для соединения сетей нам понадобятся три
компьютера. На каждом из них будет по три сетевых ин-
терфейса. Два реальных и один виртуальный. Более под-
робно это показано в приведенной выше таблице.
Схема соединения сетей – на рисунке.
Это значит, что каждая из наших сетей может напря-
мую взаимодействовать с двумя другими. Далее мы опи-
шем установку vtun для каждой из операционных систем.
Клоны BSD-систем, в отличие от Linux, сразу после уста-
новки по умолчанию имеют работающее и правильно на-
строенное устройство tun. Поэтому для FreeBSD нам не
придется его создавать. По большей части установка оди-
накова для всех систем. Наиболее подробно будет обсуж-
даться процедура установки программного обеспечения
для FreeBSD по причине наибольшей любви к этой систе-
ме. В описаниях инсталляции для других систем внима-

16
администрирование
ошибкой. Вероятнее всего, это означает, что система не Разделы options и default являются глобальными и ос-
смогла обнаружить библиотеку lzo. Если вам не удастся таются неизменными на протяжении всего конфигураци-
самостоятельно избавиться от этой ошибки, значит при- онного файла. Это значит, что параметры, установлен-
дется отключить поддержку lzo. Vtun может работать и ные внутри этих разделов, влияют на все последующие
без библиотеки lzo. Для этого выполните команду: блоки конфигурационного файла. Давайте подробно рас-
смотрим содержимое вышеназванных разделов.
# ./configure —disable-lzo  port – номер порта, на котором демон будет ждать вхо-
дящие соединения от клиентов;
А затем, как положено, выполняем компиляцию и ус-  ifconfig – путь к программе ifconfig. Эта программа не-
тановку. обходима для управления сетевыми интерфейсами;
 route – путь к программе route. Используется для ра-
# make боты с маршрутами прохождения сетевых пакетов;
# make install
 compress – опция управления сжатием передаваемых
Если все прошло гладко, значит пришло время занять- данных. Может принимать значения lzo, zlib и no. Этой
ся конфигурационными файлами каждой из трех машин. опцией можно указать, какую библиотеку мы будем
В нашем случае машина vpn_office будет выполнять роль использовать для компрессии потока. Второе значе-
сервера, соответственно, vpn_filial и vpn_shop станут кли- ние описывает степень сжатия. Чем больше число, тем
ентами. Конфигурационный файл vtun для FreeBSD нахо- сильнее будет сжатие. Но в то же время стоит помнить:
дится в директории /usr/local/etc/vtund.conf. верхние значения сжатия заставят демона потреблять
Давайте посмотрим, из чего состоит конфигурацион- гораздо больше ресурсов процессора . Максимальное
ный файл хоста vpn_office. значение сжатия равно 9. Если компиляцию с поддер-
жкой lzo выполнить не удалось, то можно отключить
сжатие, установив значение compress no;
options {
port 5000;  speed – ограничение, накладываемое на скорость пе-
ifconfig /sbin/ifconfig; редачи данных. Позволяет притормозить передачу дан-
route /sbin/route;
} ных особо жадных до трафика клиентов;
 pass – пароль, используемый при аутентификации вхо-
default { дящего соединения;
compress lzo:9;
speed 0;
 type – тип соединения. Может принимать значения tun,
} ether, pipe, tty;
filial {{ # îïèñûâàåì êëèåíòà ôèëèàë  proto – описывает протокол, используемый для пере-
pass secret; дачи данных. Может принимать значения udp и tcp;
type tun;
proto udp;
 encr – включаем шифрование соединения. Может при-
encr yes; нимать значения no или yes;
keepalive yes;  keepalive – пытаться восстанавливать соединение, если
оно будет прервано. Может принимать значения no или
yes.
up {
ifconfig "%% 192.168.0.2 192.168.0.1 netmask Секция up описывает действия, выполняемые при удач-
255.255.255.255 mtu 1450 up"; ном соединении. Рассмотрим ее на примере клиента filial.
route "add -net 192.168.20.0/24 192.168.0.1";
}; Внутри мы описываем способ конфигурирования вирту-
ального интерфейса с адресом 192.168.0.2. Затем привя-
down {
ifconfig "%% down"; зываем этот интерфейс соединением типа точка точка к
route "delete 192.168.20.0"; другому виртуальному интерфейсу 192.168.0.1. И завер-
};
} шаюшим штрихом настраиваем маршрутизацию для сети
192.168.20.0/24 через интерфейс с адресом 192.168.0.1.
Также стоит рассмотреть секцию down, описывающую
shop { # îïèñûâàåì êëèåíòà ìàãàçèí действия, выполняемые при разрыве соединения. Нам
pass secret;
type tun;; необходимо удалить виртуальный интерфейс tun и разру-
proto udp; шить маршрутизацию для сети 192.168.40.0/24.
encr yes;
keepalive yes; Комбинацией опций type и proto можно создать раз-
ные виды туннелей:
up {
ifconfig "%% 192.168.0.2 192.168.0.3 netmask Ethernet-туннель
255.255.255.255 mtu 1450 up";
route "add -net 192.168.40.0/24 192.168.0.3"; type ether ;
}; proto udp;
down { up {
ifconfig «%% xxxxxxxx»;
ifconfig "%% down"; };
route "delete 192.168.40.0";
};
} Ethernet-туннель позволяет работать с любым прото-
колом, работающим поверх Ethernet. Например, IP, IPX,

№4(5), апрель 2003 17


администрирование
Appletalk, DECnet. Компрессию можно производить, ис- # cd lzo-1.08
пользуя lzo. Если lzo не работает, то нужно установить # ./configure
# make
proto tcp и compress zlib. # make check
IP-туннель # make test
# make install
type tun; Постепенно мы добрались и до vtun, обратите особое
proto udp;
up { внимание на ключи команды configure.
ifconfig "%% xxxxxxxx";
}; # tar zxvf vtun-2.5.tar.gz
# cd vtun
SLIP- или PPP-туннель # ./configure —with-lzo-headers=/usr/local/include/ —
with-lzo-lib=/usr/local/lib —with-ssl-lib=/usr/local/lib —
type tcp; with-ssl-headers=/usr/local/include/openssl
proto udp; # make
# make install
up {
ifconfig "%% xxxxxxxx";
};
Если компиляция прошла без ошибок, значит мы сде-
pipe- или TTY-туннель лали все правильно и можем переходить к конфигуриро-
ванию vtun. Файл настроек vtun находится в /usr/local/etc/
type tun; vtund.conf. Вносим в него следующие:
proto tcp;
up {
program /xx/xx "xyyyyyyyyy"; options {
}; port 5000;
ifconfig /usr/sbin/ifconfig;
TTY- или pipe-туннель может работать с любыми про- route /usr/sbin/route;
}
граммами. Возможно применение сжатия, шифрования и
даже ограничения пропускной способности. Для туннеля
default {
типа pipe лучше всего использовать протокол proto tcp. compress lzo:9;
Можно, конечно, использовать и proto udp, но работать speed 0;
}
такой туннель будет нестабильно.
Итак, разобравшись с основной теорией работы тун-
shop {
неля, давайте перейдем к настройке хоста vpn_shop. pass secret;
Машина vpn_shop работает под управлением Solaris type tun;
proto udp;
2.7. Для нее установка программного обеспечения будет encr yes;
немного отличаться. Кроме упомянутых раньше lzo и vtun, keepalive yes;
нам понадобятся исходные коды универсального TUN/TAP-
драйвера и библиотеки OpenSSL. # îáðàòèòå âíèìàíèå íà ñèíòàêñèñ êîìàíä ifconfig è route
Процедура установки универсального TUN/TAP драй- # åñòü îòëè÷èÿ îò FreeBSD â îáîçíà÷åíèè ñåòåé,
вер хорошо автоматизирована и довольно-таки проста: # à òàêæå â ñîçäàíèè è ðàçðóøåíèè ðîóòèíãà

# tar zxvf tun-1.0.tar.gz up {


# cd tun-1.0 ifconfig "%% 192.168.0.3 netmask 255.255.255.0
# ./configure 192.168.0.2 up";
# make install route "add net 192.168.30.0 192.168.0.2 1";
};

В стандартной поставке Solaris 2.7 OpenSSL отсутству- down {


ifconfig "%% down";
ет, как и библиотека lzo, поэтому будем ставить их сами. route "delete net 192.168.30.0 192.168.0.2 1";
Взять дистрибутив OpenSSL можно на сайте проекта };
}
openssl.org. С помощью ключей указываем, что библио-
теки должны установиться в /usr/local/lib, заголовочные Для того чтобы при первом соединении с другими ма-
файлы по умолчанию в /usr/local/include/openssl, а все ос- шинами команда route отработала корректно, нужно до-
тальное в /usr/local/openssl. бавить в файл /etc/netmasks запись такого вида:

# tar openssl-0.9.5a.tar.gz 192.168.30.0 255.255.255.0


# cd openssl-0.9.5a
# ./configure —prefix=/usr/local —openssldir=/usr/local/
openssl Закончив с Solaris, примемся за работу над Linux. К
# make
# make test сожалению, с ним все не так просто, как с двумя преды-
# make install дущими системами. Перед тем как воспользоваться ус-
лугами vtun, нужно вручную создать устойство tun, в стан-
Пришло время собрать lzo. Как всегда, делаем это дартной поставке оно отсутствует. Наш Linux работает на
вручную: ядре версии 2.4. Значит файл устройства будет находиться
в /dev/net/tun. Создадим нужное нам устройство с помо-
# tar zxvf lzo-1.08.tar.gz щью команды:

18
администрирование
# mknod /dev/net/tun c 10 200 up {
ifconfig "%% 192.168.0.1 pointopoint 192.168.0.2 mtu
Установка программного обеспечения под Debian дли- 1450";
лась дольше всего и для меня превратилась в долгую и route "add -net 192.168.30.0/24 192.168.0.2";
};
мучительную процедуру. С помощью apt-get ставим па-
кет vtun, поставлявшийся вместе с Debian. Заставить его down {
ifconfig "%% down";
работать мне так и не удалось. Но ставить все равно сто- route "delete -net 192.168.30.0";
ит, потому что он разложит необходимые файлы по мес- };
}
там и создаст между ними нужные взаимосвязи.
Скачать все конфигурационные файлы можно здесь:
# apt-get install vtun http://onix.opennet.ru/files/vtun-cfg.tar.gz.
В связи с тем, что в файлах vtund.conf находится пароль
Путем чтения документации и общения с друзьями соединения, доступ к ним должен иметь только пользова-
было выяснено, что для того чтобы все заработало, необ- тель root. После всех этих манипуляций можно запускать vtun.
ходимо установить пакеты разработчика liblzo-dev и libssl- На машине vpn_office запускаем демон в режиме сервера.
dev. Что мы с радостью и выполняем.
vpn_office# vtund -s
# apt-get install liblzo-dev
# apt-get install libssl-dev
На другой консоли смотрим на сообщения об ошибках.
Заметного сдвига это не принесло, и я принялся рыс-
кать в поисках решения по Интернету. Постепенно при- vpn_office# tail -f /var/log/messages
шло понимание, что таких бедолаг, как я, довольно мно-
го. После более тщательного исследования выяснилось, Если ошибок не появилось, значит все у нас хорошо.
что из-за изменений, внесенных в ядро на пути к версии Соответственно, на хостах vpn_shop и vpn_filial запуска-
2.4, vtun пакет от Debian и не должен был работать. Те- ем демоны в режиме клиента.
перь нам нужно установить пакет демона vtund.
vpn_shop# vtund -p shop 80.80.20.2
vpn_filial# vtund -p filial 80.80.20.2ô
# apt-get install vtund
Снова ждем ошибок. Не дождавшись, смотрим, какие
После всех этих приключений берем стандартный ди- сетевые интерфейсы у нас подняты на каждой из машин.
стрибутив vtun, используемый нами для остальных сис- Больше всего нас интересуют интерфейсы vtun0 и vtun1.
тем, и компилируем его с настройками по умолчанию. У вас должны получиться примерно такие данные:
Скомпилировав исходный код, команду make install не вы- vpn_office# ifconfig -u
полняем. Вместо нее вручную заменяем старый выполня-
ed0: flags=8843 mtu 1500
емый файл, находящийся в директории /usr/local/sbin/, сво- inet 192.168.30.251 netmask 0xffffff00 broadcast 192.168.30.255
им новым файлом. inet6 fe80::280:48ff:fedf:66f7%ed0 prefixlen 64 scopeid 0x1
ether 00:80:48:df:66:f7
Для ядра 2.4 необходимо, чтобы модуль поддержки tun ed1: flags=8843 mtu 1500
был загружен в оперативную память. Такого результата inet 80.80.20.2 netmask 0xffffff00 broadcast 80.80.20.255
inet6 fe80::240:95ff:fe45:9ce2%ed1 prefixlen 64 scopeid 0x2
можно добиться с помощью команды modprobe tun. Пос- ether 00:40:95:45:9c:e2
ле этого нам необходимо включить поддержку vtun в ядре. lo0: flags=8049 mtu 16384
inet6 ::1 prefixlen 128
Ищем в тексте ядра строку Universal TUN/TAP device driver inet6 fe80::1%lo0 prefixlen 64 scopeid 0x5
(CONFIG_TUN). Я думаю, вы знаете, что нужно делать, inet 127.0.0.1 netmask 0xff000000
tun0: flags=8051 mtu 1450
чтобы пересобрать ядро. После этого в конфигруацион- inet6 fe80::280:48ff:fedf:66f7%tun0 prefixlen 64 scopeid 0x8
ный файл vtun нужно внести такой текст. inet 192.168.0.2 --> 192.168.0.3 netmask 0xffffffff
Opened by PID 1143
tun1: flags=8051 mtu 1450
options { inet6 fe80::280:48ff:fedf:66f7%tun1 prefixlen 64 scopeid 0x9
port 5000; inet 192.168.0.2 --> 192.168.0.1 netmask 0xffffffff
ifconfig /sbin/ifconfig; Opened by PID 1150
route /sbin/route;
}
vpn_shop# ifconfig -a
lo0: flags=849 <UP,LOOPBACK,RUNNING,MULTICAST> mtu 8232
default { inet 127.0.0.1 netmask ff000000
le0: flags=863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST> mtu 1500
compress lzo:9; inet 192.168.40.251 netmask ffffff00 broadcast 192.168.40.255
speed 0; ether 00:80:48:b6:43:5f
} le1: flags=863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST> mtu 1500
inet 80.80.20.3 netmask ffffff00 broadcast 80.80.20.255
ether 00:02:b3:65:0f:47
filial { tun0: flags=8d1<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
pass secret; inet 192.168.0.3 --> 192.168.0.2 netmask ffffffff
type tun; ether 0:0:0:0:0:0
proto udp;
encr yes;
keepalive yes; vpn_filial# /sbin/ifconfig

№4(5), апрель 2003 19


администрирование
vpn_office# ifconfig -u --- 192.168.30.251 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
ed0: flags=8843 mtu 1500 round-trip min/avg/max = 5.683/5.720/5.788 ms
inet 192.168.30.251 netmask 0xffffff00 broadcast 192.168.30.255
inet6 fe80::280:48ff:fedf:66f7%ed0 prefixlen 64 scopeid 0x1
ether 00:80:48:df:66:f7 vpn_office# ping 192.168.40.251
ed1: flags=8843 mtu 1500 PING 192.168.30.251 (192.168.30.251): 56 data bytes
inet 80.80.20.2 netmask 0xffffff00 broadcast 80.80.20.255 64 bytes from 192.168.40.251: icmp_seq=0 ttl=64 time=6.092 ms
inet6 fe80::240:95ff:fe45:9ce2%ed1 prefixlen 64 scopeid 0x2 64 bytes from 192.168.40.251: icmp_seq=1 ttl=64 time=5.785 ms
ether 00:40:95:45:9c:e2 64 bytes from 192.168.40.251: icmp_seq=2 ttl=64 time=5.851 ms
lo0: flags=8049 mtu 16384 64 bytes from 192.168.40.251: icmp_seq=3 ttl=64 time=5.826 ms
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x5 --- 192.168.30.251 ping statistics ---
inet 127.0.0.1 netmask 0xff000000 4 packets transmitted, 4 packets received, 0% packet loss
tun0: flags=8051 mtu 1450 round-trip min/avg/max/stddev = 5.785/5.888/6.092/0.120 ms
inet6 fe80::280:48ff:fedf:66f7%tun0 prefixlen 64 scopeid 0x8
inet 192.168.0.2 --> 192.168.0.3 netmask 0xffffffff Судя по всему, туннели исправно передают пакеты в
Opened by PID 1143
tun1: flags=8051 mtu 1450 обе стороны и все работает наилучшим образом. Теперь
inet6 fe80::280:48ff:fedf:66f7%tun1 prefixlen 64 scopeid 0x9 давайте проверим, как работает шифрование. Нужно по-
inet 192.168.0.2 --> 192.168.0.1 netmask 0xffffffff
Opened by PID 1150 смотреть, что и в каком виде передается по интерфейсам
tun0 – 192.168.0.2 и ed1 – 80.80.20.2. Давайте начнем про-
vpn_shop# ifconfig -a слушивание интерфейсов, участвующих в передаче дан-
lo0: flags=849 <UP,LOOPBACK,RUNNING,MULTICAST> mtu 8232 ных, с помощью программы tcpdump. В то же время с ма-
inet 127.0.0.1 netmask ff000000
le0: flags=863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST> mtu 1500 шины vpn_shop начинаем пинговать интерфейс
inet 192.168.40.251 netmask ffffff00 broadcast 192.168.40.255 192.168.40.251, принадлежащий машине vpn_office.
ether 00:80:48:b6:43:5f
le1: flags=863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST> mtu 1500
inet 80.80.20.3 netmask ffffff00 broadcast 80.80.20.255 vpn_office# tcpdump -i tun0 -lenx
ether 00:02:b3:65:0f:47 13:33:14.573619 AF 2 84: 192.168.0.2 > 192.168.40.251: icmp:
tun0: flags=8d1<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500 echo request
inet 192.168.0.3 --> 192.168.0.2 netmask ffffffff 4500 0054 0cc3 0000 4001 c398 c0a8 0002
ether 0:0:0:0:0:0 c0a8 28fb 0800 edcc c904 0000 ede7 cc3d
9505 0700 0809 0a0b 0c0d 0e0f 1011 1213
1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
vpn_filial# /sbin/ifconfig 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
lo Link encap:Local Loopback 3435 3637
inet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0 13:33:14.573665 AF 2 84: 192.168.40.251 > 192.168.0.2: icmp:
UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1 echo reply
RX packets:13072 errors:0 dropped:0 overruns:0 frame:0 4500 0054 1b3f 0000 4001 b51c c0a8 28fb
TX packets:23921 errors:0 dropped:0 overruns:0 carrier:0 c0a8 0002 0000 f5cc c904 0000 ede7 cc3d
Collisions:0 9505 0700 0809 0a0b 0c0d 0e0f 1011 1213
1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
eth0 Link encap:Ethernet HWaddr 00:80:48:c7:c7:9b 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
inet addr:192.168.20.251 Bcast:192.168.20.255 3435 3637
Mask:255.255.255.0 13:33:15.583143 AF 2 84: 192.168.0.2 > 192.168.40.251: icmp:
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 echo request
RX packets:78 errors:0 dropped:0 overruns:0 frame:10 4500 0054 0cc6 0000 4001 c395 c0a8 0002
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0 c0a8 28fb 0800 42a6 c904 0100 eee7 cc3d
Collisions:0 3e2c 0700 0809 0a0b 0c0d 0e0f 1011 1213
Interrupt:3 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
eth1 Link encap:Ethernet HWaddr 00:02:2e:f1:17:26 3435 3637
inet addr:80.80.20.1 Bcast:80.80.20.255 Mask:255.255.255.0 13:33:15.583194 AF 2 84: 192.168.40.251 > 192.168.0.2: icmp:
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 echo reply
RX packets:49 errors:1 dropped:0 overruns:0 frame:15 4500 0054 1b43 0000 4001 b518 c0a8 28fb
TX packets:22 errors:0 dropped:0 overruns:0 carrier:0 c0a8 0002 0000 4aa6 c904 0100 eee7 cc3d
Collisions:1 3e2c 0700 0809 0a0b 0c0d 0e0f 1011 1213
Interrupt:4 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
tun0: Link encap:Point-to-Point Protocol 3435 3637
inet addr:192.168.0.1 P-t-P: 192.168.0.2 13:33:16.590000 AF 2 84: 192.168.0.2 > 192.168.40.251: icmp:
Mask:255.255.255.0 echo request
UP POINTPOINT RUNNING NOARP MULTICAST MTU:1500 4500 0054 0cc6 0000 4001 c395 c0a8 0002
Metric:1 c0a8 28fb 0800 42a6 c904 0100 eee7 cc3d
RX packets:155 errors:0 dropped:0 overruns:0 frame:15 3e2c 0700 0809 0a0b 0c0d 0e0f 1011 1213
TX packets:162 errors:0 dropped:0 overruns:0 carrier:0 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
Collisions:0 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
3435 3637
13:33:16.590120 AF 2 84: 192.168.40.251 > 192.168.0.2: icmp:
Теперь можно попробовать, как работает наша вирту- echo reply
4500 0054 1b43 0000 4001 b518 c0a8 28fb
альная частная сеть. Выполним команду ping на хостах c0a8 0002 0000 4aa6 c904 0100 eee7 cc3d
vpn_filial и vpn_office. Таким образом мы сможем прове- 3e2c 0700 0809 0a0b 0c0d 0e0f 1011 1213
1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
рить прохождение пакетов от vpn_filial к vpn_office и от 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
vpn_shop к vpn_office. 3435 3637

vpn_filial# ping 192.168.30.251 На предыдущем листинге явно видно содержимое те-


PING 192.168.30.251 (192.168.30.251): 56 data bytes
64 bytes from 192.168.30.251: icmp_seq=0 ttl=64 time=5.788 ms стовых ICMP-пакетов. А теперь внимательно посмотрим,
64 bytes from 192.168.30.251: icmp_seq=1 ttl=64 time=5.724 ms в каком виде эти пакеты путешествуют по небезопасной
64 bytes from 192.168.30.251: icmp_seq=2 ttl=64 time=5.683 ms
64 bytes from 192.168.30.251: icmp_seq=3 ttl=64 time=5.685 ms сети 80.80.20.0/24.

20
администрирование
vpn_office# tcpdump -i ed1 -lenx В файл конфигурации хоста vpn_shop добавим на-
13:33:14.573441 0:40:95:45:9c:e2 0:2:b3:65:f:47 0800 140: стройки нового туннеля. Я надеюсь, что вы уже можете
80.80.20.2.5000 > 80.80.20.3.1035: udp 98
4500 007e 0cc4 0000 4011 a506 5050 1402 самостоятельно разобраться в том, что они значат.
5050 1403 1388 040b 006a f9e2 0060 7db0
f6ef dd81 4638 917a 5a80 7f48 87d7 7bc9 filial_to_shop {
459f 97f0 b95a 95cf 87b1 29ce b2d7 8f50 pass secret;
228e 6b8f eafb 1f5d ae9d 7518 2085 2da9
8c85 type tun;
proto udp;
13:33:14.574798 0:2:b3:65:f:47 0:40:95:45:9c:e2 0800 140: encr yes;
80.80.20.3.1035 > 80.80.20.2.5000: udp 98
4500 007e 1b40 0000 4011 968a 5050 1403 keepalive yes;
5050 1402 040b 1388 006a 998c 0060 7db0
f6ef dd81 4638 5390 c84e 886e 466d ffcd
df10 9010 5995 fcdd b315 92fb 6a1d 8f50 up {
228e 6b8f eafb 1f5d ae9d 7518 2085 2da9 ifconfig "%% 192.168.0.3 netmask 255.255.255.0 192.168.0.1 up";
8c85
13:33:15.582910 0:40:95:45:9c:e2 0:2:b3:65:f:47 0800 140: route "add net 192.168.20.0 192.168.0.1 1";
};
80.80.20.2.5000 > 80.80.20.3.1035: udp 98
4500 007e 0cc7 0000 4011 a503 5050 1402
5050 1403 1388 040b 006a 28fd 0060 7db0 down {
ifconfig "%% down";
f6ef dd81 4638 3048 4e92 e692 1c3d 5fa3 route "delete net 192.168.20.0 192.168.0.1 1";
c2a6 bc50 8fa5 79d3 c0c2 6537 c74b 1e84
b95e c8f8 6048 3d3c 4f33 32a4 25a2 2da9 };
8c85
13:33:15.584332 0:2:b3:65:f:47 0:40:95:45:9c:e2 0800 140: Затем запускаем сервер:
80.80.20.3.1035 > 80.80.20.2.5000: udp 98
4500 007e 1b44 0000 4011 9686 5050 1403
5050 1402 040b 1388 006a cd92 0060 7db0 vpn_shop# vtund -s
f6ef dd81 4638 f41d cb55 f37d 1229 dbb6
14f7 14d1 08e3 a204 5045 74a0 7807 1e84
b95e c8f8 6048 3d3c 4f33 32a4 25a2 2da9 В свою очередь, в конфигурацию хоста vpn_filial доба-
8c85
13:33:15.593910 0:40:95:45:9c:e2 0:2:b3:65:f:47 0800 140: вим вот такие строки:
80.80.20.2.5000 > 80.80.20.3.1035: udp 98
4500 007e 0cc7 0000 4011 a503 5050 1402
5050 1403 1388 040b 006a 28fd 0060 7db0 filial_to_shop {
f6ef dd81 4638 3048 4e92 e692 1c3d 5fa3 pass secret;
c2a6 bc50 8fa5 79d3 c0c2 6537 c74b 1e84 type tun;
b95e c8f8 6048 3d3c 4f33 32a4 25a2 2da9 proto udp;
8c85 encr yes;
13:33:15.594237 0:2:b3:65:f:47 0:40:95:45:9c:e2 0800 140: keepalive yes;
80.80.20.3.1035 > 80.80.20.2.5000: udp 98
4500 007e 1b44 0000 4011 9686 5050 1403
5050 1402 040b 1388 006a cd92 0060 7db0 up {
f6ef dd81 4638 f41d cb55 f37d 1229 dbb6 ifconfig "%% 192.168.0.1 pointopoint 192.168.0.3 mtu
14f7 14d1 08e3 a204 5045 74a0 7807 1e84 1450";
b95e c8f8 6048 3d3c 4f33 32a4 25a2 2da9 route "add -net 192.168.30.0/24 192.168.0.3";
8c85 };

down {
Как мы могли убедиться, все пакеты движутся через ifconfig "%% down";
route "delete -net 192.168.30.0 ";
публичную сеть в зашифрованном виде. Мы создали тун- };
нели VPN1 и VPN2 между тремя частными сетями. Теперь
машина vpn_office сможет общаться с любой машиной из А теперь запускаем клиента :
всех трех сетей. Но в то же время машины vpn_shop и
vpn_filial могут взаимодействовать лишь с машиной vpn_shop# vtund -p filial_to_shop 80.80.20.1
vpn_office, но не друг с другом. При таком способе соеди-
нения сетей у нас получилась топология типа звезда. Та- Таким образом, у нас появляется еще один туннель. Я
кая конструкция не очень надежна. Если хост vpn_office надеюсь, что заботясь о безопасности, вы догадались по-
по каким-либо причинам выйдет из строя, вся система VPN менять во всех конфигурационных файлах пароль соеди-
перестанет существовать. Чтобы избежать подобных пла- нения. После этого необходимо перезапустить демонов и
чевных результатов, нам необходимо создать резервный клиентов. Теперь главное – не забыть установить на кли-
туннель VPN3 между хостами vpn_shop и vpn_filial. Это ентских машинах трех сетей правильные адреса шлюза
даст им возможность работать друг с другом напрямую, по умолчанию. После того как эта работа будет заверше-
не полагаясь на хост vpn_office. на, можно со спокойной совестью отдыхать.

№4(5), апрель 2003 21


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

НАСТРОЙКА
INCOMING
CONNECTIONS
В LINUX

Users never read manuals...


«man mgetty», секция «BUGS»

В любой фирме наверняка найдётся один-два человека, которым жизненно необходимо


получать почту за пределами «офисной сети». Хорошо, если ваш шеф человек с понятием и
свято чтит КЗОТ, тогда он просто скажет: «Ребята, в воскресенье нужно отдыхать!». А если нет?
Тогда не остается ничего другого, кроме как отвлечься на пару минут от раскладывания пасьянса
и сделать это. Для тех, кто еще не понял – в статье пойдет речь о том, как настроить удаленный
доступ к серверу.

СЕРГЕЙ РОПЧАН
Во избежание всевозможных вопро-  В качестве операционной системы предмет поднятия трубки. Для этого
сов, в том числе и системных (и да не стоял, стоит и будет стоять запускаем программу /sbin/mgetty (не
нарветесь вы на kernel panic), на вся- ASPLinux версии 7.2. путать с mingetty!) следующим обра-
кий случай уточняю: Что ж, приступим. зом:
 В качестве модема использова- mgetty -D -s 38400 -n 4 ttyS1
лась покрытая пылью коробочка с ШАГ 1
надписью «ZyXEL 228S». После того, как модем должным об-
 Подключалось это к серийному разом подключен и сконфигурирован, То есть указываем mgetty работать
порту почтового сервера. например, утилитой kudzu, попробу- с модемом на линии /dev/ttyS1 только
ем его для начала протестировать на в режиме DATA (-D) со скоростью

22
администрирование
38400 (-s), а трубку поднимать только /AutoPPP/ — ppp /usr/sbin/pppd auth - выглядит он следующим образом (я
после четвертого гудка (-n). Если мо- chap +pap login modem crtscts lock пронумеровал строки, чтобы было
proxyarp
дем действительно подключен к этой легче их комментировать).
линии (а не к ttyS0, например), то при
попытке дозвона вы услышите ровно /AutoPPP/ расшифровывается как 00 —
01 09/23 14:34:28 yS1 mgetty:
четыре длинных гудка, прежде чем «обнаруживать PPP-соединение авто- experimental test release 1.1.26-Apr16
модем «поднимет трубку». матически». Далее следует путь к 02 09/23 14:34:28 yS1 check for
lockfiles
программе, которую нужно запустить 03 09/23 14:34:28 yS1 locking the
ШАГ 2 при обнаружении попытки установить line
04 09/23 14:34:28 yS1 lowering DTR
Все устройства, с помощью которых PPP-соединение и её параметры: to reset Modem
можно получить доступ на линуксовый  auth означает, что перед тем как 05 09/23 14:34:29 yS1 send:
\dATQ0V1H0[0d]
сервер, должны быть должным обра- пустить клиента в сетку, необходи- 06 09/23 14:34:29 yS1 waiting for
зом прописаны в файле /etc/inittab. мо провести авторизацию; «OK» ** found **
Программа init считывает этот файл  -chap – не проводить chap-автори- 07 09/23 14:34:30 yS1
ATS0=0Q0&D3&C1[0d]
send:

и «принуждает» определенные про- зацию; 08 09/23 14:34:30 yS1 waiting for


граммы отслеживать попытки регис-  +pap – проводить pap-авториза- «OK» ** found **
09 09/23 14:34:30 yS1 waiting...
трации в системе через эти устрой- цию; 10 09/23 14:35:25 yS1 wfr: waiting
ства. Чтобы каждый раз не запускать  login – использовать для pap-авто- for «RING»
11 09/23 14:35:25 yS1 wfr: waiting
mgetty руками, переложим это заня- ризации базу зарегистрированных for «RING»
12 09/23 14:35:30 yS1 wfr: waiting
тие на широкие плечи init. в системе пользователей; for «RING»
Открываем файл inittab и дописы-  modem – «общаться с модемом» 13 09/23 14:35:35 yS1 wfr: waiting
for «RING»
ваем туда вышеуказанную командную (ждать CD, подавать DTR); 14 09/23 14:35:40 yS1 send: ATA[0d]
строку следующим образом:  crtscts – использовать хардварный 15 09/23 14:35:40 yS1 waiting for
«CONNECT» ** found **
s1:2345:respawn:/sbin/mgetty -D -s flow control (RTS/CTS) при работе 16 09/23 14:35:59 yS1 send:
38400 -n 4 ttyS1 с серийным портом; 17 09/23 14:35:59 yS1 waiting for
 lock – создавать lock-файл, дабы «_» ** found **
18 09/23 14:36:01 yS1 clean_line:
То есть даем init ценное указание доступ к устройству был эксклю- only 500 of 5277 bytes logged
19 09/23 14:36:11 yS1 login.config:
под кодовым названием s1: активизи- зивным; max. 9 command line arguments possible
ровать mgetty на четырех уровнях за-  proxyarp – «добавлять» хост кли- 20 09/23 14:36:11 ##### data dev=ttyS1,
pid=2307, caller=’none’, conn=’38400/
пуска (2345) и «держать его постоян- ента в локальную сеть. V.34 28800/None’, name=’’, cmd=’/usr/
но» (respawn). sbin/pppd’, user=’/AutoPPP/’
Даем команду ps fax|less, чтобы ШАГ 4
узнать PID процесса init (а вдруг он Чтобы клиент успешно прошел авто-  01–03 – блокировка линии.
не равен 1?) и PID mgetty (а вдруг он ризацию, необходимо сделать две  04–08 – инициализация модема.
остался висеть после «ручного» за- вещи: добавить пользователя в сис-  09 – ждем-c, пока кто-нибудь по-
пуска?). Процесс mgetty, если он под- тему (adduser <username>, passwd звонит.
гружен, убиваем обычным образом <username>) и добавить регистраци-  10–14 – поднятие трубки после че-
(kill <PID>), а вот init ненавязчиво онную информацию в файл /etc/ppp/ тырех гудков.
просим перечитать свой конфигура- pap-secrets.  15–18 – обмен информацией.
ционный файл при помощи сигнала  19 – считывание конфига.
«SIGHUP»: kill -SIGHUP <PID>. Пос- #Secrets for authentication using PAP
#client server secret IP addresses
 20 – поднятие PPP и, собственно,
ле этого можно попробовать тести- dialup * qwerty 192.168.1.254 клиент получил доступ к серверу.
рования ради убить несколько раз
mgetty – он все равно будет появлять- Под client подразумевается имя Теперь, когда поставленная зада-
ся автоматически под новыми пользователя; * server говорит о том, ча решена, самое время подумать о
PID’ами. Именно подобное поведе- что пользователь под этим именем «наворотах».
ние процесса, кстати говоря, и под- может подключаться к любым серви- Во-первых, давать ли пользовате-
разумевается под параметром сам; secret – это пароль (он должен лю доступ ко всей «офисной сети» или
respawn в inittab. быть тем же самым, что и при добав- ограничить его коннектом с почтовым
лении пользователя в систему); IP сервером?
ШАГ 3 addresses – IP-адрес, под которым Во-вторых, если в вашей сети есть
Теперь необходимо сконфигуриро- дозвонившийся клиент будет рабо- пользователи, считающие себя хаке-
вать mgetty так, чтобы при успешном тать в сети. рами, то хранение паролей в открытом
коннекте инициировалось PPP-со- Все, теперь можно тестировать виде – не очень хороший способ.
единение. Для этого открываем конфи- mgetty по полной программе. В-третьих, возможно, имеет смысл
гурационный файл /etc/mgetty+sendfax/ настроить mgetty таким образом, что-
login.conf и пишем там следующее (ос- ШАГ 5 бы после установки соединения модем
тальные строчки конфига лично я Лог mgetty находится в файле сервера прерывал его и тут же пытал-
удалил): mgetty.log.ttyS1 каталога /var/log и ся дозвониться модему клиента сам...

№4(5), апрель 2003 23


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

БОРЬБА ЗА
СИСТЕМНЫЕ
РЕСУРСЫ

Как часто пользователи нашей сети жалуются нам, системным администраторам, на


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

ДЕНИС КОЛИСНИЧЕНКО

24
администрирование
Попробуем проанализировать, из-за чего снижается про- вать ядро и исключить из его состава ненужный код.
изводительность нашего сервера и сети в целом? Сейчас
мы не будем касаться аппаратной стороны вопроса, а зат-
ронем лишь программную. В этой статье мы рассмотрим:
 повышение производительности сервера;
 ограничение пропускной способности канала с помо-
щью Squid;
 отказ от приема рекламной информации;
 ограничение полномочий пользователей.

Будем предполагать, что у нас уже есть настроенный и функ-


ционирующий сервер на базе операционной системы Linux.
Ðèñ. 1. Ïðîãðàììà êîíôèãóðàöèè ÿäðà make menuconfig.
Повышение производительности сервера
Сначала попытаемся заставить наш сервер работать не- Перейдите в раздел Processor type and features и уста-
много быстрее. Положительно на производительность лю- новите нужный вам тип процессора. Следующая таблица
бого компьютера влияют: поможет вам справиться с этой задачей:
 Частота центрального процессора. Òàáë. 1.Òèïû ïðîöåññîðîâ.
 Объем оперативной памяти.
 Скорость работы жесткого диска.

Конечно, кроме этих показателей есть еще и другие,


но в нашем случае они не столь важны – ведь у нас же
сервер. Хотя, если у нас сервер X-терминалов, то для нас
будет важен объем видеопамяти и общая скорость рабо-
ты нашей видеоподсистемы. Нужно заметить, что в слу-
чае с Linux объем оперативной памяти более важен, чем Примечание. Ядро можно настроить для работы с дру-
частота процессора. гими процессорами, например, Ahtlon или Duron. Для это-
Итак, начнем по порядку. Замедлить быстродействие го просто выберите необходимый вам тип процессора.
процессора может само ядро системы. Да, это так. За- Если у вас многопроцессорная машина, включите под-
метное снижение быстродействия может наблюдаться в держку SMP. Также очень рекомендую включить функцию
двух случаях: MTRR. Включение этой опции может существенно повы-
 Ядро откомпилировано для другого типа процессора. сить производительность системы. Кроме процессоров
Например, у вас Pentium III, а ядро собрано с расчетом Intel данную возможность поддерживают процессоры и по-
на обыкновенный Pentium. сторонних производителей: Cyrix 6x86, 6x86MX, MII, AMD
 Если у вас двухпроцессорная машина (или более мощ- K6-2 (stepping 8 и выше), K6-3, Centaur C6. Некоторые BIOS
ная), а вы используете ядро, не поддерживающее SMP устанавливают MTRR для первого процессора, но отклю-
(Symmetric multi-processing support). чают для второго. Активизация данной опции также ре-
шает и эту проблему. Затем можно просмотреть все ос-
Обе эти проблемы не решить без перекомпиляции тальные параметры ядра и отключить ненужные функции.
ядра. Вы ни разу не перекомпилировали ядро? Ничего Например, если у нас нет шины USB или она попросту не
страшного – все очень просто. Следуйте приведенным используется, зачем включать в ядро лишний код?
ниже инструкциям. Когда все устройства сконфигурированы, нужно сохра-
Зарегистрируйтесь в системе как пользователь root и нить файл конфигурации ядра и перейти непосредствен-
убедитесь, что установлены исходные тексты ядра и за- но к этапу компилирования ядра. Введите команду:
головки ядра (пакеты kernel и kernel-headers соответствен-
но). Затем перейдите в каталог /usr/src/linux и выполните # make dep
команду make menuconfig (см. рис. 1). Перед внесением
изменений в файл конфигурации ядра, сохраните его под После завершения ее работы необходимо ввести команду:
другим именем: Save Configuration to an Alternative File.
Во время конфигурирования ядра вы можете включать # make bzImage
или исключать некоторые функции из состава ядра или
же сделать нужную вам функцию модулем, то есть в со- Если исходные тексты ядра и компилятор установле-
став ядра данная функция включена не будет, но она бу- ны корректно, то примерно минут через 20 (это зависит
дет использоваться при необходимости. Например, если от версии ядра и от быстродействия вашей системы) вы
вы добавите в систему устройство, то будет подключен получите откомпилированное ядро. Обычно оно помеща-
нужный модуль, при условии, что вы его откомпилирова- ется в каталог /usr/src/linux/arch/i386/boot.
ли. Главная задача – повышение производительности си- Примечание. Если в процессе компиляции вы получи-
стемы, этого можно достичь, если точно сконфигуриро- ли сообщение о том, что не найден какой-то файл, то, ско-

№4(5), апрель 2003 25


администрирование
рее всего, вы отключили опцию, которая нужна для рабо- Вам нужны все запущенные сервисы? Нет, так почему
ты другой опции. Восстановите сохраненную конфигура- же они активны? Выключите все ненужные вам сервисы.
цию ядра и попытайтесь откомпилировать ядро заново. Возможно, некоторые из них нужно запускать только в
Теперь следует откомпилировать модули, которые бу- определенное время. Например, сервис ftp вам нужен
дут использоваться ядром: только в рабочее время – незачем использовать ftp но-
чью. Или, наоборот, сервис ssh вам нужен только ночью,
# make modules когда вам вздумается из дому изменить настройки сер-
вера. Следующий фрагмент файла /etc/xinetd.conf разре-
И установить их: шает использовать сервис ftp только в рабочее время,
учитывая обеденный перерыв:
# make modules_install
service ftp
{
Перед установкой модулей сделайте резервную копию socket_type = stream
модулей старого ядра (каталог /lib/modules). Теперь мож- wait = no
user = root
но ввести команду: server = /usr/etc/in.ftpd
server_args = -l
# make install instances = 4
log_on_success += DURATION USERID
log_on_failure += USERID
# Âðåìÿ ðàáîòû ñåðâèñà
Однако для установки только что созданного ядра я access_times = 8:00-12:00 13:00-18:00
не рекомендую этого делать. Сначала нужно протестиро- nice = 10
}
вать ваше ядро. С этой целью откройте в любом тексто-
вом редакторе файл /etc/lilo.conf и добавьте в него следу- Для остановки того или иного сервиса введите коман-
ющие строки: ду service <имя> stop. Например, service httpd stop.
Примечание. Для запуска сервиса используется пара-
image=/usr/src/linux/arch/i386/boot/bzImage метр start, а для перезагрузки – restart.
label=my_linux
# Ïàðàìåòðû root è mem ó âàñ, ñêîðåå âñåãî, áóäóò äðóãèìè Вы отключили все, что можно, а памяти все равно не
root=/dev/hda1 хватает? Тогда вам можно посоветовать только модерни-
append=" mem=256M"
read-only зацию оперативной памяти. А пока можно создать файл
подкачки, который немного отложит покупку памяти. На-
Потом введите команду lilo и перезагрузите систему. пример, если вы хотите создать файл подкачки разме-
Попробуйте загрузить ядро. В случае возникновения оши- ром 128 Мб, выполните следующие действия:
бок вы всегда сможете загрузить старую версию. Наде-  Выполните команду:
юсь, что после проведенных действий ваша система ста-
ла работать быстрее. После рассмотрения оптимизации dd if=/dev/zero of=/swap bs=1k count=131072
процессора, обратим наше внимание на оперативную па-
мять. Узнать информацию о загрузке оперативной памя- Данная команда создаст пустой файл /swap размером
ти поможет команда free. Что больше всего «пожирает» 128 Мб.
оперативную память? Правильно, процессы! Одно дело,  Создайте файловую систему типа Linux Swap:
когда неблагодарный пользователь запустит большое
количество процессов, но совсем другое дело, когда мы, mkswap /swap 131072
администраторы, так нерационально используем наши
ресурсы. Запустите конфигуратор setup и выберите пункт  Активизируйте созданный файл подкачки:
меню System Services (см. рис. 2). Если вы используете
ОС Linux Mandrake, запустите конфигуратор drakxservices. swapon /swap

 Введите команду free, чтобы убедиться, что файл под-


качки подключен.

Третью команду нужно добавить в сценарий загрузки


системы /etc/rc.d/rc.local, чтобы не вводить ее вручную при
каждой загрузке сервера.
Мы еще можем увеличить производительность жест-
кого диска. Тут нам поможет программа hdparm. Давайте
попробуем немного «разогнать» наш жесткий диск.

# hdparm - d1m2c3u1 /dev/hda

Теперь разберемся, что же мы сделали этой коман-


Ðèñ. 2. Ñèñòåìíûå ñåðâèñû. дой. Во-первых, мы включили DMA, затем разрешили пе-

26
администрирование
редавать более одного слова за такт, а также включили пользуют ресурсы канала в других целях. Естественно, пер-
32-битный доступ к диску (команда с). Для просмотра ус- вым пропускная способность канала важнее, чем вторым. С
тановленных параметров введите команду: помощью прокси-сервера Squid можно разделить канал.
Для начала в файле конфигурации (/etc/squid/squid.conf)
# hdparm /dev/hda укажите, сколько пулов, то есть групп пользователей, у вас
будет: delay_pools 2. Затем определите классы пулов. Все-
Запустим hdparm в режиме теста: го существует три класса:
 Используется одно ограничение пропускной способно-
# hdparm –t /dev/hda сти канала на всех.
 Одно общее ограничение и 255 отдельных для каждо-
В зависимости от жесткого диска у нас должно полу- го узла сети класса С.
читься не менее 14 Мб/сек. Обратите внимание на опцию  Для каждой подсети класса В будет использовано соб-
m2. Данная опция позволяет передавать более одного ственное ограничение и отдельное ограничение для
слова за такт – два слова (m2). Если у вас современный каждого узла.
жесткий диск, установите максимальное значение – m16.
Однако если после сохранения параметров на консоли В файл squid.conf добавьте следующие директивы:
появляется сообщение Drive Seek Error, уменьшите дан-
ное значение (например, до восьми блоков за такт). delay_class 1 1
# îïðåäåëÿåò ïåðâûé ïóë êëàññà 1 äëÿ äîìàøíèõ ïîëüçîâàòåëåé
Можно использовать параметры X33 и X66 для вклю- delay_class 2 2
чения режимов передачи данных UDMA33 и UDMA66 со- # îïðåäåëÿåò âòîðîé ïóë êëàññà 2 äëÿ ñëóæàùèõ
ответственно. Если при использовании режимов Х33 и Х66
производительность снизилась, используйте режим Х68. Теперь задайте узлы, которые будут относиться к пулам:
Для сохранения параметров контроллера IDE используй-
те команду: acl home src àäðåñà
acl workers src àäðåñà
delay_access 1 allow home
# hdparm -k1 /dev/hda delay_access 1 deny all
delay_access 2 allow workers
delay_access 2 deny all
При перезагрузке системы параметры IDE теряются, по-
этому команду «разгона» винчестера нужно поместить в Затем укажите ограничения:
сценарий запуска системы. Сейчас просто добавьте коман-
ду вызова hdparm в файл /etc/rc.d/rc.local. Этот способ явля- delay_parameters 1 14400/14400
delay_parameters 2 33600/33600 16800/33600
ется наиболее универсальным, поскольку он позволяет ус-
тановить отдельные параметры для разных жестких дисков, Как я уже отмечал выше, для пула класса 1 использу-
если у вас их несколько. Второй, менее универсальный спо- ется одно ограничение для всех компьютеров, входящих
соб заключается в редактировании файла /etc/sysconfig/ в пул – 14400 байт. Первое число задает скорость запол-
harddisks, в котором можно задать общие параметры для нения для всего пула (байт/секунду). Второе – максималь-
всех жестких дисков. Есть еще один «подводный камень», ное ограничение. Для пула класса 2, соответственно, ис-
который состоит в следующем: при пробуждении системы и пользуются ограничения на всю подсеть и отдельно на
её переходе в нормальное состояние после «сна» парамет- каждого пользователя.
ры контроллера также сбрасываются. Этого можно избежать,
если подправить файл конфигурации демона apmd, кото- Борьба со спамом
рый отвечает за управление питанием. Параметры контрол- Вы опять получили письмо с предложением купить базу дан-
лера IDE, которые устанавливаются при переходе системы ных абонентов МТС? Добавьте адрес спаммера в «черный»
в «спящий» режим и выходе из него, задаются строками список – в файл /etc/mail/access. Данный файл преобразует-
HDPARM_AT_SUSPEND и HDPARM_AT_RESUME в файле ся в файл access.db, который используется программой
конфигурации /etc/sysconfig/apmd. sendmail. В нем вы можете указать узлы, которым разреше-
Мы сделали все возможное, чтобы наш сервер рабо- но (запрещено) использовать ваш SMTP-сервер. Формат
тал быстрее. Теперь попробуем ограничить пропускную этого файла такой: узел | сеть | пользователь | действие.
способность канала.
localhost.localdomain RELAY
localhost RELAY
Ограничение пропускной способности 127.0.0.1 OK
канала с помощью Squid spammer@spam.ru
spamworld.com
REJECT
ERROR:"550 Access denied"
Для этого нам понадобится уже настроенный и работающий 192.168.1 RELAY
прокси-сервер Squid (сервис Squid). Предположим, что нам host.mydomain.ru REJECT
mydomain.ru RELAY
нужно настроить прокси-сервер таким образом, чтобы одна
группа компьютеров могла работать с одной скоростью, а В первой-третьей строках мы разрешаем самим себе
другая – с другой. Это может потребоваться, например, для использовать SMTP-сервер. Затем мы запрещаем пересыл-
разграничения пользователей, которые используют канал ку почты пользователю spammer@spam.ru, а также всему
для работы (например, вы), и пользователей, которые ис- домену spamworld.com. Шестая строка разрешает пересыл-

№4(5), апрель 2003 27


администрирование
ку почты всей нашей локальной подсети – 192.168.1.*. Пос- <Limit LOGIN>
ледняя строка разрешает использовать SMTP-сервер на- DenyAll
AllowUser pupkin
шему домену, а предпоследняя запрещает использовать MaxClients 5
наш сервер одному узлу из домена mydomain.ru – host. Deny from 153.111.171.137
Deny from 192.168.2.
Разница между действием OK и RELAY заключается в </Limit>
том, что в первом случае (ОК) пересылка разрешается,
даже если другие правила sendmail запретили пересылку Первая директива в блоке Limit запрещает регистра-
почты, например, если имя узла не разрешено (при ис- цию (LOGIN) всем пользователям, вторая разрешает толь-
пользовании DNS). ко регистрацию пользователя pupkin, третья – задает мак-
Для запрещения пересылки можно просто использо- симальное число клиентов (5). Последние две директивы
вать REJECT. Тогда пользователь увидит сообщение запрещают регистрацию с узла 153.111.171.137, а также
«Access denied». Действие ERROR более информативно, из подсети 192.168.2. Кроме директив DenyAll и AllowUser
так как вы можете указать любое свое сообщение (уста- существуют противоположные им по действию – AllowAll и
новить реакцию на ошибку). Действие ERROR можно за- DenyUser соответственно. Данный блок Limit нужно указать
писать по-другому: ERROR:D.S.N:Message, где D.S.N – это в файле конфигурации сервера ProFTPD – /etc/proftpd.conf.
код ошибки в соответствии с RFC 1893. Теперь, когда пользователи других подсетей не смо-
Для того чтобы новые правила доступа вступили в гут использовать наши ресурсы, немного ограничим сво-
силу, введите команду: их родных пользователей. Для ограничения локальных
пользователей используются файлы:
# makemap hash /etc/mail/access < /etc/mail/access  access.conf
 console.perms
Изменения вступят в силу сразу после завершения ра-  limits.conf
боты программы makemap. Перезагружать sendmail при
этом не нужно! Эти файлы расположены в каталоге /etc/security. Пер-
вый файл – это таблица доступа пользователей. Когда
Ограничение действий пользователей кто-то регистрируется в системе (удаленно или локаль-
Иногда нужно запретить некоторым узлам (или целым под- но), в этой таблице система ищет запись, содержащую
сетям) доступ к вашему серверу. Зачем пользователям имя пользователя и предоставляет соответствующий это-
из соседнего отдела пытаться зарегистрироваться на ва- му пользователю доступ или вообще запрещает его. Если
шем FTP-сервере? Ясное дело, что FTP-сервер не позво- имя пользователя не найдено, но может регистрировать-
лит им этого сделать, поскольку они не знают, точнее, не ся со всех терминалов (для локальной регистрации) или
должны знать имя пользователя и пароль для доступа к со всех узлов (для удаленной регистрации).
этому серверу. Так зачем же нам разрешать доступ к FTP Формат файла access.conf такой: Разрешение:Пользо-
этим пользователям, если мы заведомо знаем, что им там ватели:Доступ. Первое поле может содержать либо сим-
делать нечего? Демон tcpd аутентифицирует удаленных вол «+», который означает, что доступ разрешен, или сим-
пользователей и проверяет корректность их запросов. С вол «-», запрещающий доступ. Поле Пользователи содер-
помощью этого демона можно ограничить запросы с уда- жит список имен пользователей, разделенных пробелами.
ленных компьютеров. Файл hosts.allow содержит список Можно указывать имя пользователя в формате user@host.
хостов, которым разрешено подключаться к вашей сис- Такая запись описывает пользователя user, который регист-
теме, а hosts.deny – запрещено. Записи имеют формат: рируется из машины host. Для обозначения всех пользова-
служба:хост.домен. Если вы хотите разрешить или зап- телей можно указать ALL в качестве значения второго поля.
ретить доступ всем, используйте модификатор ALL. За- Третье поле (Доступ) может содержать список терми-
пись ALL:ALL открывает или закрывает доступ к вашей налов, из которых разрешена (или запрещена – в зависи-
машине всем компьютерам для всех видов сервисов. Ниже мости от значения первого поля) регистрация пользовате-
приведен листинг файла hosts.allow. лей (для локальной регистрации). Если вас интересует ре-
гистрация по сети, вы можете указать здесь имя узла, IP-
ftp:our_domain.firma.ru адрес узла, адрес сети (заканчивается точкой), имена до-
менов или имена узлов локальной сети (не содержат точ-
В вышеприведенном листинге доступ к ftp разрешен ки). Для обозначения всех узлов локальной сети можно
только нашему домену our_domain.firma.ru. В файл использовать модификатор LOCAL. Можно также исполь-
hosts.deny рекомендуется добавить запись, запрещаю- зовать модификатор EXCEPT (кроме) для исключения не-
щую доступ к FTP соседям (другому отделу) или же аб- которых элементов списка (во втором и в третьем полях).
солютно всем (ftp:ALL) Раз уж мы заговорили о FTP- Рассмотрим несколько примеров:
сервере, нельзя не сказать, что все приведенные выше
операции можно было реализовать средствами самого -:ALL EXCEPT den user serge:LOCAL .microsoft.com
+:reboot shutdown:LOCAL
сервера, но я не вижу смысла загружать сервер лиш- +:root:tty1
ней работой, если все это можно сделать на более низ- -:root:LOCAL
-:den user serge:LOCAL EXCEPT host1
ком уровне. Но для полноты обзора все же рассмотрим
директиву Limit, ограничивающую доступ к серверу: Первое правило запрещает регистрацию всех пользо-

28
администрирование
вателей, кроме (EXCEPT) den, user, serge из любого хоста роль пользователя root, и если пароль правилен, вы полу-
локальной сети и домена .microsoft.com. Но эти пользова- чите привилегии пользователя root.
тели могут регистрироваться из любого другого домена. В файле limits.conf определяются ограничения ресур-
Второе правило разрешает регистрацию пользователей сов системы для пользователя или группы пользователей.
reboot и shutdown из любого узла локальной сети. Третье Формат файла такой: <domain> <type> <item> <value>.
правило разрешает регистрацию пользователя root из тер- Первое поле (domain) может содержать:
минала tty1, а следующее правило – запрещает регистра-  Имя пользователя.
цию пользователя root по сети (локальной). Последнее пра-  Имя группы. Перед именем группы нужно указать сим-
вило запрещает регистрацию пользователей den, user, вол «@».
serge из любого узла локальной сети, кроме узла host1.  Символ «*». Данное ограничение установлено по умол-
C точки зрения безопасности приведенные примеры не чанию.
имеют никакого смысла. Я привел данный пример только в
демонстрационных целях. Как видно из имен пользовате- Второе поле – это тип ограничения: мягкое (soft) или
лей во втором правиле, первый используется для перезаг- жесткое (hard). Мягкое ограничение определяет число си-
рузки системы, а второй – для ее останова. То есть при стемных ресурсов, которое пользователь все еще может
регистрации этих пользователей система соответственно превысить, жесткое ограничение превысить невозможно.
или перезагружается, или останавливается. Подобное При попытке сделать это, пользователь получит сообще-
практикуется многими системными администраторами, ко- ние об ошибке.
торых я знаю. Как они говорят, этих пользователей созда- Элементом ограничения (item) может быть:
ли для удобства: если нужно перезагрузить машину, нуж-  core – ограничение размера файла core (Кб);
но просто войти в систему под пользователем reboot. Та-  data – максимальный размер данных (Кб);
кое удобство вам может дорого обойтись, если кто-то, уз-  fsize – максимальный размер файла (Кб);
нав ваш пароль, остановит машину во время вашего от-  memlock – максимальное заблокированное адресное
сутствия, поэтому не рекомендую вам создавать подобных пространство (Кб);
пользователей вообще. Третье правило разрешает регис-  nofile – максимальное число открытых файлов;
трацию пользователя root с терминала tty1 (локальная ре-  stack – максимальный размер стека (Кб);
гистрация), но не запрещает регистрацию со всех осталь-  cpu – максимальное время процессора (минуты);
ных. Можно было бы указать правило  nproc – максимальное число процессов;
 as – ограничение адресного пространства;
-:root:ALL  maxlogins – максимальное число одновременных ре-
гистраций в системе;
перед третьим правилом, но специально для этих целей  locks – максимальное число файлов блокировки.
служит файл /etc/securetty, о котором мы поговорим не-
много позже. Рассмотрим несколько примеров. Например, нам
Теперь перейдем ко второму файлу – console.perms. нужно установить максимальное число процессов для
Этот файл определяет полномочия привилегированных пользователя user. Это можно сделать с помощью та-
пользователей, которые будут им присвоены при регист- ких записей:
рации через консоль системы (локальная регистрация). Ско-
рее всего, вам не нужно будет редактировать этот файл. user soft nproc 50
user hard nproc 60
После внесения изменений в этот файл выполните команду:
Первая строка определяет мягкое ограничение (рав-
pam_console_apply -r ное 50), а вторая – жесткое. Допустим, у нас есть группы
dialup1 и dialup2. В каждую группу входят 30 пользовате-
Обычно данная команда помещается в один из инициа- лей. У нас есть всего 30 входящих линий, поэтому нужно
лизационных сценариев системы. Для получения более обеспечить одновременную работу не более 15 пользо-
подробной информации обратитесь к справочной системе. вателей из каждой группы. Это делается так:
В файле limits.conf определяются квоты системных
ресурсов, например, максимальное число процессов или @dialup1 - maxlogins 14
@dialup2 - maxlogins 14
максимальное время процессора. Прежде чем ограничить
пользователей, рассмотрим, как можно ограничить само- В первом и втором случае из каждой группы пользо-
го себя, то есть пользователя root. вателей одновременно работать смогут не более 15
В файле /etc/securetty, который уже упоминался выше, (maxlogins 14 – отсчет начинается с нуля). При регистра-
указываются терминалы и виртуальные консоли, из кото- ции шестнадцатый пользователь увидит сообщение: Too
рых может регистрироваться пользователь root. Я реко- many logins for «dialup1». Последнее, что можно сделать, –
мендую вообще запретить регистрацию пользователя root это установить квоты для файловых систем, но квотиро-
из консоли. Для этого удалите (или закомментируйте) все вание выходит за рамки этой статьи (вполне возможно,
строки в файле securety. Если вам будут нужны макси- что квоты будут рассмотрены в следующей моей статье).
мальные привилегии, используйте команду su (super user). Все ваши вопросы, комментарии и пожелания присылай-
После ввода этой команды программа запросит у вас па- те на адрес dhsilabs@mail.ru.

№4(5), апрель 2003 29


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

СИСТЕМА ФИЛЬТРАЦИИ

ИНТЕРНЕТ-ТРАФИКА
Целью данных записок является создание простой в управлении и в то же время гибкой в
настройке системы фильтрации интернет-трафика. Строить её мы будем на основе FreeBSD 4.5 +
Squid + SquidGuard + Berkeley DB 3.2.9 + Apache. Стоит отметить, что обсуждаемые в этой статье
приемы будут работать и на основе Linux. В принципе такой комплекс можно построить на любой
Unix-совместимой системе. Главная проблема – необходимость использования версий SquidGuard
и Squid для этой системы. Apache можно заменить любым другим веб-сервером или использовать
уже существующий веб-сервер. Кстати, веб-сервер можно запустить на отдельной машине под
управлением любой операционной системы. Не стоит отчаиваться, если база данных Berkeley DB еще
не портирована для вашей платформы. SquidGuard легко может работать и без нее.

АНДРЕЙ БЕШКОВ
30
администрирование
Вы можете спросить, зачем нам нужны все эти сложнос- Интернете, а также распространенность баннерной рек-
ти? Как и любой другой ресурс, интернет-трафик имеет ламы, такой путь выглядит утопией. В начале такого оши-
обыкновение заканчиваться. Да и канал от нас к провай- бочного пути кажется, что нужно всего лишь записывать
деру не резиновый, отсюда вывод – необходимо тем или все запрещенные сайты в отдельные файлы с помощью
иным способом ограничить аппетиты пользователей. С ACL-записей типа:
другой стороны, если начальство поймает кого-то из со-
трудников за просмотром порносайтов или скачиванием acl porno src "/usr/local/squid/etc/porno.lst"
acl erotic src "/usr/local/squid/etc/erotic.lst"
mp3, нагоняй получит не только провинившийся. Админи-
стратор будет виноват в том, что позволяет сотрудникам А затем запрещать их всех скопом. Но обслуживание
тратить оплачиваемый организацией трафик на всякую такой системы способно превратиться в головную боль
ерунду. В то же время стоит помнить, что каждая органи- уже на первой тысяче сайтов. Squid загружает списки кон-
зация имеет свои правила использования ресурсов сети троля доступа в оперативную память. С добавлением но-
Интернет. Довольно часто в списке запретов можно встре- вых сайтов размер файла будет постоянно расти. Соот-
тить не только эротику, но и сайты анекдотов, форумы и ветственно, и Squid будет занимать все больше опера-
чаты. Например, бесплатные почтовые сайты могут быть тивной памяти. В связи с тем, что список запрещенных
запрещены из соображения секретности. Одновременно сайтов неупорядочен, поиск в нем будет занимать доволь-
можно запретить пользователям скачивать из внешней но продолжительное время. SquidGuard выполняет за 12
сети выполняемые файлы. Это существенно снижает опас- секунд 100 000 запросов к базе, содержащей 205 900 за-
ность вирусного заражения сети. писей. Тестирование проводилось на машине с процес-
Кроме того, перед нами все еще стоит задача эконо- сором Pentium 500 MHz. Такой скорости удается добиться
мии трафика. Существенно снизить его потребление по- за счет того, что SquidGuard хранит список сайтов в фор-
может запрещение бесполезной для нас баннерной рек- ме B-дерева. Как мы видим, средствами Squid все выше-
ламы. Вы могли бы спросить, что в баннерах плохого? описанное выполнить достаточно тяжело. И тут в поле
Squid – кеширующий прокси-сервер, соответственно, ска- нашего внимания попадает класс программ под названи-
чиваемые файлы ложатся в локальный кеш. При следую- ем редиректоры. С разной степенью легкости эти програм-
щих запросах эти файлы уже не будут скачиваться из мы позволяют решать наши проблемы. Используемый
Интернета. Проблема в том, что баннерная реклама по- нами SquidGuard тоже является редиректором. Давайте
строена на применении механизма CGI (Common Gateway коротко опишем его возможности.
Interface), расшифровывается как «общий интерфейс  Может разрешить доступ некоторой группе пользова-
шлюза». Характерным признаком которого является ис- телей только к избранным сайтам.
пользование знака «?» в адресной строке запроса. На-  Блокирует доступ пользователей к определенному
пример, адрес одного из баннеров «Украинской Баннер- списку адресов.
ной Сети» выглядит так: http://banner.kiev.ua/cgi-bin/  Помогает блокировать доступ к сайтам на основе спис-
bi.cgi?h" + user + "&"+ pid + "&" + page + "&2. ка регулярных выражений.
К сожалению, CGI используется не только для баннер-  Запрещает использовать IP-адреса вместо доменных
ной рекламы, но и для чатов, форумов, сетевых магази- имен внутри URL.
нов и прочей полезной сетевой функциональности. То есть  Дает возможность перенаправить пользователей, пы-
везде, где необходимо получить от пользователя данные. тающихся получить доступ к запрещенным страницам,
Затем полученные данные должны быть обработаны, а на другую страницу, где им будет объяснена причина
результаты работы CGI необходимо вернуть пользовате- запрета.
лю. Значит для каждого пользователя не только запросы,  Помогает перенаправить запросы на доставку часто
но и ответы будут разными. Поэтому класть полученные скачиваемых файлов, таких как MSIE, Netscape
документы в кеш squid бесполезно. По умолчанию squid Navigator или ICQ, к их локальным копиям.
не использует кеш при работе с динамическими докумен-  Позволяет использовать разные политики доступа в за-
тами. В свою очередь, это значит, что одни и те же банне- висимости от времени дня, текущей даты, дня недели.
ры будут выкачиваться бесконечно. Подменяя баннеры пу-  Дает возможность гибкой настройки процесса прото-
стыми картинками с локального веб-сервера, можно зна- колирования обрабатываемых запросов.
чительно снизить количество потребляемого трафика.
Многие администраторы, столкнувшись с этими проб- В качестве кандидатов на место SquidGuard претен-
лемами, могут утверждать, что они легко решаются с по- довали squirm и Jesred. После тестирования от squirm при-
мощью штатных средств Squid. Я не стану отрицать, что шлось отказаться, потому что список фильтрации поддер-
Access Control List (списки контроля доступа), сокращен- живается всего один на всех пользователей. Соответ-
но ACL, используемые в Squid, – это довольно мощный ственно запретить что-либо конкретному пользователю не
инструмент. Но для работы с ним требуется достаточно представляется возможным. Запрещать приходится либо
большой опыт. С другой стороны, трудно представить, как всем, либо никому. К тому же список сайтов приходится
администратор будет разбираться, какие сайты он дол- хранить в виде довольно сложных и неудобных для вос-
жен блокировать. Остается только вслед за пользовате- приятия регулярных выражений. По моему мнению, такое
лями ходить на все часто посещаемые сайты, и постепен- ограничение не позволяет использовать squirm в сетях
но запрещать неугодные. Учитывая количество сайтов в средних и больших размеров.

№4(5), апрель 2003 31


администрирование
Затем мне под руку попался Jesred. Несмотря на то # Âðåìÿ æèçíè óñïåøíîãî DNS-çàïðîñà.
что Jesred является модернизированным потомком squirm positive_dns_ttl 6 hours
# Âðåìÿ æèçíè DNS-çàïðîñîâ, çàâåðøèâøèõñÿ îøèáêîé.
и имеет более гибкий синтаксис файла шаблонов, он все negative_dns_ttl 5 minutes
еще страдает от тех же проблем. Единственное улучше- # Ïîääåðæêà íåñòàíäàðòíûõ http-êëèåíòîâ
half_closed_clients on
ние в этой области – достаточно высокая скорость рабо- # Ìèíèìàëüíûå ðåêîìåíäóåìûå ïðàâà
ты и возможность пропускать запросы некоторых пользо- acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
вателей без фильтрации. Как вы понимаете, в этом слу- acl localhost src 127.0.0.1/255.255.255.255
чае ни о каком гибком разграничении полномочий пользо- # Ssl
acl SSL_ports port 443 563
вателей речь не идет. # http
Ну что же, теперь, когда с формальностями и изучени- acl Safe_ports port 80
# ftp
ем начальной теории покончено, приступим к установке. acl Safe_ports port 21
Я думаю, нижеприведенных инструкций по настройке # https, snews
acl Safe_ports port 443 563
Apache и Squid хватит, чтобы установить их в комплекта- # gopher
ции по умолчанию. Для получения более подробных све- acl Safe_ports port 70
# wais
дений вам стоит посетить следующие сайты: acl Safe_ports port 210
http://apache.lexa.ru # unregistered ports
acl Safe_ports port 1025-65535
http://www.squid-cache.org # http-mgmt
http://squid.opennet.ru acl Safe_ports port 280
# gss-http
В процессе компиляции всего программного обеспе- acl Safe_ports port 488
чения вместо стандартного make мною использовался # filemaker
acl Safe_ports port 591
gmake, но это опять же вопрос личных предпочтений. Мне # multiling http
кажется, что gmake работает стабильнее и быстрее. acl Safe_ports port 777
acl CONNECT method CONNECT
В качестве прокси-сервера я использовал squid # îïèñûâàåì íàøèõ ïîëüçîâàòåëåé
2.5.STABLE1. На момент написания статьи это была са- acl users src "/usr/local/squid/etc/users.txt"
# Ðàçðåøàåì ñîåäèíåíèÿ òîëüêî ïî ïðàâèëüíûì ïîðòàì. È ðàçäàåì
мая свежая версия. Взять ее можно на http://www.squid- # âñåì ïðàâà äîñòóïà
cache.org/Versions/v2/2.5/. Рекомендуется всегда исполь- http_access allow manager localhost
http_access deny manager
зовать самые новейшие из стабильных версий программ. http_access deny !Safe_ports
Такой подход позволит в дальнейшем избежать многих http_access allow users
http_access deny !Safe_ports
проблем со стабильностью и безопасностью работы тех http_access deny CONNECT !SSL_ports
или иных инструментов. http_access deny all
# Àäðåñ ïîëüçîâàòåëÿ, êîòîðîãî áóäóò óâåäîìëÿòü
# î ïåðåïîëíåíèè êåøà
# tar zxvf squid-2.5.STABLE1-src.tar.gz cache_mgr root@test.ru
# cd squid-2.5.STABLE1 # Ïîëüçîâàòåëü, îò èìåíè êîòîðîãî áóäåò ðàáîòàòü Squid
# ./configure cache_effective_user nobody
# gmake # Ãðóïïà, îò èìåíè êîòîðîé áóäåò ðàáîòàòü Squid
# gmake install cache_effective_group nogroup
# Âêëþ÷àòü ëè IP-àäðåñ êëèåíòà â çàãîëîâîê http-çàïðîñà
После инсталляции редактируем файл конфигурации forwarded_for on
# Ðàçðåøàåì óïðàâëÿòü êåøåì ñ ïîìîùüþ cachemgr.cgi.
squid, находящийся в файле /usr/local/squid/etc/squid.conf. #  êà÷åñòâå ïàðîëÿ áóäåì èñïîëüçîâàòü ñëîâî «passwd»
Должно получиться примерно следующее: cachemgr_passwd passwd all
# Âêëþ÷àåì ñáîð ñòàòèñòèêè ïî êàæäîìó êëèåíòó
client_db on
# Îáðàáàòûâàòü çàïðîñû íà ïîðò 3128
http_port 3128
hierarchy_stoplist cgi-bin ? Обращаю ваше внимание на строку acl users src «/usr/
# Çàïðåùàåì êåøèðîâàòü CGI local/squid/etc/users.txt». Она означает, что список пользо-
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY вателей, которым разрешен доступ к squid, находится в
# Ðàçìåð îïåðàòèâíîé ïàìÿòè, îòâîäèìîé ïîä êåø файле /usr/local/squid/etc/users.txt. Файл списка имеет сле-
cache_mem 64 MB
# Òóò ìû áóäåì áðàòü ôàéëû ñòàíäàðòíûõ ñîîáùåíèé îá îøèáêàõ дующий формат:
error_directory /usr/local/squid/share/errors/Russian-koi8-r
# Ìàêñèìàëüíûé ðàçìåð îáúåêòà, çàïèñûâàåìîãî â êåø #Ïåòðîâà Íàòàëüÿ (Ñíàáæåíèå)
maximum_object_size 16384 KB 192.168.10.91/32
# Çäåñü ó íàñ áóäåò õðàíèòüñÿ êåø. Îòâîäèì ïîä íåãî 5000 Ìá.
# Ïðèêàçûâàåì ñîçäàòü 16 äèðåêòîðèé ïåðâîãî óðîâíÿ è 256 #Èâàíîâ Âëàäèìèð (Äîñòàâêà)
192.168.10.92/32
# âòîðîãî óðîâíÿ. #Ñåðãååâ Èãîðü (Ïëàíîâûé îòäåë)
cache_dir ufs /usr/local/squid/cache 5000 16 256
# Ïðîòîêîë äîñòóïà ê êåøó 192.168.10.93/255.255.255.255
#Êðèâîóõèíà Èðèíà (Ëàáîðàòîðèÿ)
cache_access_log /usr/local/squid/logs/access.log 192.168.10.94/255.255.255.255
# Òóò íàõîäèòñÿ ïðîòîêîë ðàáîòû êåøà
cache_log /usr/local/squid/logs/cache.log #Ñèíèöûíà Ñâåòëàíà (ñåêðåòàðü ãåíåðàëüíîãî äèðåêòîðà)
192.168.10.95/255.255.255.255
# Ïðîòîêîë ðàáîòû ìåíåäæåðà êåøà
cache_store_log /usr/local/squid/logs/store.log
# Ïîä ýòèì ïîëüçîâàòåëåì áóäåì õîäèòü ïî Ftp
ftp_user vasa@pupkin.ru Реально в списке содержатся не имена пользовате-
# Åñëè Squid óæå ñêà÷àë 60% ôàéëà, à ïîëüçîâàòåëü îòêàçàëñÿ лей, а IP-адреса их машин. Как вы смогли убедиться, все
# åãî çàáèðàòü, òî âñå ðàâíî ïðîäîëæàòü ñêà÷èâàòü ôàéë.
quick_abort_pct 60 устроено достаточно просто. Решено работать с отдель-
# Âðåìÿ æèçíè çàïðîñîâ, çàâåðøèâøèõñÿ îøèáêîé. Íàïðèìåð, ным файлом, содержащим список пользователей, чтобы
# «connection refused» èëè «404 Not Found»
negative_ttl 1 minutes не перегружать главный конфигурационный файл.

32
администрирование
Users.txt должен иметь те же права доступа, что и ошибках появляются в файле протокола.
squid.conf, для того чтобы squid мог читать его содержимое.
# tail -f /var/log/messages
# chown nobody:nogroup /usr/local/squid/etc/users.txt
Если все сделали правильно, тогда должны увидеть
Возможен и другой вариант управления доступом к что-то подобное:
web. При этом доступ во внешнюю сеть средствами squid
не ограничивается. Разграничением доступа в этом слу- Oct 3 12:15:05 dns squid[139]: Squid Parent: child process ↵
141 started
чае будет заниматься SquidGuard. Для тех пользователей,
чей адрес не внесен в файл /usr/local/squidGuard/ Это значит что, squid у нас заработал. Теперь примемся
squidGuard.conf, производится перенаправление на стра- за установку Russian Apache. Я использовал весрсию 1.3.27
ницу запрещения. Соответственно, эти пользователи ни- PL30.16. Ну а вы, как всегда, берите новейший дистрибутив
когда Интернета не увидят. Чтобы добиться такого эф- ftp://ftp.lexa.ru/pub/apache-rus/apache_1.3.27rusPL30.16.tar.gz.
фекта, нужно удалить из squid.conf строки: Распаковываем его и ставим в комплекте по умолчанию.

acl users src "/usr/local/squid/etc/users.txt" # tar zxvf apache_1.3.27rusPL30.16.tar.gz


http_access allow users # ./configure
http_access deny all # gmake
# gmake instal
И добавить в squid.conf вместо них строку:
Запускаем apache:
http_access allow all
/usr/local/apache/bin/apachectl start
Мне больше нравится второй вариант разграничения
доступа. Если использовать традиционную схему разгра- Создаем директорию, где будут лежать пустой баннер
ничения прав, то проверка прав доступа происходит дваж- и файл mp3 с каким-либо забавным звуком.
ды. Сначала внутри Squid, а затем в SquidGuard. Мне ка-
жется, что управлять доступом в одной точке гораздо удоб- # mkdir /usr/local/apache/htdocs/replace
нее. Но это опять же дело вкуса.
Настало время создать директорию, в которой у нас Кладем туда 1x1.gif и my.mp3. Берем модифицирован-
будет храниться кеш squid. ный block.cgi и копируем его в /usr/local/apache/cgi-bin
Выставляем ему нужные права:
# mkdir /usr/local/squid/cache
# chown nobody:wheel /usr/local/apache/cgi-bin/block.cgi
# chmod 500 /usr/local/apache/cgi-bin/block.cgi
А тут у нас будут лежать логи.
block.cgi – это perl-скрипт, который будет вызывать-
# mkdir /usr/local/squid/logs ся каждый раз, когда пользователь попытается посе-
тить запрещенную страницу. Взять его можно из архи-
Нужно позаботиться, чтобы директории /usr/local/squid/ ва с дистрибутивом squidGuard. В первоначальном ва-
cache и /usr/local/squid/logs были доступны пользователю, рианте этот скрипт назывался squidGuard-1.2.0/samples/
от имени которого работает squid. Узнать имя этого squidGuard.cgi.in. Можно использовать его, но все же
пользователя можно так: лучше взять слегка модифицированный мною вариант.
Мой скрипт, наверное, лучше, потому что руссифици-
# cat /usr/local/squid/etc/squid.conf | grep cache_effectiv рованный. На его исправление ушло почти два часа.
cache_effective_user nobody
ñache_effective_group nogroup Итак, все подготовительные работы окончены, и са-
мое время взяться за установку squidGuard 1.2.0. Для его
Получается, что пользователя зовут nobody, группа у работы необходимо иметь Berkeley DB обязательно вер-
него nogroup. сии 3.2.9. В свою очередь, Berkeley DB не соберется без
libtool. Довольно запутаная получается цепочка. Но боять-
# chown -R nobody /usr/local/squid/cache /usr/local/squid/logs ся не стоит. Берем libtool из коллекции портированных
# /usr/local/squid/sbin/squid -z
приложений (http://www.freebsd.org/cgi/pds.cgi?ports/devel/
Внутри директории /usr/local/squid/cache создаем libtool) и, как обычно, выполняем распаковку, компиляцию,
иерархию директорий для хранения кеш-файлов. Загля- а затем и установку:
нув в /usr/local/squid/cache, вы сразу поймете, что имелось
в виду под словом иерархия. # tar zxvf libtool-1.3.4.tar.gz
# cd libtool-1.3.4
Запускаем squid.
# ./configure
# /usr/local/squid/sbin/squid -D # gmake
# gmake install

А на другой консоли смотрим, какие сообщения об С выполнением этих действий не должно возникнуть

№4(5), апрель 2003 33


администрирование
никаких сложностей. Скачиваем Berkeley DB 3.2.9 с http://
www.sleepycat.com/update/index.html. Забираем два пат-
ча http://www.sleepycat.com/download/patchlogs.shtml. И
снова:

# tar zxvf db-3.2.9.tar.gz

Копируем патч-файлы в получившуюся после распа-


ковки дистрибутива директорию db-3.2.9. Затем приме-
няем их для модификации исходного кода.

# cp patch.3.2.9.1 patch.3.2.9.2 ./db-3.2.9


# cd /usr/local/src/db-3.2.9
# patch -p0 < patch.3.2.9.1
# patch -p0 < patch.3.2.9.2
Итак, вполне очевидно, что лучше всего взять список
А теперь снова компиляция. MESD или Dansguardian. Какой из них выбрать – остав-
ляю на ваше личное усмотрение. И тот, и другой обновля-
# cd build_unix ются довольно часто. Но во избежание перегрузки серви-
# ../dist/configure
# gmake са, не стоит качать списки чаще чем раз в неделю.
# gmake install Скачав себе один из списков, распакуем его в дирек-
торию /usr/local/squidGuard/db:
Забираем squidGuard-1.2.0 с http://www.squidguard.org/
download/. Распаковываем и компилируем: # tar zxvf blacklists.tgz -C /usr/local/squidGuard
# mv /usr/local/squidGuard/blacklists /usr/local/ ↵
squidGuard/db
# tar zxvf squidGuard-1.2.0.tar.gz
# cd squidGuard-1.2.0
# ./configure --prefix=/usr/local/squidGuard ↵ В директории /usr/local/squidGuard/db появилось не-
--with-db=/usr/local/BerkeleyDB.3.2 ↵ сколько поддиректорий. В свою очередь, в каждой из них
--with-sg-config=/usr/local/squidGuard/squidGuard.conf ↵
--with-sg-logdir=/usr/local/squidGuard/log ↵ лежат файлы:
--with-sg-dbhome=/usr/local/squidGuard/db  domains – список доменов;
 urls – список адресов, используемых для блокирова-
Разберемся с ключами, передаваемыми программе ния одельной страницы, а не всего домена;
configure:  expression – выражения, используемые при поиске в
 --prefix=/usr/local/squidGuard – директория, в которую url. Например, sex, hot, teens, porno и т. д.
будет установлен squidGuard;
 --with-db=/usr/local/BerkeleyDB.3.2 – тут находится ис- Если бы мы взяли официальный список squidGuard, то
пользуемая в процессе компиляции библиотека внутри каждой директории можно было бы увидеть фай-
BerkeleyDB.3.2; лы обновлений к базам с такими названиями:
 --with-sg-config=/usr/local/squidGuard/squidGuard.conf –
местонахождение файла конфигурации squidGuard; domains.20020825.diff
domains.20020901.diff
 --with-sg-logdir=/usr/local/squidGuard/log – директория domains.20020908.diff
для файлов протоколов; domains.20020915.diff
domains.20020922.diff
 --with-sg-dbhome=/usr/local/squidGuard/db – тут будут
находиться списки блокируемых сайтов. Внутри каждого из этих файлов находятся записи вида:

# gmake +xratedpornsite.com
# gmake test +209.51.157.43
# gmake install -zena.cenhost.com
-scuzz.xtac.com
Cоздаем для хранения файлов протоколирования ра-
боты squidGuard директорию /usr/local/squidGuard/log. Также в директории находятся файлы:

# mkdir /usr/local/squidGuard/log urls.20020825.diff


urls.20020901.diff
urls.20020908.diff
Официальный список блокируемых доменов можно urls.20020915.diff
urls.20020922.diff
взять на сайте squidGuard – http://www.squidguard.org/
blacklist. Также доступен список от MESD – http:// С записями вроде:
squidguard.mesd.k12.or.us/blacklists.tgz. И еще один хороший
список от Dansguardian – http://blacklist.dansguardian.org/cgi- -silva.org/look_at_me
+recom.it/fuck/beatrice
bin/download.pl?type=download&file=bigblacklist.
Кратко сравним их между собой: Записи, начинающиеся знаком «+», – это запрос на

34
администрирование
добавление строчки в главную базу. Соответственно, стро- %a&clientname=%n&clientident=%i&clientgroup=%s&targetgroup=%t&url=%u
}
ки с минусом имеют обратное назначение. К сожалению,
применить файлы обновления можно только к базе в фор- # íà÷èíàåì ðàçäàâàòü ïðàâà
acl {
мате Berkeley DB. Выполняется это действие командой: # îòäåëó ÈÒ ìîæíî âñå, êðîìå ðåêëàìû
it-department {
# squidGuard -u pass local-ok !banners !ads all
}
dostavka {
pass local-ok !porn !banners !ads !local-block all
Мне кажется, что такой способ обновления не очень redirect http://192.168.10.9/cgi-bin/block.cgi?clientaddr=↵
удобен. Поэтому нам следует либо отказаться от списка %a&clientname=%n&clientident=%i&clientgroup=↵
%s&targetgroup=%t&url=%u
доменов, составленного squidGuard, либо написать кон- rewrite mp3
вертор обновлений в нормальный формат. }
# îòäåëó ñíàáæåíèÿ ðàçðåøàåì òîëüêî òî, ÷òî îïðåäåëåíî
Разобравшись с форматом базы, приступим к конфи- # â local-ok
гурированию squidGuard. Cоздаем файл /usr/local/ snab {
# òàê ìîæíî äàòü ïîëüçîâàòåëþ äîñòóï òîëüêî ê èçáðàííûì
squidGuard/squidGuard.conf. И вносим в него вот это: # ñàéòàì
pass local-ok none
# òóò ó íàñ ëåæàò ëîãè redirect http://192.168.10.9/cgi-bin/block.cgi?clientaddr= ↵
logdir /usr/local/squidGuard/log %a&clientname=%n&clientident=%i&clientgroup= ↵
# çäåñü áàçû %s&targetgroup=%t&url=%u
dbhome /usr/local/squidGuard/db rewrite mp3
# îïèñûâàåì àäðåñà îòäåëà ÈÒ }
src it-department { # äåéñòâèÿ, âûïîëíÿåìûå ïî óìîë÷àíèþ, åñëè ïîëüçîâàòåëü
ip 192.168.10.222-192.168.10.223 # íå îïèñàí íè â îäíîì src
} default {
# îòäåë äîñòàâêè # áëîêèðóåì âñå
src dostavka { pass none
ip 192.168.10.101, 192.168.10.104 redirect http://192.168.10.9/cgi-bin/block.cgi?clientaddr= ↵
} %a&clientname=%n&clientident=%i&clientgroup= ↵
# îòäåë ñíàáæåíèÿ %s&targetgroup=Not_Authorized&url=%u
src snab { # ïèøåì ëîãè â ôàéë /usr/local/squidGuard/log/default
ip 192.168.10.105 log default
} }
# ãîâîðèì, ÷òî âñå îáðàùåíèÿ ê ôàéëàì *.mp3 íóæíî ïåðåíàï- # çàêðûâàåì ñïèñîê acl
# ðàâèòü íà http://192.168.10.9/replace/my.mp3 }
rewrite mp3 { Кстати, не забудьте скачать мою базу баннеров: http://
s@.*\.mp3$@http://192.168.10.9/replace/my.mp3@r
# è çàïðîòîêîëèðîâàòü ýòî ñîáûòèå â ôàéëå onix.opennet.ru/files/banners.tar.gz. Потом вы сможете вно-
# /usr/local/squidGuard/log/rewr_mp3 сить в нее свои собственные записи. Иначе при запуске
log rewr_mp3
} squidGuard будет жаловаться на ее отсутствие и становить-
# îïèñûâàåì áàçó ïîðíîñàéòîâ ся в режим холостой работы. В этом режиме он будет про-
dest porn {
domainlist porn/domains пускать все запросы без обработки.
urllist porn/urls Покончив с файлом конфигурации, продолжим на-
# çàïèñàòü ïðîòîêîë â ôàéë /usr/local/squidGuard/log/porn
log porn стройку squidGuard. Даем права пользователю, от имени
} которого будет работать squidGuard на директории log и
# îïèñûâàåì áàçó ðåêëàìû
dest ads { db. Так же поступаем и с файлом squidGuard.conf.
domainlist ads/domains
urllist ads/urls # chown -R nobody /usr/local/squidGuard/log ↵
# çàïèñàòü ïðîòîêîë â ôàéë /usr/local/squidGuard/log/ads /usr/local/squidGuard/db
log ads
# ïîäìåíÿåì âñå áàííåðû ïðîçðà÷íûì èçîáðàæåíèåì ðàçìåðîì # chown nobody /usr/local/squidGuard/squidGuard.conf
# 1x1 ïèêñåëü
redirect http://192.168.10.9/replace/1x1.gif SquidGuard может работать с текстовыми базами дан-
}
# îïèñûâàåì ñâîþ ñîáñòâåííóþ áàçó áàííåðíûõ ñèñòåì ных, но в таком случае при каждом запуске ему прихо-
dest banners { дится создавать в оперативной памяти бинарное дере-
domainlist banners/domains
# â ýòîì ôàéëå çàïèñàíû âûðàæåíèÿ òèïà baner, banner, ads, во всех загружаемых баз в формате Berkeley DB. Этот
# show_ads процесс занимает длительное время. Подобных задер-
expressionlist banners/expressions
urllist banners/urls жек можно избежать, если заранее самому создать
# ïåðåíàïðàâëÿåì âñå çàïðîñû íà ïðîçðà÷íûé gif ðàçìåðîì базы в нужном формате. На моей машине после созда-
# 1x1 ïèêñåëü
redirect http://192.168.10.9/replace/1x1.gif ния баз время загрузки сократилось почти в 10 раз. По-
log banners этому мы напишем скрипт (http://onix.opennet.ru/files/
}
# îïèñûâàåì äîìåíû, êîòîðûå íèêîãäà íå äîëæíû áëîêèðîâàòüñÿ rebuid_base.tar.gz) для перестройки баз и перезапуска
# âíå çàâèñèìîñòè îò ñïèñêà ñêà÷èâàåìîãî èç ñåòè squidGuard с новыми базами.
dest local-ok {
domainlist local-ok/domains
urllist local-ok/urls # cat > /usr/local/squidGuard/bin/rebuid_base.sh
} #!/bin/sh
# îïèñûâàåì äîìåíû, êîòîðûå äîëæíû áûòü çàáëîêèðîâàíû âñåãäà /usr/local/squidGuard/bin/squidGuard -C all
# âíå çàâèñèìîñòè îò ñïèñêà ñêà÷èâàåìîãî èç ñåòè chown -R nobody /usr/local/squidGuard/db
dest local-block { killall -HUP squid
domainlist local-block/domains ^D
urllist local-block/urls
# è ïåðåíàïðàâëÿåì âñå çàïðîñû íà block.cgi
redirect http://192.168.10.9/cgi-bin/block.cgi?clientaddr= ↵ Устанавливаем нужные права доступа на файл

№4(5), апрель 2003 35


администрирование
rebuid_base.sh. Убедимся, что этот скрипт имеет право за- ^D
пускать только пользовать root. # cat > /usr/local/etc/rc.d/squid.sh
#!/bin/sh
# chmod 100 /usr/local/squidGuard/bin/rebuid_base.sh /usr/local/squid/bin/squid -D
# /usr/local/squidGuard/bin/rebuid_base.sh ^D
# chmod 100 /usr/local/etc/rc.d/apache.sh ↵
Запустив rebuid_base.sh, необходимо дождаться нор- /usr/local/etc/rc.d/squid.sh
мального завершения задачи. Теперь во всех директори-
ях, упомянутых в разделах dest конфигурационного фай- Настало время перезагрузить машину. Это даст нам
ла, появились файлы баз данных domains.db и urls.db. возможность посмотреть, как сервисы поведут себя при
Перед тем как подключать squidGuard к squid, необхо- возможных перебоях в подаче электричества.
димо протестировать его локально. Для начала немного В качестве маленького бонуса можно наладить авто-
теории. Squid передает данные на стандартный ввод ре- матическое обновление базы доменов. Для скачивания
директора. Редиректор, в свою очередь, обрабатывает файла базы доменов нам понадобится программа wget –
запрос и выдает на стандарный вывод результаты своей http://www.freebsd.org/cgi/pds.cgi?ports/ftp/wget. Конечно,
работы. Затем squid забирает эти данные. Редиректор от- можно было обойтись и стандартным fetch. Но все же
вечает на запрос от squid либо пустой строкой, если пе- wget работает гораздо надежнее. Распаковываем и ста-
ренаправление не требуется, либо измененным URL. Фор- вим как обычно.
мат запроса от squid к редиректору выглядит так:
# tar zxvf wget-1.8.2.tar.gz
# cd wget-1.8.2
# ./configure
# gmake
# gmake install
Для того чтобы проверить, как squidGuard будет реа- Ñìîòðèì, êóäà îí ó íàñ óñòàíîâèëñÿ.
гировать на запросы пользователей, скачиваем написан- # where wget
ную мною тестовую программу test.tar.gz (http://
onix.opennet.ru/files/test.tar.gz). Распаковываем ее и кла- Пишем скрипт (http://onix.opennet.ru/files/rebuid_ba-
дем полученный файл test.pl в /usr/local/squidGuard/bin/. se.tar.gz), который будет выкачивать обновления с сайта
Устанавливаем файлу test.pl разрешение на выполнение. MESD и класть их в директорию /usr/local/squidGuard/update.
Затем запускаем test.pl и вводим тестируемый адрес. Пос- Затем архив с обновлениями будет распакован и скопиро-
ле этого в файле result.txt смотрим результаты работы ван в директорию /usr/local/squidGuard/bd. После этого бу-
squidGuard. Набор тестируемых сайтов можно изменять дет произведена перестройка баз и перезапуск squid.
прямо в файле test.pl. Если результаты теста вас удовлет-
ворили, значит самое время объединить squidGuard и Squid. #cat > /usr/local/squidGuard/bin/update_blacklist.sh
#!/bin/sh
В файл /usr/local/squid/etc/squid.conf добавляем строки: /usr/local/bin/wget -q --cache=off ↵
'http://squidguard.mesd.k12.or.us/blacklists.tgz' ↵
# åñëè íè îäèí èç ýêçåìïëÿðîâ squidGuard íå îòâå÷àåò, òî -O /usr/local/squidGuard/update/blacklist.tgz
# ðàáîòàòü íàïðÿìóþ tar zxvf /usr/local/squidGuard/update/blacklist.tgz -C ↵
/usr/local/squidGuard/update/
redirector_bypass on cp -R -f /usr/local/squidGuard/update/blacklists/* ↵
# ãäå íàõîäèòñÿ squidGuard
redirect_program /usr/local/squidGuard/bin/squidGuard /usr/local/squidGuard/bd
rm -R /usr/local/squidGuard/update/blacklists
# ñêîëüêî ýêçåìðëÿðîâ squidGuard çàïóñêàòü /usr/local/squidGuard/rebuid_base.sh
redirect_children 1
^D

Перезапускаем squid. В свою очередь, squid самосто- Теперь даем нашему скрипту нужные права.
ятельно выполнит перезапуск всех дочерних процессов
редиректоров. # chmod 100 /usr/local/squidGuard/bin/update_blacklist.sh

# killall -HUP squid Создадим временную директорию, в которую будут


распаковываться обновления.
В конце файла /usr/local/squidGuard/log/squidGuard.log
ищем такие строки: # mkdir /usr/local/squidGuard/update

2002-10-15 16:11:04 [10653] squidGuard 1.2.0 started ↵ Настраиваем планировщик на выполнение нашего задания.
(1034683864.337)
2002-10-15 16:11:04 [10653] squidGuard ready for ↵
requests (1034683864.353) # crontab -e -u root
MAILTO="admin@test.ru"
1 0 * * 7 /usr/local/squidGuard/bin/update_blacklist.sh
Если они есть, значит все работает как положено. Те-
перь сделаем так, чтобы Squid и Apache запускались ав- Назначаем выполнение обновления на 0 часов 1 мину-
томатически при каждой загрузке машины. ту каждого воскресенья. Уведомление о выполнении этого
задания приказываем направлять на адрес admin@test.ru.
# cat > /usr/local/etc/rc.d/apache.sh Теперь осталось раздать всем пользователям подобающие
#!/bin/sh
/usr/local/apache/bin/apachectl start права и можно отдыхать.

36
FAQ Shell
ВОПРОС: ВОПРОС:
Как работать с интерактивными программами, напри- А почему большинство скриптов написано на Bourne shell?
мер, telnet или ftp? Почему моя любимая tcsh обойдена вниманием?
ОТВЕТ: ОТВЕТ:
Вопрос не относится непосредственно к shell, для ре- Скажу к слову, tcsh – это и моя любимая оболочка, я ра-
шения этой задачи удобно использовать специальный ботаю в ней, как в интерактивной, но скрипты всегда пишу
пакет функций tcl -expect (http://expect.nist.gov). Данный в Bourne shell. Причина проста: скрипты на Bourne shell
пакет содержит функции: больше распространены, и любому администратору не-
 spawn – породить процеcc; обходимо знать эту оболочку, по ней есть много доку-
 send – послать процессу входные данные; ментации, в том числе и на русском языке. Программи-
 expect – в зависимости от выводимых данных по- ровать в C-shell несколько привычнее, но многочислен-
слать процессу некие входные данные. ные ошибки реализации языка (особенно в клаccическом
csh) сильно затрудняют работу. В частности, не очень
Простой пример – получение файлов по ftp в автомати- удобен механизм перенаправлений:
ческом режиме:
sh:
mpg123 ./*.mp3 > /dev/null 2>&1
spawn /usr/bin/ftp ftp.myhost.ru csh:
expect{ mpg123 ./*.mp3 > /dev/null) >& /dev/null
"Name*: " {send "username\r"}
"Password:" {send "user_password\r"}
"failed" {puts "Can`t login."; exit 1}
} В оболочке C практически невозможно нормально раз-
send "lcd /etc\r" делить stdout и stderr.
expect "ftp> " {send "cd /pub/etc\r"}
expect "ftp> " {send "get passwd\r"}
expect "ftp> " {send "quit\r"} ВОПРОС:
exit 0
В моей системе нет команды killall. Что можно придумать?
Работа с telnet и ssh также не должна вызвать затруд- ОТВЕТ:
нений (кроме автокоманд на сервере, выполняемых при Пишем примерно такой сценарий:
запуске командного интерпретатора). А вообще, expect
#!/bin/sh
– это очень полезный инструмент, позволяющий авто- kill $1 `ps ax | grep $2 | awk '{print $1}'| sed 's/\n/ /g'`
матизировать интерактивные операции (учтите, что для
его работы необходим tcl). Вызываем скрипт так:

ВОПРОС: killall -9 ftpd


Как узнать, в командном или интерактивном режиме ра-
ботает shell? Один минус: убивается больше процессов, чем нужно, т.к.
ОТВЕТ: grep находит сам себя и пытается убить лишние процес-
Можно проверить специальную переменную $- или пере- сы. Хотя это несмертельно, но если такого процесса нет,
менную $PS1. Для первого случая можно использовать то программа всё равно выводит Killed. Поэтому вывод
скрипт, подобный такому: надо дополнительно фильтровать, но мне было вполне до-
статочно такого варианта.
case $- in
*i*) # èíòåðàêòèâíûé ðåæèì
;; ВОПРОС:
*) # íåèíòåðàêòèâíûé ðåæèì Как найти в /etc/passwd записи с нулевым UID (кроме root)?
;;
esac ОТВЕТ:

Проверка режима оказывается полезной при написании #/bin/sh


сценариев, когда неизвестно, необходимо ли выводить в for i in `awk -F: '{if($3 == "0" && $1 != "root") print $1}'
/etc/passwd`
stdout или stderr какие-либо данные (нет смысла в неинте- do
рактивном режиме). Также полезно применять в инициа- mail -s "Strange user!" root@mymail.net << EOT
There is a user ${i} that has uid = 0
лизационных сценариях оболочки (например, чтобы выпол- `date`
нение отдельных команд через ssh или rsh не вызывало EOT
запуск кучи вспомогательных программ). Для оболочки C done
(csh, tcsh) синтаксис проверки будет несколько иным:
Удобно добавить этот скрипт в crontab (учтите, что ис-
if(! $?prompt) пользуется gawk -параметр -F могут не понять старые
# íåèíòåðàêòèâíàÿ îáîëî÷êà
exit версии awk, в таком случае внутри awk-скрипта надо ус-
else тановить FS=":").
# èíòåðàêòèâíàÿ îáîëî÷êà
echo Hi
exit
endif
Составил Всеволод Стахов

№4(5), апрель 2003 37


УСТАНОВКА
И НАСТРОЙКА
СЕРВЕРА JABBER НА
ПЛАТФОРМЕ LINUX
СЕРГЕЙ ИНДЛИН
администрирование
Что же такое Jabber? Это открытый XML-протокол, пред- что Jabber-сервер использует порт 5222 (5223 ssl) для
назначенный для мгновенного обмена сообщениями меж- связи с клиентами и порт 5269 для связи между серве-
ду узлами в Интернете. рами. То есть если вы хотите, чтобы клиенты извне мог-
Коротко перечислю основные преимущества Jabber: ли использовать ваш сервер, надо открыть порты 5222 и
 открытый протокол: над развитием Jabber работает 5223. Если вы хотите, чтобы пользователи вашего сер-
большое количество людей, доступны различные ре- вера могли общаться с пользователями других серве-
ализации и библиотеки. Все спецификации и доку- ров, надо открыть порт 5269.
ментация находятся в свободном доступе; При возникновении проблем стоит прочитать руковод-
 Jabber – децентрализованная система, не зависящая ство администратора, расположенное по адресу: http://
от единого сервера или компании. Любой пользова- www.jabber.org/admin/adminguide.html.
тель может поставить свой сервер и подключить его
к открытой сети или ограничить его работу локаль- Настройка сервера
ной сетью предприятия; Основной файл настроек сервера называется jabber.xml
 безопасность: большинство реализаций серверов под- и, как можно понять из названия, имеет формат xml. Кон-
держивают связь с клиентами по шифрованному ка- фигурационный файл хорошо документирован, для редак-
налу SSL, возможно шифрование сообщений с исполь- тирования можно использовать любой xml или текстовый
зованием gpg; редактор.
 поддержка unicode. Для нас это означает отсутствие Итак, открываем в удобном текстовом редакторе файл
проблем, связанных с различными кодировками рус- /usr/local/jabber/jabber.xml и внимательно читаем коммен-
ского языка; тарии. Вот что можно поменять для начала:
 функциональность сервера можно расширять с помо-  тег host – имя сервера. Если вы хотите общаться с
щью дополнительных модулей. Например, для связи пользователями других серверов, или клиенты под-
с другими системами IM можно использовать аген- ключаются через Интернет, это имя должно быть за-
тов icq, yahoo, aim, msn. Для поддержки многополь- регистрировано в DNS. Для сборки ALT Linux опреде-
зовательских конференций также существует модуль, ляется в файле /etc/jabber/jabber.cfg;
возможна связь с irc-сетями.  vCard – описание нашего сервера;
 welcome – сообщение, которое будет посылаться но-
На странице http://www.jabber.org/admin/serverlist.php вым пользователям;
можно найти список доступных реализаций серверов.  cекция admin – здесь надо задать локальные иденти-
Здесь я опишу установку и настройку свободного сер- фикаторы администраторов (предварительно раском-
вера Jabber, распространяемого под лицензией GNU GPL ментировав секцию). Имена в теге read будут полу-
– jabberd 1.4.2. чать административные сообщения (например, о ре-
Несколько слов об идентификаторах. Jabber исполь- гистрации новых пользователей), а в теге write до-
зует систему имен, аналогичную адресу электронной по- полнительно могут делать рассылки и задавать со-
чты: name@host.domain, в отличие от icq, где применя- общение дня;
ются цифровые идентификаторы. Например, мой JID  update – проверять обновления сервера. Спокойно
(Jabber ID) – serj@abc92.ru. можно закомментировать.

Установка сервера Теперь стоит настроить ssl-подключение к серверу


На домашней странице проекта http://jabberd.jabber для защиты трафика между клиентами и сервером. Для
studio.org можно скачать исходники сервера или готовые генерации сертификата используем следующий скрипт
пакеты для различных систем. Для дистрибутивов ALT (http://www.jabber.org/admin/adminguide.html#security-ssl):
Linux сервер Jabber можно установить из репозитария
Sisyphus командой apt-get install jabber. OPENSSL=/usr/bin/openssl
При сборке из исходников сервер не устанавливает- ## This generates the cert and key
ся в системные каталоги, а стартует прямо из каталога ## The key will be valid for 3650 days.
## Be sure to enter the FQDN of your Jabber
сборки. Развернем исходный тарбол в директорию, на- ## server as the «Common Name».
пример, /usr/local/jabber. Для сборки в системе должны $OPENSSL req -new -x509 -newkey rsa:1024 -days 3650
-keyout privkey.pem -out key.pem
присутствовать, помимо обычной сборочной среды (gcc, ## This will remove the passphrase
make, библиотеки и т. д.), библиотеки libpth, libpth-devel, $OPENSSL rsa -in privkey.pem -out privkey.pem
## Put it all together
libssl, openssl-devel (в разных системах названия могут cat privkey.pem >> key.pem
немного отличаться). ## Cleanup
rm privkey.pem
Заходим в каталог /usr/local/jabber и даем команду
./configure —enable-ssl. Внимательно читаем вывод. Вна- При генерации ключа в качестве “Common Name” не-
чале должна быть строка “Searching for SSL... Found”. обходимо использовать имя Jabber-сервера.
Если все хорошо, даем команду make и ждем, пока со- После того как файл с ключами готов, надо разре-
берется сервер. После успешной сборки приступаем к шить в конфиге Jabber-сервера использовать ssl-порт.
конфигурированию. В файле /usr/local/jabber/jabber.xml находим секцию io и
Если ваша сеть защищена фаерволом, надо учесть, в ней раскомментируем секцию ssl, указав полный путь

№4(5), апрель 2003 39


администрирование
к файлу сертификата: /usr/local/jabber/key.pem, а в сек- ICQ-транспорт
ции pthcsock надо раскомментировать строку ssl и за- Для Jabber есть два транспорта icq – icqv7-t и jit. Jit мне
дать ip для ssl-порта. показался более продвинутым. Он поддерживает пере-
Ну вот, теперь можно попробовать запустить сервер. Из кодировку через параметр в конфигурационном файле
каталога /usr/local/jabber даем команду jabberd/jabberd -D и (для icqv7-t нужно патчить исходный код), работает по-
смотрим на отладочную информацию. Берем любого клиен- иск icq-контактов, кроме того, jit более стабильный, чем
та (под Windows я рекомендую jajc, под Linux – tkabber) и icqv7-t.
пытаемся подключиться к серверу. При первом подключе- Для установки скачиваем архив с исходным кодом
нии должно появиться предложение создать новую учетную на странице http://jit.jabberstudio.org и раскрываем его.
запись. Jit идет со своей версией Jabber-сервера и запускает-
Посмотрим, какие же сервисы у нас есть. Для этого в ся как отдельный процесс. Даем команду ./configure и
клиенте открываем браузер ресурсов и видим только make. Если все собралось без ошибок, копируем фай-
один сервис – адресная книга jabber.org. Давайте настро- лы jabberd/jabberd, jit/jit.so в любую директорию, напри-
им некоторые дополнительные сервисы на нашем сер- мер, /usr/local/jabber/jit. Туда же копируем файл jabber-
вере. Подробнее об администрировании сервисов мож- icq.example и переименовываем его в jabber-icq.xml.
но прочитать на странице: http://www.jabber.org/admin/ Теперь надо отредактировать этот файл, указав свои
componentadminguide.html. имена сервера. Так как в нашем случае этот сервис бу-
дет выполняться на той же машине, что и основной сер-
Адресная книга вер Jabber, в качестве ip указываем 127.0.0.1. В теге
Для установки на ALT Linux достаточно дать команду apt- secret задаем пароль для связи с основным сервером
get install jabber-jud. Для других дистрибутивов можно ска- Jabber. Протокол icq ничего не знает про unicode, а в
чать jud (jabber user directory) со страницы http:// нашей стране исторически сложилось использование
jabberd.jabberstudio.org/downloads. Скачав исходник, раз- кодировки windows-1251 для icq. Поэтому сервису jit не-
вернем его прямо в директорию /usr/local/jabber. Пере- обходимо знать, в какую кодировку преобразовывать
ходим в директорию /usr/local/jabber/jud-0.4 и даем ко- сообщения из/в unicode. Эта кодировка задается тегом
манду make. После успешной сборки читаем файл charset, который надо установить в windows-1251.
README и копируем нужные секции в основной конфи- Внимательно читаем файл INSTALL в директории
гурационный файл /usr/local/jabber/jabber.xml. /usr/local/jabber/jit/jit и копируем из него нужные секции
Будьте внимательны: секцию “service id="jud"“ надо в конфиг jabber.xml основного сервера. Помните об
скопировать в корневой раздел (внутри тега jabber), а иерархии тегов. Секция “service id="icq"“ должна быть
“service type="jud"“ – в раздел browse. Меняем имя хоста вложена в тег jabber конфига, а секция “service
на реальное в обеих секциях, правим путь к jud.so на type="icq"“ в раздел browse. Меняем, как обычно, име-
наш – ./jud-0.4/jud.so и по желанию меняем vCard. на сервера, в поле ip задаем 127.0.0.1, secret – тот же,
Теперь можно перезапустить сервер и наслаждаться что и в jabber-icq.xml и порт 5555. Эти параметры опре-
корпоративной адресной книгой. деляют, по какому порту основной сервер будет ждать
связи от jit-процесса.
Конференции Перезапускаем основной сервер Jabber и запуска-
Новый протокол конференций muc поддерживается ем отдельным процессом jit:
агентом muconference-0.3.tar.gz, доступным на страни-
/usr/local/jabber/jit/jabber -H /usr/local/jabber/jit/ -c
це http://mu-conference.jabberstudio.org. Скачиваем ар- /usr/local/jabber/jit/jabber-icq.xml
хив и разворачиваем его в директорию jabber. Перехо-
дим в новую директорию /usr/local/jabber/mu-conference В клиенте открываем браузер ресурсов и находим ICQ
и даем команду make. После успешной сборки внима- Link. Пытаемся зарегистрироваться. В качестве имени
тельно читаем файл README и копируем оттуда нуж- вводим свой числовой номер icq. Если все хорошо, то в
ные секции в конфигурационный файл Jabber сервера ростере должен появиться агент с именем ICQ Transport.
jabber.xml. Теперь можно добавлять контакты icq в форме
Не забудьте поменять localhost.localdomain на реаль- uin@icq.host.domain, искать через сервис ICQ Link/search
ное имя хоста. Если вы хотите, чтобы конференции были или импортировать существующие контакты. Кстати,
дос т упны из Интернета, зарегис трируйте имя если вы использовали раньше icq с сохранением контак-
conference.host.domain в службе DNS. тов на сервере, то jit их автоматически импортирует.
Теперь можно перезапустить сервер и с помощью Я надеюсь, что эта статья облегчит вам установку
браузера ресурсов убедиться, что новый сервис досту- собственного сервера Jabber. Не так уж это и сложно.
пен на сервере. В клиенте попробуйте зайти в комнату Дополнительно можно установить агентов доступа к
и настроить ее свойства. Комнату можно сделать по- сетям aim, jahoo, msm – ведь Jabber является откры-
стоянной, приватной, запароленной и т. д. При разго- тым, расширяемым решением для взаимодействия.
воре в комнате работают команды с префиксом “/” типа В качестве информации на русском языке рекомен-
/me, /smile и множество других. дую сервер http://www.jabber.ru, на этом же сервере
В клиенте tkabber на эти команды работает допол- можно свободно зарегистрироваться. И успешного
нение клавишей tab. Jabber-а!

40
FAQ Shell
ВОПРОС: тановка переменной по умолчанию), но охватить всё в рам-
В чем состоят отличия различных оболочек? ках данного вопроса явно не удастся, за дополнительны-
ОТВЕТ: ми сведениями обращайтесь к документу http://ln.com.ua/
Сравнительная таблица наиболее известных оболочек ~openxs/projects/man/solaris8/bash.html#expansion.
может быть найдена на http://www.looking-glass.org/
shell.html. Одной из наиболее функциональных оболочек ВОПРОС:
является zsh (хотя за функциональность приходится рас- В чем отличие различных кавычек в shell?
плачиваться некоторой потерей быстродействия). Для ОТВЕТ:
большинства операций обычно достаточно bash или tcsh. Кавычки – это очень полезный инструмент. Различные
Вообще существует два типа оболочек – произошедшие виды кавычек применяются в различных случаях (учтите,
от Bourne shell (sh, bash, ksh, zsh) и произошедшие от кавычки сохраняют своё значение и в интерактивной обо-
C-shell (csh, tcsh). Отличия в синтаксисе оболочек весьма лочке). Итак, какие бывают кавычки:
существенны. Оболочки, произошедшие от Bourne shell,  двойные(") – внутри таких кавычек происходят все тек-
чаще используются для программирования, так как язык стовые подстановки (см. ниже), в том числе и подста-
C-shell далёк от совершенства (хотя я бы не сказал, что новка обратных кавычек. Например, echo "$PATH" вы-
tcsh многим уступает в возможностях программирования ведет значение переменной PATH, а echo "${PATH}
bash, но исторически csh обладал кучей огрехов, поэтому `date`" выведет значение PATH, поставит пробел и под-
сейчас более распространён синтаксис Bourne shell). Обо- ставит результат выполнения программы date;
лочки С-shell всегда являлись больше интерактивными  одинарные(') – внутри одинарных кавычек всё печата-
оболочками, но язык их скриптов намного ближе тем, кто ется как есть, без подстановок: echo '$PATH' выведет
знаком с языком С. К сожалению, русской документации $PATH;
по C-shell я не встречал. Может быть, в скором времени  обратные(`) – подставление вывода указанной в ка-
этот пробел будет заполнен. вычках команды, также выполняются все подстанов-
ки: `ps aux | grep $1` – выведет список заданных в ар-
ВОПРОС: гументе $1 процессов. Учтите, что результатом могут
Существует ли руководство по bash на русском языке? быть несколько строк.
ОТВЕТ:
Да, есть: ВОПРОС:
http://ln.com.ua/~openxs/projects/man/solaris8/bash.html Как прочитать несколько строк с терминала?
http://www.citforum.ru/programming/shell/index.shtml ОТВЕТ:
Для этого используется цикл while с командой read. Стан-
ВОПРОС: дартное решение:
Как работают текстовые замены и подстановки в bash?
ОТВЕТ: while read line
do
Вообще текстовые замены и подстановки – это одна из echo $line
самых мощных возможностей bash (в оригинальной sh эти done
возможности сильно урезаны). Существует несколько ти-
пов текстовых подстановок командной строки: Можно выполнять построчное чтение не с терминала, а
 фигурные скобки – всё, что находится в командной из файла – для этого достаточно выполнить перенаправ-
строке в фигурных скобках {}, расценивается как шаб- ление цикла:
лон для поиска, объединённый командой ИЛИ: file{1,2}
заменится на file1 file2 chown root /usr/{ucb/{ex,edit},lib/ while read line
do
{ex?.?*,how_ex}; echo $line
 подстановка $ – все, что идёт после данного символа done < /etc/passwd
расценивается как значение переменной или резуль-
тат выполнения команды. Также полезно окружать под- C другой стороны, для операции со строками лучше все-
становку после $ фигурными скобками (отделение от го использовать awk. Очень удобно использовать awk для
остальной части текста): echo "${HOME} – this is where выбора некоторых слов из строки, но программирование
you files are". echo ${`date`}; в awk – это большая отдельная тема.
 подстановка процессов;
 подстановка имён файлов; ВОПРОС:
 разбиение переменных на слова – по умолчанию ин- Будет ли продолжение данного FAQ?
терпретатор разбивает все переменные и результаты ОТВЕТ:
выполнения команд, не заключённые в двойные кавыч- Задавайте ваши вопросы мне: CEBKA@smtp.ru. Наибо-
ки, на слова, что позволяет обрабатывать переменные лее интересные войдут в этот список.
в циклах по полям.

Существует достаточно много дополнительных парамет-


ров подстановки (например, подстановка подстрок или ус- Составил Всеволод Стахов

№4(5), апрель 2003 41


РАЗВОДНОЙ МОСТ
НА LINUX
(BRIDGING FIREWALLS)
администрирование
Для подключения телекоммуникационных се- Ситуация с адресами на сегодняшний день критическая,
тей к Интернету провайдер на целую сеть обыч- в том смысле, что IP-адресов v.4 не хватает, а конечные
но выделяет всего лишь один реальный IP-ад- пользователи никак не планируют свой переход на IP v.6.
рес, а далее вы организуете у себя компью- С одной стороны, хорошо, если все компьютеры в сети
тер-шлюз, за которым располагаете вашу сет- будут иметь реальные адреса. Но с другой, это породит и
ку с адресами вида 192.168.x.x (либо часть проблем, таких как сокрытие внутренней организа-
172.16.0.0/12, либо 10.0.0.0/8) из RFC 1918. На ции сети, сокрытие числа пользователей в сети, расходу-
компьютере-шлюзе обычно имеется две сете- емого ими трафика и получаемых в итоге доходов. Удоб-
вые карты, поднимаются прокси-сервера тех но, когда все внутренние хосты маскируются за одним ад-
или иных сервисов либо NAT (трансляция ад- ресом, поэтому это очень популярно у нас в России. Так-
ресов или маскарадинг), либо всё сразу. Такая же это удобно с точки зрения настройки. В случае смены
конфигурация встречается очень часто, поэто- провайдера (или внешнего IP-адреса) менять настройки
му в литературе хорошо описано, что и как на- придётся на одном компьютере, а не на всех компьюте-
страивать. Однако в случае, когда все адреса, рах внутренней сети. Хотя бывают случаи, когда упроще-
выделенные провайдером, являются реальны- ния процесса перенастройки не происходит (если исполь-
ми, существует несколько решений по органи- зуются DNS- и SMTP-сервера провайдера). Возникает ло-
зации сети. В литературе об этом пишут мень- гичный вопрос: «А как следует правильно развивать сети,
ше, поэтому об одном весьма удобном спосо- чтобы иметь при этом меньше проблем?». Однозначного
бе организации я и попробую рассказать. ответа на этот вопрос дать нельзя. Вопрос о том, что луч-
ше: реальные (легитимные) или маскируемые (нелегитим-
ные) адреса и как их использовать, на мой взгляд, зас-
луживает отдельной статьи. Поэтому дискуссию по этому
вопросу я предлагаю перенести на форум сайта журнала.
Итак, вам предстоит работать с реальными адресами.
Правила организации сетей никто не отменял, и если вам
нужен всего лишь один IP-адрес, то реально провайдер
выделяет вам подсетку из 4-х адресов. Запишем адрес в
двоичном виде и посмотрим только на два последних бита
в двоичной записи: 00 – адрес сети; 11 – широковещание
(broadcast), а два оставшихся – 01 и 10 – ваши адреса.
Так как для общения с внешним миром в вашей сетке обя-
зательно должен быть шлюз, которому также надо выде-
лить один реальный адрес, пусть им будет 01. В результа-
те для нас остаётся один-единственный адрес, заканчи-
вающийся на 10.
Небольшое замечание: при подсчёте трафика провай-
дер будет суммировать всё, что будет попадать на все адре-
са сети, в последнем примере – это 4 адреса, а не тот один,
который присвоен вашему компьютеру. Так что это следует
учесть и не удивляться, что при правильном учёте трафика
ваши данные и данные провайдера будут расходиться не в
вашу пользу. Но, как известно, всегда бывают исключения.
Если же провайдером выделяется несколько большая
подсесть, скажем, в два раза большая, то реально будет вы-
делено не 8, а 8-3=5 адресов. Иметь 8 адресов подряд куда
более выгоднее, чем 4+4. Вот вам и арифметика – «1+1=5».
Если адресов будет 16, то возможных к использованию бу-
дет уже 16-3=13 и т. д. Обычно большие сети делятся на
подсети, если адресов много, то потери невелики, и от деле-
ния получается только выгода. А вот если поделить 8 адре-
сов, то явно будут большие потери. Легко понять, что потери
кроются вроде как в лишнем адресе подсети и лишнем ад-
ресе для шлюза. Каким образом поделить сеть, чтобы не
терять адреса? Это мы и попытаемся сделать. Довольно
часто бывает, что шлюз, используемый в провайдерской
сети, не имеет большого числа настроек, либо вообще на-
ходится на попечении провайдера и не подвластен для ва-
шего контроля. Поэтому областью наших настроек и экспе-
ПАВЕЛ ЗАКЛЯКОВ риментов будет все, что находится за зтим шлюзом.

43
администрирование
Ограничим область наших действий. Для этого предла- Тогда даже прописанные вручную правила:
гаемые советы по организации нелегитимной сети следует
сразу отклонить. Компьютеры внутри сети должны иметь ре- # route add -host x.x.x.1 dev eth0
# route add -host x.x.x.2 dev eth0
альные адреса. Для подсчёта трафика можно поставить хаб # route add -host x.x.x.3 dev eth1
у шлюза и, подключив к нему сниффер, можно будет счи- # route add -host x.x.x.4 dev eth1
# route add -host x.x.x.5 dev eth1
тать трафик – это выход. Но что делать, если надо какой-то ..
пакет не пропустить? Скажем, если надо иметь небольшой # route add -host x.x.x.y dev eth1
# route add default gw x.x.x.1
межсетевой экран (МЭ), а не только подсчёт трафика.
Собственно, зачем нужно разделение сетей на подсети? показывающие, что тот или иной IP-адрес следует искать
Именно для того, чтобы одни другим «не мешали». на том или ином интерфейсе, не помогают*.
У многих для решения этого вопроса часто приходит в Сам компьютер, на котором стоит МЭ, «видит» все ма-
голову мысль: а почему бы не поставить компьютер с дву- шины после прописывания подобных правил, машины сети
мя сетевыми карточками. С одной стороны его надо со- и Интернет «видят» Linux. Но машины сети отказываются
единить со шлюзом, а с другой стороны к нему подключить видеть шлюз, ну а шлюз, в свою очередь, отказывается
все компьютеры сети. Решение, вообще говоря, правиль- видеть машины в сети. Указание в настройке машин сети
ное, но далее начинаются проблемы. (Для удобства изло- шлюзом адреса x.x.x.3, привязанного к интерфейсу eth1,
жения наш компьютер «посередине» назовём межсетевым ни к чему не приводит, и дело кажется тупиковым. Всё это
экраном (МЭ), а так как на нём стоит Linux, то будем назы- происходит, потому что умный шлюз не знает о том, что
вать его также и Linux.) Если вы хоть раз сталкивались с надо передавать пакеты для адресов x.x.x.4, x.x.x.5 и др.
тем, что у вас справа и слева от МЭ одна и та же сетка, то на адрес x.x.x.2. Если провести эксперимент: при выше-
вы поймёте, почему возникали проблемы. Разумный до описанной конфигурации назначить на eth0 вместо адре-
этого (при работе NAT) компьютер перестаёт понимать, как са x.x.x.2 ненадолго адрес x.x.x.4, далее обратиться с него
ему работать. Наверное, он «думает», что обе карточки куда-либо в Интернет, чтобы шлюз его «увидел», а затем
смотрят в одну строну, а не в разные. (Замечание: исполь- быстро поменять всё обратно, то некоторое время обще-
зование с одним адресом двух стоящих вместе сетевых ние с компьютером x.x.x.4 будет нормальным. Он будет
карт в виде одной логической, более производительной «видеть» шлюз и Интернет. Интернет также будет видеть
сетевой карты, не новость, а способ повышения быстро- его. Такая ситуация многих вдохновляет: заработало!
действия сети при минимизации затрат.) Шлюз пингуется, а машины сети видны из Интернета. Но
Я спрашивал многих людей, как это сделать и мне от- радость быстро проходит, когда происходит обновление
вечали по-разному: начиная с советов по настройке масок arp-таблицы шлюза. Если шлюз ваш, то проблема в прин-
255.255.255.255 на интерфейсах МЭ и заканчивая покуп- ципе решается просто. Необходимо на шлюзе для адре-
кой профессиональных средств, таких как CISCO PIX сов, находящихся за МЭ, указать адрес x.x.x.2 в качестве
Firewall и др. При этом необходимость покупки обосновы- gateway, подобно тому как в настройках Linux шлюзом яв-
валась тем, что сделать так, чтобы и слева и справа (на ляется адрес x.x.x.1. Тогда наш шлюз будет слать пакеты
разных сетевых интерфейсах) у компьютера на базе Linux на MAC-адрес eth0 и всё должно работать. Не следует ис-
была одна и та же сеть, и пакеты попадали с одного интер- кать проблем в отсутствии 1 в файле /proc/sys/net/ipv4/
фейса на другой – невозможно. Поэтому у меня и родилась ip_forward или в отсутствии поддержки ip_forward в ядре,
идея написать эту статью, дабы поделиться своим опытом. ошибок в настройке iptables (ipchains) или где-то ещё. В
Пусть карточка на МЭ, смотрящая на интернет-шлюз, нашем случае проблема состоит в том, что мы не можем
будет eth0, а смотрящая в сеть с компьютерами – eth1. перенастраивать шлюз.
Существует решение этой проблемы в виде моста
(bridge). Логично предположить: а кто мешает Linux брать
пакеты с одной карточки из одной физической сети и
передавать их в другую физическую сеть, в которую
смотрит другая его карточка. Сразу хочу вас обрадовать,
что у меня всё это работает (более года) довольно быс-
тро и не требует больших ресурсов. Меня же, до того

* Во время подготовки статьи к печати высказыва- routing and traffic guide – я проверял, у меня подобное ра-
лись различные замечания, которые я постарался учесть ботает. Единственный минус, когда во внутренней сети
в той или иной мере. Одно замечание я привожу без из- много машин. В данном примере, по-моему, неправильно
менений, так как времени проверить самому, работает записаны правила. На мой взгляд, их надо записать так:
это или нет, у меня не было, да и когда писал статью, я о
данной возможности не знал, а давать непроверенный # echo 200 mytable >> /etc/iproute2/rt_tables
# ip rule add from x.x.x.1 dev eth0 table mytable
совет от своего имени я не могу – совесть не позволяет. ...
Так что привожу замечание Всеволода Стахова, может
# ip route add default via x.x.x.1 dev eth0 table mytable
быть, кто-то им воспользуется, и оно окажется более по- # ip route flush cache
лезным, чем вся моя статья.
«На самом деле это работает – читай Linux Advanced Это работает.»

44
администрирование
как я это сделал, многие «теоретики» уверяли, что сде- Предполагается, что вы немного знакомы с Linux и
лать такое можно, но работать это будет медленно, осо- знаете, где можно скачать нужную версию ядра. (Для тех,
бенно если я захочу, чтобы вдобавок происходила фильт- кто не знает – ядра лучше брать на http://www.kernel.org
рация пакетов. «О МЭ и думать забудь, – говорили они, – или http://www.ru.kernel.org.)
если у тебя не Dual Xeon». У меня AMD K7 (Duron) вели- После скачивания нужного ядра следует наложить на него
колепно справляется с этой задачей, причём на 100-ме- патчи, которые качаем отсюда: http://bridge.sourceforge.net/
габитной сетке по команде download.html. Для различных версий ядра нужны различ-
ные патчи. У меня всё работало на ядрах версий 2.4.18 и
# top 2.4.19. С ядром версии 2.4.20 я не экспериментировал, но
и патча пока не видел, возможно, ядро уже подкорректи-
загрузка от пересылки и фильтрации не превышает 3-4%. ровано нужным образом, так что патч ему не нужен.
Так что можно смело говорить о том, что при сегодняш- Для наложения патча в версиях, требующих его при-
них ценах решение получается дешёвое. менения, следует выполнить из директории, где располо-
Большую часть загрузки процессора забирают на себя жено ваше ядро, команду:
другие процессы, как snort и httpd сервера apache, как
видно из рисунка. Если же обращения к веб-серверу не- # patch -p0 -E <ôàéë_ñ_ïàò÷åì
частые, то большую часть загрузки потребляет сама про-
грамма top. Данный screenshot был сделан сразу после Опция -p0 указывает на то, что вы будете накладывать
завершения скачивания 50-мегабайтного файла, который патч, находясь в директории уровня 0, то есть где нахо-
скачивался несколько секунд. дятся файлы и директории ядра, либо:

# patch -p1 -E <ôàéë_ñ_ïàò÷åì

если вы будете выполнять команду из директории, содер-


жащей каталог с номером ядра.
Первый вариант лучше, так как вашу директорию вы
можете называть хоть linux, хоть linux-2.4.19 и пр. Ключ -E
говорит о том, что следует удалять пустые файлы, если
таковые окажутся после наложения патча. Если у вас ядро
версии 2.4.19, то имя файла патча будет bridge-nf-0.0.7-
against-2.4.19.diff. После успешного наложения патча сле-
дует начать обычную процедуру конфигурирования ядра.
Можно править руками файл .config, а можно запустить

# make menuconfig

находясь в директории с ядром. (Если у вас не появляет-


ся меню или что-то не работает, то, возможно, вы не ус-
тановили средства разработки ядра. Придерживайтесь
выводимых сообщений об ошибках – они содержат дос-
таточную информацию. Часто забывают установить биб-
лиотеку ncurses.)

Хочу порекомендовать следующие ссылки:


http://bridge.sourceforge.net
http://bridge.sourceforge.net/docs/Firewalling for Free.pdf
http://www.sparkle-cc.co.uk/firewall/firewall.html
В результате у вас должна появиться возможность
прозрачного фильтрования и учёта трафика. Можно ска-
зать, что мы с вами сделаем МЭ-мост, который при жела-
нии можно сделать почти неуязвимым и невидимым, но
об этом чуть далее, в процессе настройки. Также за счёт
фильтрования и возможной установки не двух, а более
сетевых карточек, у вас появится возможность очень гиб- В меню настройки конфигурации ядра в разделе
кой настройки вашей сети или ваших псевдо-подсетей. «Networking options» нужно поставить звёздочку (или бук-
Если докупить отдельно расширитель, увеличивающий ву М), выбрав слудующий пункт:
число PCI-слотов в вашей системе, то можно соорудить
что-то вроде коммутатора CISCO серии 2900. <*> 802.1d Ethernet Bridging

№4(5), апрель 2003 45


администрирование
Для .config равносильно внесению строчки ды из директории, где установлены исходники ядра:
CONFIG_BRIDGE=y, либо CONFIG_BRIDGE=m.
# make dep
# make clean
# make bzImage

Далее можно скомпилировать модули, но если у вас


что-то не будет грузиться, то вы зря потратите время на
компиляцию модулей два раза, так что разумнее на этом
этапе прописать новую конфигурацию, а модули скомпи-
лировать потом, после того как станет ясно, что ядро у
нас рабочее и не надо его перекомпилировать в новой
конфигурации. Для этого надо взять созданный файл
bzImage: при успешном создании он будет лежать, ско-
рее всего, в директории /usr/src/linux-2.4.x/arch/i386/boot.
В дальнейшем я не буду акцентировать внимание о Его желательно переименовать во что-то более удоб-
включении той или иной опции в качестве модуля. Факти- ное, чем bzImage, например в vmlinuz-2.4.x, и поместить в
чески, это всё, что нужно конфигурировать в ядре для директорию /boot. Следует подправить либо /etc/lilo.conf,
работы моста, и для проверки этого вполне хватит, но что- либо /etc/grub.conf, в зависимости от установленного у вас
бы не компилировать ядро несколько раз, мы сразу вклю- загрузчика. Допишите новую конфигурацию по аналогии,
чим и другие полезные для нас опции. не удаляя при этом старую! В случае загрузчика grub мож-
но просто перезапускаться. В случае lilo следует его за-
[*] Frame Diverter (EXPERIMENTAL) пустить, чтобы он внёс необходимые изменения.

либо CONFIG_NET_DIVERT=y. # lilo


Если в меню такого пункта нет, возможно, что вы не
включили в самом первом меню: Не забудьте это сделать! Для grub файл /etc/grub.conf есть
символическая ссылка на /boot/grub/grub.conf. (На всякий
Code maturity level options ---> случай, initrd – это команда инициализации ramdisk, она
прописывается для конфигурации виртуального диска в
пункт памяти и загрузки его из образа; при установке по умол-
чанию такой образ имеется в той же директории /boot.
[*]Prompt for development and/or incomplete code/drivers Строчку, содержащую initrd, копировать по аналогии со-
всем не обязательно.)
либо CONFIG_EXPERIMENTAL=y. Далее, если загрузка прошла успешно (не имеются в
Далее включаем поддержку сетевого фильтра iptables, виду возможные ругательства системы при загрузке на
если она не была включена: отсутствие модулей), то можно довести дело до конца,
скомпилировав и установив модули. Если же загрузка не
[*] Network packet filtering (replaces ipchains) проходит, возможно, что-то вы скомпилировали не так,
или не тот процессор указали, или что-то ещё. Я предпо-
либо CONFIG_NETFILTER=y. лагаю, что остальные пункты меню у вас настроены пра-
У нас появится подменю: вильно, поэтому и не рассматриваю их. Для компиляции
и установки модулей нужны следующие команды:
IP: Netfilter Configuration --->
# make modules
# make modules_install
Здесь разумно включить все, что может вам понадо-
биться. Если сомневаетесь, то попробуйте включить всё, запускать их следует из той же директории, что и make
лучше пусть что-то пригодится с меньшей вероятностью, menuconfig, make dep... После успешной компиляции и уста-
чем что-то не будет работать (правда, и работать такое новки модулей следует перезагрузиться. Если всё прошло
ядро будет чуть медленнее). успешно, то можно приступить к настройке моста. Для нача-
При включении поддержки сетевого фильтра, под выб- ла нам понадобятся bridge-utils. Для Red Hat-подобных Linux
ранным нами ранее пунктом 802.1d Ethernet Bridging, дол- имеется rpm-файл, который устанавливается командой:
жен появиться пункт:
# rpm -i bridge-utils-0.9.6-1.i386.rpm
[*] netfilter (firewalling) support
иногда пишут
либо CONFIG_BRIDGE_NF=y.
Выбираем его. Это нужно, чтобы мы могли фильт- # rpm -ihv bridge-utils-0.9.6-1.i386.rpm
ровать пакеты – «делать мост разводным». Далее идут
стандартные шаги компиляции ядра. Запустите коман- (Что означают те или иные ключи, смотрите man rpm.)

46
администрирование
Обладателям RPM-несовместимых дистрибутивов при- не про МЭ начинал писать, а про организацию моста и воз-
дётся немного посложнее, но для них имеется .tag.gz файл можную пользу из этого, помимо экономии IP-адресов.
почти того же самого содержания. При установке програм- Далее можно поднять интерфейс нашего моста, при-
мы из него у вас не должны возникнуть проблемы. своив ему один из IP-адресов из нашей сети. (Это разум-
После установки можно попробовать создать новый но: зачем серверу иметь 2 адреса, если вы, уже опере-
мост. Придумаем нашему мосту разумное имя, пусть он дивши, подумали вместо 0.0.0.0 для eth0 и eth1 пропи-
будет называться bridge0 (можно давать имена без цифр, сать реальные адреса, то скажу, что работать с двумя ад-
например, mybridge) и создадим его командой ресами тоже будет, но один адрес будет явно «лишним».)
Сделать это просто: как обычно, запустите:
# brctl addbr bridge0
# ifconfig mybridge x.x.x.2 netmask 255.255.y.y ↵
broadcast x.x.x.z up
Имеющийся у нас мост следует закрепить, прояснив
для себя, на какие берега он будет крепиться, другими далее работа компьютера ничем не будет отличаться от
словами, выделить сетевые интерфейсы, которые будут того, как если бы этот адрес был присвоен интерфейсу eth0.
работать с мостом. Заметьте, что карточек в сервере мо- Для фильтрации пакетов, проходящих через наш мост,
жет быть много и совсем необязательно все из них за- используется цепочка FORWARD iptables. Если она у вас по
действовать для организации моста. Вот она, гибкость умолчанию не имеет политику пропускания или явно не про-
Linux! В принципе можно организовать мост при различ- писано, что разрешено, то мост у вас работать не будет. Для
ных конфигурациях и необязательно при этом должны обработки пакетов доступны все возможности iptables.
быть реальные адреса, о чём я писал в начале статьи. Если у вас всё заработало, и вы не хотите каждый раз
Итак, для добавления интерфейсов eth0 и eth1 следует вручную поднимать мост при загрузке системы, то следу-
запустить команды: ющий скрипт для вас. Он делает всё вышеописанное в
автоматическом режиме стандартным способом во вре-
# brctl addif bridge0 eth0 мя загрузки. Итак, файл называется bridge (вы можете
# brctl addif bridge0 eth0
назвать его по-другому), его следует поместить в дирек-
торию инициализационных скриптов /etc/rc.d/init.d.
Если что-то не будет получаться, то вызывайте помощь.
#! /bin/bash
# brctl --help #
# chkconfig: 2345 11 89
# ìîé ñêðèïò ìîñòà
return=$rc_done
Далее следует поднять интерфейсы eth0 и eth1 так, case "$1" in
чтобы они ловили все пакеты у себя в сегменте. start)
echo "Starting service bridge bridge0"
brctl addbr bridge0 || return=$rc_failed
# ifconfig eth0 0.0.0.0 promisc brctl addif bridge0 eth0 || return=$rc_failed
# ifconfig eth1 0.0.0.0 promisc brctl addif bridge0 eth1 || return=$rc_failed
ifconfig eth0 0.0.0.0 promisc || return=$rc_failed
Давать интерфейсам какие-либо адреса не нужно. Это ifconfig eth1 0.0.0.0 promisc || return=$rc_failed
brctl sethello bridge0 1 || return=$rc_failed
будет гарантией вашей безопасности. Если у нашего мос- brctl setmaxage bridge0 4 || return=$rc_failed
та, в частности МЭ, нет адреса, то его и просканировать brctl setfd bridge0 4 || return=$rc_failed
ifconfig bridge0 promisc up || return=$rc_failed
невозможно! Вот где прелесть этого метода. Я не говорю # ifconfig bridge0 x.x.x.x netmask 255.255.x.x ↵
уже об атаках. Даже чтобы устроить syn-flood или какую- broadcast x.x.x.x up || return=$rc_failed
# route add default gw z.z.z.z || ↵
нибудь другую атаку на отказ в обслуживании, то надо бу- return=$rc_failed
дет очень постараться, и в конечном итоге при достаточ- arp -f || return=$rc_failed
echo -e "$return"
ной производительности мост будет жив и будет считать и ;;
фильтровать пролетающий через него трафик. Для конфи- stop)
echo "Shutting down service bridge bridge0"
гурирования можно использовать ещё одну доверенную се- # route del default gw z.z.z.z || return=$rc_failed
тевую карточку или делать это с консоли. В любом случае brctl delif bridge0 eth0 || return=$rc_failed
brctl delif bridge0 eth1 || return=$rc_failed
за такую высокую надёжность и безопасность можно зап- ifconfig bridge0 down
латить ценой неудобного конфигурирования. Настраивать brctl delbr bridge0 || return=$rc_failed
echo -e "$return"
же правила для такого МЭ – одно удовольствие. При жела- ;;
нии на МЭ можно установить систему обнаружения атак, status)
ifconfig bridge0
скажем, тот же snort (www.snort.org), который сможет ди- brctl show bridge0
намически отслеживать проходящий трафик и запускать ;;
restart)
нужный скрипт, способный переконфигурировать фильтр, до- $0 stop || return=$rc_failed
бавляя или убирая правила в цепочках/таблицах iptables $0 start || return=$rc_failed
;;
(ipchains). То есть можно динамически менять фильтрующую *)
способность такой системы. Однако возможны и минусы: си- echo "Usage: $0 {start|stop|status|restart}"
exit 1
стема может заблокировать или выкинуть нужные данные в esac
случае ложного срабатывания. Далее я расскажу, как в
test "$return" = "$rc_done" || exit 1
ущерб безопасности можно получить удобства. Всё-таки я exit 0

№4(5), апрель 2003 47


администрирование
Если вы хотите мосту присвоить IP-адрес, то заком- вило, берущее все пакеты, уходящие в Интернет на 80-е
ментируйте строчку: порты с интерфейса и заворачивающее их на локальный
прокси:
#ifconfig bridge0 promisc up || return=$rc_failed
iptables -t nat -A PREROUTING -i eth1 -p tcp -d 0/0 ↵
--dport 80 -j REDIRECT --to-ports 3128
а у строчек (ipchains -A input -i eth1 -p tcp -d 0/0 80 -j REDIRECT 3128 )

#ifconfig bridge0 x.x.x.x netmask 255.255.x.x ↵ Но не тут-то было – эффекта нужного не будет, так
broadcast x.x.x.x up || return=$rc_failed
#route add default gw z.z.z.z || return=$rc_failed как пакеты изначально не адресованы нашему МЭ. Если
#route del default gw z.z.z.z || return=$rc_failed бы заменить MAC-адрес в пакетах, идущих на 80 порт с
MAC-адреса шлюза на MAC-адрес интерфейса Linux eth1,
снимите комментарии и запишите правильные ваши IP- то тогда бы такой проблемы не было. Но счастье откры-
адрес, маску, широковещание и шлюз. Далее инициали- того кода в том и заключается, что если кому-то одному
зационный файл надо включить в сценарий загрузки на нужно было что-то сделать, то он это написал и выложил
нужных нам уровнях. К сожалению, командой на всеобщее пользование – так что добро пожаловать на
http://diverter.sourceforge.net.
# chkconfig bridge on К сожалению, на сегодня развитие данного проекта
прекращено, последние версии упоминаемых ядер на сай-
наш мост не включится, так как для такого добавления те – 2.2.19 и 2.4.10. Возможно, это связано с тем, что прин-
нет необходимых строчек, наличие которых усложнило бы ципиально нового ничего не появилось, ошибок не най-
понимание, увеличило бы размеры и очень мало приба- дено, поэтому данную программу divert-utils-0.221.tar.gz
вило бы удобства. можно использовать и для новых ядер. Завёртывание нуж-
Поэтому для автозапуска нам следует самостоятельно ного нам трафика осуществляется парой команд:
создать файлы для необходимых уровней. Я у себя тако-
выми посчитал 2-й, 3-й, 4-й и 5-й. Мне кажется, что разум- # divert on eth1 proto tcp add dst 80
# divert on eth1 enable
нее запускать мост после сервиса network, поэтому номер
для запуска я выбрал 11 (10 для network плюс один). С вык- после чего вышеуказанные правила iptables (ipchains)
лючением моста ситуация обратная, я выбрал номер 89. работают. Для реализации такого простого решения не-
Чем меньше номер, тем раньше произойдёт событие. обходимо: скомпилировать ядро с поддержкой моста (мы
Затем следует создать ссылки K89bridge во всех ди- это уже сделали с успехом), однако если у вас старые ядра,
ректориях rс?.d и S11bridge в rc2.d, rc3.d, rc4.d, rc5.d. Де- то, возможно, вам понадобится скачать патч для вашей
лается это, находясь в нужной директории командами: версии. А также необходимо скомпилировать саму про-
грамму divert-командой:
# ln -s ../init.d/bridge K89bridge
# ln -s ../init.d/bridge S11bridge # make
В случае запуска мост должен подниматься в процес-
се загрузки (то есть опускаться, если говорить по анало- Любому заинтересовавшемуся в программе, не долж-
гии с разводными мостами). И должен останавливаться в но это всё показаться сложным.
процессе останова/выключения системы. В принципе мож- Замечание1: я не использую у себя frame diverter, так
но запускать мост до network и создать для него конфигу- как нет необходимости (следовательно, не могу гаранти-
рационные файлы в /etc/sysconfig/networking-scripts, но мне ровать вам его работу на 100%), что же касается моста,
этот путь понравился меньше. то всё работает великолепно, если что-то не так – пиши-
Некоторые особенности настройки iptables и ещё одну те, попробуем разобраться.
маленькую хитрость я хотел бы написать сейчас, а имен- Замечание 2: если в настройках iptables не привязы-
но о Frame Diverter, который может быть очень полезным ваться к физическим интерфейсам, то должно быть абсо-
средством при создании многофункциональных мостов, лютно всё равно, где у моста вход, а где выход. Иногда
фактически являющихся прозрачными прокси-серверами это удобно – не думать, как подключить. Безопасность от
с вытекающими удобствами. этого, на мой взгляд, не ухудшается.
У читателя может возникнуть мысль: если можно со- Как заставить мост разводиться, то есть пропускать
здать прозрачный МЭ, который даже по traceroute (tracert нужные нам пакеты, а ненужные выбрасывать в глубоко
для Windows) не виден, то почему бы не сделать прозрач- вырытый ров? Для этого следует настроить правила филь-
ными и другие функции? Скажем, вы собрались почистить трации пакетов в iptables (или ipchains для старых версий).
вентиляторы от пыли, и можете смело выключать свой сер- Очень полезным будет прочтение книги «Брандмауэ-
вер в рабочий день, заменив его патчкордом. Удобно, не ры в Linux» [1]. К сожалению, в ней не говорится ничего
так ли? Или если у вас 1000 и более машин, вам не надо об iptables, так что всё написанное вам придётся адапти-
идти и менять на всех конфигурацию. Удобства всем по- ровать самим. Теория изложена автором очень грамотно.
нятны, так что перейдём лучше к описанию их реализации. Если вы изучите эту книгу и поймёте отличия ipchains от
Если вы на МЭ поднимете прокси-сервер, например, iptables (документы об их различии легко найти в сети),
sqiud, то логично предположить, что можно сделать пра- то вы без труда будете писать правила как для первого,

48
администрирование
так и для второго. Набрав в поисковой системе «Packet iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags ↵
Filtering HOWTO: применение iptables», можно найти мно- ALL FIN,URG,PSH -j DROP
iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags ↵
го ссылок, содержащих русский HOWTO: SYN,FIN SYN,FIN -m limit --limit 5/minute -j LOG ↵
http://www.3ka.mipt.ru/vlib/books/OS/Linux/howto-rus/ --log-level notice --log-prefix "SYN/FIN: "
iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags ↵
packet-filtering-HOWTO-7.html SYN,FIN SYN,FIN -j DROP
http://www.fedchik.org.ua/linux/netfilter/iptables/packet- iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags ↵
SYN,RST SYN,RST -m limit --limit 5/minute -j LOG ↵
filtering-HOWTO-7.html --log-level notice --log-prefix "SYN/RST: "
http://www.yes.net.ua/asmodeus/library/os/linux/HOWTO/ iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags ↵
SYN,RST SYN,RST -j DROP
packet-filtering-HOWTO-7.html
К сожалению, я не знаю, где лежит оригинальный до- # Òî æå ñàìîå, íî çàïðåùàåì «ïëîõèì» ïàêåòàì ïîïàäàíèå
# íà ñåðâåð.
кумент, не в обиде на меня будут его авторы, да и какая iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags ↵
разница, откуда его скачивать. ALL FIN,URG,PSH -m limit --limit 5/minute -j LOG ↵
--log-level notice --log-prefix "NMAP-XMAS: "
Тем, кто пока сомневается в написании своих правил iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags ↵
самостоятельно, посоветую разобраться с правилами и ALL FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags ↵
как они «включаются» в приведенном далее примере. SYN,FIN SYN,FIN -m limit --limit 5/minute -j LOG ↵
Будем считать, что у нашего шлюза адрес x.x.x.1, ад- --log-level notice --log-prefix "SYN/FIN: "
iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags ↵
рес Linux будет x.x.x.2, а всё остальное – наши машины в SYN,FIN SYN,FIN -j DROP
сети. Перед запуском файла не забудьте поправить кон- iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags ↵
SYN,RST SYN,RST -m limit --limit 5/minute -j LOG ↵
фигурацию под вашу. Дня начала создадим скрипт, в ко- --log-level notice --log-prefix "SYN/RST: "
тором напишем следующее: iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags ↵
SYN,RST SYN,RST -j DROP

#!/bin/bash # Ââîäèì ïðàâèëà, îãðàíè÷èâàþùèå ÷èñëî RST/ACK-ïàêåòîâ è


echo "Starting firewalling, setting rules..." # äåëàþùèå çàïèñü â ëîã-ôàéëå, ÷òîáû ÷åðåç ïèíãîâàíèå õîñòîâ
# ÷òîáû íàø ïðîöåññ íå çàïóñêàëñÿ ìîë÷à, âûâåäåì èíôîðìàöèþ # áûëè òðóäíîñòè ñ îïðåäåëåíèåì ÎÑ, óñòàíîâëåííîé íà ýòèõ
# Óêàæåì ïåðåìåííûå, êîòîðûå íàì ïðèãîäÿòñÿ. # õîñòàõ.
SERVER_IP="x.x.x.2"
PRIVPORTS="0:1023" #Drop RST/ACKs to limit OS detection through pinging
UNPRIVPORTS="1024:65535" iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags ↵
TRACEROUTE_SRC_PORTS="32769:65535" RST RST,ACK -m limit --limit 5/minute -j LOG ↵
TRACEROUTE_DST_PORTS="33434:33523" --log-level notice --log-prefix "SYN/RST: "
CLASS_A="10.0.0.0/8" iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags ↵
CLASS_B="172.16.0.0/12" RST RST,ACK -j DROP
CLASS_C="192.168.0.0/16"
OUR_NET="x.x.x.??/??" iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags ↵
OUR_BROADCAST="x.x.x.???" RST RST,ACK -m limit --limit 5/minute -j LOG ↵
--log-level notice --log-prefix "SYN/RST: "
# Çäåñü óêàçûâàåì IP è MAC êîìïüþòåðîâ â íàøåé ñåòè iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags ↵
COMPUTER1_IP="x.x.x.3" RST RST,ACK -j DROP
COMPUTER1_MAC="XX:XX:XX:XX:XX:XX"
COMPUTER2_IP="x.x.x.4" # Çàùèòà îò Syn-flood, (ïðèíöèï ðàáîòû ïîäðîáíåå
COMPUTER2_MAC="XX:XX:XX:XX:XX:XX" # ñì. âûøå â HOWTO)
COMPUTER3_IP="x.x.x.5" iptables -A FORWARD -p tcp -d $OUR_NET --syn -m limit ↵
COMPUTER3_MAC="XX:XX:XX:XX:XX:XX" --limit 1/s -j ACCEPT
COMPUTER4_IP="x.x.x.6" iptables -A INPUT -p tcp -d $SERVER_IP --syn -m limit ↵
COMPUTER4_MAC="XX:XX:XX:XX:XX:XX" --limit 1/s -j ACCEPT
...
# Çàùèòà îò ñêðûòîãî ñêàíèðîâàíèÿ ïîðòîâ
# Ñáðàñûâàåì âñå ïðàâèëà. # (Furtive port scanner)
iptables -F iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags ↵
# Óñòàíàâëèâàåì íà âñåõ öåïî÷êàõ ïîëèòèêó SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
# ïî óìîë÷àíèþ – âñ¸ çàïðåùåíî. iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags ↵
iptables -P INPUT DROP SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -P FORWARD DROP # Ping of Death
iptables -P OUTPUT DROP iptables -A FORWARD -p icmp -d $OUR_NET --icmp-type ↵
# Ïðè íåîáõîäèìîñòè ñëåäóåò ïîâòîðèòü âñ¸ òî æå ñàìîå äëÿ echo-request -m limit --limit 1/s -j ACCEPT
# äîïîëíèòåëüíûõ òàáëèö, åñëè îíè èñïîëüçóþòñÿ, íàïðèìåð, iptables -A INPUT -p icmp -d $SERVER_IP --icmp-type ↵
# iptables -t mangle -F echo-request -m limit --limit 1/s -j ACCEPT

# Ïðàâèëà äëÿ loopback, ðàçðåøèòü ïðîõîæäåíèå ïàêåòîâ # Ðàçðåøàåì ïðîõîæäåíèå ïàêåòîâ îò è ê íàøåìó http (https)
# ïî èíòåðôåéñó îáðàòíîé ïåòëè # ñåðâåðó. Îáðàùåíèå ê âåá-ñåðâåðó èç âíóòðåííåé ñåòè
iptables -A INPUT -i lo -j ACCEPT # ñ÷èòàòü áóäåì îòäåëüíî
iptables -A OUTPUT -o lo -j ACCEPT iptables -A INPUT -p tcp -i bridge0 -s $OUR_NET ↵
# Âûêèäûâàòü âñå ïàêåòû, êîòîðûå èìåþò àäðåñ èíòåðôåéñà --sport $UNPRIVPORTS -d $SERVER_IP --dport 80 -j ACCEPT
# îáðàòíîé ïåòëè è ïîïàäàþò ê íàì èç äðóãèõ èíòåðôåéñîâ, iptables -A OUTPUT -p tcp -o bridge0 -d $OUR_NET ↵
# îòëè÷àþùèõñÿ îò lo. Ïðè ðàáîòå ýòî ïðàâèëî íå èñïîëüçó- --dport $UNPRIVPORTS -s $SERVER_IP --sport 80 -j ACCEPT
# åòñÿ, ñêîðåå îíî ñëóæèò çàùèòîé «îò äóðàêà» èëè «óìíîãî # îñòàëüíûå îáðàùåíèÿ
# âçëîìùèêà». iptables -A INPUT -p tcp -i bridge0 --sport $UNPRIVPORTS ↵
iptables -A INPUT -d 127.0.0.1/8 -i ! lo -j DROP -d $SERVER_IP --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -o bridge0 --dport $UNPRIVPORTS ↵
# ñ÷èòàåì âåñü ïðèõîäÿùèé òðàôèê íà àäðåñ ñåðâåðà $SERVER_IP -s $SERVER_IP --sport 80 -j ACCEPT
iptables -A INPUT -p tcp -i bridge0 -d $SERVER_IP iptables -A INPUT -p tcp -i bridge0 --sport $UNPRIVPORTS ↵
-d $SERVER_IP --dport 443 -j ACCEPT
# Çàïðåùàåì «ïëîõèì» ïàêåòàì ïðîõîæäåíèå ÷åðåç ìîñò, ÷òîáû îíè iptables -A OUTPUT -p tcp -o bridge0 --dport $UNPRIVPORTS ↵
# íå ïîïàäàëè íà êîìïüþòåðû çà ìîñòîì. Äåëàåì çàïèñü â ëîãàõ. -s $SERVER_IP --sport 443 -j ACCEPT
# Ïðè íîðìàëüíîé ðàáîòå ñåòè òàêèõ ïàêåòîâ áûòü íå äîëæíî.
iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags ↵ # Çàäà¸ì àäðåñà, ñ êîòîðûõ ìîæíî àäìèíèñòðèðîâàòü íàø ñåðâåð
ALL FIN,URG,PSH -m limit --limit 5/minute -j LOG ↵ # ÷åðåç ssh, ïóñòü ýòî áóäóò COMPUTER1 è COMPUTER2
--log-level notice --log-prefix "NMAP-XMAS: " iptables -A INPUT -p tcp -i bridge0 -s $COMPUTER1_IP ↵

№4(5), апрель 2003 49


администрирование
--sport $UNPRIVPORTS -d $SERVER_IP --dport 22 -m mac ↵ iptables -A OUTPUT -p udp -s $SERVER_IP ↵
--mac-source $COMPUTER1_MAC -j ACCEPT --sport $UNPRIVPORTS -d $OUR_NET --dport 138 -j ACCEPT
iptables -A OUTPUT -p tcp -o bridge0 -s $SERVER_IP ↵ iptables -A INPUT -p udp -s $OUR_NET --sport 138 ↵
--sport 22 -d $COMPUTER1_IP --dport $UNPRIVPORTS -j ACCEPT -d $SERVER_IP --dport $UNPRIVPORTS -j ACCEPT
iptables -A INPUT -p tcp -i bridge0 -s $COMPUTER2_IP ↵
--sport $UNPRIVPORTS -d $SERVER_IP --dport 22 -m mac ↵ iptables -A INPUT -p udp -s $OUR_NET --sport 137 ↵
--mac-source $COMPUTER2_MAC -j ACCEPT -d $OUR_NET --dport 137 -j ACCEPT
iptables -A OUTPUT -p tcp -o bridge0 -s $SERVER_IP ↵ iptables -A OUTPUT -p udp -s $OUR_NET --sport 137 ↵
--sport 22 -d $COMPUTER2_IP --dport $UNPRIVPORTS -j ACCEPT -d $OUR_NET --dport 137 -j ACCEPT

# Âûáðàñûâàåì âñå íåëåãèòèìíûå ïàêåòû (RFC 1918). Ïðè ïðàâèëü- iptables -A INPUT -p udp -s $OUR_NET --sport 138 ↵
# íîé íàñòðîéêå èõ íå äîëæíî áûòü â ñåòè ñ ðåàëüíûìè àäðåñàìè. -d $OUR_NET --dport 138 -j ACCEPT
iptables -A FORWARD -s $CLASS_A -j DROP iptables -A OUTPUT -p udp -s $OUR_NET --sport 138 ↵
iptables -A FORWARD -s $CLASS_B -j DROP -d $OUR_NET --dport 138 -j ACCEPT
iptables -A FORWARD -s $CLASS_C -j DROP
# Áëîêèðóåì ïàêåòû, êîòîðûå ìû ñ÷èòàåì íåíóæíûìè. Äîïèøèòå iptables -A INPUT -p udp -s $OUR_NET --sport 138 ↵
# ïðàâèëà ñàìè. Íèæå áëîêèðóåòñÿ «ñåòåâîå îêðóæåíèå -d $OUR_BROADCAST --dport 138 -j ACCEPT
# (smb-ïðîòîêîë)» è èæå ñ íèì. ×òîáû èç âíåøíåé ñåòè iptables -A OUTPUT -p udp -s $SERVER_IP --sport 138 ↵
# íèêòî íå íàø¸ë çàáûòûå share-ðåñóðñû â ëîêàëüíîé ñåòè, -d $OUR_BROADCAST --dport 138 -j ACCEPT
# åñëè êòî-òî ÷òî-òî çàáûë çàêðûòü.
# À èç ñåòè â Èíòåðíåò âðÿä ëè êòî-òî ïîëåçåò. # Çàïðåùàåì Ping of Death è ïðîïóñêàåì îáû÷íûå ping âíóòðü
iptables -A FORWARD -s ! $OUR_NET -d $OUR_NET -p tcp ↵ iptables -A INPUT -p icmp --icmp-type echo-request ↵
--dport 137:139 -j DROP -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -s ! $OUR_NET -d $OUR_NET -p udp ↵ iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
--dport 137:139 -j DROP # ðåêîìåíäóþ èñïðàâèòü è çàïðåòèòü, ìíîãèå ñêàíåðû âíà÷àëå
iptables -A FORWARD -s $OUR_NET -d ! $OUR_NET -p tcp ↵ # ïèíãóþò õîñò, ïðåæäå ÷åì åãî ñêàíèðîâàòü.
--dport 137:139 -j DROP
iptables -A FORWARD -s $OUR_NET -d ! $OUR_NET -p udp ↵ # Ðàçðåøàåì ïðîõîæäåíèå icmp-ïàêåòîâ. Ïðè òðåáîâàíèÿõ
--dport 137:139 -j DROP # ïîâûøåííîé áåçîïàñíîñòè ìîæíî ïåðåñìîòðåòü (çàïðåòèòü)
# Ó ìåíÿ âîçíèêëî æåëàíèå ïðèêðûòü ÷àñòî ïðèõîäÿùèå ïðî- # ýòè ïðàâèëà.
# âåðêè íà íàëè÷èå proxy è mssql â ïðîöåññå ðàáîòû ìîñòà. iptables -A INPUT -p icmp --icmp-type source-quench ↵
iptables -A FORWARD -d $OUR_NET -p tcp --dport 1433 -j DROP -j ACCEPT
iptables -A FORWARD -d $OUR_NET -p tcp --dport 3128 -j DROP iptables -A OUTPUT -p icmp --icmp-type source-quench ↵
-j ACCEPT
# Ðàçðåøèì ñåðâåðó îáùàòüñÿ ñ DNS-ñåðâåðàìè, åñëè åñòü iptables -A INPUT -p icmp --icmp-type parameter-problem ↵
# îïàñåíèÿ î áåçîïàñíîñòè, òî ïðàâèëà ìîæíî ïåðåïèñàòü -j ACCEPT
# äëÿ êîíêðåòíûõ ïðîâåðåííûõ DNS-cåðâåðîâ. iptables -A OUTPUT -p icmp --icmp-type parameter-problem ↵
iptables -A OUTPUT -p tcp -s $SERVER_IP ↵ -j ACCEPT
--sport $UNPRIVPORTS --dport 53 -j ACCEPT iptables -A INPUT -p icmp ↵
iptables -A INPUT -p tcp --syn -d $SERVER_IP ↵ --icmp-type destination-unreachable -j ACCEPT
--dport $UNPRIVPORTS --sport 53 -j ACCEPT iptables -A OUTPUT -p icmp ↵
iptables -A OUTPUT -p udp -s $SERVER_IP ↵ --icmp-type destination-unreachable -j ACCEPT
--sport $UNPRIVPORTS --dport 53 -j ACCEPT iptables -A OUTPUT -p icmp ↵
iptables -A INPUT -p udp -d $SERVER_IP ↵ --icmp-type fragmentation-needed -j ACCEPT
--dport $UNPRIVPORTS --sport 53 -j ACCEPT iptables -A INPUT -p icmp --icmp-type time-exceeded ↵
iptables -A OUTPUT -p udp -s $SERVER_IP --sport 53 ↵ -j ACCEPT
--dport 53 -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type time-exceeded ↵
iptables -A INPUT -p udp -d $SERVER_IP --dport 53 ↵ -j ACCEPT
--sport 53 -j ACCEPT
# Ðàçðåøàåì íà ñåðâåðå äåëàòü ping è ïîëó÷àòü îòâåòû
# Ðàçðåøàåì whois (ó ìåíÿ ýòèõ ïðàâèë íåò çà íåíàäîáíîñòüþ) iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p tcp -s $SERVER_IP ↵ iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
--sport $UNPRIVPORTS --dport 43 -j ACCEPT
iptables -A INPUT -p tcp ! --syn -d $SERVER_IP ↵ # Äëÿ ðàáîòû traceroute íà ñåðâåðå
--dport $UNPRIVPORTS --sport 43 -j ACCEPT iptables -A OUTPUT -p udp -s $SERVER_IP ↵
--sport $TRACEROUTE_SRC_PORTS ↵
# Åñëè ó íàñ ñòîèò SAMBA, òî ðàçðåøàåì SMB to/from server --dport $TRACEROUTE_DST_PORTS -j ACCEPT
# âíóòðè ëîêàëüíîé ñåòè # Îòáðàñûâàåì ñ óâåäîìëåíèåì âñå ïàêåòû, ÷òî ñåðâåð ïûòàåòñÿ
iptables -A INPUT -p tcp -s $OUR_NET --sport $UNPRIVPORTS ↵ # ïîñëàòü íàðóæó. Ïðè ãðàìîòíîé íàñòðîéêå ïàêåòû íå äîëæíû
-d $SERVER_IP --dport 139 -j ACCEPT # äîõîäèòü äî ýòîãî ïðàâèëà.
iptables -A OUTPUT -p tcp -s $SERVER_IP --sport 139 ↵ iptables -A OUTPUT -s $SERVER_IP -j REJECT
-d $OUR_NET --dport $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -p tcp -s $SERVER_IP ↵ # Ñ÷¸ò÷èêè òðàôèêà + ðàçðåøåíèå íà ïðîïóñêàíèå òðàôèêà ÷åðåç
--sport $UNPRIVPORTS -d $OUR_NET --dport 139 -j ACCEPT # ìîñò: åñëè ìîæíî ðàçðåøèòü, ìîæíî è çàïðåòèòü. Èñõîäÿùèé
iptables -A INPUT -p tcp -s $OUR_NET --sport 139 ↵ # òðàôèê ïðèâÿçûâàåì ê MAC-àäðåñó ñåòåâûõ êàðòî÷åê
-d $SERVER_IP --dport $UNPRIVPORTS -j ACCEPT iptables -A FORWARD -s $COMPUTER1_IP -m mac ↵
iptables -A INPUT -p udp -s $OUR_NET --sport $UNPRIVPORTS ↵ --mac-source $COMPUTER1_MAC -j ACCEPT
-d $SERVER_IP --dport 139 -j ACCEPT iptables -A FORWARD -d $COMPUTER1_IP -j ACCEPT
iptables -A OUTPUT -p udp -s $SERVER_IP --sport 139 ↵
-d $OUR_NET --dport $UNPRIVPORTS -j ACCEPT iptables -A FORWARD -s $COMPUTER2_IP -m mac ↵
iptables -A OUTPUT -p udp -s $SERVER_IP ↵ --mac-source $COMPUTER2_MAC -j ACCEPT
--sport $UNPRIVPORTS -d $OUR_NET --dport 139 -j ACCEPT iptables -A FORWARD -d $COMPUTER2_IP -j ACCEPT
iptables -A INPUT -p udp -s $OUR_NET --sport 139 ↵
-d $SERVER_IP --dport $UNPRIVPORTS -j ACCEPT iptables -A FORWARD -s $COMPUTER3_IP -m mac ↵
--mac-source $COMPUTER3_MAC -j ACCEPT
iptables -A INPUT -p udp -s $OUR_NET --sport $UNPRIVPORTS ↵ iptables -A FORWARD -d $COMPUTER3_IP -j ACCEPT
-d $SERVER_IP --dport 137 -j ACCEPT
iptables -A OUTPUT -p udp -s $SERVER_IP --sport 137 ↵ ....
-d $OUR_NET --dport $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -p udp -s $SERVER_IP ↵ iptables -A FORWARD -s $COMPUTERn_IP -m mac ↵
--sport $UNPRIVPORTS -d $OUR_NET --dport 137 -j ACCEPT --mac-source $COMPUTERn_MAC -j ACCEPT
iptables -A INPUT -p udp -s $OUR_NET --sport 137 ↵ iptables -A FORWARD -d $COMPUTERn_IP -j ACCEPT
-d $SERVER_IP --dport $UNPRIVPORTS -j ACCEPT
# Ïðàâèëà òîëüêî äëÿ ïîäñ÷¸òà ñëåäóåò ïèñàòü áåç -j îïöèè
iptables -A INPUT -p udp -s $OUR_NET --sport $UNPRIVPORTS ↵ # iptables -A FORWARD -s $COMPUTER001_IP -m mac ↵
-d $SERVER_IP --dport 138 -j ACCEPT --mac-source $COMPUTER001_MAC
iptables -A OUTPUT -p udp -s $SERVER_IP --sport 138 ↵ # iptables -A FORWARD -d $COMPUTER001_IP
-d $OUR_NET --dport $UNPRIVPORTS -j ACCEPT # ïîýêñïåðèìåíòèðóéòå

50
администрирование
Далее, после запуска созданного вами файла, мост #!/usr/bin/perl
должен фильтровать пакеты так, как вы этого хотите. В
$SERVER_IP="x.x.x.2";
случае если у вас всё настроено правильно, то при вык- $COMPUTER1_IP="x.x.x.3"; $COMPUTER1_MAC="XX:XX:XX:XX:XX:XX";
лючении правила должны автоматически сохраняться и $COMPUTER2_IP="x.x.x.3"; $COMPUTER2_MAC="XX:XX:XX:XX:XX:XX";
...
загружаться заново при включении компьютера с сохра-
нением всех значений счётчиков. Способ, описываемый # ñîçäàäèì ôóíêöèþ, êîòîðàÿ áóäåò ñòàâèòü òî÷êè, óäîáíåå
# ñìîòðåòü íà 10.000.000.000 ÷åì íà 10000000000
в книге «Брандмауэры в Linux» [1] имеет этот недостаток: sub DOTS {
после перезапуска значения счётчиков не восстанавли- # ðàññòàâëåíèå òî÷åê ðàçðÿäîâ
$string1 = shift;
ваются. Я правил у себя файл /etc/rc.d/init.d/iptables, что- if(not($string1 =~ /\D/)){
бы при выключении (опция stop) он сохранял параметры, $string1 =~s/(\d{3})$/\.$1/;
while ($string1 =~ /^\d{3}/){$string1 =~s/(\d{3}\.\d)/\.$1/;}
а после останавливал интерфейс. Возможно, вам также }
следует сделать небольшие изменения. $string1 =~s/(^\.)(.*)/$2/;
return $string1;
Для просмотра значений (простейший биллинг) исполь- }
зуйте команду: print "Content-type:text/html; charset=koi8-r\n\n";
print "<html>\n<head>";

# iptables -L -v -x -n print "<TITLE>Traffic shower</TITLE>\n<META ↵


NAME=\"content\" CONTENT=\"text/html; ↵
charset=koi8-r\">\n";
 -L выводит все цепочки; print "</HEAD><BODY BGCOLOR=\"white\" ↵
LINK=\"red\"\nleftmargin=\"10\" marginwidth=\"10\" ↵
 -v – информативный вывод, у цепочек выводятся зна- topmargin=\"2\" marginheight=\"2\">\n";
чения счётчиков;
$date = localtime time;
 -x означает, что значения счётчиков не округляются $ip=$ENV{"REMOTE_ADDR"};
до Кб и Мб и выводятся точно в байтах; print $date,"\n<br>";
# Äëÿ ðàáîòû ïðîãðàììû ïðèä¸òñÿ îòäåëüíî ñîçäàòü ôàéë-êîïèþ
 -n означает, что не надо преобразовывать IP-адреса и # äëÿ iptables c óñòàíîâëåííûì ôëàãîì SETUID, èíà÷å ðàáîòàòü
номера портов/сервисов в их имена. # íå áóäåò, ôàéë-êîïèþ ìîæíî ïîìåñòèòü êóäà óãîäíî, ñêàæåì,
# â /dir1. C òî÷êè çðåíèÿ áåçîïàñíîñòè òóò âîçìîæíû ñëàáûå
# ìåñòà.
Последняя опция часто не указывается, так как вро- system "/dir1/iptables -L -v -x -n >/temp/traffic-dump";
# Âûâîä ñáðàñûâàåòñÿ â îòäåëüíûé ôàéë, ÷òîáû ìîæíî áûëî ýòîò
де бы является бесполезной, однако необходимость в ней # ôàéë ïî íåñêîëüêó ðàç ïðîñìàòðèâàòü. Åñëè çàïóñêàòü
появляется тогда, когда у вас пропадет Интернет, а точ- # iptables íåñêîëüêî ðàç, òî ïðè êàæäîì íîâîì çàïóñêå
# áóäåò íîâàÿ ñèòóàöèÿ (íà ìîìåíò çàïóñêà).
нее, перестанут правильно работать DNS-сервера. В слу- # îòêðûâàåì ôàéë è "âûðåçàåì" èç íåãî íóæíûå íàì çíà÷åíèÿ,
чае падения DNS ответ от iptables может задерживаться # ïîìåùàÿ èõ â íóæíûå íàì ïåðåìåííûå.
open(TRAFFIC,"/temp/traffic-dump") or die ("Cannot open ↵
до 10 минут, а если указать -n, то вывод цепочек будет file trafic-dump");
быстрым, как обычно. Если iptables запускается у вас из for ($index=1; !eof(TRAFFIC); $index++) {
$str=<TRAFFIC>;
других скриптов, то задержка его выполнения «повесит» chomp($str);
эти скрипты и приведёт к глюкам. В частности, поначалу
###### Web server 80 port #########
у меня mrtg не понимал тот факт, что ему передавались if ($str=~/tcp -- bridge0 \* 0.0.0.0\/0 $SERVER_IP ↵
пустые значения. tcp spts:1024:65535 dpt:80/) {
if ($str=~/\s*(\d+)\s+(\d+)\s(.*)/) {$webserver_in=$2;}
Для удобного просмотра статистики без захода на сер- }
вер под правами администратора можно создать неболь- if ($str=~/tcp -- \* bridge0 $SERVER_IP 0.0.0.0\/0 tcp ↵
spt:80 dpts:1024:65535/) {
шой cgi-скрипт. Чтобы не усложнять задачу, я напишу if ($str=~/\s*(\d+)\s+(\d+)\s(.*)/) {$webserver_out=$2;}
вывод только нескольких значений, а далее развить идею, }
# Âî âðåìÿ îòëàäêè îáðàòèòå âíèìàíèå íà ÷èñëî ïðîáåëîâ è
я думаю, вы сможете сами. # ñèìâîëû, çàïèñûâàåìûå ÷åðåç "\": ïðè íå ñîâïàäåíèè ñòðî÷êè
Создадим небольшой файл на perl и, придав ему ис- # ñ ýòàëîíîì áóäåò âûâåäåíî ïóñòîå çíà÷åíèå.
# Çíà÷åíèÿ äëÿ ñðàáàòûâàíèÿ ðåãóëÿðíûõ âûðàæåíèé ñëåäóåò
полняемые атрибуты, поместим в директорию для cgi- # áðàòü èç ôàéëà /temp/traffic-dump, èíà÷å, åñëè ÷òî-òî íå
скриптов (в RedHat 7.3 /var/www/cgi-bin), рекомендую кни- # òàê ñ ïðîáåëàìè è ïð, òî ó âàñ ìîãóò ïîëó÷èòüñÿ ïóñòûå
# çíà÷åíèÿ â ïåðåìåííûõ $webserver_in, $webserver_out
гу «CGI-программирование» [2]. Результат его исполне- # $str=~/\s*(\d+)\s+(\d+)\s(.*)/ äîëæíî ïåðåäàâàòü çíà÷åíèå
ния можно увидеть на рисунке: # âòîðîãî ñòîëáöà â ïåðåìåííóþ $2 (ïîäðîáíåå ñì. êíèãó
# À.Ïàâëîâà [2] èëè ëþáîé ñïðàâî÷íèê ïî Perl, ðàçäåë
# «Ðåãóëÿðíûå âûðàæåíèÿ»)
###### Computer1 #########
if ($str=~/all -- \* \* $COMPUTER1_IP 0.0.0.0\/0 ↵
MAC $COMPUTER1_MAC/) {
if ($str=~/\s*(\d+)\s+(\d+)\s(.*)/) {$COMPUTER1_out=$2;}
}
if ($str=~/all -- \* \* 0.0.0.0\/0 $COMPUTER1_IP/) {
if ($str=~/\s*(\d+)\s+(\d+)\s(.*)/) {$COMPUTER1_in=$2;}
}
###### Computer2 #########
if ($str=~/all -- \* \* $COMPUTER2_IP 0.0.0.0\/0 ↵
MAC $COMPUTER2_MAC/) {
if ($str=~/\s*(\d+)\s+(\d+)\s(.*)/) {$COMPUTER2_out=$2;}
}
if ($str=~/all -- \* \* 0.0.0.0\/0 $COMPUTER2_IP/) {
if ($str=~/\s*(\d+)\s+(\d+)\s(.*)/) {$COMPUTER2_in=$2;}
}
# ... è òàê äàëåå äëÿ äðóãèõ êîìïüþòåðîâ...

№4(5), апрель 2003 51


администрирование
} # for ($index=1; !eof(TRAFFIC); $index++) до обнуления. Если же разбираться с БД вам не хочется, а
close(TRAFFIC);
хочется иметь что-то красивое, чтобы видеть визуально,
# Äàëåå, èç ïîëó÷åííûõ çíà÷åíèé ìû ñîçäà¸ì ñîáñòâåííî как расходуется трафик, то за 10 минут можно установить
# html-îò÷¸ò. Äëÿ ýòîãî ïðîâåðÿåì IP-àäðåñ, ñ êîòîðîãî çà-
# ïðîøåí ñêðèïò, è âûâîäèì çíà÷åíèÿ. Åñëè ýòî IP àäìèíèñò- mrtg. Для тех, кто не знает – это небольшая программа,
# ðàòîðà ($COMPUTER1_IP), òî âûâîäèì áîëåå ñëîæíûé îò÷¸ò, считающая трафик и рисующая красивые графики. Это не
# ñî âñåìè ïîëüçîâàòåëÿìè. Åñëè ýòî äðóãîé IP, òî âûâîäèì
# äëÿ íåãî ñâîé îò÷¸ò – îáû÷íî ýòî ñòàòèñòèêà òîëüêî íà единственно возможная программа своего класса.
# ýòîò àäðåñ è âñ¸.
if ($ip eq $COMPUTER1_IP) {

print "\n\n<table cellpadding=\"3\" border=\"1\">\n";


print "<tr align=\"center\"><td>&nbsp;</td> ↵
<td>output</td> <td>input</td></tr>\n";
print "<tr><td>Computer1</td> ↵
<td>",DOTS($COMPUTER1_out),"</td>";
print "<td>",DOTS($COMPUTER1_in),"</td>";
print "</tr>\n";
print "<tr><td>Webserver 80 port</td> ↵
<td>",DOTS($webserver_out),"</td>";
print "<td>",DOTS($webserver_in),"</td>";
print "</tr>\n";

print "<tr><td>Computer2</td> ↵
<td>",DOTS($COMPUTER2_out),"</td>";
print "<td>",DOTS($COMPUTER2_in),"</td>";
print "</tr>\n";
#(è òàê äàëåå äëÿ äðóãèõ êîìïüþòåðîâ).
$total_out=$webserver_out+$COMPUTER1_out+$COMPUTER2_out;
$total_in=$webserver_in+$COMPUTER1_in+$COMPUTER2_in;
print "<tr><td>Total</td>";
print "<td>",DOTS($total_out),"</td>";
print "<td>",DOTS($total_in),"</td></tr>\n";
print "</table>\n\n";

}
elsif ($ip eq $COMPUTER2_IP) {
print "\n\n<table cellpadding=\"3\" border=\"1\">\n";
print "<tr align=\"center\"><td>&nbsp;</td> ↵
<td>output</td> <td>input</td></tr>\n";
print "<tr><td>Computer2</td> ↵ Для тех, кто любит изучать первоисточники, сообщу сле-
<td>",DOTS($COMPUTER2_out),"</td>";
print "<td>",DOTS($COMPUTER2_in),"</td>"; дующие ссылки:
print "</tr>\n"; http://www.bog.pp.ru/work/mrtg.html
print "</table>\n\n";
http://www.bog.pp.ru/work/rrdtool.html
} Для остальных скажу, что в поставке Red Hat 7.3 mrtg
#elsif ($ip eq ...) { идёт в комплекте и чаще уже установлен. Единственным
# ... узким местом по его настройке становится его конфигу-
#}
рационный файл, про который я кратко расскажу. Если
} мы посмотрим в файл /etc/crontab, то увидим строчку вида:
else { print "Unknown IP!";}
0-59/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg ↵
print " </body>"; --logging /var/log/mrtg.log
print "</html>";
или похожую. Если таковой нет, напишем сами. (Так как mrtg
Для начала такая статистика очень даже подойдёт. есть в стандартном дистрибутиве, считаю его уже установ-
Реально же рекомендуется поднимать БД, в которую пе- ленным у вас.) Как видим, конфигурационный файл для mrtg
риодически заносить показания счётчиков, а сами счёт- называется mrtg.cfg и находится в /etc/mrtg. Идём туда, де-
чики обнулять (iptables -Z) во избежание их переполнения лаем резервную копию и правим его до следующего вида:
и последующей выдачи неправильных значений. Хотя в
RedHat 7.x/8.x проблема переполнения менее актуальна, # Multi Router Traffic Grapher -- Example Configuration File
# Minimal mrtg.cfg
чем в более ранних версиях. #--------------------
Для повышения точности можно одновременно про- WorkDir: /var/www/html/mrtg
Language:ru
сматривать и обнулять. Target[computer1]:`/sbin/stat/comp1`
MaxBytes[computer1]: 125000000000
# iptables -L -v -x -n -Z Title[computer1]: Traffic Analysis for Computer1
PageTop[computer1]: <H1>Stats for Computer1</H1>
Directory[computer1]: comp1
XSize[computer1]: 600
При таком способе снятия показаний точно ничего не YSize[computer1]: 160
проскочит неучтённым после момента снятия значений, но Options[computer1]: growright

52
администрирование
Target[computer2]:`/sbin/stat/comp2` tcp spts:1024:65535 dpt:80"`
MaxBytes[computer2]: 125000000000 in=`echo $in|cut -d" " -f2`
Title[computer2]: Traffic Analysis for Computer2
PageTop[computer2]: <H1>Stats for Computer2</H1> echo $in
Directory[computer2]: comp2 echo $out
XSize[computer2]: 600 echo 0
YSize[computer2]: 160 echo web
Options[computer2]: growright
Target[web]:`/sbin/stat/web`
MaxBytes[web]: 125000000000 Если есть проблемы с написанием скриптов для bash,
Title[web]: Traffic Analysis for Web server 80 то рекомендую неплохую книгу «Linux и UNIX: програм-
PageTop[web]: <H1>Stats for Web server 80</H1>
Directory[web]: webdir мирование в shell» [3].
XSize[web]: 600 В целях безопасности, возможно, следует использо-
YSize[web]: 160
Options[web]: growright вать директорию, отличную от /temp (/tmp), для хранения
временного файла.
Эту конфигурацию следует понимать так: рабочей ди- Отладка датчиков заключается в том, чтобы при их за-
ректорией для mrtg будет /var/www/html/mrtg. В ней будут пуске они выводили на экран 4 строчки, где нам важны
создаваться поддиректории по именам аккаунтов: первые две – они должны показывать реально вырезан-
 /var/www/html/mrtg/comp1 ные значения из файла /temp/traffic-dump с показаниями
 /var/www/html/mrtg/comp2 счётчиков на цепочках. Остальные две носят скорее ин-
 /var/www/html/mrtg/webdir формативный характер – uptime и название того, с чего
эти показания снимаются. Видимо, это важно для тех слу-
При желании можно писать всё в одну директорию, чаев, когда сеть очень большая.
хотя это не очень удобно. Файлы для просмотра будут Программа mrtg готова к запуску, точнее она сама
соответственно: запустится по crontab и начнёт работать тогда, когда вы
 /var/www/html/mrtg/comp1/computer1.html создадите рабочий конфигурационный файл. Поэтому
 /var/www/html/mrtg/comp2/computer2.html разумнее вначале отладить сенсоры, а после править
 /var/www/html/mrtg/webdir/web.html конфигурационный файл. Возможно, вам придётся со-
здать и рабочие поддиректории, но я этого не делал. При
Теперь осталось настроить сенсоры или датчики, ко- первом и втором запуске mrtg в новой конфигурации он
торые будут сообщать mrtg сами значения счётчиков. Это будет ругаться на то, что у него нет файлов или файла
в нашем примере файлы: со значениями. Поэтому лучше его запустить два раза
 /sbin/stat/comp1 вручную и после ещё один раз, убедившись, что всё ему
 /sbin/stat/comp2 понравилось.
 /sbin/stat/web
# mrtg /etc/mrtg/mrtg.cfg
У вас это могут быть любые файлы и лежать они мо-
гут где угодно. Сначала разумнее создать и проверить Это будет быстрее, чем ждать 10-15 минут и после идти
работу этих файлов, а после править mrtg.cfg. в /var/log/messages, если что-то было не так. Далее може-
Рассмотрим на примере файла /sbin/stat/web: те просматривать html-файлы с полученными красивыми
картинками через поднятый на вашем сервере apache.
#!/bin/bash Единственное дополнение состоит в том, что не всегда
# web/80 (íå çàáóäüòå èñïðàâèòü íà ñâîé IP)
ip=x.x.x.2 нужно, чтобы директории с отчётом были доступны всем,
# Òàê êàê ñòàòèñòèêà ñíèìàåòñÿ ðàç â 5 ìèíóò, è ó íàñ ìîæåò поэтому пару слов о том, как к этим директориям ограни-
# áûòü ìíîãî ñ÷¸ò÷èêîâ, òî íåðàçóìíî çàïóñêàòü êàæäûé ðàç
# iptables. Ïîýòîìó ìû âûâîä iptables ñêèäûâàåì â ôàéë è чить доступ. Для этого находим файл конфигурации apache.
# äàëåå ðàáîòàåì ñ ôàéëîì, ÷èòàÿ åãî ñêîëü óãîäíî ðàç. У меня это /etc/httpd/conf/httpd.conf и дописываем в нём:
# ñìîòðèì, êîãäà ñîçäàí ôàéë: åñëè äàâíî (>5 ìèíóò), òî
# äåëàåì åãî çàíîâî (îáðàòèòå âíèìàíèå: ' è ` ðàçëè÷íû):
if [ -f /temp/traffic-dump ] <Directory /var/www/html/mrtg/comp1>
then Order deny,allow
currenttime=`date +%s` Deny from all
locktime=`date -r /temp/traffic-dump +%s` Allow from x.x.x.3
secondsdiff=`expr $currenttime - $locktime` </Directory>
if [ $secondsdiff -gt 300 ] <Directory /var/www/html/mrtg/comp2>
# åñëè ôàéë óñòàðåâøèé, òî åñòü ñîçäàííûé áîëåå 5 ìèíóò Order deny,allow
# íàçàä – ãåíåðèðóåì íîâûé: Deny from all
then Allow from x.x.x.3 x.x.x.4
/sbin/www/iptables -L -v -x -n >/temp/traffic-dump </Directory>
fi <Directory /var/www/html/mrtg/webdir>
else Order deny,allow
/sbin/www/iptables -L -v -x -n >/temp/traffic-dump Deny from all
fi Allow from x.x.x.3
# äëÿ ñîâïàäåíèÿ âàæíî ÷èñëî ïðîáåëîâ </Directory>
out=`cat /temp/traffic-dump |grep ↵
"ACCEPT tcp -- \* bridge0 $ip 0.0.0.0/0 ↵
tcp spt:80 dpts:1024:65535"` Это позволит компьютеру с IP x.x.x.3 просматривать
out=`echo $out|cut -d" " -f2` все три статистики, а компьютеру x.x.x.4 только свою.
in=`cat /temp/traffic-dump |grep ↵ Разумной может быть небольшая правка вышеописан-
"ACCEPT tcp -- bridge0 \* 0.0.0.0/0 $ip ↵ ного в статье CGI-скрипта, чтобы он генерировал в отчё-

№4(5), апрель 2003 53


администрирование
те для просмотра сразу html-ссылки на страницы просмот- Заходить следует как обычно, при запросе имени вво-
ра mrtg статистики. Тогда можно будет просто щелчком дим userlogin1 или userlogin2, пароль и наслаждаемся гра-
мыши смотреть графики. фиками. Если же вы хотите придумать что-то более изощ-
Если вас не устраивает привязка к IP-адресу, то вмес- рённое или совместить парольную аутентификацию с
то привязки можно сделать доступ по паролю средства- идентификацией по IP, то можно и так сделать, но я этого
ми apache, для этого: создаём директорию, где будут хра- делать не буду, а порекомендую хорошую книгу, в кото-
ниться пароли, если такой у нас ещё нет рой вы прочитаете много нового о сервере Apache:
«Apache для профессионалов» [4].
# mkdir /usr/lib/apache/passwords Небольшое замечание: через мост проходят не IP-про-
токолы, вне зависимости от правил iptables, такие как
и заносим туда пользователей с паролями. Cisco Discovery Protocol (CDP) и Spanning Tree Protocol
Если файла /usr/lib/apache/passwords/passwords нет, то (STP), возможно, и другие. Думаю, что iptables умеет и их
пишем: фильтровать, надо просто хитро записать ему правила,
но так как особой надобности в этом не было, то я до это-
# htpasswd -ñ /usr/lib/apache/passwords/passwords userlogin1 го «не дошёл» пока. Если кто-то знает – напишите, буду
рад. Выключение же на мосту поддержки STP не влияет
далее, уже без опции create (-c): на прохождение пакетов STP через него.
Mrtg, Apache, perl и всё вышеописанное у меня ве-
# htpasswd /usr/lib/apache/passwords/passwords userlogin2 ликолепно уживается с мостом, МЭ и дополняет их, так-
же у меня на сервере вместе с ними живёт система об-
Когда нас будут спрашивать про пароль при вводе наружения атак snort и система бесперебойного пита-
строк, то придумываем и вводим пароль. Поставьте нуж- ния, но о них, я думаю, что если получится что-то инте-
ные права, ограничивающие чтение директории /usr/lib/ ресное, то я расскажу в следующих статьях. Что же
apache/passwords другими пользователями в целях безо- касается параметров, то в эксперименте участвовал и
пасности. Если apache ругается на невозможность досту- по сей день работает мост на Red Hat Linux v.7.3
па к файлу, то вы перестарались. (Valhalla). Железо: AMD K7 (Duron) 750/256/80/с двумя
Далее правим /etc/httpd/conf/httpd.conf и дописыва- 100-мегабитными сетевыми карточками Compex RE-
ем/правим в нём: 100TX/WOL на базе чипсета Realtek RTL-8139. (Осталь-
ные несущественные параметры, как двух- или трёх-
<Directory /var/www/html/mrtg/comp1> кнопочная мышь или её отсутствие – не заслуживают
AuthType Basic
AuthName "yourcompany" внимания и упоминания).
AuthUserFile /usr/lib/apache/passwords/passwords
Require user userlogin1
AllowOverride None Литература:
</Directory> 1. Роберт Л. Зиглер. Брандмауэры в Linux. Перевод с англ.:
<Directory /var/www/html/mrtg/comp1>
AuthType Basic Уч. пос. – М.: Издательский дом «Вильямс», 2000.
AuthName "yourcompany" 2. Павлов А. CGI-программирование: Учебный курс. –
AuthUserFile /usr/lib/apache/passwords/passwords
Require user userlogin2 СПб.: Питер, 2000.
AllowOverride None 3. Девид Тейнсли. Linux и UNIX: программирование в
</Directory>
<Directory /var/www/html/mrtg/webdir> shell. Руководство разработчика: Перев. с англ. –
Order deny,allow К.: Издательская группа BHV, 2001.
Deny from all
Allow from x.x.x.3 4. Питер Уэнрайт. Apache для профессионалов. М.: Из-
</Directory> дательство «Лори», 2001.

54
BUGTRAQ
Уязвимость в Sendmail  Freebsd 4.4 – (default & self compiled Sendmail 8.11.6)
does not crash;
Обзор уязвимости  Solaris 8.0 x86 – (default & self compiled Sendmail 8.11.6)
Sendmail – один из самых популярных почтовых агентов does not crash;
(Mail Transfer Agent, MTA). Примерно 50%-75% серверов  Solaris 8.0 sparc – (default & self compiled Sendmail
в Интернете используют его для обмена почтой. Это не- 8.11.6) does not crash;
удивительно, поскольку в ОС Unix и Linux он установлен  HP-UX 10.20 – (self compiled Sendmail 8.11.6) does not
по умолчанию. crash;
В марте 2003 года мировая общественность была уве-  IRIX 6.5.14 – (self compiled Sendmail 8.11.6) does not crash;
домлена о новой уязвимости, найденной в Sendmail (5.79-  AIX 4.3 – (binary of Sendmail 8.11.3 from bull.de) does
8.12.7). Ее автором является Марк Давд (Mark Dowd) из not crash;
ISS (Internet Security Systems) X-Force. Найденная уязви-  RedHat 7.0 – (default Sendmail 8.11.0) does not crash;
мость ориентирована на функцию обработки заголовка  RedHat 7.2 – (default Sendmail 8.11.6) does not crash;
сообщения. При получении письма производится семан-  RedHat 7.3 (patch) – (patched Sendmail 8.11.6) does not
тическая проверка адреса реципиента, в том числе и crash;
«From», «To», «CC». Для этих целей используется функ-  RedHat 7.0 – (self compiled Sendmail 8.11.6) crashes;
ция crackaddr(char* addr), которая описана в файле  RedHat 7.2 – (self compiled Sendmail 8.11.6) crashes;
headers.c. Обрабатываемые данные помещаются в ста-  RedHat 7.3 – (self compiled Sendmail 8.11.6) crashes;
тический буфер, после заполнения которого они прохо-  Slackware 8.0 (patch) – (patched Sendmail 8.11.6 binary)
дят несколько проверок безопасности. Одна из этих про- crashes;
верок функционирует некорректно, эта особенность дает  Slackware 8.0 – (self compiled Sendmail 8.12.7) does not
возможность злоумышленнику (при помощи специально crash;
сформированного поля адреса) переполнить буфер и вы-  RedHat 7.x – (self compiled Sendmail 8.12.7) does not crash.
полнить произвольный код от имени пользователя, запу-
стившего MTA. Некорректная работа одной из проверок Из предложенной вашему вниманию статистики преж-
заключается в обработке символов '<' и '>', указанных в де всего видно, что многие системы являются потенци-
адресе реципиента. Дело в том, что при обработке данно- ально чуствительными к данной уязвимости. Это RedHat
го поля каждая встреча символа '>', указатель buflim, ко- и Slackware Linux. Как выяснилось, причиной крушения
торый ссылается на конец буфера, инкрементируется на Sendmail в этих системах есть неверное значение указа-
1. Но в тоже время появление '<' никак не обрабатывает- теля MciCache, обьявленного в файле mci.c. LSD провели
ся, хотя при возникновении такой ситуации указатель более детальное исследование и им удалось успешно эк-
buflim должен быть декрементирован. Поскольку каждой сплуатировать уязвимость Buffer Overrun в системе Linux
закрывающейся скобке должна предшествовать откры- Slackware 8.0. Достичь этого удалось, изменяя значения
вающаяся, мы не можем просто указать в адресе N зак- некоторых указателей и MciCache в частности. Опреде-
рывающихся скобок, чтобы увеличить буфер на N. К со- ленно нужно изменить следующие данные:
жалению, для увеличения значения указателя buflim на 1,  установить значение статического указателя MCI
нужно использовать комбинацию '<>'. Для вычисления мак- **MciCache в адрес начала структуры mailer_con_info;
симального значения X, на которое можно увеличить ука-  установить адрес структуры *mci_mailer в адрес MCI;
затель конца буфера, нужно решить простое уравнение:  указатель на *mci_host в адрес MCI;
 указатель на FILE *mci_out в адрес MCI.
(2 * x) <= (MAXNAME + 1 - 7) + x
x <= (MAXNAME + 1 - 7)
После внесения изменений становится возможным
Таким образом мы определяем, насколько можно уве- влияние на исполнение процеса Sendmail:
личить значение buflim, чтобы добиться максимального
количества байт, которые переполнят буфер. В данном Program received signal SIGSEGV, Segmentation fault.
0x400ee94a in _IO_vfprintf (s=0xaabbccdd, format=0x809b773 ↵
случае оно будет равно 250. "%s%s", ap=0xbfffd6ac) at vfprintf.c:1024
1024 vfprintf.c: No such file or directory.
(gdb) where
Эксплуатация #0 0x400ee94a in _IO_vfprintf (s=0xaabbccdd, ↵
Из-за статистической декларации буфера на пути к эксплу- format=0x809b773 "%s%s", ap=0xbfffd6ac) at vfprintf.c:1024
#1 0x400f7047 in fprintf (stream=0xaabbccdd, ↵
атации данной уязвимости становятся компиляторы, разме- format=0x809b773 "%s%s")at fprintf.c:32
щающие статические данные в сегменте данных (data #2 0x8084ff8 in smtpmessage ()
#3 0x80847ac in smtpquit ()
segment). Другими словами, должны быть некие используе- #4 0x8069e89 in mci_uncache ()
мые статические данные, размещенные по окончании бу- #5 0x8069f14 in mci_flush ()
#6 0x804e0b9 in finis ()
фера, которые при его переполнении исполнились бы от име- #7 0x8073042 in dowork ()
ни процесса Sendmail. После экспериментов, проведенных #8 0x807f9bc in smtp ()
#9 0x804da8e in main ()
Польской хакерской командой LAST STAGE OF DELIRIUM #10 0x400c19cb in __libc_start_main (main=0x804ac00, argc=3,
(LSD) выяснилось, что на большинстве Unix-системах за бу- argv=0xbffffbe4, init=0x804a07c <_init>, fini=0x808918c ↵
<_fini>, rtld_fini=0x4000ae60 <_dl_fini>, ↵
фером такие данные не расположены. Следующий список stack_end=0xbffffbdc)
содержит результаты, полученные при исследовании: at ../sysdeps/generic/libc-start.c:92

№4(5), апрель 2003 55


FREEBSD
компиляция
администрирование
Перекомпиляция ядра и самой операционной системы
FreeBSD – часть непрерывного процесса обеспечения бе-
зопасности интернет-сервера, и хотя у новичка в мире от-
крытых исходников слова "компиляция ядра операцион-
ной системы" обычно вызывают благоговейное прекло-
нение перед произносящим их, этот процесс на самом
деле не является слишком сложным и тем более таин-
ственным. В этой статье я опишу обычный порядок пере-
компиляции системы, ее ядра, а также основные опции и
параметры команды make, используемые в процессе ком-
пиляции для систем, основанных на процессорах семей-
ства Intel x86. На вашей машине должны быть установле-
ны инструменты разработки – gcc, make и все соответ-
ствующие библиотеки и заголовочные файлы.
Исходные тексты операционной системы обычно на-
ходятся в каталоге /usr/src. Для их обновления до теку-
щей версии чаще всего используется программа cvsup,
устанавливаемая из коллекции пакетов FreeBSD. cvsup
является разновидностью CVS [2] (concurrent versions
system, одна из широко распространенных систем управ-
ления версиями программ, используемых для групповой
разработки программного обеспечения. СVS обеспечива-
ет подмножество ее функций, необходимое для синхро-
низации локальных файлов с файлами, расположенными
на master-сервере cvsup. При работе cvsup передает толь-
ко различия (diffs) между измененными со времени пос-
леднего обновления файлами, а также может использо-
вать компрессию потока (с использованием zlib), что по-
зволяет этому методу обновления существенно выигры-
вать в производительности и нагрузке на канал по срав-
нению, например, c FTP.

Данная программа вызывается с параметром, указы-


вающим местоположение файла, описывающего следу-
ющие основные параметры:
 местонахождение исходных текстов OS на локальном
винчестере;
 имя сервера, на котором расположен репозиторий с ис-
ходными текстами, соответствующими текущей версии;
 части операционной системы (например, игры, библио-
теки, ядро или вся система целиком), подлежащие об-
новлению.

Рассмотрим подробно два параметра – default tag и


список коллекций для обновления. Параметр default tag
указывает, до какой ветки FreeBSD вы хотите произво-
дить апгрейд. Возможные варианты:

. (òî÷êà) – FreeBSD-current.
FreeBSD "ñ ïåðåäíåãî êðàÿ". Íå ðåêîìåíäóåòñÿ òåì, êòî
òîëüêî îñâàèâàåò ïðîöåññ ïåðåêîìïèëÿöèè.
RELENG_5_0 – FreeBSD 5.0
Âåòêà 5.0-RELEASE, èñïîëüçóåòñÿ äëÿ êðèòè÷åñêèõ
áàãôèêñîâ è ïàò÷åé ñèñòåìû áåçîïàñíîñòè.
RELENG_4
Âåòêà FreeBSD-4.x. Ñåé÷àñ ýòî FreeBSD-STABLE. Îñíîâíàÿ
âåòâü ðàçâèòèÿ ÷åòâåðòîé âåðñèè ñèñòåìû.
RELENG_4_7
FreeBSD-4.7-RELEASE, èñïîëüçóåòñÿ äëÿ êðèòè÷åñêèõ
áàãôèêñîâ è ïàò÷åé ñèñòåìû áåçîïàñíîñòè.
RELENG_4_6
FreeBSD 4.6 è 4.6.2, èñïîëüçóåòñÿ äëÿ êðèòè÷åñêèõ
áàãôèêñîâ è ïàò÷åé ñèñòåìû áåçîïàñíîñòè.
АЛЕКСАНДР ПРОКОШЕВ RELENG_4_5

№4(5), апрель 2003 57


администрирование
FreeBSD 4.5, èñïîëüçóåòñÿ äëÿ êðèòè÷åñêèõ áàãôèêñîâ è ботоспособности программ из-за несоответствий струк-
ïàò÷åé ñèñòåìû áåçîïàñíîñòè.
RELENG_4_4 тур данных (простой пример – команда ps, часто не рабо-
FreeBSD 4.4, èñïîëüçóåòñÿ äëÿ êðèòè÷åñêèõ áàãôèêñîâ è тающая с ядром, версия которого не соответствует вер-
ïàò÷åé ñèñòåìû áåçîïàñíîñòè.
RELENG_4_3 сии остальной системы).
FreeBSD 4.3, èñïîëüçóåòñÿ äëÿ êðèòè÷åñêèõ áàãôèêñîâ è Полностью формат sup-файла описан в документации
ïàò÷åé ñèñòåìû áåçîïàñíîñòè.
RELENG_3 по cvsup. Далее в этой статье я предполагаю, что пара-
Âåòêà FreeBSD-3.x. Ñåé÷àñ ýòî 3.x-STABLE. Îñíîâíàÿ метр default tag установлен в значение "RELENG_4", соот-
âåòâü ðàçâèòèÿ òðåòüåé âåðñèè ñèñòåìû.
RELENG_2_2 ветствующий версии системы 4.x-STABLE, и производится
Âåòêà FreeBSD-2.2.x. Óñòàðåâøàÿ âåòâü. обновление системы целиком (используется тег src-all). При
Чем отличается RELEASE от STABLE? Очень просто: этом наш sup-файл имеет примерно следующий вид:
STABLE – это то, что получается из RELEASE в процессе
его (релиза) технического сопровождения, то есть исправ- --== cut /etc/cvsupfile.sys ==--
# Ôàéë îáíîâëåíèÿ ñèñòåìû
ления ошибок и латания обнаруженных дыр в безопасно-
сти. Отдельным пунктом здесь стоит версия системы, обо- *default host=cvsup5.FreeBSD.org
*default base=/usr
значаемая тегом RELENG_4, которая представляет собой *default prefix=/usr
"стабильную ветвь разработки". Рано или поздно на ос- *default release=cvs
*default tag=RELENG_4
нове этой версии будет выпущена версия 4.8-RELEASE *default delete use-rel-suffix compress
(RELENG_4_8_0_RELEASE), от которой, в свою очередь,
src-all
отойдет 4.8-STABLE (RELENG_4_8). # src-base
Переходим к списку коллекций. cvsup понимает сле- # src-bin
# src-contrib
дующие коллекции, относящиеся к исходным текстам опе- # src-etc
рационной системы: # src-games
# src-gnu
# src-include
src-all # src-kerberos5
Ïîëíîå äåðåâî èñõîäíèêîâ # src-kerberosIV
src-base # src-lib
Áàçîâûå ïðîãðàììû # src-libexec
src-bin # src-release
Ïðîãðàììû â /usr/src/bin – òî, ÷òî ïîñëå óñòàíîâêè # src-sbin
íàõîäèòñÿ â /bin # src-share
src-contrib # src-sys
Contributed software, â òîì ÷èñëå awk, gcc, tcpdump è # src-tools
ìíîãîå äðóãîå, áåç ÷åãî íå îáîéòèñü. # src-usrbin
src-etc # src-usrsbin
Òî, ÷òî ñ ïîìîùüþ mergemaster'à óñòàíàâëèâàåòñÿ â /etc # src-crypto
src-games # src-eBones
Èãðû. # src-secure
src-gnu # src-sys-crypto
GNU software --== end cut ==--
src-include
.h-ôàéëû äëÿ ïîìåùåíèÿ â /usr/include
src-kerberos5 Запускаем cvsup:
Kerberos 5.
src-kerberosIV
Kerberos 4.
src-lib --== cut here ==--
Èñõîäíèêè ñèñòåìíûõ áèáëèîòåê. ice.root# cvsup /etc/cvsupfile.sys
src-libexec Connected to cvsup5.FreeBSD.org
Íåêîòîðûå äåìîíû. Ñêëàäûâàþòñÿ â /usr/libexec Updating collection src-all/cvs
src-release Edit src/etc/Makefile [âûâîäèìûå ñîîáùåíèÿ îïóùåíû]
Èíñòðóìåíòû äëÿ ïîñòðîåíèÿ äèñòðèáóòèâà. Edit src/share/misc/pci_vendors
src-sbin Finished successfully ice.root#
Áóäóùåå ñîäåðæèìîå /sbin --== end cut ==--
src-share
Áóäóùåå ñîäåðæèìîå /usr/share
src-sys После успешного завершения работы cvsup в катало-
Èñõîäíèêè ÿäðà ге /usr/src нашего компьютера находятся исходные тек-
src-tools
Èíñòðóìåíòû äëÿ òåñòèðîâàíèÿ è ïîääåðæêè ñèñòåìû. Íå сты, соответствующие текущему содержанию CVS-репо-
ñîáèðàþòñÿ âî âðåìÿ buildworld. зитория ветки STABLE четвертого релиза FreeBSD.
src-usrbin
Áóäóùåå ñîäåðæèìîå /usr/bin Теперь переходим к компиляции.
src-usrsbin Сначала просмотрим файл, настройки которого влия-
Áóäóùåå ñîäåðæèìîå /usr/sbin
src-crypto src-eBones src-secure src-sys-crypto ют на конфигурацию и производительность получаемой
Êðèïòîïîäñèñòåìà. в результате системы – /etc/make.conf (или /etc/defaults/
make.conf). В нем вы можете задать параметры оптими-
Еще раз подчеркну, что коллекция src-all включает в зации для компилятора, указать, компилировать ли про-
себя все остальные коллекции, так что если в sup-файле филировочные версии библиотек, sendmail, поставляемый
вы указали "src-all", нет надобности указывать еще какие- с системой, perl, а также некоторые другие опции. Инте-
либо коллекции. С другой стороны, FreeBSD Handbook [1] ресное замечание насчет параметров оптимизации:
рекомендует не обновлять userspace программы отдель- FreeBSD Handbook [1] рекомендует выставлять флаг оп-
но от ядра и наоборот, так как это может привести к нера- тимизации "-O", но ничто не мешает вам выставить, к при-

58
администрирование
меру "-O3 -march=i686", хотя, конечно, это скажется на make buildkernel KERNCONF=MYCONF
времени компиляции. Еще одно важное замечание: если
вы производите апгрейд с версии FreeBSD 4.7-RELEASE
или ниже на 4-STABLE, обязательно выставьте параметр Здесь MYCONF – имя того самого файла конфигура-
"COMPAT3X" файла /etc/make.conf в значение "yes", ина- ции ядра в каталоге /usr/src/sys/i386/conf, который вы не-
че при запуске программ, скомпилированных для FreeBSD давно редактировали. Обратите внимание, что команда
3.x (одной из таких программ является JDK 1.1.8, содер- make выполняется в каталоге /usr/src, а имя файла кон-
жащийся в ports), вы увидите сообщение динамического фигурации передается ей без пути до него. После успеш-
редактора связей о ненайденном символе __stderrp в си- ного завершения работы make перейдите в однопользо-
стемных библиотеках. вательский режим:
Начнем с конфигурации ядра. Традиционно в 4.3BSD-
based системах, к которым относится и FreeBSD, конфи- shutdown now
гурация ядра описывается в текстовом файле, который
затем с помощью команды config преобразуется в h-фай- и, вновь войдя в каталог /usr/src cd /usr/src, выполните три
лы и Makefile, используемые непосредственно инструмен- заключительные команды:
тами компиляции. Примеры файлов конфигурации нахо-
дятся в каталоге /usr/src/sys/i386/conf и называются make installkernel KERNCONF=MYCONF
make installworld
GENERIC и LINT. Для создания своей конфигурации ско- fastboot
пируйте файл GENERIC в файл, к примеру:
При выполнении make installkernel ваше нынешнее ядро
MYCONF: будет скопировано в файл /kernel.old, а модули – в ката-
cd /usr/src/sys/i386/conf
cp GENERIC MYCONF лог /modules.old. Это даст вам шанс все же запустить си-
стему со старым ядром, если новое по какой-либо причи-
и приступайте к его редактированию. Значения опций до- не окажется неработоспособным.
вольно подробно описаны в файле LINT, и я не буду по- Совет: если вы компилировали ядро самый первый раз
вторно описывать их здесь. Естественно, вы должны от- (то есть то, которое перед выполнением make installkernel
четливо представлять себе аппаратную конфигурацию ва- находится в файле /kernel, заведомо работоспособно),
шей машины. И еще один совет: на первых порах случа- перед make installkernel скопируйте его на всякий случай,
ется всякое, поэтому лучше вносить серьезные измене- допустим, в /kernel.stable, чтобы оно не затерлось после-
ния в конфигурацию ядра той же версии, под которой в дующими выполнениями make installkernel. У вас будет
данный момент работает ваш компьютер, то есть до об- возможность впоследствии загрузить его из командной
новления исходников через cvsup. Такой подход имеет два строки начального загрузчика OS вместо ядра по умол-
преимущества: чанию /kernel. Описание работы с командами начального
 исключается полная перекомпиляция системы (то есть загрузчика выходит далеко за рамки темы данной ста-
make buildworld не выполняется – только make тьи, поэтому интересующихся мы отсылаем к страницам
buildkernel, так как установленная система той же вер- онлайнового руководства по операционной системе, ка-
сии, что и собираемое ядро), что значительно умень- сающихся команд boot и loader (man 8 boot и man 8 loader).
шает время итерации; Если все прошло успешно, то после перезагрузки вы
 больше возможности сохранить работоспособность си- будете работать в совершенно свежей операционной си-
стемы при загрузке со старым ядром в случае нерабо- стеме, только что собранной практически своими рука-
тоспособности вновь собранного из-за того же самого ми. С другой стороны, нельзя не напомнить о необходи-
соответствия версии системы версии ядра. мости делать резервное копирование файловых систем
перед началом апгрейда.
После завершения редактирования перейдите в ката- Ссылки:
лог /usr/src и дайте команду сборки системы: cd /usr/src [1] FreeBSD Handbook http://www.freebsd.org/doc/
make buildworld. Время выполнения этой команды за- en_US.ISO8859-1/books/handbook/index.html
висит от заданных ранее опций компиляции и может со- [2] Concurrent versions system http://www.cvshome.org
ставить от часа до нескольких часов. Если вы компили-
руете на многопроцессорной машине, имеет смысл вы-
полнять make с ключом -j<n+2>, где n – количество про-
цессоров:

make -j4 buildworld

Внимание! Для сборки системы вам потребуется око-


ло 300 Мб свободного места на разделе файловой систе-
мы, содержащем каталог /usr/obj.
После окончания сборки системы остается только
скомпилировать ядро:

№4(5), апрель 2003 59


АБСОЛЮТНО
ВСЕ О

ATM

СЕРГЕЙ РОПЧАН
администрирование
Технология асинхронного режима пе- тельские данные, объединенный канал могли быть реализованы сетями ISDN
редачи (Asynchronous Transfer Mode, все равно передает байты этого под- – например, для передачи цветного
ATM) разработана как единый универ- канала, заполненные нулями. телевизионного изображения необхо-
сальный транспорт для нового поколе- Попытки загрузить периоды про- дима полоса пропускания в районе 30
ния сетей с интеграцией услуг, кото- стоя подканалов приводят к необходи- Мбит/с. Технология ISDN такую ско-
рые называются широкополосными мости введения заголовка для данных рость поддержать не может, а для ATM
сетями ISDN (Broadband-ISDN, B- каждого подканала. В промежуточной она не составляет больших проблем.
ISDN). технологии STDM (Statistical TDM), ко- Разработку стандартов ATM осуще-
По планам разработчиков единооб- торая позволяет заполнять периоды ствляет группа организаций под назва-
разие, обеспечиваемое ATM, будет простоя передачей пульсаций трафи- нием ATM Forum под эгидой специаль-
состоять в том, что одна транспортная ка других подканалов, действительно ного комитета IEEE, а также комитеты
технология сможет обеспечить не- вводятся заголовки, содержащие но- ITU-T и ANSI. ATM – это очень слож-
сколько перечисленных ниже возмож- мер подканала. Данные при этом ная технология, требующая стандарти-
ностей, то есть подразумевалось сде- оформляются в пакеты, похожие по зации в самых различных аспектах,
лать эту технологию насколько структуре на пакеты компьютерных поэтому, хотя основное ядро стандар-
возможно универсальной: сетей. Наличие адреса у каждого па- тов было принято в 1993 году, работа
 Передачу в рамках одной транспор- кета позволяет передавать его асинх- по стандартизации активно продолжа-
тной системы компьютерного и ронно, так как местоположение его ется. Оптимизм внушает тот факт, что
мультимедийного (голос, видео) относительно данных других подкана- в ATM Forum принимают участие прак-
трафика, чувствительного к задер- лов уже не является его адресом. Асин- тически все заинтересованные сторо-
жкам, причем для каждого вида хронные пакеты одного подканала ны – производители телекоммуникаци-
трафика качество обслуживания вставляются в свободные таймслоты онного оборудования, производители
будет соответствовать его потреб- другого подканала, но не смешивают- оборудования локальных сетей, опера-
ностям. ся с данными этого подканала, так как торы телекоммуникационных сетей и
 Иерархию скоростей передачи дан- имеют собственный адрес. сетевые интеграторы.
ных, от десятков мегабит до не- Технология ATM совмещает в себе
скольких гигабит в секунду с гаран- подходы двух технологий – коммута-
тированной пропускной способно- ции пакетов и коммутации каналов. От Основные концепции
стью для ответственных приложе- первой она взяла на вооружение пе- технологии ATM
ний. редачу данных в виде адресуемых па- Сеть ATM имеет классическую струк-
 Общие транспортные протоколы кетов, а от второй – использование туру крупной территориальной сети –
для локальных и глобальных сетей. пакетов небольшого фиксированного конечные станции соединяются инди-
 Сохранение имеющейся инфра- размера, в результате чего задержки видуальными каналами с коммутато-
структуры физических каналов или в сети становятся более предсказуе- рами нижнего уровня, которые, в свою
физических протоколов: Т1/Е1, ТЗ/ мыми, в связи с чем облегчается ана- очередь, соединяются с коммутатора-
ЕЗ, SDH STM-n, FDDI. лиз и мониторинг. С помощью техни- ми более высоких уровней. Коммута-
 Взаимодействие с унаследованны- ки виртуальных каналов, предвари- торы ATM пользуются 20-байтными
ми протоколами локальных и гло- тельного заказа параметров качества адресами конечных узлов для марш-
бальных сетей: IP, SNA, Ethernet, обслуживания канала и приоритетно- рутизации трафика на основе техники
ISDN. го обслуживания виртуальных каналов виртуальных каналов. Для частных
с разным качеством обслуживания сетей ATM определен протокол марш-
Главная идея технологии асинхрон- удается добиться передачи в одной рутизации PNNI (Private NNI), с помо-
ного режима передачи была высказа- сети разных типов трафика без диск- щью которого коммутаторы могут
на достаточно давно – этот термин риминации. Технология ATM с самого строить таблицы маршрутизации авто-
ввела лаборатория Bell Labs еще в начала разрабатывалась как техноло- матически. В публичных сетях ATM
далеком 1968 году. Основной разра- гия, способная обслуживать все виды таблицы маршрутизации могут стро-
батываемой технологией тогда была трафика в соответствии с их требова- иться администраторами вручную, как
технология TDM с синхронными мето- ниями. и в сетях Х.25, или могут поддержи-
дами коммутации, основанными на по- Службы верхних уровней сети B- ваться протоколом PNNI.
рядковом номере байта в объединен- ISDN должны быть примерно такими Коммутация пакетов происходит на
ном кадре. Главный недостаток техно- же, что и у сети ISDN – это передача основе идентификатора виртуального
логии TDM, которую также называют факсов, распространение телевизион- канала (Virtual Channel Identifier, VCI),
технологией синхронной передачи ного изображения, голосовая почта, который назначается соединению при
STM (Synchronous Transfer Mode), зак- электронная почта, различные инте- его установлении и уничтожается при
лючается в невозможности перерасп- рактивные службы, например прове- разрыве соединения. Адрес конечно-
ределять пропускную способность дение видеоконференций. Высокие го узла ATM, на основе которого про-
объединенного канала между подкана- скорости технологии ATM создают го- кладывается виртуальный канал, име-
лами. В те периоды времени, когда по раздо больше возможностей для ет иерархическую структуру, подобную
подканалу не передаются пользова- служб верхнего уровня, которые не номеру в телефонной сети, и исполь-

№4(5), апрель 2003 61


администрирование
зует префиксы, соответствующие ко- вать не только волоконно-оптический технологии ATM применен стандарт-
дам стран, городов, сетям поставщи- кабель, но и неэкранированную витую ный для глобальных вычислительных
ков услуг и т. п., что упрощает марш- пару категории 5. На скорости 622 сетей прием – передача ячеек в соот-
рутизацию запросов установления со- Мбит/с допустим только волоконно-оп- ветствии с техникой виртуальных ка-
единения, как и при использовании тический кабель, причем как SMF, так налов с длиной номера виртуального
агрегированных IP-адресов в соответ- и MMF. канала в 24 бита, что вполне достаточ-
ствии с техникой CIDR (техника захва- Имеются и другие физические ин- но для обслуживания большого коли-
та среды). терфейсы к сетям ATM, отличные от чества виртуальных соединений каж-
Виртуальные соединения могут SDH/SONET. К ним относятся интер- дым портом коммутатора глобальной
быть постоянными (Permanent Virtual фейсы Т1/Е1 и ТЗ/ЕЗ, распространен- (может быть всемирной) сети ATM.
Circuit, PVC) и коммутируемыми ные в глобальных сетях, и интерфей- Размер ячейки ATM является ре-
(Switched Virtual Circuit, SVC), Для ус- сы локальных сетей – интерфейс с ко- зультатом компромисса между теле-
корения коммутации в больших сетях дировкой 4В/5В со скоростью 100 фонистами и компьютерщиками – пер-
используется понятие виртуального Мбит/с (FDDI) и интерфейс со скорос- вые настаивали на размере поля дан-
пути – Virtual Path, который объединя- тью 25 Мбит/с, предложенный компа- ных в 32 байта, а вторые – в 64 байта.
ет виртуальные каналы, имеющие в нией IBM и утвержденный ATM Forum. Чем меньше пакет, тем легче ими-
сети ATM общий маршрут между ис- Кроме того, для скорости 155,52 тировать услуги каналов с постоянной
ходным и конечным узлами или общую Мбит/с определен так называемый битовой скоростью, которая характер-
часть маршрута между двумя комму- “cell-based” физический уровень, то на для телефонных сетей. Ясно, что
таторами сети. Идентификатор вирту- есть уровень, основанный на ячейках, при отказе от жестко синхронизиро-
ального пути (Virtual Path Identifier, VPI) а не на кадрах SDH/SONET. Этот ва- ванных временных слотов для каждо-
является старшей частью локального риант физического уровня не исполь- го канала идеальной синхронности
адреса и представляет собой общий зует кадры SDH/SONET, а отправляет добиться будет невозможно, однако
префикс для некоторого количества по каналу связи непосредственно чем меньше размер пакета, тем легче
различных виртуальных каналов. Та- ячейки формата ATM, что сокращает этого достичь.
ким образом, идея агрегирования ад- накладные расходы на служебные дан- Для пакета, состоящего из 53 байт,
ресов в технологии ATM применена на ные, но несколько усложняет задачу при скорости в 155 Мбит/с время пе-
двух уровнях – на уровне адресов ко- синхронизации приемника с передат- редачи кадра на выходной порт состав-
нечных узлов (работает на стадии ус- чиком на уровне ячеек. ляет менее 3 мкс. Так что эта задерж-
тановления виртуального канала) и на Все перечисленные выше характе- ка не очень существенна для трафи-
уровне номеров виртуальных каналов ристики технологии ATM не свидетель- ка, пакеты которого должны переда-
(работает при передаче данных по ствуют о том, что это некая “особен- ваться каждые 125 мкс.
имеющемуся виртуальному каналу). ная” технология, а скорее представля- Однако на выбор размера ячейки
Соединения конечной станции ATM ют ее как типичную технологию гло- большее влияние оказала не величи-
с коммутатором нижнего уровня опре- бальных сетей, основанную на техни- на ожидания передачи ячейки, а задер-
деляются стандартом UNI (User ке виртуальных каналов. Особеннос- жка пакетизации. Задержка пакетиза-
Network Interface). Спецификация UNI ти же технологии ATM лежат в облас- ции – это время, в течение которого
определяет структуру пакета, адреса- ти качественного обслуживания разно- первый замер голоса ждет момента
цию станций, обмен управляющей ин- родного трафика и объясняются стрем- окончательного формирования пакета
формацией, уровни протокола ATM, лением решить задачу совмещения в и отправки его по сети. При размере
способы установления виртуального одних и тех же каналах связи и в од- поля данных в 48 байт одна ячейка
канала и способы управления трафи- ном и том же коммуникационном обо- ATM обычно переносит 48 замеров го-
ком. В настоящее время принята вер- рудовании компьютерного и мультиме- лоса, которые делаются с интервалом
сия UNI 4.0, но наиболее распростра- дийного трафика таким образом, что- в 125 мкс. Поэтому первый замер дол-
ненной версией, поддерживаемой про- бы каждый тип трафика получил тре- жен ждать примерно 6 мс, прежде чем
изводителями оборудования, являет- буемый уровень обслуживания и не ячейка будет отправлена по сети.
ся версия UNI 3.1. рассматривался как “второстепенный”. Именно по этой причине телефонисты
Стандарт ATM не вводит свои спе- Подход, реализованный в техноло- боролись за уменьшения размера
цификации на реализацию физическо- гии ATM, состоит в передаче любого ячейки, так как 6 мс – это задержка,
го уровня. Здесь он основывается на вида трафика – компьютерного, теле- близкая к пределу, за которым начи-
технологии SDH/SONET, принимая ее фонного или видео – пакетами фикси- наются нарушения качества передачи
иерархию скоростей. В соответствии рованной и очень маленькой длины в голоса. При выборе размера ячейки в
с этим начальная скорость доступа 53 байта. Пакеты ATM называют ячей- 32 байта задержка пакетизации соста-
пользователя сети – это скорость ками – cell. Поле данных ячейки зани- вила бы 4 мс, что гарантировало бы
ОС-3 155 Мбит/с. Организация ATM мает 48 байт, а заголовок – 5 байт. более качественную передачу голоса.
Forum определила для ATM не все Чтобы пакеты содержали адрес А стремление компьютерных специа-
иерархии скоростей SDH, а только ско- узла назначения и в то же время про- листов увеличить поле данных до 64
рости ОС-3 и ОС-12 (622 Мбит/с). На цент служебной информации не пре- байт вполне понятно – при этом повы-
скорости 155 Мбит/с можно использо- вышал размер поля данных пакета, в шается полезная скорость передачи

62
администрирование
данных. Избыточность служебных дан- два различных типа трафика в отно- хние границы задержки и вариации
ных при использовании 48-байтного шении этого параметра – трафик с задержки ячеек.
поля данных составляет 10 %, а при постоянной битовой скоростью В технологии ATM поддерживает-
использовании 32-байтного поля дан- (Constant Bit Rate, CBR) и трафик с пе- ся следующий набор основных коли-
ных она сразу повышается до 16 %. ременной битовой скоростью (Variable чественных параметров:
Выбор для передачи данных любо- Bit Rate, VBR).  Peak Cell Rate (PCR) – максималь-
го типа небольшой ячейки фиксиро- К разным классам были отнесены ная скорость передачи данных;
ванного размера еще не решает зада- трафики, порождаемые приложения-  Sustained Cell Rate (SCR) – средняя
чу совмещения разнородного трафи- ми, использующими для обмена сооб- скорость передачи данных;
ка в одной сети, а только создает пред- щениями протоколы с установлением  Minimum Cell Rate (MCR) – мини-
посылки для ее решения. Для полного соединений и без установления соеди- мальная скорость передачи дан-
решения этой задачи технология ATM нений. В первом случае данные пере- ных;
привлекает и развивает идеи заказа даются самим приложением достаточ-  Maximum Burst Size (MBS) – макси-
пропускной способности и качества об- но надежно, как это обычно делают мальный размер пульсации;
служивания, реализованные в техно- протоколы с установлением соедине-  Cell Loss Ratio (CLR) – доля поте-
логии frame relay. Но если сеть frame ния, поэтому от сети ATM высокой на- рянных ячеек;
relay изначально была предназначена дежности передачи не требуется. А во  Cell Transfer Delay (CTD) – задерж-
для передачи только пульсирующего втором случае приложение работает ка передачи ячеек;
компьютерного трафика (в связи с без установления соединения и вос-  Cell Delay Variation (CDV) – вариа-
этим для сетей frame relay так трудно становлением потерянных и искажен- ция задержки ячеек.
дается стандартизация передачи голо- ных данных не занимается, что
са), то разработчики технологии ATM предъявляет повышенные требования Параметры скорости измеряются в
проанализировали всевозможные об- к надежности передачи ячеек сетью ячейках в секунду, максимальный раз-
разцы трафика, создаваемые различ- ATM. мер пульсации – в ячейках, а времен-
ными приложениями, и выделили 4 В результате было определено пять ные параметры – в секундах. Макси-
основных класса трафика, для которых классов трафика, отличающихся сле- мальный размер пульсации задает ко-
разработали различные механизмы дующими качественными характерис- личество ячеек, которое приложение
резервирования и поддержания требу- тиками: может передать с максимальной ско-
емого качества обслуживания.  наличием или отсутствием пульса- ростью PCR, если задана средняя ско-
Класс трафика (называемый также ции трафика, то есть трафики CBR рость. Доля потерянных ячеек являет-
классом услуг – service class) каче- или VBR; ся отношением потерянных ячеек к
ственно характеризует требуемые ус-  требованием к синхронизации дан- общему количеству отправленных яче-
луги по передаче данных через сеть ных между передающей и принима- ек по данному виртуальному соедине-
ATM. Если приложение указывает ющей сторонами; нию. Так как виртуальные соединения
сети, что требуется, например, пере-  типом протокола, передающего являются дуплексными, то для каждо-
дача голосового трафика, то из этого свои данные через сеть ATM, с ус- го направления соединения могут быть
становится ясно, что особенно важны- тановлением соединения или без заданы разные значения параметров.
ми для пользователя будут такие по- установления соединения (только В технологии ATM принят не совсем
казатели качества обслуживания, как для случая передачи компьютерных традиционный подход к трактовке тер-
задержки и вариации задержек ячеек, данных). мина “качество обслуживания” – QoS.
существенно влияющие на качество Обычно качество обслуживания тра-
переданной информации – голоса или Очевидно, что только качественных фика характеризуется параметрами
изображения, а потеря отдельной характеристик, задаваемых классом пропускной способности (здесь это
ячейки с несколькими замерами не так трафика, для описания требуемых ус- RCR, SCR, MCR, MBS), параметрами
уж важна, как, например, воспроизво- луг оказывается недостаточно. В тех- задержек пакетов (СТО и CDV), а так-
дящее голос устройство может аппрок- нологии ATM для каждого класса тра- же параметрами надежности переда-
симировать недостающие замеры и фика определен набор количествен- чи пакетов (CLR). В ATM характерис-
качество пострадает не слишком. Тре- ных параметров, которые приложение тики пропускной способности называ-
бования к синхронности передаваемых должно задать. Например, для трафи- ют параметрами трафика и не вклю-
данных очень важны для многих при- ка класса А необходимо указать посто- чают их в число параметров качества
ложений – не только голоса, но и ви- янную скорость, с которой приложение обслуживания QoS, хотя по существу
деоизображения, и наличие этих тре- будет посылать данные в сеть, а для они таковыми являются. Параметрами
бований стало первым критерием для трафика класса В – максимально воз- QoS в ATM являются только парамет-
деления трафика на классы. можную скорость, среднюю скорость ры CTD, CDV и CLR. Сеть старается
Другим важным параметром тра- и максимально возможную пульсацию. обеспечить такой уровень услуг, что-
фика, существенно влияющим на спо- Для голосового трафика можно не бы поддерживались требуемые значе-
соб его передачи через сеть, является только указать на важность синхрони- ния и параметров трафика, и задержек
величина его пульсаций. Разработчи- зации между передатчиком и прием- ячеек, и доли потерянных ячеек.
ки технологии ATM решили выделить ником, но и количественно задать вер- Соглашение между приложением и

№4(5), апрель 2003 63


администрирование
сетью ATM называется трафик-кон- ния качества обслуживания каждого передаваемого трафика) и занимает-
трактом. Основным его отличием от канала. ся разбиением (сегментацией) сооб-
соглашений, применяемых в сетях Стек протоколов ATM показан на щения, принимаемого AAL от протоко-
frame relay, является выбор одного из таблице ниже: ла верхнего уровня, на ячейки ATM,
нескольких определенных классов тра-
фика, для которого наряду с парамет-
рами пропускной способности трафи-
ка могут указываться параметры за-
держек ячеек, а также параметр на-
дежности доставки ячеек. В сети frame
relay класс трафика один, и он харак-
теризуется только параметрами про-
пускной способности. Стек протоколов ATM соответству- снабжением их соответствующим за-
Необходимо подчеркнуть, что зада- ет нижним уровням семиуровневой головком и передачей уровню ATM для
ние только параметров трафика (вме- модели ISO/OSI и включает уровень отправки в сеть.
сте с параметрами QoS) часто не пол- адаптации ATM, собственно уровень Верхний подуровень AAL называ-
ностью характеризует требуемую ус- ATM и физический уровень. Прямого ется подуровнем конвергенции –
лугу, поэтому задание класса трафи- соответствия между уровнями прото- Convergence Sublayer, CS. Этот поду-
ка полезно для уточнения нужного ха- колов технологии ATM и уровнями мо- ровень зависит от класса передавае-
рактера обслуживания данного соеди- дели OSI нет. мого трафика. Протокол подуровня
нения сетью. Уровень адаптации (ATM Adaptation конвергенции решает такие задачи,
Если для приложения не критично Layer, AAL) представляет собой набор как, например, обеспечение времен-
поддержание параметров пропускной протоколов AAL1-AAL5, которые пре- ной синхронизации между передаю-
способности и QoS, то оно может от- образуют сообщения протоколов вер- щим и принимающим узлами (для тра-
казаться от задания этих параметров, хних уровней сети ATM в ячейки ATM фика, требующего такой синхрониза-
указав признак “Best Effort” в запросе нужного формата. Функции этих уров- ции), контролем и возможным восста-
на установление соединения. Такой ней достаточно условно соответству- новлением битовых ошибок в пользо-
тип трафика получил название трафи- ют функциям транспортного уровня вательской информации, контролем
ка с неопределенной битовой скорос- модели OSI, например функциям про- целостности передаваемого пакета
тью – Unspecified Bit Rate, UBR. токолов TCP или UDP. Протоколы AAL компьютерного протокола (Х.25, frame
После заключения трафик-контрак- при передаче пользовательского тра- relay).
та, который относится к определенно- фика работают только в конечных уз- Протоколы AAL для выполнения
му виртуальному соединению, в сети лах сети, как и транспортные протоко- своей работы используют служебную
ATM работает несколько протоколов и лы большинства технологий. информацию, размещаемую в заго-
служб, обеспечивающих нужное каче- Каждый протокол уровня AAL об- ловках уровня AAL. После приема яче-
ство обслуживания. Для трафика UBR рабатывает пользовательский трафик ек, пришедших по виртуальному кана-
сеть выделяет ресурсы “по возможно- определенного класса. На начальных лу, подуровень SAR протокола AAL
сти”, то есть те, которые в данный мо- этапах стандартизации каждому клас- собирает посланное по сети исходное
мент свободны от использования вир- су трафика соответствовал свой про- сообщение (которое в общем случае
туальными соединениями, заказавши- токол AAL, который принимал в конеч- было разбито на несколько ячеек ATM)
ми определенные параметры качества ном узле пакеты от протокола верхне- с помощью заголовков AAL, которые
обслуживания. го уровня и заказывал с помощью со- для коммутаторов ATM являются про-
Технология ATM изначально разра- ответствующего протокола нужные зрачными, так как помещаются в 48-
батывалась для поддержки как посто- параметры трафика и качества обслу- битном поле данных ячейки, как и по-
янных, так и коммутируемых виртуаль- живания для данного виртуального лагается протоколу более высокого
ных каналов (в отличие от технологии канала. При развитии стандартов ATM уровня. После сборки исходного сооб-
frame relay, долгое время не поддер- такое однозначное соответствие меж- щения протокол AAL проверяет слу-
живающей коммутируемые виртуаль- ду классами трафика и протоколами жебные поля заголовка и концевика
ные каналы). Автоматическое заклю- уровня AAL исчезло, и сегодня разре- кадра AAL и на их основании прини-
чение трафик-контракта при установ- шается использовать для одного и того мает решение о корректности получен-
лении коммутируемого виртуального же класса трафика различные прото- ной информации.
соединения представляет собой весь- колы уровня AAL. Ни один из протоколов AAL при пе-
ма непростую задачу, так как комму- Уровень адаптации состоит из не- редаче пользовательских данных ко-
таторам ATM необходимо определить, скольких подуровней. Нижний подуро- нечных узлов не занимается восста-
смогут ли они в дальнейшем обеспе- вень AAL называется подуровнем сег- новлением потерянных или искажен-
чить передачу трафика данного вир- ментации и реассемблирования ных данных. Максимум, что делает
туального канала наряду с трафиком (Segmentation And Reassembly, SAR). протокол AAL, – это уведомляет конеч-
других виртуальных каналов таким Эта часть не зависит от типа протоко- ный узел о таком событии. Так сдела-
образом, чтобы выполнялись требова- ла AAL (и, соответственно, от класса но для ускорения работы коммутато-

64
администрирование
ров сети ATM в расчете на то, что слу- няет коммутацию по номеру виртуаль- таторы ATM отмечают ячейки, которые
чаи потерь или искажения данных бу- ного соединения, который в техноло- нарушают соглашения о параметрах
дут редкими. Восстановление потерян- гии ATM разбит на две части – иденти- качества обслуживания, чтобы уда-
ных данных (или игнорирование этого фикатор виртуального пути (Virtual лить их при перегрузках сети. Таким
события) отводится протоколам верх- Path Identifier, VPI) и идентификатор образом, ячейки с CLP=0 являются для
них уровней, не входящим в стек про- виртуального канала (Virtual Channel сети высокоприоритетными, а ячейки
токолов технологии ATM. Identifier, VCI). Кроме этой основной с CLP=1 – низкоприоритетными.
Существует определенный интер- задачи протокол ATM выполняет ряд Поле Управление ошибками в за-
фейс между приложением, которому функций по контролю за соблюдени- головке (Header Error Control, НЕС) со-
требуется передать трафик через сеть ем трафик-контракта со стороны держит контрольную сумму, вычислен-
ATM, и уровнем адаптации AAL. С по- пользователя сети, маркировке ячеек- ную для заголовка ячейки. Конт-
мощью этого интерфейса приложение нарушителей, отбрасыванию ячеек- рольная сумма вычисляется с помо-
(протокол компьютерной сети, модуль нарушителей при перегрузке сети, а щью техники корректирующих кодов
оцифровывания голоса) заказывает также управлению потоком ячеек для Хэмминга, поэтому она позволяет не
требуемую услугу, определяя тип тра- повышения производительности сети только обнаруживать ошибки, но и ис-
фика, его параметры, а также парамет- (естественно, при соблюдении условий правлять все одиночные ошибки, а так-
ры QoS. Технология ATM допускает трафик-контракта для всех виртуаль- же некоторые двойные. Поле НЕС
два варианта определения параметров ных соединений). обеспечивает не только обнаружение
QoS: первый – непосредственное за- Протокол ATM работает с ячейка- и исправление ошибок в заголовке, но
дание их каждым приложением, вто- ми следующего формата. и нахождение границы начала кадра в
рой – назначение их по умолчанию в Поле Управление потоком (Generic потоке байтов кадров SDH, которые
зависимости от типа трафика. После- Flow Control) используется только при являются предпочтительным физичес-
дний способ упрощает задачу разра- взаимодействии конечного узла и пер- ким уровнем технологии ATM, или же
ботчика приложения, так как в этом вого коммутатора сети. В настоящее в потоке бит физического уровня, ос-
случае выбор максимальных значений время его точные функции не опреде- нованного на ячейках. Указателей, по-
задержки доставки ячеек и вариации лены. зволяющих в поле данных кадра
задержек перекладывается на плечи Поля Идентификатор виртуально- STS-n (STM-n) технологии SONET/SDH
администратора сети. го пути (VitualPath Identifier, VPI) и Иден- обнаруживать границы ячеек ATM (по-
добных тем указателям, которые ис-
пользуются для определения, напри-
мер, границ виртуальных контейнеров
подканалов Т1/Е1), не существует.
Поэтому коммутатор ATM вычисляет
контрольную сумму для последова-
тельности из 5 байт, находящихся в
Самостоятельно обеспечить требу- тификатор виртуального канала (Vitual поле данных кадра STM-n, и если вы-
емые параметры трафика и QoS про- Channel Identifier, VCI) занимают соот- численная контрольная сумма говорит
токолы AAL не могут. Для выполнения ветственно 1 и 2 байта. Эти поля зада- о корректности заголовка ячейки ATM,
соглашений трафик-контракта требу- ют номер виртуального соединения, первый байт становится границей
ется согласованная работа коммутато- разделенный на старшую (VPI) и млад- ячейки. Если же это не так, то проис-
ров сети вдоль всего виртуального со- шую (VCI) части. ходит сдвиг на один байт и операция
единения. Эта работа выполняется Поле Идентификатор типа данных продолжается. Таким образом, техно-
протоколом ATM, обеспечивающим (Payload Type Identifier, PTI) состоит из логия ATM выделяет асинхронный по-
передачу ячеек различных виртуаль- трех бит и задает тип данных, перено- ток ячеек ATM в синхронных кадрах
ных соединений с заданным уровнем симых ячейкой, – пользовательские SDH или потоке бит физического уров-
качества обслуживания. или управляющие (например, управля- ня, основанного на ячейках.
ющие установлением виртуального
соединения). Кроме того, один бит это-
Протокол ATM го поля используется для указания пе- Формат ячейки ATM
Протокол ATM занимает в стеке про- регрузки в сети – он называется Explicit Рассмотрим методы коммутации яче-
токолов ATM примерно то же место, Congestion Forward Identifier, EFCI – и ек ATM на основе пары чисел VPI/VCI.
что протокол IP в стеке TCP/IP или про- играет ту же роль, что бит FECN в тех- Коммутаторы ATM могут работать в
токол LAP-F в стеке протоколов техно- нологии frame relay, то есть передает двух режимах – коммутации виртуаль-
логии frame relay. Протокол ATM зани- информацию о перегрузке по направ- ного пути и коммутации виртуального
мается передачей ячеек через комму- лению потока данных. канала. В первом режиме коммутатор
таторы при установленном и настро- Поле Приоритет потери кадра (Cell выполняет продвижение ячейки толь-
енном виртуальном соединении, то Loss Priority, CLP) играет в данной тех- ко на основании значения поля VPI, а
есть на основании готовых таблиц ком- нологии ту же роль, что и поле DE в значение поля VCI он игнорирует.
мутации портов. Протокол ATM выпол- технологии frame relay – в нем комму- Обычно так работают магистральные

№4(5), апрель 2003 65


администрирование
коммутаторы территориальных сетей. ния. Сначала этот узел устанавливает Кроме адресной части пакет CALL
Они доставляют ячейки из одной сети виртуальное соединение всего с одним SETUP протокола Q.2931, с помощью
пользователя в другую на основании узлом, а затем добавляет к соедине- которого конечный узел запрашивает
только старшей части номера вирту- нию с помощью специального вызова установление виртуального соедине-
ального канала, что соответствует по одному новому члену. Ведущий ния, включает также части, описыва-
идее агрегирования адресов. В резуль- узел становится вершиной дерева со- ющие параметры трафика и требова-
тате один виртуальный путь соответ- единения, а остальные узлы – листья- ния QoS. При поступлении такого па-
ствует целому набору виртуальных ми этого дерева. Сообщения, которые кета коммутатор должен проанализи-
каналов, коммутируемых как единое посылает ведущий узел, принимают ровать эти параметры и решить, дос-
целое. все листья соединения, но сообщения, таточно ли у него свободных ресурсов
После доставки ячейки в локаль- которые посылает какой-либо лист производительности для обслужива-
ную сеть ATM ее коммутаторы начи- (если соединение дуплексное), прини- ния нового виртуального соединения.
нают коммутировать ячейки с учетом мает только ведущий узел. Если да, то новое виртуальное соеди-
как VPI, так и VCI, но при этом им хва- Пакеты протокола Q.2931, предназ- нение принимается и коммутатор пе-
тает для коммутации только младшей наченные для установления коммутиру- редает пакет CALL SETUP дальше в
части номера виртуального соедине- емого виртуального канала, имеют те соответствии с адресом назначения и
ния, так что фактически они работают же названия и назначение, что и паке- таблицей маршрутизации, а если нет,
с VCI, оставляя VPI без изменения. ты протокола Q.933, рассмотренные то запрос отвергается.
Последний режим называется режи- выше при изучении технологии frame
мом коммутации виртуального канала. relay, но структура их полей, естествен-
Подход здесь аналогичен подходу но, другая. Услуги протокола ATM
в сети ISDN – для установления соеди- Адресом конечного узла в коммута- и управление трафиком
нения разработан отдельный протокол торах ATM является 20-байтный адрес. Для поддержания требуемого качества
Q.2931, который весьма условно мож- Этот адрес может иметь различный обслуживания различных виртуальных
но отнести к сетевому уровню. Этот формат, описываемый стандартом ISO соединений и рационального исполь-
протокол во многом похож на прото- 7498. При работе в публичных сетях зования ресурсов в сети на уровне про-
колы Q.931 и Q.933 (даже номером), используется адрес стандарта Е.164, токола ATM реализовано несколько
но в него внесены, естественно, изме- при этом 1 байт составляет AFI, 8 байт служб, предоставляющих услуги раз-
нения, связанные с наличием несколь- занимает IDI – основная часть адреса личных категорий (service categories)
ких классов трафика и дополнитель- Е.164 (15 цифр телефонного номера), по обслуживанию пользовательского
ных параметров качества обслужива- а остальные 11 байт части DSP (Domain трафика. Эти службы являются внут-
ния. Протокол Q.2931 опирается на до- Specific Part). ренними службами сети ATM, они
статочно сложный протокол канально- При работе в частных сетях ATM предназначены для поддержания
го уровня SSCOP, который обеспечи- обычно применяется формат адреса, пользовательского трафика различ-
вает надежную передачу пакетов соответствующий домену международ- ных классов совместно с протокола-
Q.2931 в своих кадрах. В свою оче- ных организаций, причем в качестве ми AAL. Но в отличие от протоколов
редь, протокол SSCOP работает по- международной организации выступа- AAL, которые работают в конечных
верх протокола AAL5, который необхо- ет ATM Forum. В этом случае поле IDI узлах сети, данные службы распреде-
дим для разбиения кадров SSCOP на занимает 2 байта, которые содержат лены по всем коммутаторам сети. Ус-
ячейки ATM и сборки этих ячеек в кад- код ATM Forum, данный ISO, а структу- луги этих служб разбиты на катего-
ры при доставке кадра SSCOP в ком- ра остальной части DSP соответствует рии, которые в общем соответствуют
мутатор назначения. описанной выше за исключением того, классам трафика, поступающим на
Виртуальные соединения, образо- что поле HO-DSP занимает не 4, а 10 вход уровня AAL конечного узла. Ус-
ванные с помощью протокола Q.2931, байт. луги уровня ATM заказываются конеч-
бывают симплексными (однонаправ- Адрес ESI присваивается конечно- ным узлом через интерфейс UNI с по-
ленными) и дуплексными. му узлу на предприятии-изготовителе мощью протокола Q.2931 при уста-
Протокол Q.2931 позволяет также в соответствии с правилами IEEE, то новлении виртуального соединения.
устанавливать виртуальные соедине- есть 3 первых байта содержат код пред- Как и при обращении к уровню AAL,
ния типа “один-к-одному” (point-to-point) приятия, а остальные три байта – по- при заказе услуги необходимо указать
и “один-ко-многим” (point-to-multipoint). рядковый номер, за уникальность кото- категорию услуги, а также парамет-
Первый случай поддерживается во рого отвечает данное предприятие. ры трафика и параметры QoS. Эти
всех технологиях, основанных на вир- Конечный узел при подключении к параметры берутся из аналогичных
туальных каналах, а второй характе- коммутатору ATM выполняет так назы- параметров уровня AAL или же опре-
рен для технологии ATM и является ваемую процедуру регистрации. При деляются по умолчанию в зависимо-
аналогом мультивещания, но с одним этом конечный узел сообщает комму- сти от категории услуги.
ведущим вещающим узлом. При уста- татору свой ESI-адрес, а коммутатор Всего на уровне протокола ATM оп-
новлении соединения “один-ко-мно- сообщает конечному узлу старшую ределено пять категорий услуг, кото-
гим” ведущим считается узел, который часть адреса, то есть номер сети, в ко- рые поддерживаются одноименными
является инициатором этого соедине- торой работает узел. службами:

66
администрирование
 CBR – услуги для трафика с посто- CLP-1. При перегрузках сети они мо- вателем и сетью таких параметров, как
янной битовой скоростью; гут просто отбрасываться сетью. Ячей- PCR, CDV, SCR, ВТ, CTD и CDV. Он
 rtVBR – услуги для трафика с пере- ки, которые запаздывают и не уклады- работает по модифицированному ал-
менной битовой скоростью, требу- ваются в интервал, оговоренный пара- горитму “дырявого ведра”, применяе-
ющего соблюдения средней скоро- метром вариации задержки CDV, так- мому в технологии frame relay.
сти передачи данных и синхрони- же считаются мало значащими для Для многих приложений, которые
зации источника и приемника; приложения и отмечаются признаком могут быть чрезвычайно “взрывными”
 nrtVBR – услуги для трафика с пе- низкого приоритета CLP-1. в отношении интенсивности трафика,
ременной битовой скоростью, тре- Для соединений CBR нет ограниче- невозможно точно предсказать пара-
бующего соблюдения средней ско- ний на некоторую дискретность зака- метры трафика, оговариваемые при
рости передачи данных и не требу- за скорости PCR, как, например, в ка- установлении соединения.
ющего синхронизации источника и налах Т1/Е1, где скорость должна быть В отличие от CBR и обеих служб
приемника; кратна 64 Кбит/с. VBR, служба UBR не поддерживает ни
 ABR – услуги для трафика с пере- По сравнению со службой CBR, параметры трафика, ни параметры ка-
менной битовой скоростью, требу- службы VBR требуют более сложной чества обслуживания. Служба UBR
ющего соблюдения некоторой ми- процедуры заказа соединения между предлагает только доставку “по воз-
нимальной скорости передачи дан- сетью и приложением. В дополнение к можности” без каких-либо гарантий.
ных и не требующего синхрониза- пиковой скорости PCR приложение Разработанная специально для обес-
ции источника и приемника; VBR заказывает еще и два других па- печения возможности превышения
 UBR – услуги для трафика, не раметра: длительно поддерживаемую полосы пропускания, служба UBR
предъявляющего требований к ско- скорость – SCR, которая представля- представляет собой частичное реше-
рости передачи данных и синхро- ет собой среднюю скорость передачи ние для тех непредсказуемых “взрыв-
низации источника и приемника. данных, разрешенную приложению, а ных” приложений, которые не готовы
также максимальный размер пульса- согласиться с фиксацией параметров
Названия большинства категорий ции – MBS. Максимальный размер трафика.
услуг совпадают с названием типов пульсации измеряется в количестве Главными недостатками услуг UBR
пользовательского трафика, для об- ячеек ATM. Пользователь может пре- являются отсутствие управления пото-
служивания которого они разработа- вышать скорость вплоть до величины ком данных и неспособность прини-
ны, но необходимо понимать, что сами PCR, но только на короткие периоды мать во внимание другие типы трафи-
службы уровня ATM и их услуги – это времени, в течение которых передает- ка. Несмотря на перегрузку сети, со-
внутренние механизмы сети ATM, ко- ся объем данных, не превышающий единения UBR будут продолжать пере-
торые экранируются от приложения MBS. Этот период времени называет- дачу данных. Коммутаторы сети могут
уровнем AAL. ся Burst Tolerance, ВТ – терпимость к буферизовать некоторые ячейки по-
Услуги категории CBR предназна- пульсации. Сеть вычисляет этот пери- ступающего трафика, но в некоторый
чены для поддержания трафика синх- од как производный от трех заданных момент буферы переполняются, и
ронных приложений – голосового, эму- значений PCR, SCR и MBS. ячейки теряются. А так как для соеди-
ляции цифровых выделенных каналов Если скорость PCR наблюдается в нений UBR не оговаривается никаких
и т. п. Когда приложение устанавлива- течение периода времени, большего параметров трафика и QoS, то их ячей-
ет соединение категории CBR, оно за- чем ВТ, то ячейки помечаются как на- ки отбрасываются в первую очередь.
казывает пиковую скорость трафика рушители – устанавливается признак Служба ABR подобно службе UBR
ячеек PCR, являющуюся максималь- CLP-1. предоставляет возможность превы-
ной скоростью, которую может поддер- Для услуг категории rtVBR задают- шения полосы пропускания, но благо-
живать соединение без риска потерять ся и контролируются те же параметры даря технике управления трафиком
ячейку, а также параметры QoS: вели- QoS, что и для услуг категории CBR, а при перегрузке сети она дает некото-
чины максимальной задержки ячеек услуги категории nrtVBR ограничива- рые гарантии сохранности ячеек. ABR
CTD, вариации задержки ячеек CDV и ются поддержанием параметров тра- – это первый тип служб уровня ATM,
максимальной доли потерянных ячеек фика. Сеть также поддерживает для который действительно обеспечива-
CLR. обеих категорий услуг VBR определен- ет надежный транспорт для пульсиру-
Затем данные передаются по это- ный максимальный уровень доли по- ющего трафика за счет того, что мо-
му соединению с запрошенной скоро- терянных ячеек CLR, который либо за- жет находить неиспользуемые интер-
стью – не с большей и, в большинстве дается явно при установлении соеди- валы в общем трафике сети и запол-
случаев, не меньшей, хотя уменьше- нения, либо назначается по умолчанию нять их своими ячейками, если дру-
ние скорости приложением возможно, в зависимости от класса трафика. гим категориям служб эти интервалы
например, при передаче компрессиро- Для контроля параметров трафика не нужны.
ванного голоса с помощью услуги ка- и QoS в технологии ATM применяется Как и в службах CBR и VBR, при
тегории CBR. Любые ячейки, переда- так называемый обобщенный алго- установлении соединения категории
ваемые станцией с большей скорос- ритм контроля скорости ячеек – ABR оговаривается значение пиковой
тью, контролируются первым коммута- Generic Cell Rate Algorithm, который скорости PCR. Однако соглашение о
тором сети и помечаются признаком может проверять соблюдение пользо- пределах изменения задержки переда-

№4(5), апрель 2003 67


администрирование
чи ячеек или о параметрах пульсации наряду с ячейками данных специаль- торую он хотел бы поддерживать в
не заключается. ные служебные ячейки управления данное время. Каждый коммутатор,
Вместо этого «сеть и конечный узел ресурсами – Resource Management, через который проходит по виртуаль-
заключают соглашение о требуемой RM. Ячейки RM, которые узел отправ- ному пути это сообщение, может
минимальной скорости передачи MCR. ляет вдоль потока данных, называют- уменьшить запрашиваемую скорость
Это гарантирует приложению, работа- ся прямыми ячейками RM – Forward до некоторой величины, которую он
ющему в конечном узле, небольшую Recource Management (FRM), а ячей- может поддерживать в соответствии с
пропускную способность, обычно ми- ки, которые идут в обратном по отно- имеющимися у него свободными ре-
нимально необходимую для того, что- шению к потоку данных направлении, сурсами (или оставить запрашивае-
бы приложение работало. Конечный называются обратными ячейками RM мую скорость без изменения). Узел
узел соглашается не передавать дан- – Backward Recource Management назначения, получив ячейку FRM, пре-
ные со скоростью выше пиковой, то (BRM). вращает ее в ячейку BRM и отправля-
есть PCR, а сеть соглашается всегда Существует несколько петель об- ет в обратном направлении, причем он
обеспечивать минимальную скорость ратной связи. Самая простая петля тоже может уменьшить запрашивае-
передачи ячеек MCR. обратной связи – между конечными мую скорость. Получив ответ в ячейке
Если при установлении соединения станциями. При ее наличии коммута- BRM, узел-источник точно узнает, ка-
ABR не задаются значения максималь- тор сети извещает конечную станцию кая скорость отправки ячеек в сеть для
ной и минимальной скорости, то по о перегрузке с помощью специально- него в данный момент доступна.
умолчанию считается, что PCR совпа- го флага в поле прямого управления Во второй схеме каждый коммута-
дает со скоростью линии доступа стан- перегрузками (флаг EFCI) ячейки дан- тор сети может работать как узел-ис-
ции к сети, a MCR считается равной ных, переносимой протоколом ATM. точник и узел назначения. Как узел-
нулю. Затем конечная станция посылает че- источник он может сам генерировать
Трафик соединения категории ABR рез сеть сообщение, содержащееся в ячейки FRM и отправлять их по имею-
получает гарантированное качество специальной ячейке управления BRM щимся виртуальным каналам. Как узел
услуг в отношении доли потерянных исходной станции, говоря ей о необхо- назначения он может отправлять на
ячеек и пропускной способности. Что димости уменьшить скорость посылки основе получаемых ячеек FRM ячейки
касается задержек передачи ячеек, то ячеек в сеть. BRM в обратном направлении. Такая
хотя сеть и старается свести их к ми- В этом способе конечная станция схема является более быстродейству-
нимуму, но гарантий по этому парамет- несет основную ответственность за ющей и полезной в протяженных тер-
ру не дает. Следовательно, служба управление потоком, а коммутаторы риториальных сетях.
ABR не предназначена для приложе- играют пассивную роль в петле обрат- Как видно из описания, служба ABR
ний реального времени, а предназна- ной связи, только уведомляя станцию- предназначена не только для прямого
чена для приложений, в которых поток отправитель о перегрузке. поддержания требований к обслужи-
данных не очень чувствителен к задер- Такой простой способ имеет не- ванию конкретного виртуального со-
жкам в передаче. сколько очевидных недостатков. Ко- единения, но и для более рациональ-
При передаче трафика CBR, VBR и нечная станция не узнает из сообще- ного распределения ресурсов сети
UBR явное управление перегрузками ния BRM, на какую величину нужно между ее абонентами, что в конечном
в сети отсутствует. Вместо этого ис- уменьшить скорость передачи данных итоге также приводит к повышению
пользуется механизм отбрасывания в сеть. Поэтому она просто понизит качества обслуживания всех абонен-
ячеек-нарушителей, а узлы, пользую- скорость до минимальной величины тов сети.
щиеся услугами CBR и VBR, старают- MCR, хотя, возможно, это и необяза- Коммутаторы сети ATM использу-
ся не нарушать условия контракта под тельно. Кроме того, при большой про- ют различные механизмы для поддер-
угрозой потери ячеек, поэтому они тяженности сети коммутаторы должны жания требуемого качества услуг. Кро-
обычно не пользуются дополнительной продолжать буферизовать данные все ме описанных в стандартах ITU-T и
пропускной способностью, даже если время, пока уведомление о перегруз- ATM Forum механизмов заключения
она в данный момент доступна в сети. ке будет путешествовать по сети, а для соглашения на основе параметров тра-
Служба ABR позволяет воспользо- глобальных сетей это время может фика и параметров QpS, а затем от-
ваться резервами пропускной способ- быть достаточно большим, и буферы брасывания ячеек, не удовлетворяю-
ности сети, так как сообщает конечно- могут переполниться, так что требуе- щих условиям соглашения, практичес-
му узлу о наличии в данный момент мый эффект достигнут не будет. ки все производители оборудования
избыточной пропускной способности с Разработаны и более сложные схе- ATM реализуют в своих коммутаторах
помощью механизма обратной связи. мы управления потоком, в которых несколько очередей ячеек, обслужива-
Этот же механизм может помочь служ- коммутаторы играют более активную емых с различными приоритетами.
бе ABR снизить скорость передачи роль, а узел-отправитель узнает более Стратегия приоритетного обслужи-
данных конечным узлом в сеть (вплоть точно о возможной в данный момент вания трафика основана на категори-
до минимального значения MCR), если скорости отправки данных в сеть. ях услуг каждого виртуального соеди-
сеть испытывает перегрузку. В первой схеме узел-источник по- нения. До принятия спецификации ABR
Узел, пользующийся услугами ABR, сылает в ячейке FRM явное значение в большинстве коммутаторов ATM
должен периодически посылать в сеть скорости передачи данных в сеть, ко- была реализована простая одноуров-

68
администрирование
невая схема обслуживания, которая стью заменяя. Поэтому протоколы и личается тем, что она применяется для
давала трафику CBR первый приори- спецификации, которые определяют построения не только глобальных, но
тет, трафику VBR второй, а трафику способы взаимодействия технологии и локальных сетей. В последнем слу-
UBR – третий. При такой схеме комби- ATM с другими технологиями, очень чае размерность ARP-таблицы, кото-
нация CBR и VBR может потенциально важны для современных сетей. А так рая должна содержать записи и о по-
заморозить трафик, обслуживаемый как протокол IP является на сегодня граничных маршрутизаторах, и о мно-
другим классом служб. Такая схема не основным протоколом построения со- жестве конечных узлов, может быть
будет правильно работать с трафиком ставных сетей, то стандарты работы IP очень большой. К тому же, для круп-
ABR, так как не обеспечит его требо- через сети ATM являются стандарта- ной локальной сети характерно посто-
вания к минимальной скорости пере- ми, определяющими взаимодействие янное изменение состава узлов, а зна-
дачи ячеек. Для обеспечения этого тре- двух наиболее популярных технологий чит, часто возникает необходимость в
бования должна быть выделена неко- сегодняшнего дня. корректировке таблиц. Все это делает
торая гарантированная полоса пропус- Протокол Classical IP (RFC 1577) яв- ручной вариант решения задачи ото-
кания. ляется первым (по времени появления) бражения адресов для сетей ATM мало
Чтобы поддерживать службу ABR, протоколом, определившим способ пригодным.
коммутаторы ATM должны реализо- работы интерсети IP в том случае, ког- В соответствии со спецификацией
вать двухуровневую схему обслужива- да одна из промежуточных сетей ра- Classical IP одна сеть ATM может быть
ния, которая бы удовлетворяла требо- ботает по технологии ATM. Из-за клас- представлена в виде нескольких IP-
ваниям CBR, VBR и ABR. По этой схе- сической концепции подсетей прото- подсетей, так называемых логических
ме коммутатор предоставляет некото- кол и получил свое название – подсетей (Logical IP Subnet, LIS). Все
рую часть своей пропускной способно- Classical. узлы одной LIS имеют общий адрес
сти каждому классу служб. Трафик Одной из основных задач, решае- сети. Как и в классической IP-сети,
CBR получает часть пропускной спо- мых протоколом Classical IP, является весь трафик между подсетями обяза-
собности, необходимую для поддержа- традиционная для IP-сетей задача – тельно проходит через маршрутиза-
ния пиковой скорости PCR, трафик поиск локального адреса следующего тор, хотя и существует принципиаль-
VBR получает часть пропускной спо- маршрутизатора или конечного узла ная возможность передавать его не-
собности, необходимую для поддержа- по его IP-адресу, то есть задача, воз- посредственно через коммутаторы
ния средней скорости SCR, а трафик лагаемая в локальных сетях на прото- ATM, на которых построена сеть ATM.
ABR получает часть пропускной спо- кол ARP. Поскольку сеть ATM не под- Маршрутизатор имеет интерфейсы во
собности, достаточную для обеспече- держивает широковещательность, всех LIS, на которые разбита сеть ATM.
ния требования минимальной скоро- традиционный для локальных сетей В отличие от классических подсе-
сти ячеек MCR. Это гарантирует, что способ широковещательных ARP-зап- тей маршрутизатор может быть под-
каждое соединение может работать росов здесь не работает. Технология ключен к сети ATM одним физическим
без потерь ячеек и не будет достав- ATM, конечно, не единственная техно- интерфейсом, которому присваивает-
лять ячейки ABR за счет трафика логия, в которой возникает такая про- ся несколько IP-адресов в соответ-
CBR или VBR. На втором уровне это- блема, – для обозначения таких тех- ствии с количеством LIS в сети.
го алгоритма трафик CBR и VBR мо- нологий даже ввели специальный тер- Решение о введении логических
жет забрать всю оставшуюся пропус- мин – «нешироковещательные сети с подсетей связано с необходимостью
кную способность сети, если это не- множественным доступом» (Non- обеспечения традиционного разделе-
обходимо, так как соединения ABR Broadcast networks with Multiple Access, ния большой сети ATM на независимые
уже получили свою минимальную NBMA). К сетям NBMA относятся, в ча- части, связность которых контролиру-
пропускную способность, которая им стности, сети Х.25 и frame relay. ется маршрутизаторами, как к этому
гарантировалась. В общем случае для неширокове- привыкли сетевые интеграторы и ад-
щательных сетей стандарты TCP/IP министраторы. Решение имеет и оче-
определяют только ручной способ по- видный недостаток – маршрутизатор
Передача трафика IP строения ARP-таблиц, однако для тех- должен быть достаточно производи-
через сети ATM нологии ATM делается исключение – тельным для передачи высокоско-
Технология ATM привлекает к себе об- для нее разработана процедура авто- ростного трафика ATM между логичес-
щее внимание, так как претендует на матического отображения IP-адресов кими подсетями, в противном случае
роль всеобщего и очень гибкого транс- на локальные адреса. Такой особый он станет узким местом сети. В связи
порта, на основе которого строятся подход к технологии ATM объясняется с повышенными требованиями по про-
другие сети. И хотя технология ATM следующими причинами. Сети NBMA изводительности, предъявляемыми се-
может использоваться непосредствен- (в том числе Х.25 и frame relay) исполь- тями ATM к маршрутизаторам, многие
но для транспортировки сообщений зуются, как правило, как транзитные ведущие производители разрабатыва-
протоколов прикладного уровня, пока глобальные сети, к которым подклю- ют или уже разработали модели мар-
она чаще переносит пакеты других чается ограниченное число маршрути- шрутизаторов с общей производитель-
протоколов канального и сетевого заторов, а для небольшого числа ностью в несколько десятков милли-
уровней (Ethernet, IP, IPX, frame relay, маршрутизаторов можно задать ARP- онов пакетов в секунду.
X.25), сосуществуя с ними, а не полно- таблицу вручную. Технология ATM от- Все конечные узлы конфигуриру-

№4(5), апрель 2003 69


администрирование
ются традиционным образом – для них единение. Если же он запрашивал протокол Classical IP, решает эту про-
задается их собственный IP-адрес, ATM-адрес маршрутизатора по умол- блему, но такое решение не всегда ус-
маска и IP-адрес маршрутизатора по чанию, то он устанавливает с ним со- траивает предприятия, пользующиеся
умолчанию. Кроме того, задается еще единение, чтобы передать IP-пакет в услугами локальных сетей, так как, во-
один дополнительный параметр – ад- другую сеть. первых, требуется обязательная под-
рес ATM (или номер VPI/VCI для слу- Для передачи IP-пакетов через сеть держка протокола IP во всех узлах ло-
чая использования постоянного вирту- ATM спецификация Classical IP опре- кальных сетей, а во-вторых, требует-
ального канала, то есть PVC) так на- деляет использование протокола уров- ся установка некоторого количества
зываемого сервера ATMARP. Введе- ня адаптации AAL5, при этом специфи- маршрутизаторов, что также не всегда
ние центрального сервера, который кация ничего не говорит ни о парамет- приемлемо. Отчетливо ощущалась
поддерживает общую базу данных для рах трафика и качества обслуживания, необходимость способа согласования
всех узлов сети, – это типичный прием ни о требуемой категории услуг CBR, технологии ATM с технологиями ло-
для работы через нешироковещатель- rtVBR, nrtVBR или UBR. кальных сетей без привлечения сете-
ную сеть. Этот прием используется во вого уровня.
многих протоколах, в частности в про- В ответ на такую потребность ATM
токоле LAN Emulation, рассматривае- ATM + LAN Forum разработал спецификацию, на-
мом далее. Технология ATM разрабатывалась сна- зываемую LAN emulation, LANE (то
Каждый узел использует адрес чала как “вещь в себе”, без учета того есть эмуляция локальных сетей), ко-
ATM сервера ATMARP, чтобы выпол- факта, что в существующие техноло- торая призвана обеспечить совмести-
нить обычный запрос ARP. Этот зап- гии сделаны большие вложения и по- мость традиционных протоколов и
рос имеет формат, очень близкий к этому никто не станет сразу отказы- оборудования локальных сетей с тех-
формату запроса протокола ARP из ваться от установленного и работаю- нологией ATM. Эта спецификация
стека TCP/IP. Длина аппаратного ад- щего оборудования, даже если появ- обеспечивает совместную работу
реса в нем определена в 20 байт, что ляется новое, более совершенное. Это этих технологий на канальном уров-
соответствует длине адреса ATM. В обстоятельство оказалось не столь не. При таком подходе коммутаторы
каждой логической подсети имеется важным для территориальных сетей, ATM работают в качестве высокоско-
свой сервер ATMARP, так как узел которые в случае необходимости мог- ростных коммутаторов магистрали
может обращаться без посредниче- ли предоставить свои оптоволоконные локальной сети, обеспечивая не толь-
ства маршрутизатора только к узлам каналы для построения сетей ATM. ко скорость, но и гибкость соедине-
своей подсети. Обычно роль сервера Учитывая, что стоимость высокоскоро- ний коммутаторов ATM между собой,
ATMARP выполняет маршрутизатор, стных оптоволоконных каналов, проло- поддерживающих произвольную то-
имеющий интерфейсы во всех логи- женных на большие расстояния, час- пологию связей, а не только древо-
ческих подсетях. то превышает стоимость остального видные структуры.
При поступлении первого запроса сетевого оборудования, переход на Спецификация LANE определяет
ARP от конечного узла сервер снача- новую технологию ATM, связанный с способ преобразования кадров и ад-
ла направляет ему встречный инверс- заменой коммутаторов, во многих слу- ресов МАС-уровня традиционных тех-
ный запрос ATMARP, чтобы выяснить чаях оказывался экономически оправ- нологий локальных сетей в ячейки и
IP- и ATM-адреса этого узла. Этим спо- данным. коммутируемые виртуальные соеди-
собом выполняется регистрация каж- Для локальных сетей, в которых нения SVC технологии ATM, а также
дого узла в сервере ATMARP, и сер- замена коммутаторов и сетевых адап- способ обратного преобразования.
вер получает возможность автомати- теров равнозначна созданию новой Всю работу по преобразованию про-
чески строить базу данных соответ- сети, переход на технологию ATM мог токолов выполняют специальные ком-
ствия IP- и ATM-адресов. Затем сер- быть вызван только весьма серьезны- поненты, встраиваемые в обычные
вер пытается выполнить запрос ми причинами. Гораздо привлекатель- коммутаторы локальных сетей, поэто-
ATMARP-узла путем просмотра своей нее полной замены существующей му ни коммутаторы ATM, ни рабочие
базы. Если искомый узел уже зареги- локальной сети новой сетью ATM выг- станции локальных сетей не замеча-
стрировался в ней и он принадлежит лядела возможность “постепенного” ют того, что они работают с чуждыми
той же логической подсети, что и зап- внедрения технологии ATM в суще- им технологиями. Такая прозрачность
рашивающий узел, то сервер отправ- ствующую на предприятии сеть. При была одной из главных целей разра-
ляет в качестве ответа запрашивае- таком подходе фрагменты сети, рабо- ботчиков спецификации LANE.
мый адрес. В противном случае дает- тающие по новой технологии ATM, мог- Так как эта спецификация опреде-
ся негативный ответ (такой тип ответа ли бы мирно сосуществовать с други- ляет только канальный уровень взаи-
в обычном широковещательном вари- ми частями сети, построенными на модействия, то с помощью коммута-
анте протокола ARP не предусматри- основе традиционных технологий, та- торов ATM и компонентов эмуляции
вается). ких как Ethernet или FDDI, улучшая ха- LAN можно образовать только вирту-
Конечный узел, получив ответ ARP, рактеристики сети там, где это нужно, альные сети, называемые здесь эму-
узнает ATM-адрес своего соседа по и оставляя сети рабочих групп или от- лируемыми сетями, а для их соедине-
логической подсети и устанавливает с делов в прежнем виде. Применение ния нужно использовать обычные
ним коммутируемое виртуальное со- маршрутизаторов IP, реализующих маршрутизаторы.

70
администрирование
Использование риториальных коммутаторов ATM – это лее высокоуровневым технологиям,
технологии ATM Internet. Коммутаторы ATM использу- чем технологии собственно глобаль-
Технология ATM расширяет свое при- ются как гибкая среда коммутации ных сетей.
сутствие в локальных и глобальных виртуальных каналов между IP-марш- Техника виртуальных каналов зак-
сетях не очень быстро, но неуклонно. рутизаторами, которые передают свой лючается в разделении операций мар-
Число сетей, выполненных по этой тех- трафик в ячейках ATM. Сети ATM ока- шрутизации и коммутации пакетов.
нологии, ежегодно увеличивается на зались более выгодной средой соеди- Первый пакет таких сетей содержит
20-30 %. нения IP-маршрутизаторов, чем выде- адрес вызываемого абонента и про-
В локальных сетях технология ATM ленные каналы SDH, так как виртуаль- кладывает виртуальный путь в сети,
применяется обычно на магистралях, ный канал ATM может динамически настраивая промежуточные коммута-
где востребованы такие ее качества, перераспределять свою пропускную торы. Остальные пакеты проходят по
как масштабируемая скорость (выпус- способность между пульсирующим виртуальному каналу в режиме комму-
каемые сегодня корпоративные ком- трафиком клиентов IP-сетей. Приме- тации на основании номера виртуаль-
мутаторы ATM поддерживают на сво- ром магистральной сети ATM крупно- ного канала, который является локаль-
их портах скорости 155 и 622 Мбит/с), го поставщика услуг является сеть ным адресом для каждого порта каж-
качество обслуживания (для этого компании UUNET – одного из ведущих дого коммутатора.
нужны приложения, которые умеют поставщиков услуг Internet Северной Техника виртуальных каналов име-
запрашивать нужный класс обслужи- Америки. ет преимущества и недостатки по
вания), петлевидные связи (которые И напоследок хотелось бы сделать сравнению с техникой маршрутизации
позволяют повысить пропускную спо- некоторые выводы, касающиеся рас- каждого пакета, характерной для се-
собность и обеспечить резервирова- сматириваемого нами материала на тей IP или IPX. Преимуществами явля-
ние каналов связи). Петлевидные свя- протяжении цикла “АБСОЛЮТНО ВСЕ ются: ускоренная коммутация пакетов
зи поддерживаются в силу того, что О .....”, итак. по номеру виртуального канала, а так-
ATM – это технология с маршрутиза- Хотя технология ATM разрабатыва- же сокращение адресной части паке-
цией пакетов, запрашивающих уста- лась для одновременной передачи та, а значит, и избыточности заголов-
новление соединений, а значит, табли- данных компьютерных и телефонных ка. К недостаткам следует отнести не-
ца маршрутизации может эти связи сетей, передача голоса по каналам возможность распараллеливания по-
учесть – либо за счет ручного труда CBR для сетей ATM составляет всего тока данных между двумя абонентами
администратора, либо за счет прото- 5 % от общего трафика, а передача ви- по параллельным путям, а также не-
кола маршрутизации PNNI. деоинформации – 10 %. Телефонные эффективность установления вирту-
Основной соперник технологии компании пока предпочитают переда- ального пути для кратковременных
ATM в локальных сетях – технология вать свой трафик непосредственно по потоков данных
Gigabit Ethernet. Она превосходит ATM каналам SDH, не довольствуясь гаран- Сети Х.25 относятся к одной из наи-
в скорости передачи данных – 1000 тиями качества обслуживания ATM. более старых и отработанных техноло-
Мбит/с по сравнению с 622 Мбит/с, а Кроме того, технология ATM пока име- гий глобальных сетей. Трехуровневый
также в затратах на единицу скорос- ет недостаточно стандартов для плав- стек протоколов сетей Х.25 хорошо
ти. Там, где коммутаторы ATM исполь- ного включения в существующие те- работает на ненадежных зашумлен-
зуются только как высокоскоростные лефонные сети, хотя работы в этом на- ных каналах связи, исправляя ошибки
устройства, а возможности поддерж- правлении идут. и управляя потоком данных на каналь-
ки разных типов трафика игнорируют- Что же касается совместимости ном и пакетном уровнях.
ся, технологию ATM, очевидно, заме- ATM с технологиями компьютерных Сети Х.25 поддерживают группо-
нит технология Gigabit Ethernet. Там же, сетей, то разработанные в этой обла- вое подключение к сети простых ал-
где качество обслуживания дей- сти стандарты вполне работоспособ- фавитно-цифровых терминалов за
ствительно важно (видеоконференции, ны и удовлетворяют пользователей и счет включения в сеть специальных
трансляция телевизионных передач и сетевых интеграторов. устройств PAD, каждое из которых
т. п.), технология ATM останется. Для К технологиям глобальных сетей с представляет собой особый вид тер-
объединения настольных компьютеров коммутацией пакетов относятся сети минального сервера.
технология ATM, вероятно, еще долго Х.25, frame relay, SMDS, ATM и TCP/IP. На надежных волоконно-оптичес-
не будет использоваться, так как здесь Все эти сети, кроме сетей TCP/IP, ис- ких каналах технология Х.25 становит-
очень серьезную конкуренцию ей со- пользуют маршрутизацию пакетов, ос- ся избыточной и неэффективной, так
ставляет технология Fast Ethernet. нованную на виртуальных каналах как значительная часть работы ее про-
В глобальных сетях ATM применя- между конечными узлами сети. токолов ведется “вхолостую”.
ется там, где сеть frame relay не справ- Сети TCP/IP занимают особое по- Сети frame relay работают на осно-
ляется с большими объемами трафи- ложение среди технологий глобальных ве весьма упрощенной, по сравнению
ка, и там, где нужно обеспечить низ- сетей, так как они выполняют роль тех- с сетями Х.25, технологией, которая
кий уровень задержек, необходимый нологии объединения сетей любых ти- передает кадры только по протоколу
для передачи информации реального пов, в том числе и сетей всех осталь- канального уровня – протоколу LAP-F.
времени. ных глобальных технологий. Таким Кадры при передаче через коммутатор
Сегодня основной потребитель тер- образом, сети TCP/IP относятся к бо- не подвергаются преобразованиям, из-

№4(5), апрель 2003 71


администрирование
за чего технология и получила свое relay поддерживали только службу по- значения нескольких параметров ка-
название. стоянных виртуальных каналов, а чества обслуживания – максималь-
Важной особенностью технологии служба коммутируемых виртуальных ной битовой скорости PCR, средней
frame relay является концепция резер- каналов стала применяться на практи- битовой скорости SCR, максималь-
вирования пропускной способности ке только недавно. ной пульсации MBS, а также контро-
при прокладке в сети виртуального Технология ATM является дальней- ля временных соотношений между
канала. Сети frame relay создавались шим развитием идей предварительно- передатчиком и приемником, важных
специально для передачи пульсирую- го резервирования пропускной спо- для трафика, чувствительного к за-
щего компьютерного трафика, поэто- собности виртуального канала, реа- держкам.
му при резервировании пропускной лизованных в технологии frame relay. Технология ATM сама не определя-
способности указывается средняя ско- Технология ATM поддерживает ос- ет новые стандарты для физического
рость трафика CIR и согласованный новные типы трафика, существующие уровня, а пользуется существующими.
объем пульсаций Вс. у абонентов разного типа: трафик с Основным стандартом для ATM явля-
Сеть frame relay гарантирует под- постоянной битовой скоростью CBR, ется физический уровень каналов тех-
держку заказанных параметров каче- характерный для телефонных сетей и нологий SONET/SDH и PDH.
ства обслуживания за счет предвари- сетей передачи изображения, трафик Ввиду того что ATM поддержива-
тельного расчета возможностей каж- с переменной битовой скоростью ет все основные существующие типы
дого коммутатора, а также отбрасыва- VBR, характерный для компьютерных трафика, она выбрана в качестве
ния кадров, которые нарушают согла- сетей, а также для передачи компрес- транспортной основы широкополос-
шение о трафике, то есть посылаются сированного голоса и изображения. ных цифровых сетей с интеграцией
в сеть слишком интенсивно. Для каждого типа трафика услуг – сетей B-ISDN, которые долж-
Большинство первых сетей frame пользователь может заказать у сети ны заменить сети ISDN.

72
безопасность

СЕРГЕЙ ЯРЕМЧУК
Операционная система Unix с самого начала задумыва- эффективный и быстрый способ получить доступ к систем-
лась простой по устройству и безопасной по содержа- ным файлам. Так, известно, что большинство демонов (про-
нию. Простота системы заключается в том, что все, что грамм, выполняющих запросы пользователей) имеют ус-
не видит глаз, является файлами, правда разными по тановленный SUID/SGID-бит. Сущность его заключается в
содержанию, но пользователь не видит абсолютно ника- том, чтобы придать процессу, запущенному от имени обыч-
кой разницы между обычным текстовым файлом и фай- ного пользователя, несколько большие права в системе.
лом, представляющим собой жесткий диск. Жизнь в си- В качестве примера рассмотрим утилиту passwd, кото-
стему вдыхают процессы. рая позволяет изменить пользователю свой пароль. Все
Пользователи имеют определенные права доступа, на учетные записи и пароли (в зашифрованном виде) хранят-
основании которых решается вопрос о том, может ли про- ся в файлах /etc/passwd и /etc/shadow. Если предоставить
цесс, имеющий определенные атрибуты (владелец, груп- право каждому пользователю самолично вносить измене-
па), открыть файл для работы с ним. Но такое упрощение ния в эти файлы напрямую, то можете представить, что
имеет и свои видимые недостатки. Так, важные систем- это будет. Естественно, вам никто и не даст такое право.
ные файлы получаются фактически не защищенными. По-
чему? Как правило, в грамотно настроенной системе та- [sergej@grinder sergej]$ ls -l /etc/passwd /etc/shadow
-rw-r--r-- 1 root root 1628 Àâã 13 18:31 /etc/passwd
кие файлы может изменять и удалять только суперполь- -r-------- 1 root root 1081 Àâã 13 18:31 /etc/shadow
зователь. Но хорошо, когда это именно наш системный
администратор, а если нет? Я считаю, что взломать акка- Как видите, все пользователи имеют право только на
унт root в принципе возможно, но есть гораздо более чтение файла /etc/passwd, а записывать информацию

74
безопасность
может только root (а /etc/shadow, как вы видите, закрыли это находится в пакете lids-х.х.х-y.y.y.tar.gz, где х.х.х –
от всех остальных, чтобы пароли нельзя было подобрать). номер версии утилиты lids, а y.y.y – номер версии ядра,
Теперь смотрим на утилиту passwd: для которого предназначен патч. Причем поддерживаются
и так любимые системными администраторами ядра се-
[sergej@grinder sergej]$ ls -l /usr/bin/passwd рии 2.2.х и современные 2.4.х, а также developer ядра се-
-r-s--x--x 1 root root 15104 Ìàð 14 03:44 /usr/bin/passwd
рии 2.5.х. Я использовал lids-1.1.2rc4-2.4.19.tar.gz, поэтому
Буква «s» означает, что установлен флаг SUID, а вла- с ftp://ftp.kernel.org было взято ядро linux-2.4.19.tar.bz2. Те-
дельцем файла является его величество root и теперь, перь распаковываем два скаченных файла.
кто бы ни запустил утилиту на выполнение, на время ра-
боты программы он временно получает права суперполь- # bzip2 -cd linux-2.4.19.tar.bz2 | tar -xvf -
# tar -zxvf lids-1.1.2rc4-2.4.19.tar.gz
зователя, т.е. произвести запись в защищенный систем-
ный файл. Естественно, утилита должна (и делает это) Следующим шагом переходим в распакованный ката-
производить изменение учетной записи только запустив- лог с ядром и устанавливаем патч.
шего ее пользователя. Как вы понимаете, требования
по безопасности к программам, использующим данный # cd linux_install_path/linux
# patch -p1 < /lids_install_path/lids-1.1.2rc4-2.4.19.patch
метод, должны быть повышены. Это, наверное, самая
большая дыра во всех Unix, потому что найдя ошибку в В случае если патч установился без проблем, обяза-
одной из программ, использующих биты SUID/SGID, мож- тельно нужно создать символическую ссылку /usr/src/linux
но производить любые действия, не обладая при этом на новый каталог с исходниками ядра.
правами суперпользователя.
Это свойство использовал нашумевший в 1988 году # rm -rf /usr/src/linux
# ln -s linux_install_patch/linux /usr/src/linux
вирус Морриса. Теперь, получив доступ к такой програм-
ме, ничего не мешает переслать файл /etc/passwd себе Теперь переходим в каталог с исходными текстами,
по электронной почте или убить init, тем самым остано- конфигурируем и компилируем ядро.
вив работу сервера. Но с другой строны, к тому же фай-
лу /etc/passwd при нормальной работе должны обра- # cd /usr/src/linux
# make xconfig (èëè make menuconfig)
щаться всего две программы: login – при входе пользо-
вателя в систему, и уже упоминаемая passwd при сме- В процессе конфигурирования необходимо обязатель-
не пароля. Но уж никак не Sendmail. Отсюда получаем, но установить следующие пункты. В «Code maturity level
что процессы, запущенные от имени суперпользовате- options» выставьте «Prompt for development and/or incomplete
ля, имеют гораздо больше прав, чем им требуется. С code/drivers».
одной стороны, количество SUID/SGID неуклонно умень-
шается, но до нуля их количество вряд ли дойдет. По-
этому необходимо иметь способ вручную отрегулиро-
вать доступ к некоторым важным системным файлам и
каталогам.
Еще было бы совсем неплохо расширить имеющуюся
модель доступа к файлам – владелец, группа-владелец,
остальные и права для каждого – чтение, запись, выпол- В «General setup» – «Sysctl support».
нение. Такая модель, хотя и обладает определенной про-
стотой в реализации, но иногда не обеспечивает гибкос-
ти при организации прав доступа в тех случаях, когда есть
необходимость задать их персонально для каждого (что
отлично реализовано в Windows NT).
Итак, задачи поставлены, теперь хотелось бы иметь
инструмент для их решения. Таким инструментом яв-
ляется LIDS (Linux Intrusion Detection System), который
представляет из себя патч к ядру для осуществления
принудительного контроля доступа в ядре, а также ин-
струмент администрирования (lidsadm). Кроме того,
LIDS встраивает в ядро механизм предупреждений о
каких-либо опасных действиях, а также такую доволь-
но полезную вещь, как детектор сканера портов, даю-
щий сисадмину время на подготовку к отражению ата-
ки. Ведь в большинстве случаев перед проникновени-
ем идет «разведка боем».
Для установки LIDS необходимо скачать с сайта про-
екта http://www.lids.org/install.html или с одного из его ftp- И зайдя в новый пункт «Linux Intrusion Detection System» –
зеркал утилиту администрирования и патч к ядру. Все «Linux Intrusion Detection System support (EXPERIMENTAL)».

№4(5), апрель 2003 75


безопасность
рое возникает, когда знакомишься с используемыми оп-
циями и правилами, что это уже где-то видел. И в прин-
ципе будете правы на все сто. Все опции и действия, ко-
торые можно с их помощью задать, напоминают исполь-
зуемые в программе конфигурирования FIREWALL –
ipchains. Даже принцип действия у них в чем-то совпа-
дает, только ipchains работает с пакетами, пришедшими
по сети, а LIDS – с процессами, запущенными от имени
какого-то пользователя. Для начала необходимо опре-
делиться с некоторыми терминами. Субъектом действия
утилиты может быть любая программа или файл, объек-
том может быть файл каталог или специальное устрой-
ство. Прежде всего устанавливаем пароль для защиты
утилиты, пока работаем с обычным ядром – пароль у нас
После конфигурирования записываем внесенные изме- спрашивать не будут, но как только перегрузимся, все
нения и выходим из программы конфигурации. После этого действия по конфигурированию будут предваряться зап-
идет обычный процесс компиляции и установки нового ядра. росом пароля (хотя есть возможность и отключить за-
щиту). Итак, вводим:
# make dep
# make clean # lidsadm -P
# make bzImage
# make modules
# make modules_install
Теперь у нас запросят пароль дважды и после оконча-
Копируем получившееся новое ядро в каталог /boot: ния работы утилиты в зашифрованном виде его можно
пронаблюдать в файле lids.pw. Для получения краткой
# cp arch/i386/boot/bzImage /boot/lids-kernel справки по используемым командам и устанавливаемым
флагам введите:
И в параметрах загрузчика (Grub или LILO) прописы-
ваем необходимые строки для запуска системы с новым # lidsadm -h.
ядром. Но перегружаться еще рано, теперь необходимо
установить и сконфигурировать утилиту lidsadm. Если Теперь, чтобы добавить новое правило, воспользуем-
этого не сделать, то система попросту не загрузится. Не ся опцией -A (append). Общий синтаксис команды такой:
удаляйте старое ядро: в случае неудачи будет возмож-
ность загрузиться без LIDS для продолжения работы и lidsadm -A [-s subject] -o object [-d] -j
выяснения причин. Итак, переходим в каталог с распа-
кованной LIDS и даем стандартную команду для конфи- Поле ACTION указывает на действие, которое будет
гурирования и установки. выполняться при запросе отмеченного ресурса. Оно мо-
жет принимать несколько значений, но самыми употреб-
# ./configure && make && make install ляемыми будут четыре:
 READ (объект помечен только для чтения);
После установки можно обнаружить каталог /etc/lids/,  APPEND (возможно только добавление информации);
в котором хранятся установки и настройки программы.  WRITE (возможна запись, в том числе и удаление);
Внутри находятся четыре файла:  GRANT (предоставляет возможность субъекту откло-
 lids.conf – в данном файле содержится информация о нять общие правила).
правах доступа (ACL – Access Control Lists) к различ-
ным файлам и каталогам. Теперь введя команду:
 lids.cap – в этом файле прописаны возможности по кон-
фигурированию. Чтобы включить необходимое свойство, # /sbin/lidsadm -A -o /etc/shadow -j DENY
необходимо поставить «+» перед ним, отключить – «-».
 lids.net – в этом файле устанавливаются необходимые мы запретим всем пользователям доступ к данному фай-
значения для посылки предупреждающих сообщений лу. Теперь после перезагрузки с lids-ядром, просмотрев с
с помощью e-mail (IP-адрес, порт, SMTP-сервер, заго- помощью команды:
ловок). Для включения данной возможности необхо-
димо собрать ядро с параметром «Send security alerts # ls /etc/shadow
through network».
 lids.pw – в этом файле сохраняется пароль, предназ- в ответ получим ls: /etc/shadow : No such file or directory.
наченный для изменения параметров lids. Чтобы пользователь мог зарегистрироваться в систе-
ме, откроем доступ только для чтения единственной
Теперь самое время познакомиться с самой утили- программе, которая законно должна работать с данным
той администрирования lidsadm. Первое чувство, кото- файлом.

76
безопасность
# /sbin/lidsadm -A -s /bin/login -o /etc/shadow -j READ и ввести пароль по запросу. Чтобы отказаться от режима
LFS, вводим:
Теперь пользователи получают возможность входить
в систему (с помощью /bin/login), т.е. здесь достаточно # /sbin/lidsadm -S -- +LIDS
прав только для чтения, а другим программам доступ бу-
дет заблокирован. Аналогичным образом можно устано- Плюс ко всему желательно заставить перечитать lids
вить требуемые действия сразу на весь каталог. конфигурационные файлы:

# /sbin/lidsadm -A -o /sbin/ -j READ # /sbin/lidsadm -S -- +RELOAD_CONF

Для различных файлов журналов достаточно устано- Если появилась необходимость отключения от защи-
вить возможность только дозаписи информации в них, в щенного режима глобально для всей системы, то доста-
таком случае злоумышленнику будет довольно трудно точно для этого ввести:
скрыть свое пребывание редактированием соответству-
ющих логов. Например: # /sbin/lidsadm -S -- -LIDS_GLOBAL

# /sbin/lidsadm -A -o /var/log/samba/ -j APPEND и теперь это будет обычная система. Как говорилось, lids
# /sbin/lidsadm -A -o /var/log/secure -j APPEND
может защищать процессы от посягательств извне. Уста-
Просмотреть все установленные правила можно, вос- новив в файле /etc/lids/lids.cap опцию -29:CAP_INIT_KILL,
пользовавшись опцией -L (list): можно защитить все процессы, чьим родительским явля-
ется процесс номер 1 в системе init. А вот так можно уб-
# lidsadm -L рать (спрятать) из списков процессов, выдаваемых с по-
мощью команды ps, сервер Apache.
Статус системы можно просмотреть опцией:
# /sbin/lidsadm -A -s /usr/sbin/httpd -t -o CAP_HIDDEN ↵
# /sbin/lidsadm -V -j INHERIT

В случае если lids «прижился» на компьютере и ста-


После того как все необходимые правила будут занесены, рое ядро за ненадобностью было удалено, есть возмож-
необходимо обновить dev/inode лист с помощью команды: ность при загрузке lids-ядра установить режим загрузки
без защиты. Для этого надо при выборе ядра в LILO или
# /sbin/lidsadm -U Grub дополнительно указать параметр:

Естественно, кроме добавления информации о защи- security=0: grub>lids-kernel security=0


щаемых файлах, есть возможность удалить файл из спис-
ка. Это можно проделать, воспользовавшись опцией -D После этого система будет загружена в обычном не-
(delete) с указанием конкретного файла: защищенном режиме.
При компиляции ядра с опцией «Port Scanner Detector
# /sbin/lidsadm -D /etc/httpd/ in kernel» появится возможность дополнительно отслежи-
вать работу сканеров портов, и в случае обнаружения та-
или с помощью команды lidsadm -Z очистить сразу весь кого сканирования, системный администратор будет опо-
список. И напоследок, после всех установок, необходимо вещен, а в лог-файле появится информация, которая мо-
«запечатать» ядро («seal the kernel») с помощью команды: жет помочь (а может и не помочь, скрыть IP-адрес труда
особого не представляется, но это тема отдельного раз-
/sbin/lidsadm -I говора) в поиске злоумышленника так, что такой возмож-
ностью пренебрегать не стоит. Вот такой он LIDS. Един-
а более грамотным решением будет занести в файл /etc/ ственная сложность в конфигурировании – это опреде-
rc.local соответствующую строку, чтобы не вводить ее литься с каталогами, которые нужно будет защищать, и
при каждом перезапуске системы. После этого ваша си- выбрать режим работы для них. Здесь универсальный
стема будет защищена с помощью lids. А что делать, если совет дать трудно: все зависит от назначения компьюте-
понадобится временно убрать защиту, неужели опять ра и запущенных сервисов. Но не обязательно стараться
придется перезагружаться со старым ядром? Совсем нет. закрыть все файлы, достаточно поначалу обойтись толь-
Необходимо переключиться в режим LIDS free session ко наиболее важными, а затем постепенно наращивать
(LFS). Для его поддержки при конфигурировании ядра защиту. В документации, поставляемой с пакетом LIDS,
необходимо установить параметр «Allow switching LIDS приведены примеры для некотрых наиболее часто исполь-
protections». зуемых сервисов, так что по аналогии можно будет ра-
Чтобы открыть сеанс LFS в текущем терминале (и толь- зобраться. Но одно ясно: используя LIDS, можно суще-
ко в нем), необходимо ввести: ственно поднять уровень защиты компьютера под управ-
лением Linux и значительно усложнить жизнь тем, кто хо-
# /sbin/lidsadm -S -- -LIDS чет покопаться в чужом компьютере.

№4(5), апрель 2003 77


безопасность

СИСТЕМА КРИПТОГРАФИЧЕСКОЙ
ЗАЩИТЫ ИНФОРМАЦИИ

Без использования криптографии сегодня немыслимо решение задач по обеспечению


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

ВЛАДИМИР МЕШКОВ

78
безопасность
Управление ключами
Важнейшую роль в криптографии играет управление
ключами. Это основа для обеспечения конфиденциаль-
ности обмена информацией, идентификации и целост-
ности данных.
Целью управления ключами является нейтрализация
таких угроз, как:
 компрометация конфиденциальности секретных
ключей; Ðèñ.1. Äðàéâåð íå çàãðóæåí.
 компрометация аутентичности секретных или откры-
тых ключей. При этом под аутентичностью понимает- Драйвер после загрузки перехватывает системный вы-
ся знание или возможность проверки идентичности зов sys_gost, и все обращения МВ к функции sys_gost будут
корреспондента, для обеспечения конфиденциальной обслуживаться драйвером. Однако если ключевые данные
связи с которым используется данный ключ; не введены в БКИ, драйвер также не будет выполнять крип-
 несанкционированное использование секретных или топреобразований, возвращая МВ нулевое значение (рис.2).
открытых ключей, например использование ключа,
срок действия которого истек.

Для снижения риска компрометации конфиденциаль-


ности секретных ключей необходимо ограничить круг
лиц, у которых есть доступ к ключевой информации.
Работать с ключами должен специально подготовлен-
ный персонал, имеющий соответствующие полномочия
(допуск).
Исходя из этого требования, разработаем модель си- Ðèñ.2. Äðàéâåð çàãðóæåí. Êëþ÷åâàÿ èíôîðìàöèÿ íå ââåäåíà.
стемы криптографической защиты информации (СКЗИ),
в которой доступ к ключам имеет только администратор Только после того, как МКД осуществит запись клю-
системы. Назначение СКЗИ – криптографическое пре- чевой информации в БКИ, входные данные, передавае-
образование информации в соответствии с алгоритмом мые драйверу, поступают на вход БКП. Ключевая инфор-
ГОСТ 28147-89, режим гаммирования. мация предварительно формируется модулем генерации
Данная система реализована для операционной сис- ключевых данных (рис.3).
темы Linux, версия ядра – 2.4.17, компилятор gcc-2.95.3.

Состав СКЗИ и назначение


структурных элементов
В состав СКЗИ входят следующие элементы:
 модуль генерации ключевых данных;
 драйвер криптографического преобразования (да-
лее драйвер). Непосредственно выполняет операции
криптографического преобразования информации.
Содержит блок криптографического преобразования Ðèñ.3. Äðàéâåð çàãðóæåí. Êëþ÷åâàÿ èíôîðìàöèÿ ââåäåíà.
(БКП) и блок хранения ключевой информации (БКИ);
 модуль записи ключевых данных (МКД). Осуществ- Сразу отметим, что операции загрузки драйвера и запи-
ляет запись ключевых данных в БКИ драйвера; си в него ключевых данных являются привилегированными.
 модуль взаимодействия с драйвером (МВ). Осуще- Выполнить их может только администратор системы, имею-
ствляет информационный обмен с драйвером при щий права root. Таким образом выполняется требование по
выполнении операций криптографического преобра- ограничению доступа персонала к ключевой информации.
зования.

Алгоритм функционирования СКЗИ Реализация СКЗИ


Структурная схема СКЗИ представлена на рис. 1-3.
Информация, подлежащая преобразованию, посту- Системный вызов sys_gost
пает на вход модуля МВ. МВ, получив блок данных, вы- Как было сказано выше, в состав ядра ОС Linux дополни-
зывает системную функцию sys_gost. Данная функция тельно вводится новый системный вызов sys_gost. Меха-
дополнительно вводится в состав ядра ОС Linux. Блок низм системных вызовов был рассмотрен в статье «Пе-
входных данных является параметром вызова sys_gost. рехват системных вызовов в ОС Linux» [1].
Если драйвер не загружен, функция sys_gost никаких Добавим запись о системном вызове sys_gost() в таб-
преобразований не выполняет и возвращает вызываю- лицу системных вызовов sys_call_table (файл /usr/src/linux/
щему модулю нулевое значение (рис.1). arch/i386/kernel/entry.S):

№4(5), апрель 2003 79


безопасность
ENTRY(sys_call_table) Здесь E_START и E_STOP – флаги, информирующие
.
. о начале/завершении операции криптографического
. преобразования. Макрос _syscall3 сообщает компиля-
.long SYMBOL_NAME(sys_gost)
/* 226. Íîâûé ñèñòåìíûé âûçîâ! */ тору, что он должен сделать, встретив в исходном тек-
сте программы обращение к системному вызову
Наш системный вызов имеет порядковый номер 226. sys_gost. Этот макрос определен в файле /usr/src/linux/
Добавим его в заголовочный файл /usr/src/linux/include/ include/asm-i386/unistd.h:
asm-i386/unistd.h, в котором содержится перечень всех
системных вызовов ядра и макросы для работы с ними: #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
type name(type1 arg1,type2 arg2,type3 arg3) \
{ \
#define __NR_gost 226 /* Íîâûé ñèñòåìíûé âûçîâ! */ long __res; \
__asm__ volatile ("int $0x80" \
: "=a" (__res) \
В файл /usr/include/bits/syscall.h добавим запись: : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
"d" ((long)(arg3))); \
__syscall_return(type,__res); \
#define SYS_gost __NR_gost }

Теперь осталось написать код, реализующий систем- Таким образом, системный вызов sys_gost будет вы-
ный вызов sys_gost(). Вот как он выглядит: полняться стандартным для всех системных вызовов спо-
собом: аргументы вызова загружаются в регистры про-
asmlinkage int sys_gost(char * block, size_t count, int flag) цессора, а затем вызывается программное прерывание
{
return 0; int $0x80. Конструкция __NR_##name трансформирует-
} ся в порядковый номер системного вызова name, и этот
номер загружается в регистр EAX.
Этот код мы добавим в файл /usr/src/linux/fs/open.c. После внесения всех изменений ядро необходимо пе-
Как мы видим, системный вызов sys_gost принимает рекомпилировать.
три параметра: указатель на буфер с данными char *buf,
размер буфера off_t count и флаг int flag. Третий пара- Драйвер
метр flag служит для информирования о начале/заверше- Задача драйвера – перехватить системный вызов sys_gost,
нии выполнения операции криптопреобразования. принять ключи и начать выполнение операций криптогра-
Для того чтобы процесс (модуль МВ) мог обратить- фического преобразования блоков данных, поступающих
ся к данному системному вызову, в каталоге /usr/include/ от МВ. Драйвер является символьным (байт-ориентирован-
создадим заголовочный файл gost.h следующего содер- ным) устройством. Создадим для него файл устройства
жания: следующей командой:

#include <sys/types.h> mknod /dev/gost c 69 0


#include <linux/unistd.h>
#define E_START 1
#define E_STOP 0
Заголовочные файлы и переменные
static inline _syscall3(int,gost,char *,buf,off_t,count,int,flag) Для работы нам понадобятся следующие header-файлы:

Алгоритм шифрования ГОСТ 28147-89 ческой защиты данных в компьютерных системах был
Алгоритм ГОСТ 28147-89 был разработан в СССР и явля- опубликован в 1990 году и в настоящее время широко
ется стандартом шифрования Российской Федерации, используется в программном обеспечении. В отличие от
описывает принципы криптографического преобразова- его собрата, алгоритма DES, принятого в качестве феде-
ния данных для передачи в компьютерных сетях, отдель- рального стандарта США, ГОСТ 28147-89 позволяет дос-
ных компьютерных комплексах или компьютерах, их шиф- тигать большего уровня секретности данных в силу от-
рования и создания цифровых подписей. сутсвия ограничений на уровень секретности защищае-
Алгоритм ГОСТ 28147-89 криптографического преоб- мой информации.
разования предназначен как для аппаратной реализации, Данный алгоритм, подобно DES, работает с блоками
так и для программых реализаций, он удовлетворяет не- размером по 64 бита, но на этом их сходство заканчива-
обходимым общемировым стандартам криптостойкости ется и следуют различия:
и не определяет ограничений на уровень секретности за-  ГОСТ 28147-89 содержит 32 цикла преобразования, в
щищаемой информации. отличие от 16 циклов DES.
Этот стандарт является обязательным для организа-  Каждый цикл в ГОСТ 28147-89 состоит из более про-
ций и компаний РФ, которые используют шифровальную стых операций, чем в DES, что сказывается на скоро-
защиту для данных, загружаемых или передаваемых че- сти работы.
рез компьютерные сети, отдельные компьютерные комп-  В отличие от длины ключа в DES (56 бит), стандарт
лексы. ГОСТ 28147-89 описывает длину ключа 256 бит.
Стандарт алгоритма ГОСТ 28147-89 для криптографи-  ГОСТ 28147-89 работает на порядок быстрее DES.

80
безопасность
#include <linux/module.h> int init_module(void)
#include <linux/kernel.h> {
#include <linux/types.h>
#include <linux/slab.h> Регистрируем устройство в системе:
#include <linux/fs.h>
#include <sys/syscall.h>
#include <asm/uaccess.h> if (register_chrdev(GOST_MAJOR,"gost",&gost_fops)) return -EIO;
#include "gost_var.h"
#define GOST_MAJOR 69 – ñòàðøèé íîìåð óñòðîéñòâà
Сохраняем указатель на оригинальный системный вызов:
Переменные:
orig_gost = sys_call_table[SYS_gost];
int key_enable = 0; – ôëàã íàëè÷èÿ êëþ÷åâîé èíôîðìàöèè â ÁÊÈ
int key_init = 0; – ôëàã èíèöèàëèçàöèè êëþ÷åâîé èíôîðìàöèè
Производим замену системных вызовов и выходим из
struct key_info { функции:
char key_d[64];
__u32 X[8];
char sp[8]; sys_call_table[SYS_gost] = own_gost;
} keys; return 0;
}
В соответствии с рис. 2 и 3, структура struct key_info
keys является БКИ. В ней будет храниться ключевая ин- Структура gost_fops содержит функции, выполняемые
формация. Назначение полей структуры struct key_info: драйвером, имеет следующее содержание:
 char key_d[64] – буфер для хранения долговременного
ключа; struct file_operations gost_fops = {
write: write_gost,
 __u32 X[8] – буфер для хранения сеансового ключа; open: open_gost,
 char sp[8] – буфер для хранения синхропосылки. };
release: close_gost,

В файле gost_var.h определены переменные, необхо- Итак, для драйвера определены функции открытия,
димые для реализации алгоритма ГОСТ 28147-89. Файл записи и закрытия.
имеет следующее содержание:
Функция открытия устройства
#include <limits.h> Функция имеет следующий вид:
const __u32 C1=0x01010104;
const __u32 C2=0x01010101; static int open_gost(struct inode *inode, struct file *file)
{
__u32 SM1,
SM2, Если устройство уже открыто, сообщить об этом:
N3,
N4;
if (MOD_IN_USE) return -EBUSY;
union {
struct {
__u32 N1; Проверяем значение младшего номера устройства
__u32 N2;
} lg; (должно быть равно 0) и режим открытия устройства (чте-
char N[8]; ние/запись):
} nac;

Значение констант C1 и C2 определено ГОСТ 28147-89. if (MINOR(inode->i_rdev) != 0) return -ENODEV;


if ((file->f_mode & 1) != 1) return -EBUSY;
Переменные SM1 и SM2, в соответствии с терминологией
ГОСТ 28147-89, назовем сумматорами, а N1, N2, N3, N4 – Обнуляем структуру для хранения ключевой информации:
накопителями.
Экспортируем таблицу системных вызовов ядра: memset(&keys,0,sizeof(struct key_info));

extern void *sys_call_table[]; Сбрасываем флаг наличия ключевой информации в БКИ:

Вводим дополнительно указатель для сохранения ори- key_enable = 0;


гинального системного вызова:
Устанавливаем счетчик использования модуля и выходим
int (*orig_gost)(char *block, size_t count, int flag); из функции:

MOD_INC_USE_COUNT;
return 0;
Инициализация драйвера }
Инициализацию драйвера выполняет функция init_module.
Во время инициализации перехватываем системный вы-
зов sys_gost. Алгоритм перехвата системных вызовов был Функция записи в устройство
рассмотрен в статье «Перехват системных вызовов в ОС В процессе записи драйверу передается структура типа
Linux» [1]. struct key_info, содержащая ключевую информацию.

№4(5), апрель 2003 81


безопасность
static ssize_t write_gost(struct file *file, ↵ Проверяем значение флагов flag и key_enable. Если оба
const char *buf, size_t count, loff_t *ppos)
{ этих флага установлены, приступаем к выполнению опе-
рации криптографического преобразования блока данных:
Второй аргумент функции содержит блок данных, пе-
редаваемых драйверу для обработки. Третий аргумент – if ((flag && key_enable)) {
размер этого блока. Проверяем размер блока:
Все дальнейшие операции выполняются в соответствии
if (count!=sizeof(struct key_info)) return -EINVAL; с алгоритмом ГОСТ 28147-89, режим гаммирования.
Если ключи не инициализированы, выполним их ини-
Считываем передаваемый блок данных в адресное циализацию:
пространство драйвера (в БКИ):
if (key_init == 0) init_key();
copy_from_user((char *)&keys,buf,count);
Суммируем значение накопителя N4 и константы C1
Поднимаем флаг наличия ключевой информации в по модулю (232-1):
БКИ и выходим из функции:
__asm__ __volatile__(
key_enable = 1; " addl %3,%%eax \n\t"
return count; " jnc 1f \n\t"
" incl %%eax \n\t"
} "1: cmpl %2,%%eax\n\t"
" jnz 2f \n\t"
" xorl %%eax,%%eax \n\t"
"2:"
Функция закрытия устройства :"=a"(N4)
Данная функция только уменьшает счетчик использова- :"0"(N4),"b"(ULONG_MAX),"d"(C1));
ния драйвера:
Суммируем значение накопителя N3 и константы C2
static int close_gost(struct inode *inode, struct file *file) по модулю 232:
{
MOD_DEC_USE_COUNT;
return 0; N3 += C2;
}

Приравниваем значения накопителей:


Функция выгрузки драйвера
Выгружает драйвер команда rmmod. При этом вызывает- nac.lg.N1 = N3;
nac.lg.N2 = N4;
ся функция cleanup_module:
Шифруем содержимое накопителей N1 и N2 в режиме
void cleanup_module() простой замены алгоритма ГОСТ 28147-89:
{

Восстанавливаем указатель на оригинальный системный symple_replace_crypt();


вызов в таблице:
Выполняем операцию криптографического преобразова-
sys_call_table[SYS_gost]=orig_gost; ния блока данных и возвращаем МВ размер блока данных:

Обнуляем структуру, содержащую ключевую информацию: for(i=0;i<=7;i++) block[i]^=nac.N[i];


return count;
}
memset(&keys,0,sizeof(struct key_info));
Если ключи не введены (флаг key_enable сброшен), или
Снимаем регистрацию устройства: установлен флаг завершения операции криптопреобразо-
вания (flag == E_STOP), сбрасываем флаг инициализации
unregister_chrdev(GOST_MAJOR,"gost"); ключей и возвращаем нулевое значение модулю МВ:
return;
}
key_init = 0;
return (0);
}
Функция own_gost
Функция own_gost, которая заменяет оригинальный сис-
темный вызов sys_gost, непосредственно выполняет опе- Функция init_key
рации криптографического преобразования блоков дан- Функция init_key() выполняет инициализацию ключей (в
ных, переданных драйверу модулем взаимодействия МВ. соответствии с алгоритмом ГОСТ 28147-89):

int own_gost(char *block, size_t count, int flag) void init_key()


{
int i; {

82
безопасность
Поместим в накопители N1 и N2 значение синхропосылки: Функция block
В функции block объединены блок подстановки (главный
memset(&nac,0,sizeof(nac)); структурный элемент алгоритма) и регистр сдвига. В це-
memcpy(nac.N,keys.sp,8);
лях повышения скорости работы данная функция реали-
Шифруем содержимое накопителей N1 и N2 в режиме зована на языке assembler.
простой замены алгоритма ГОСТ 28147-89:
__u32 block(__u32 SM1, char *k, __u32 N2)
symple_replace_crypt(); {
__u32 SM2;
Приравниваем значение накопителей: __asm__ __volatile__ (
" cld \n\t"
N3=nac.lg.N1; " pushl %%edx \n\t"
N4=nac.lg.N2; " xorl %%ecx,%%ecx \n\t"
" xorl %%edx,%%edx \n\t"
" movw $4,%%cx \n\t"
Поднимаем флаг инициализации ключей и возвраща- "1: pushl %%esi \n\t"
емся из функции: " pushw %%cx \n\t"
" pushl %%eax \n\t"
" pushl %%edx \n\t"
key_init = 1; " xorl %%edi,%%edi \n\t"
return; " xorw %%cx,%%cx \n\t"
} " movl %%esi,%%edi \n\t"
" addl $8,%%edi \n\t"
" xorl %%ebx,%%ebx \n\t"
" xorw %%dx,%%dx \n\t"
Функция symple_replace_crypt "
"
pushw %%ax \n\t"
shlb $4,%%al \n\t"
Операцию шифрования в режиме простой замены ГОСТ " shrb $4,%%al \n\t"
28147-89 выполняет функция symple_replace_crypt(). Фун- " movb %%al,%%dl \n\t"
" popw %%ax \n\t"
кция имеет следующий вид: " shrb $4,%%al \n\t"
" movb %%al,%%dh \n\t"
void symple_replace_crypt() " xorl %%eax,%%eax \n\t"
{ " movb %%dl,%%bl \n\t"
" btw $0,%%bx \n\t"
int i,n; " jnc 2f \n\t"
" decb %%bl \n\t"
" shrb $1,%%bl \n\t"
" movw (%%esi,%%ebx),%%ax \n\t"
В соответствии с алгоритмом ГОСТ 28147-89 выпол- " shrb $4,%%al \n\t"
няем 31 цикл преобразования: " jmp 3f \n\t"
"2: shrb $1,%%bl \n\t"
" movw (%%esi,%%ebx),%%ax \n\t"
for(n=1;n<=3;n++) { " shlb $4,%%al \n\t"
for(i=0;i<=7;i++) op(i); " shrb $4,%%al \n\t"
} "3: movb %%al,%%cl \n\t"
for(i=7;i>=1;i--) op(i); " xorl %%ebx,%%ebx \n\t"
" movb %%dh,%%bl \n\t"
" btw $0,%%bx \n\t"
32-й цикл несколько отличается от остальных, распи- " jnc 4f \n\t"
" decb %%bl \n\t"
шем его отдельно: " shrb $1,%%bl \n\t"
" movw (%%edi,%%ebx),%%ax \n\t"
SM1=nac.lg.N1+X[0]; " shrb $4,%%al \n\t"
SM2=block(SM1,keys.key_d,nac.lg.N2); " shlb $4,%%al \n\t"
" jmp 5f \n\t"
nac.lg.N2=SM2; "4: shrb $1,%%bl \n\t"
return; " movw (%%edi,%%ebx),%%ax \n\t"
" shlb $4,%%al \n\t"
} "5: orb %%cl,%%al \n\t"
" popl %%edx \n\t"
В функции op() реализованы циклы преобразования: " movb %%al,%%dl \n\t"
" popl %%eax \n\t"
" popw %%cx \n\t"
void op(int i) " rorl $8,%%edx \n\t"
{ " shrl $8,%%eax \n\t"
" xorl %%esi,%%esi \n\t"
Суммируем значение накопителя N1 и 4-х байтового " popl %%esi \n\t"
" addl $16,%%esi \n\t"
вектора X[i] в сумматоре SM1: " decw %%cx \n\t"
" jz 6f \n\t"
SM1 = nac.lg.N1+X[i]; " jmp 1b \n\t"
"6: movl %%edx,%%eax \n\t"
" roll $11,%%eax \n\t"
" popl %%edx \n\t"
Получаем результат из блока подстановки: " xorl %%edx,%%eax \n\t"
:"=a" (SM2)
SM2 = block(SM1,keys.key_d,nac.lg.N2); :"0"(SM1),"S"(k),"d"(N2)
nac.lg.N2 = nac.lg.N1; :"ebx","ecx","edi");
nac.lg.N1 = SM2; return SM2;
}
return;
} Здесь приведена «лобовая» реализация блока под-

№4(5), апрель 2003 83


безопасность
становки и регистра сдвига. На оптимальность, конеч- mount -t ext2 /dev/fd0 /floppy
но, не претендует, но работает правильно и достаточно
быстро. Теперь рассмотрим код генератора ключей. Заголо-
Весь вышеприведенный код драйвера разместим в вочные файлы:
файле sys_call_gost.c. Функции расположим в следующем
порядке (параметры функций и тип возвращаемого ре- #include <stdio.h>
#include <fcntl.h>
зультата не указаны):
Точка монтирования файловой системы ключевого но-
block; сителя:
op;
symple_replace_crypt;
init_key; #define MOUNT_DIR "/floppy"
own_gost;
write_gost; int main()
open_gost; {
close_gost;
init_module; int s,d,sp,rnd;
cleanup_module. char buf[64];

Для получения случайной последовательности (а точ-


Makefile нее, псевдослучайной) воспользуемся файлом /dev/
Для получения загружаемого модуля ядра (драйвера) со- urandom:
здадим Makefile следующего содержания:
rnd=open("/dev/urandom",O_RDONLY);
CC = gcc
module = sys_call_gost.o
CFLAGS = -O2 -Wall Формируем ключевые данные. Создаем на ключевом
LINUX = /usr/src/linux носителе файлы ключей и синхропосылки:
MODFLAGS = -D__KERNEL__ -DMODULE -I$(LINUX)/include
sys_call_gost.o: sys_call_gost.c d=open(MOUNT_DIR"/key_d",O_CREAT|O_WRONLY,0600);
$(CC) $(CFLAGS) $(MODFLAGS) -c sys_call_gost.c s=open(MOUNT_DIR"/key_s",O_CREAT|O_WRONLY,0600);
sp=open(MOUNT_DIR"/sp",O_CREAT|O_WRONLY,0600);

Записываем в созданные файлы случайную последо-


Модуль генерации ключевых данных вательность, считанную из /dev/urandom:
Задача модуля генерации – формирование ключевых дан-
ных (долговременного ключа, сеансового ключа и синх- bzero(buf,64);
read(rnd,buf,64);
ропосылки) и запись их на носитель. Размер ключей и if(write(d,buf,64)!=64) {
синхропосылки фиксирован. Длина сеансового ключа со- perror("key_d");
exit(-1);
ставляет 32 байта, долговременного – 64 байта, длина }
синхропосылки – 8 байт. close(d);
bzero(buf,64);
В качестве носителя ключевых данных выберем дис- read(rnd,buf,32);
кету. На этой дискете (далее ключевая дискета) будут if(write(s,buf,32)!=32) {
perror("key_s");
размещаться три файла: exit(-1);
 файл долговременного ключа key_d длиной 64 байта; }
close(s);
 файл сеансового ключа key_s длиной 32 байта;
 файл синхропосылки sp длиной 8 байт. bzero(buf,64);
read(rnd,buf,8);
if(write(sp,buf,8)!=8) {
Доступ к ключевой дискете должен иметь только ад- perror("sp");
exit(-1);
министратор системы. Для предотвращения компромета- }
ции ключевой информации администратору необходимо close(sp);
обеспечить соответствующие условия ее хранения. close(rnd);
Подготовим ключевую дискету к работе:
return (0);
fdformat /dev/fd0u1440 }
mkfs -V -t ext2 /dev/fd0

Перед записью ключевых данных в БКИ драйвера не- Генератор очень простой и приведен только в качестве
обходимо смонтировать ключевую дискету. Создадим точ- примера. Необходимо отметить, что случайная последо-
ку монтирования: вательность, из которой формируются ключевые данные,
предварительно должна быть подвергнута статистичес-
mkdir /floppy кому анализу для доказательства того, что в ней отсут-
ствуют закономерности, которые могут позволить третьей
и смонтируем туда файловую систему, находящуюся на стороне (противнику) восстановить секретный ключ. Ста-
ключевой дискете: тистический анализ представляет из себя целый комплекс

84
безопасность
специальных тестов (около 14), которые случайная пос- exit(-1);
}
ледовательность должна пройти, прежде чем ее призна-
ют годной к применению. Для получения действительно s=open(MOUNT_DIR"/key_s",O_RDONLY);
if(s < 0) {
случайной последовательности применяются специально perror("key_s");
спроектированные аппаратные генераторы, построенные exit(-1);
}
на базе полупроводниковых приборов с высоким коэф-
фициентом шума. Но так как мы рассматриваем модель Считываем информацию из файлов ключей и синхро-
СКЗИ, то жестких требований к качеству ключевой ин- посылки в структуру struct key_info:
формации предъявлять не будем. Для нашей задачи впол-
не подойдет и псевдослучайная последовательность. if(read(d,keys.key_d,64)!=64){
perror("key_d");
После завершения операции формирования ключевых exit(-1);
данных вводим команду: }

if(read(s,(char *)&keys.X,32)!=32){
umount /dev/fd0 perror("key_s");
exit(-1);
}
Теперь ключевой носитель готов к применению.
if(read(sp,keys.sp,8)!=8){
perror("sp");
Модуль записи ключевых данных exit(-1);
}
Задача модуля записи ключевых данных (МКД) – запи-
сать ключи, находящиеся на ключевой дискете, в БКИ Записываем ключевую информацию в БКИ:
драйвера. Рассмотрим программный код МКИ.
Заголовочные файлы: write(gost,(char *)&keys,sizeof(struct key_info));

#include <stdio.h> Информируем о завершении процедуры записи ключей:


#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h> printf("\nKeys loaded\n\n");
#include <errno.h>

Точка монтирования файловой системы, находящей- Закрываем файлы и выходим:


ся на дискете:
close(gost);
#define MOUNT_DIR "/floppy" close(d);
close(s);
close(sp);
int main()
{
return (1);
}
Дескрипторы ключевых файлов, синхропосылки и фай-
ла устройства: Вышеприведенный код сохраним в файле write_key.c.
Получим исполняемый модуль, введя команду:
int s,d,sp,gost;
gcc -o write_key write_key.c
Структура для хранения ключевой информации:

struct key_info {
char key_d[64];
Модуль взаимодействия с драйвером
u_long X[8]; Задача модуля взаимодействия с драйвером (МВ) – осу-
char sp[8]; ществлять информационный обмен с драйвером при вы-
} keys;
полнении операций криптографического преобразования.
memset(&keys,0,sizeof(struct key_info)); Программный код модуля МВ:

Открываем все необходимые файлы: #include <stdio.h>


#include <fcntl.h>
#include <gost.h>
gost=open("/dev/gost",O_RDWR);
if(gost < 0) { int main (int argc, char **argv)
perror("gost"); {
exit(-1); int in,n;
} char buff[8];
sp=open(MOUNT_DIR"/sp",O_RDONLY); Параметром МВ является имя файла, содержание ко-
if(sp < 0) {
perror("sp"); торого подлежит криптографическому преобразованию.
exit(-1);
} if(argc!=2) {
d=open(MOUNT_DIR"/key_d",O_RDONLY); printf("\n\tUsage: gost [input file]\n\n");
if(d < 0) { exit(0);
}
perror("key_d");

№4(5), апрель 2003 85


безопасность
Открываем входной файл: Порядок работы с СКЗИ
Для подготовки СКЗИ к работе администратор системы
in=open(argv[1],O_RDWR); должен выполнить следующие действия:
if(in < 0) {
perror("input");  загрузить драйвер командой
exit(-1);
} insmod sys_call_gost.o
memset(buff,0,8);
 подготовить дискету и сформировать ключевые данные;
Считываем из входного файла блоки данных длиной 8 байт:  записать ключи в БКИ:
 смонтировать файловую систему ключевой диске-
while((n=read(in,buff,8)) > 0) { ты командой mount -t ext2 /dev/fd0 /floppy;
 запустить на выполнение модуль МКД (файл
Вызываем системную функцию sys_gost для выполне- write_key). В случае успешного завершения МКД вы-
ния операции криптопреобразования блока данных: даст сообщение Keys loaded;
 после записи ключевых данных в БКИ ввести команду
gost(buff,n,E_START); umount /dev/fd0;
 изъять из дисковода ключевой носитель и поместить
Результат преобразования записываем в тот же файл: его в специально выделенное хранилище.

lseek(in,-n,SEEK_CUR); После того как администратор подготовит СКЗИ к рабо-


write(in,buff,n);
} те, пользователь (оператор) может приступить к выполне-
нию операций криптографического преобразования инфор-
Информируем драйвер о завершении операции крип- мации. Для этого ему достаточно запустить на выполнение
тографического преобразования: модуль МВ (исполняемый файл gost), указав в командной
строке имя преобразуемого файла. Результат преобразо-
gost(0,0,E_STOP); вания будет записан в тот же файл. Ключи расположены в
адресном пространстве ядра ОС, и модуль МВ, работающий
Закрываем входной файл и выходим из программы: в режиме приложения пользователя (третье кольцо защи-
ты), прямого доступа к ключевой информации не имеет.
close(in); Таким образом, рассмотренная модель СКЗИ позволяет
return 0;
} обеспечить достаточно высокий уровень защиты личных дан-
ных пользователя и ключевых данных от компрометации.
Вышеприведенный код сохраним в файле gost.c. Ис- Литература:
полняемый модуль получим, введя команду: 1. Мешков В. «Перехват системных вызовов в ОС Linux». –
журнал «Системный администратор». – 2003г, №3(4).
gcc -o gost gost.c с.40-44.

86
ИНТЕРНЕТ-ОПЕРАЦИОННЫЕ
СИСТЕМЫ
web
В настоящее время интернет-сайты Движки сайтов
далеко не всегда и не везде проекти- Мы часто можем слышать о движках
руются профессиально, к тому же с сайтов. Обычно под этим понимается
учетом дальнейшего развития. В дан- комплекс программ (скриптов и шаб-
ной статье мы попытаемся предска- лонов), которые обеспечивают необ-
зать, как же будет развиваться про- ходимый уровень содержания сайта,
ектирование сайтов, какой ценой это и чаще всего удаленного содержания.
обходится сейчас и будет обходиться Так все и привыкли понимать их. Су-
в будущем. Для понимания картины ществует достаточно и хороших движ-
будет замечательно, если читатель ков и очень уж специфичных, многие
имеет опыт интернет-программирова- начинающие программисты пишут
ния и создания сайтов. собственные движки сайтов, основы-
ваясь на чьих-то исходниках. Таких
Что такое вещей очень много, но и при этом до-
«Интернет-операционная стать что-то универсальное – практи-
система»? чески невозможно. Каждый из них
Интернет-операционная система (ИОС, имеет собственное направление, спе-
либо более понятное название WebOS) цифику, ограничения.
– программный продукт, предоставля- Что касается коммерческих движ-
ющий некий сервис для программ бо- ков, то тут стоит заметить, что ком-
лее высокого уровня, которые, в свою мерческие движки – есть коммерчес-
очередь, основываются на этом сер- кие, они либо заставляют нас нару-
висе. ИОС принципиально ставит пе- шать закон, либо отказываться от них,
ред собой задачу – облегчить труд либо покупать. Поэтому движки – сей-
программиста, а значит, сэкономить, час настоящая проблема для средних
структуризировать, разбить задачи программистов. Теперь посмотрим на
создателя сайта на более мелкие и движки с другой стороны. Основной
иметь более четкое и безопасное ре- задачей для них является управление
шение для своего интернет-проекта. контентом, реализация хорошего ин-
Возможно, вы привыкли к обычному терфейса клиента и администратора.
пониманию фразы – операционная Остальное отходит на задний план.
система. В голове сразу начинают Именно к этому стремились некото-
появляться слова Windows, DOS, рое время назад. Технические реше-
Linux... На самом деле операционная ния представляют собой достаточно
система – это всего лишь программа, сложные программы, где, на мой
предоставляющая интерфейс для ра- взгляд, достаточно мусора, но не это
боты остальных программ, суть это- главное, главное нам понять, что та-
го интерфейса в стандартизации, кое движок.
едином синтаксисе написания про-
грамм, единых стандартов и т. п. А Сравнение ИОС и движков
так как мы рассматриваем ИОС или Давайте попробуем сравнить ИОС и
WebOS, то, соответственно, ограни- движки. В чем разница? Так как на
чиваем себя следующими задачами: свете нет бесплатных ИОС, то пони-
предоставить некий интерфейс для мание разницы должно заставить вас
работы с интернет-сайтами (в случае понять и то, насколько необходима
WebOS) или с некоторым комплексом ИОС вообще. Принципиальная разни-
процессов интернет-сервисов (в слу- ца в назначении этих двух вещей и
чае ИОС). В чем разница? Разница уровне программирования/реализа-
лишь в том, что ИОС должна решать ции. Давайте вспомним, что же такое
значительно больше задач. Мы хоть ИОС и что такое движок и для начала
и рассматриваем именно ИОС, но определим сходства. Они имеют при-
нас интересует ограниченное на- мерно одинаковый уровень програм-
правление. Позже мы коснемся темы мирования, но только примерно, они
микро-ИОС. Вам пока лишь стоит по- оба начинают работать по запросу
нять, что мы будем рассматривать клиента. Можно даже запутаться. Тут
сайты, имеющие широкий спектр тоже может возникнуть подозрение,
возможностей, а позже касаясь мик- что в принципе некоторые задачи мо-
ро-ИОС, коснемся ограниченных воз- гут быть одинаковыми. Дело в том,
ИГОРЬ ТЕТЕРИН можностей. что в идеале обработка запроса сай-

№4(5), апрель 2003 89


web
том происходит по следующей упро- му скрипту движка, который вызыва- ходимых модулей, а остальные связи
щенной цепочке: ет функции чтения и указывает, что должны общаться через единую сис-
1. сервер (Apache) читать (шаблон5, 20 последних ново- тему взаимодействия. Эта система
2. Perl стей). В общем итоге получается обязательна для всех модулей. Я бы
3. ОС HTML, который отправляется якобы в назвал ее системой событий. Именно
4. движок stdout. Ядро собирает заголовки, от- события придают гибкость и возмож-
3. ОС правляет, что получилось у движка, и ность взаимодействия самых разных
2. Perl в случае наличия ошибок, могут быть уровней решения задач.
1. сервер (Apache) отправлены данные и об этом. При на- Кратко опишем, как должна ра-
личии серьезных ошибок вызывает- ботать система событий. События –
Тут мы схематично можем пред- ся некое событие. это отдельный модуль с единствен-
ставить, где находится ИОС. Други- В общем, вот простой пример, как ной открытой функцией: создать со-
ми словами, движок строится на веб- происходит совместная работа, и в бытие. При его создании передают-
операционной системе, которая по- чем разница между отсутствием и ся параметры, характеризующие
строена на Perl, Си, Python или, на присутствием ИОС. его. По параметрам проверяется
худой конец, на PHP. Как и любой база событий, при совпадении пара-
программе, движку предоставляется Функциональное метров (при совпадении идентифи-
выбор: либо использовать функции наполнение ИОС катора события) выполняется код,
ОС, либо писать, используя только Из рассмотренной схемы мы уже на- принадлежащий данному событию.
язык программирования. А ИОС пре- чинаем представлять, что собственно Независимо от всего событие может
доставляет этот выбор. Создает не- должна делать ИОС. Давайте слегка быть залогировано. В такой систе-
которую выгоду использования себя. пройдемся по функциям: ме событий (все тут описано очень
 Перехват, обработка ввода/выво- примитивно) весьма удобно изме-
Схема построения сайтов да, возможность управления этими нять движок и ОС. При такой схеме
при помощи ИОС и движков процессами из движка (кеширова- движку предоставляется интерфейс
Давайте рассмотрим детальнее, как ние как один из видов обработки). событий, поэтому могут писаться
будет выглядеть обычная обработка  Обработка ошибок, предупрежде- любые события, основанные даже
запроса. Клиент вводит URL в брау- ний, исключений, максимум про- на функциях движка.
зере. Запрос посылается на указан- зрачности для движка.
ный IP, где управление получает сер-  Функции СУБД. При отсутствии Вопрос о способе вызова
вер, для примера пусть это будет SQL должна быть альтернатива, скриптов и взаимосвязь
Apache, который ищет страницу по предоставляющая способ работы с ИОС
умолчанию index.html (для примера). с данными, избегая при этом ра- На мой взгляд, на свете существует
В странице оказываются SSI-ссылки боты с файловой системой. две модели вызова скриптов, и они
на выполнение скрипта, пусть это бу-  Некоторые функции безопасности. обе имеют достаточно оснований
дут новости. Apache запускает интер- Фильтры, конверторы. быть первыми.
претатор (я все привожу в очень про-  Независимая от платформы база Эти две модели можно наблюдать
стой форме) и передает параметр пользователей и удобный, гибкий в Perl и PHP. Perl не предоставляет
(имя скрипта и возможные парамет- интерфейс к ней. функций включения кода в HTML, хотя
ры для скрипта). Следующим шагом  Универсальная система логиро- это и несложно реализовать. PHP
интерпретатор запускает скрипт и пе- вания. принципиально позволяет делать это.
редает ему параметры.  Система работы, создания и обра- Какой способ лучше? На мой
Далее мы рассмотрим 2 варианта: ботки событий и другие не менее взгляд, возможность встраивания
с ИОС и без нее. значимые функции. кода в HTML лишняя, хотя и удобная.
Без ИОС. Скрипт читает файл с В чем недостатки такого метода?
новостями, файл с шаблоном, пара- Зависимости 1.Лишние проблемы с безопасностью.
метрами, возможно, эти операции Давайте взглянем на примитивную 2.Размазывание границы между вер-
разделяются (а, возможно, работа схему ИОС: ИОС представляет собой сткой и программированием.
происходит через SQL), в общем ито- несколько модулей. Будем исходить Почему я поднял вообще этот воп-
ге составляется код HTML, который из того, что ОС написана на Perl. У рос? Потому что это важно для ИОС.
передается в stdout. ИОС не должно быть как такового Важно это в том плане, что ИОС дол-
C ИОС управление получает ядра. Программист движка будет сам жна гарантировать безопасность со
скрипт ОС, который подгружает необ- выбирать, что ему нужно. Отсюда своей стороны, и предоставлять ба-
ходимую минимальную базу модулей, каждая часть ИОС должна быть мак- зовый интерфейс для работы с кон-
проделывает базовые операции: фор- симально независимой. Это действи- тентом, а без продуманной системы
матирует входящие параметры, уста- тельно должно быть так, но связей и могут возникнуть какие-либо ограни-
навливает обработчик ошибок, уста- зависимостей не избежать. Обяза- чения. Ограничения – очень нехоро-
навливается кешеризатор вывода. тельные зависимости должны быть шая штука. Я все же не даю конкрет-
Затем управление передается нужно- решены жестко, подключением необ- ных решений, а всего лишь рекомен-

90
web
дую строить свою систему на базе ги и некрупные проекты, хотя это от- Заслуга в том, что модуль logs про-
подключения внешних скриптов. носится лишь к некоторым частям ОС. сто коллекционирует все события,
Итак, что представляет из себя ret? создавая некий стандарт описания
Перспективы ИОС Несколько компактных модулей, отве- событий.
В ближайшем будущем все же долж- чающих за конкретные задачи: Система прав построена доста-
ны появиться аналоги WebOS. Все же  cru.pm – модуль, отвечающий за точно интересно. Существуют шаб-
наложение еще одного уровня несет преобразование данных (фильтры, лоны и собственно сами пользовате-
в себе какие-то затраты на изучение хеши, подсветки и др.); ли, весь интерес в том, как наклады-
документации, прикручивание этого  data.pm – собственная микро- ваются шаблоны на права пользова-
уровня и затачивания движка под ОС. СУБД; телей, и какие преимущества это
Успех будет, но не скоро. Не каждый  err.pm – модуль, перехватываю- дает.
сможет решиться на данный шаг. Ну щий и обрабатывающий ошибки, Вообще весь ret построен так,
а как правильнее развиваться анало- предупреждения и др.; что нет ничего обязательного, нет
гам ИОС покажет их бесплатность и  logs.pm – система ведения логов никаких ограничений (по крайней
открытость. Коммерческие ОСи в лю- и обработка событий; мере, к этому стремились). Но есть
бом случае будут ограничивать ис-  rights.pm – система ведения прав база для создания тех же ограниче-
пользование законами. (интересно то, что в данной систе- ний, есть атрибуты, которые можно
ме нет стандартных пользовате- было бы назвать типами, но атрибу-
Некоторые принципы ИОС лей типа root, которым дозволено ты – это нечто большее. Даже син-
По ходу были указаны некоторые все); таксис описания событий не имеет
принципы ИОС, давайте еще раз  wim.pm – модуль, обрабатываю- под собой никаких ограничений, со-
взглянем на них: щий входящие данные, в том чис- бытие может быть описано как угод-
 бесплатный продукт; ле и приходящие файлы. но. Существуют лишь рекомендации
 открытый код; и принципы.
 платформонезависимость; Каждый модуль самостоятелен, С точки зрения ret событие опи-
 компактность; кроме модуля rights.pm, который за- сывается следующим образом:
 отсутствие ограничений; висит от СУБД. Программист волен a:b:c, где a – виновник события, b –
 принцип выбора, а не навязывания. подключать только то, что ему будет тип события, c – детализация; но
по душе. Чем интересен данный про- правильно описанным событием бу-
Микро-WebOS ект? Во-первых, основным принци- дет считаться и событие, описанное,
Вот, наконец, мы и дошли до темы пом: код ret не должен превышать 50 например, так: jhskdjhkajsdh. Конеч-
"микро". Микро-WebOS обозначает Кб. СУБД ret предоставляет простые но, смысла в этих символах нет, но
минимум кода. Наложение дополни- функции (например GetRec, Put), но если событие с таким именем опи-
тельного уровня – достаточно ресур- внутренняя сложность структуры сано, то оно произойдет. Поэтому
соемкий ход. Для минимизации зат- данных зависит только от фантазии хотелось бы подчеркнуть, что ret
рат, ресурсов и времени работы не- программиста. предоставляет некую базу, на осно-
обходима микро-WebOS. Это значит, Очень интересная вещь – собы- ве которой можно строить логику
что вся функциональность ОС долж- тия. Изначальных событий в код не движка.
на быть реализована по минимуму. встроено. Но создана база для того, К минусам ret можно отнести то,
Насчет минимизации и оптимизации чтобы можно было очень просто до- что данный проект не закончен и
кода есть пара прекрасных вещей, о бавлять собственные события. Для многое еще предстоит сделать, он
которых я расскажу в следующей примера у вас есть свой скрипт, чи- рассчитан на бесплатные хостинги,
статье. тающий новости. Его вы вызываете где нет поддержки SQL, поэтому
из скрипта, который показывает но- SQL нигде не фигурирует и поддер-
ret WebOS проект вости. Последний получает новости жки для него писать не предвидит-
ret WebOS – это микро-операционная в отформатированном виде посред- ся, потому как это и не надо, Perl
система для WEB, основанная на ством события обработки текста но- предоставляет все, что необходимо,
Perl. Бесплатный, открытый проект, востей из первого, который явно вы- на достаточно неплохом уровне. В
сочетающий в себе некоторые прин- зывает это событие, определенное в ret нет той мультиплатформенности,
ципы ИОС. logs.pm. которую хотелось бы получить, но
ret рассчитан на бесплатные хостин- В чем заслуга такой системы? это лишь вопрос времени.

№4(5), апрель 2003 91


web

ВЫБОР ВЕБ-СЕРВЕРА:

ПОЧЕМУ APACHE?
ДМИТРИЙ ГАЛЫШЕВ
92
web
За последние несколько лет в России, как и во всем мире, может быть установлен на OC Novell NetWare, практичес-
Интернет все глубже проникает в нашу повседневную ки на все ОС семейства UNIX и даже на MS Windows, по-
жизнь. Фактически история Интернета в России насчиты- этому даже если у вас уже есть сервер под управлением
вает чуть более 10 лет, с тех пор, когда ряд университе- Windows 2000, не торопитесь устанавливать туда IIS – это
тов и научно-исследовательских институтов начали созда- небезопасно. Полный список поддерживаемых ОС вы най-
ние локальных сетей и обзавелись зарубежными канала- дете на сайте Apache [4].
ми связи, и заканчивая текущим моментом, когда по дан- Следующий критерий – производительность. Причем
ным РОЦИТ [1] в России насчитывается более пяти мил- тем критичнее, чем больше одновременных подключений.
лионов пользователей этой сети. До недавнего времени Apache, собираемый из исходного
Основа Интернета известна всем – это сервера. Имен- кода, оптимизированного под UNIX, ощутимо уступал IIS,
но на них размещены домашние страницы рядовых пользо- интегрированному в ОС. С выходом Apache 2.0 ситуация
вателей, состоящие из нескольких страничек, тематичес- изменилась. Вместо портирования UNIX-кода разработ-
кие ресурсы, состоящие из сотен страниц, часто генериру- чики написали полноценное Windows-приложение, кото-
емых динамически и в большинстве своем поддерживае- рое и рекомендуют для коммерческого использования.
мые группой людей, а также коммерческие проекты и впол- Электронный журнал eWEEK [5] сравнивал производитель-
не настоящие, несмотря на свою виртуальность, магази- ность Apache 2.0 и MS IIS, выполняемых под управлением
ны. Большинству рядовых пользователей свой сервер со- MS Windows 2000 Advanced Server. По результатам тестов
вершенно не нужен. Посудите сами: даже если не выклю- оба сервера показали практически одинаковую производи-
чать домашний компьютер круглосуточно, установив сер- тельность. Итак, Apache – высокопроизводительный сервер.
верное ПО, то для доступа к нему также необходимо круг- Еще один важный критерий – доступность. Разработчи-
лосуточное соединение с провайдером. Соединение по те- ки Microsoft утверждают, что они сделали огромный шаг впе-
лефонной линии слишком медленное, чтобы обслуживать ред – избавились от необходимости перезагрузки ОС при
хотя бы десять клиентов одновременно. А выделенная ли- любом изменении настроек сервера. Теперь настройки мож-
ния стоит дорого. Намного проще разместить свою стра- но менять «на лету». Но решены ли все проблемы, приводя-
ничку на сервере провайдера. Другое дело – корпоратив- щие к остановке всего сервера, обычно сопровождающие-
ные пользователи. Как правило у них уже есть выделен- ся так называемым «синим экраном смерти» – неизвестно.
ная линия, соединяющая с Интернетом локальную сеть, и И каждая перезагрузка сервера, чем бы она не была вызва-
выделенный компьютер, выполняющий роль шлюза меж- на, означает отказ в обслуживании клиентам на время пе-
ду локальной и глобальной сетями. На нем-то и можно ус- резагрузки. К сожалению, нет независимой статистики по
тановить веб-сервер. Или для того, чтобы отдать дань моде, доступности серверов под управлением той или иной ОС.
или развернуть крупный проект, приносящий прибыль. Поэтому можно лишь вспомнить, что архитектура UNIX из-
Данная статья предназначена в первую очередь для тех, начально ориентирована на бесперебойную работу.
кому предстоит непосредственно администрировать веб- Безопасность. Свободу Интернета, как оказалось, мож-
сайт и отвечать за его работу. Надеюсь, что администра- но использовать и в хулиганских целях. Для выхода в Ин-
торам с небольшим опытом в этой области она поможет тернет не нужно ни специального разрешения, ни даже
определиться в нелегком выборе серверного ПО, а также паспорта. В тысячах интернет-кафе и компьютерных клу-
аргументированно отстоять свою точку зрения при приня- бов достаточно оплатить время, и весь простор доступен
тии решения на уровне руководства организации, нередко вам. Это замечательно, но не все приходят в Интернет с
слепо принимающего на веру маркетинговые заявления. добрыми намерениями. И есть люди, которые для того,
Итак, вам нужен свой собственный веб-сайт. Какому чтобы похулиганить, выделиться или даже найти работу,
ПО доверить управление им? По данным сервера Netcraft выводят из строя интернет-сервера. Результатом действий
[2] на ноябрь 2002 года около 90% всех веб-серверов в злоумышленника могут стать как deface [6], так и порча
мире работают под управлением двух типов ПО: Apache данных, которая может принести ощутимые убытки, на-
от Apache Software Foundation и Internet Information Server пример изменение кода интернет-магазина может приве-
корпорации Microsoft [3]. Из них около 60% под управле- сти к различным последствиям: от удаления базы данных
нием Apache (более 20 000 000) и 30% под управлением до торговли в убыток хозяину сайта. Веб-сервер должен
MS IIS (более 10 000 000). Вспоминается старая поговор- быть надежно защищен от несанкционированного изме-
ка: «2 000 000 леммингов не могут ошибаться». Хотя вряд нения документов, с которыми он работает. К сожалению,
ли это можно считать критерием выбора. пока еще нет абсолютно безопасного веб-сервера. И в
Первый критерий выбора – аппаратное обеспечение Apache, и в IIS злоумышленники находят новые уязвимо-
сервера. Существует два основных решения – выделенный сти и используют их для порчи данных.
сервер и размещение на уже существующем сервере, на- Здесь стоит немного отвлечься от веб-серверов и
строив маршрутизацию трафика на брандмауэре. IIS может вспомнить предмет неутихающих споров и в последнее
быть установлен только на ОС MS Windows 2000 Server. Если время даже судебных процессов. Что же все-таки лучше –
у вас уже есть сервер под управлением другой операци- бесплатное ПО с открытым исходным кодом или коммер-
онной системы, то вам придется использовать выделен- ческое? Что безопаснее? Скептики утверждают: «Зло-
ный сервер и покупать для него OC, даже если загрузка умышленнику ничего не стоит найти уязвимость в бес-
его будет составлять менее 10%, а Apache наверняка платном ПО, ведь он может читать исходный код. Когда
может быть установлен на ваш «старый» сервер. Apache кода нет, сложно даже узнать, как оно работает.» На са-

№4(5), апрель 2003 93


web
мом деле, к счастью, хороших людей больше, чем пло- ва готов к работе, тогда как IIS придется настраивать за-
хих. И большинство людей предпочитает, найдя уязви- ново, либо искать и экспортировать ключи реестра, в ко-
мость, сообщить о ней разработчикам, нередко присы- торых хранятся его настройки, что является непростой
лая исправленный код, решающий проблему. Поэтому за задачей даже для опытного администратора NT, особен-
годы развития найти уязвимости становится сложнее. но если учесть, что документация по реестру Windows вме-
Второе заблуждение: «Открытые проекты поддержива- сте с самой OC не распространяется.
ются неофициально. Купив ПО, я могу потребовать от раз- Таким образом, можно с уверенностью утверждать, что
работчика решения проблемы». Не все так печально. Уст- IIS является решением для пользователей Windows, кото-
ранить описанную уязвимость в программе с открытым ис- рые хотят с минимальными затратами времени установить
ходным кодом может любой программист. А заплаток от собственный веб-сервер и не заботятся о его дальнейшей
производителя коммерческого ПО можно ждать месяца- поддержке. С необходимостью поддержки проекта на базе
ми, и никто кроме него вам не поможет. Примеры при же- IIS затраты на оплату администратора и трафика за посто-
лании вы можете найти в списке рассылки Bugtraq [7]. янное получение патчей от производителя могут ощутимо
Возвращаясь к веб-серверам, отметим, что самыми возрасти. В то же время безопасность и доступность тако-
разрушительными были эпидемии червей Code Red, Code го решения спорна. Решение же на базе Apache, с одной
Red II и Nimda, от которых пострадали в основном сервера стороны, требует с самого начала работы серьезной тео-
под управлением IIS, а также то, что атаки все еще продол- ретической подготовки администратора, но с другой сто-
жаются уже зараженными серверами, и не всегда безус- роны, возможность работы на большом количестве опера-
пешно. Более того, успешная атака на сервер под управ- ционных систем и архитектур открывает широкий выбор
лением IIS может обернуться не только порчей данных, с для размещения, и в сочетании с возможностью работы в
которыми он работает, но и порчей данных, с которыми собственном окружении показывает высокую стабильность
работают другие программы, и даже ОС сервера. Именно и безопасность использования, а также легкую переноси-
поэтому веб-сервер под управлением IIS не должен распо- мость, вне зависимости от сложности сайта.
лагаться на компьютере, который выполняет любую дру- 1. http://www.rocit.ru/
гую критическую работу. Такова цена за интеграцию с ОС. 2. http://www.netcraft.com/
Apache, независимый от ОС, на UNIX-системах может вы- 3. Все торговые марки принадлежат их владельцам.
полняться даже в собственном окружении, или, как гово- 4. http://httpd.apache.org/
рят, «в песочнице». Максимум успеха атаки на такой сер- 5. http://www.eweek.com/
вер – порча данных, размещенных на нем. Кроме того, каж- 6. deface – переводится с англ. как «портить». Здесь
дый дополнительный компонент, устанавливаемый вмес- означает подмену заглавной страницы сайта.
те с веб-сервером является дополнительной угрозой безо- 7. http://www.securityfocus.com/
пасности. По умолчанию вместе с IIS устанавливается не-
сколько библиотек и расширения редактора html FrontPage
(видимо, разработчики считают, что содержание сервера
должно создаваться на сервере). Стандартная поставка
Apache включает в себя только сам сервер. Все модули-
дополнения поставляются отдельно. Система управления
веб-сервером также тесно связана с безопасностью. «Лег-
кий и удобный в настройке» IIS управляется с помощью
приложений, использующих графический интерфейс, а в
последней версии и с помощью веб-приложений, устанав-
ливаемых вместе с сервером, и позволяет настроить не
все параметры, влияющие на работу сервера. Так как на-
стройки «по умолчанию» ориентированы не на максималь-
ную безопасность, а на максимальное быстродействие и
количество предоставляемых сервисов, в то время как доб-
раться до них можно только с помощью редактора реестра
Windows, установленный IIS с минимальной настройкой вы-
зывает у опытных администраторов шок. Более того, мно-
гие администраторы Windows отключают все возможнос-
ти управления сервером на основе веб-интерфейса, как
потенциальную угрозу безопасности. Настройки Apache
хранятся в нескольких текстовых файлах конфигурации.
Для администраторов, слабо представляющих, как ра-
ботает веб-сервер, редактирование этих файлов может
быть неразрешимой проблемой, несмотря на то, что они
хорошо задокументированы. В то же время при перено-
се, обновлении или переустановке веб-сервера достаточ-
но скопировать эти файлы на новое место, и сервер сно-

94
подписка

Открыта подписка на
2-е полугодие 2003 года
81655

Единый
подписной
индекс:

81655
по каталогу 81655
агентства
«Роспечать»

Рады видеть
Вас нашими
читателями!

№4(5), апрель 2003 95


СИСТЕМНЫЙ АДМИНИСТРАТОР
№ 4(5), Апрель, 2003 год

РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
НОМЕРЕ:
Наталья Хвостова
sekretar@samag.ru
PHP к ядру, увеличивающие его защищен-
Технический редактор Я думаю, не будет большим секретом, ность и возможность более гибко и
Владимир Лукин что с помощью простого HTML-кода строго работать с правами доступа для
можно создать лишь статистическую конкретных пользователей. Чтобы
РЕКЛАМНАЯ СЛУЖБА страничку. Но этого в современном обеспечить дополнительную гибкость
тел.:(095)928-8253 (доб. 112) быстроменяющемся мире уже не до- при добавлении новых возможностей
факс:(095)928-8253 статочно, необходимо быстро реаги- с помощью различных add-on был раз-
Константин Меделян ровать на изменения и выдавать эту работан модуль защиты Linux Security
reklama@samag.ru информацию пользователю. Ко все- Module (LSM), который обеспечивает
му есть еще необходимость cобрать модульное добавление расширений
Верстка и оформление информацию, например с помощью защиты к стандартному ядру Linux.
imposer@samag.ru тех же анкет, автоматически ее обра-
maker_up@samag.ru ботать и выдать пользователю. С по- Конфигурирование DHCP
мощью HTML, увы, такие задачи ре- Для чего нужен протокол DHCP? DHCP
103012, г. Москва, шить невозможно. Какие только тех- (Dynamic Host Configuration Protocol) –
Ветошный переулок, дом 13/15 нологии не применяются сейчас для это протокол настройки узла, который
тел.: (095) 928-8253 (доб. 112) придания интерактивности веб-стра- автоматически назначает IP-адреса
факс: (095) 928-8253 нице – DHTML, ASP, Perl, Java, компьютерам. Протокол DHCP – это
Е-mail: info@samag.ru ColdFusion. Есть в этом немаленьком дальнейшее развитие протокола
Internet: www.samag.ru списке и PHP. Не рассчитывал созда- BOOTP. Последний разрешает бездис-
тель данного языка Расмус Лердорф ковым клиентам запускать и автомати-
РУКОВОДИТЕЛЬ ПРОЕКТА (Rasmus Lerdorf), что его язык приоб- чески конфигурировать протокол TCP/
Петр Положевец ретет такую большую популярность. IP. Протокол DHCP централизованно
Задумывался он первоначально ис- назначает IP-адреса в вашей сети и ав-
УЧРЕДИТЕЛИ ключительно для использования в томатически конфигурирует рабочие
Владимир Положевец своих личных целях. О чем свидетель- станции. Возможно, вы подумали, что
Александр Михалев ствует даже расшифровка аббревиа- в одной сети должен быть только один
туры PHP – Personal Home Page (пер- сервер DHCP, потому что в противном
ИЗДАТЕЛЬ сональная домашняя страница). случае между серверами возникнет
ЗАО «Издательский дом конфликт, а пострадавшим опять ока-
«Учительская газета» SELinux жется клиент, который зависнет при
Дистрибутивов Linux существует ве- загрузке. А вот и не так – в одной сети
Отпечатано типографией ликое множество: есть среди них может быть несколько серверов DHCP.
ООО «Мастер Печати» предназначенные для конечного И это не только не отразится на произ-
Тираж 5000 экз. пользователя, есть совсем маленькие водительности сети, но даже повысит
узкоспециализированные, предназна- надежность сети, если, например, один
Журнал зарегистрирован ченные для решения конкретных за- из серверов выйдет из строя.
в Министерстве РФ по делам печати, дач, как правило, однодискетные, и
телерадиовещания и средств мас- нашлось место довольно приличной Процессы в WinNT
совых коммуникаций (свидетельство группе, обозначенной как Security Как вы, наверное, знаете, Windows NT
ПИ № 77-12542 от 24 апреля 2002г.) enchanced. – это многозадачная ОС, а это зна-
Основной задачей проекта было чит, что вы можете создавать про-
За содержание статьи ответственность достичь такого уровня защищенности граммным путём другие процессы и
несет автор. За содержание рекламно- системы, чтобы ее можно было спо- нити внутри процесса. Для создания
го обьявления ответственность несет койно использовать в военных и пра- процесса могут использоваться две
рекламодатель. Все права на опубли- вительственных организациях. Но по основные функции: WinExec и
кованные материалы защищены. Ре- большому счету это не совсем дист- CreateProcess. Первая из них очень
дакция оставляет за собой право изме- рибутив, каким привыкли его видеть проста в применении, имеет только
нять содержание следующих номеров. администраторы. SELinux представля- два параметра и может использовать-
ет собой дополнительные расширения ся для создания оконных процессов.

96

Вам также может понравиться