.\" Copyright (c) 2001-2004 Andrey Simonenko .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)$Id: ipa.conf.5,v 1.2.2.4 2007/07/20 09:53:40 simon Exp $ .\" .TH IPA.CONF 5 "16 апреля 2005 г." .SH НАИМЕНОВАНИЕ ipa.conf -\- конфигурационный файл для ipa(8) .SH ОПИСАНИЕ Файл \fBipa.conf\fP это конфигурационный файл для ipa(8). Этот файл или любой-другой файл, указанный в опции \fB-f\fP в командной строке ipa(8), обрабатывается когда ipa(8) начинает работать или получает сигнал SIGHUP. .SH ФОРМАТ ФАЙЛА Файл \fBipa.conf\fP может быть достаточно простым и довольно сложным. Главная идея заключается в том, чтобы разместить как можно больше установок в одном конфигурационном файле(ах), вместо того чтобы использовать внешние программы для решения задач связанных с обработкой статистики. .PP Эта страница документации содержит полное описание формата конфигурационного файла и полную документацию о всех возможностях ipa(8). .PP Почти после каждого параграфа приведен пример. Так как IPA пакет не содержит каких-либо модулей, то в примерах используются модули ipa_ipfw, ipa_ip6fw, ipa_atest и ipa_db_sdb, только лишь потому, что это были первые модули учёта и базы данных, разработанные для IPA. .PP \fBОбщий синтаксис.\fP .PP Любая логическая строка в конфигурационном файле может быть записана в несколько текстовых строках для улучшения читаемости конфигурации. Нет никакого правила в какой строке размещать зарезервированные слова, аргументы или специальные символы. Если формат позволяет использовать один пробел символ (пробел или символ табуляции), то можно использовать столько пробелов, сколько необходимо для улучшения форматирования конфигурационного файла. Все элементы в конфигурационном файле регистрозависимые. Конфигурационный файл состоит из секций, параметров и комментариев. .PP \fBКомментарии.\fP .PP Существуют shell\-подобные и C\-подобные комментарии. Если вы используете C\-подобный комментарий в shell\-подобном комментарии, то C\-подобный комментарий игнорируется. .PP \fIПример:\fP .PP .nf # Shell-подобный комментарий. /* C-подобный комментарий. */ /* * Другой C-подобный комментарий. */ .fi .PP \fBСекции и параметры.\fP .PP Секция состоит из имени секции, опциональных аргументов и тела секции. Тело секции должно быть заключено в фигурные скобки: .PP .nf секция [[=] аргумент] { /* Параметры и секции. */ } .fi .PP Параметр состоит из имени и опциональных аргументов. Каждый параметр должен заканчиваться символом `;' в конце списка своих аргументов: .PP .nf параметр [[=] аргумент]; .fi .PP Символ `=' после имени секции и параметра опционален. Некоторые параметры похоже на переменные (для таких параметров естественно использовать символ `='), другие похожи на инструкции. В любом случае, в можете выбрать синтаксис, который вам наиболее подходит. .PP Аргумент может содержать строки: .PP .nf "строка" .fi .PP Возможно использовать последовательности ``\\t'', ``\\n'', ``\\\\'' и ``\\"'', чтобы представить символ табуляции, символ новой строки, обратный слэш и двойную кавычку внутри строки. Если необходимо разделить строку на несколько линий (строк в файле), то используйте символ `\\' в конце текущей линии (не добавляйте лишних пробелов после обратного слэша). Если строка записана в несколько линий без символов `\\', то каждый символ новой строки добавляется в строку. .PP \fBМакропеременные.\fP .PP Возможно определить макропеременные и использовать их почти где угодно в конфигурационном файле: .PP .nf ${переменная} = "строка"; .fi .PP Имя любой макропеременной может состоять из букв, цифр и знака доллара. Что является буквой определяется функцией isalpha(3), которая использует локаль. .PP Значением любой макропеременной должно быть строка, когда макропеременная расширяется, то первый и последний символы двойной кавычки убираются. .PP Макропеременные могут быть локальными или глобальными. Макропеременная является глобальной, если она определена вне какой-либо секции, иначе макропеременная является локальной для всех вложенных секций и для всех внешних секции. Локальные макропеременные скрывают глобальные макропеременные. .PP Есть несколько предопределённых макропеременных: .PP ${$}\ \ \ \ \ \-\ расширяется в символ `$'; .br ${rule}\ \ \-\ расширяется в имя текущей секции \fBrule\fP; .br ${limit}\ \-\ расширяется в имя текущей секции \fBlimit\fP; .br ${sublimit}\ \-\ расширяется в имя текущей секции \fBsublimit\fP; .br ${threshold}\ \-\ расширяется в имя текущей секции \fBthreshold\fP; .br ${autorule}\ \-\ расширяется в имя текущей секции \fBautorule\fP. .PP Любая макропеременная (включая предопределённые), за исключением ${$}, по необходимости может быть переопределена. Не рекомендуется переопределять или уничтожать макропеременные в модулях. .PP Макропеременная ${$} не может быть использована для конструирования имён макропеременных (см. пример). .PP Макропеременные расширяются в момент их использования, а не в момент их определения. Макропеременные также расширяются в строках. Расширение макропеременных это свойство внутреннего парсера конфигурационного файла, поэтому макропеременная ${rule} не может быть использовано в автоправилах и шаблонах правил (см. информацию о подстановках в командных строках). .PP \fIПример:\fP .PP .nf ${a} = "${b}"; # Определение ${a}. ${b} = "1"; # Определение ${b}. param = ${a}; # Расширяется в 1. ${b} = "2"; # Переопределение ${b}. param = ${a}; # Расширяется в 2. param = "${$}{b}"; # Расширяется в ${b} (последовательность # символов внутри строки). section { ${a} = "1"; # Определение локальной ${a}, которая # скрывает глобальную ${a}. ${c} = "4"; # Определение локальной ${c}. param = ${a}; # Расширяется в 1. subsection { ${a} = "2";# Переопределение локальной ${a}. ${b} = "3";# Переопределение глобальной ${b}. } param = ${a}; # Расширяется в 2. param = ${b}; # Расширяется в 3. } # param = ${c}; <-- Ошибка: ${c} не определена как глобальная. .fi .PP \fBВключение файлов.\fP .PP Возможно хранить конфигурацию в нескольких файлах. Файлы могут быть включены при помощи следующих параметров: .PP .nf include "/путь/файл"; include_files "/директория/шаблон"; .fi .PP Параметр \fBinclude\fP включает один файл. Параметр \fBinclude_files\fP включает несколько файлов из указанной директории, имена которых совпадают с указанным шаблоном. .PP Эти параметры могут быть использованы где угодно, за исключением секций модулей. Возможно включать файлы из включённых файлов и т.д. Каждый включённый файл должен содержать корректно определённые параметры с аргументами, комментарии и секции с аргументами, но он может содержать незакрытые секции. .PP Возможно использовать регулярные выражения POSIX (расширенный формат) в качестве шаблонов в параметрах \fBinclude_files\fP, для этого установите параметр \fBposix_re_pattern\fP в ``yes'' перед параметрами, которые включают файлы с регулярными выражениями POSIX в качестве шаблонов, по умолчанию значение этого параметра равно ``no'': .PP .nf posix_re_pattern = ; .fi .PP Этот параметр не должен располагаться в какой-либо секции. .PP Включаемые файлы должны иметь того владельца, кто запустил ipa(8) и не должны иметь прав на запись для группы и остальных пользователей. Если файлы включаются с помощью параметра \fBinclude_files\fP, то и директория указанная в этом параметре тоже должна иметь те же свойства. .PP \fIПример:\fP .PP .nf posix_re_pattern = yes; include "/usr/local/etc/ipa.local.conf"; include_files "/usr/local/etc/ipa/LAN/."; .fi .PP Первый параметр включает один файл, второй параметр включает каждый файл в данной директории, регулярное выражение POSIX ``.'' означает любой символ. .PP .nf /* posix_re_pattern = no; */ include_files "/usr/local/etc/ipa/LAN/*"; .fi .PP Здесь используется шаблон shell. Первую строку необходимо раскомментировать, если перед этим использовались регулярные выражения POSIX. .PP \fBИспользование модулей учёта.\fP .PP Существуют специальные модули учёта, которые используются для сбора статистики. ipa(8) использует эти внешние модули учёта с помощью специального \fIipa_ac_mod\fP API, описанного в странице документации ipa_mod(3). .PP Параметр \fBac_mod\fP сообщает ipa(8), что необходимо загрузить заданный IPA модуль учёта: .PP .nf ac_mod "имя_файла"; .fi .PP Этот параметр не должен располагаться в какой-либо секции. Возможно использовать несколько модулей учёта одновременно. .PP \fIПример:\fP .PP .nf ac_mod "ipa_ipfw.so"; ac_mod "ipa_ip6fw.so"; .fi .PP Эти параметры загружают два модуля учёта. .PP \fBИспользование модулей баз данных.\fP .PP Существуют специальные модули баз данных, которые используются для того, чтобы сохранить статистику в базах данных. ipa(8) использует эти внешние модули баз данных с помощью специального \fIipa_db_mod\fP API, описанного в странице документации ipa_mod(3). .PP Параметр \fBdb_mod\fP сообщает ipa(8), что необходимо загрузить заданный IPA модуль базы данных: .PP .nf db_mod "имя_файла"; .fi .PP Этот параметр не должен располагаться в какой-либо секции. Возможно использовать несколько модулей баз данных одновременно. .PP \fIПример:\fP .PP .nf db_mod "ipa_db_sdb.so"; .fi .PP Этот параметр загружает один модуль базы данных. .PP \fBКонфигурирование модулей.\fP .PP Документация для IPA модуля должна давать всю информацию как конфигурировать модуль, но обычно конфигурация IPA модуля интегрируется в конфигурационный файл ipa.conf(5). .PP Каждый модуль имеет конфигурационный префикс, который используется для того, чтобы отличать секции и параметры модуля. Если параметр записан в форме: .PP .nf префикс:параметр [[=] аргумент]; .fi .PP то ipa(8) попытается найти загруженный модуль с конфигурационным префиксом ``префикс'', затем передаст этот параметр для разбора найденному модулю. .PP Секции также могут иметь префиксы: .PP .nf префикс:секция [[=] аргумент] { /* Параметры и секции модуля. */ } .fi .PP В этом случае параметры и секции внутри такой секции должны быть записаны без префикса и они будут переданы соответствующему модулю для обработки. .PP Документация для модуля должна описывать сам модуль, конфигурационный префикс модуля, имя базы данных или системы учёта и все секции и параметры модуля. .PP \fIПример:\fP .PP .nf sdb: { allow_symlinks = yes; } ipfw:debug_ipfw = 1; .fi .PP Приведенное имя секции может показаться несколько странным, но здесь всё правильно. Модуль может иметь нулевые имена секций и параметров. .PP \fBПравила учёта статистики.\fP .PP ipa(8) выполняет учёт статистика основываясь на правилах. Существуют два типа правил: статические и динамические. Статическое правило определяется в секции \fBrule\fP. Динамическое правило не имеет описания в конфигурационном файле, но любое динамическое правило генерируется на лету из некоторого автоправила, определённого в секции \fBautorule\fP. .PP Несколько правил (статических, динамических) могут разделять одни и те же установки. Существует несколько путей это сделать. Первый путь это использование секции \fBglobal\fP. Второй путь это использование секций \fBrulepat\fP (шаблоны правил). И третий путь это определение общих установок для динамических правил в секциях \fBautorule\fP. .PP Если какое-то правило (статическое, динамическое) не содержит установок для какой-то секции или параметра (динамические правила также наследуют установки от своих автоправил), то наследуются установки из подходящей секции \fBrulepat\fP, далее наследуются установки из секции \fBglobal\fP, если некоторые секции или параметра всё ещё не определены, то используются установки по умолчанию. Запустите ipa(8) с ключами \fB-tt\fP, чтобы увидеть реальные значения всех параметров. .PP Следующие параметры могут быть использованы в секциях \fBglobal\fP, \fBrulepat\fP, \fBrule\fP и \fBautorule\fP: \fBac_list\fP, \fBdb_list\fP, \fBappend_time\fP, \fBupdate_time\fP, \fBworktime\fP, \fBctl_rule_acl\fP, \fBdebug_exec\fP, \fBdebug_limit\fP, \fBdebug_limit_init\fP, \fBdebug_threshold\fP, \fBdebug_threshold_init\fP. .PP \fBИспользование систем учёта.\fP .PP Выше был определён параметр \fBac_mod\fP, который сообщает, что необходимо загрузить модуль и позволяет этому модулю обрабатывать свою конфигурацию. Параметр \fBac_list\fP определяет список используемых систем учёта: .PP .nf ac_list = <список>; .fi .PP <Список> это набор имён, разделённых пробелами. Чтобы получить имена систем учёта, прочтите документацию для модулей, которые вы указали в параметрах \fBac_mod\fP. .PP Если какое-то правило содержит параметр \fBac_list\fP, то системы учёта, перечисленные в его значении, будут опрашиваться для получения статистики для этого правила. Этот параметр позволяет создавать список систем учёта для каждого правила по отдельности. .PP Существует одна встроенная в ipa(8) система учёта \fInull\fP: эта система учёта всегда возвращает в качестве статистики 0. Если параметр \fBac_list\fP не определён, то используется система учёта \fInull\fP. .PP \fIПример:\fP .PP .nf ac_mod "ipa_ipfw.so"; ac_mod "ipa_ip6fw.so"; global { ac_list = ipfw ip6fw; } .fi .PP Здесь определены две системы учёта. .PP \fBИспользование баз данных.\fP .PP Выше был определён параметр \fBdb_mod\fP, который сообщает, что необходимо загрузить модуль и позволяет этому модулю обрабатывать свою конфигурацию. Параметр \fBdb_list\fP определяет список используемых баз данных: .PP .nf db_list = <список>; .fi .PP <Список> это набор имён, разделённых пробелами. Чтобы получить имена баз данных, прочтите документацию для модулей, которые вы указали в параметрах \fBdb_mod\fP. .PP Если какое-то правило (лимит, порог) содержит параметр \fBdb_list\fP, то базы данных, перечисленные в его значении, будут использовать для сохранения статистики для этого правила (лимита, порога). Этот параметр позволяет создавать список баз данных для каждого правила (лимита, порога) по отдельности. .PP Существует одна встроенная в ipa(8) база данных \fInull\fP: все данные, посланные в эту базу данных, сразу же исчезаю. Если параметр \fBdb_list\fP не определён, то используется база данных \fInull\fP. .PP \fIПример:\fP .PP .nf db_mod "ipa_db_sdb.so"; global { db_list = sdb; } .fi .PP Здесь определена одна база данных. .PP \fBУчёт статистики по временным интервалам недели.\fP .PP По умолчанию ipa(8) выполняет учёт статистики для всех дней недели, но существует возможность выполнять учёт статистики только для некоторых временных интервалов. Параметр \fBworktime\fP определяет временные интервалы, когда ipa(8) должна выполнять учёт статистики: .PP .nf worktime = h1:m1-h2:m2 [h1:m1-h2:m2]; worktime = *; .fi .PP обозначает день недели. Допустимые значения для следующие: `\fBS\fP' воскресенье, `\fBM\fP' понедельник, `\fBT\fP' вторник, `\fBW\fP' среда, `\fBH\fP' четверг, `\fBF\fP' пятница, `\fBA\fP' суббота. Может быть только одна запись для каждого дня. Временные интервалы не должны перекрываться или быть расположенными не по порядку. .PP Временной интервал 00:00-24:00 или символ `\fB*\fP' обозначает целый день. .PP Когда \fBworktime\fP разрешает выполнять учёт статистики, то секция в которой он располагается называется ``активной'', иначе она называется ``неактивной''. .PP Что конкретно этот параметр определяет для автоправил, правил, лимитов и порогов читайте в соответствующих параграфах. .PP Заметьте, что интервалы заданные в параметре \fBworktime\fP не гарантируют, что точно такие же временные интервалы окажутся в базе данных, так как запущеная копия ipa(8) может иметь низкий приоритет или система может быть слишком нагруженной. .PP Конец одного временного интервала может быть началом следующего временного интервала, это свойство полезно только для правил (см. ниже). .PP \fIПример:\fP .PP Выполнять учёт статистики только по понедельникам, вторникам и средам: .PP .nf worktime = M * T * W *; .fi .PP Выполнять учёт статистики в четверг с 8:00 до 14:30 и с 18:20 до 21:00, в воскресенье с полуночи до 10:35 (значение записано в нескольких строках только для выравнивания): .PP .nf worktime = H 08:00-14:30 18:20-21:00 S 00:00-10:35; .fi .PP \fBВременные интервалы базы данных.\fP .PP Параметр \fBupdate_time\fP определяет временные интервалы, когда ipa(8) должна обновлять статистику для правила: .PP .nf update_time = <время>; .fi .PP Если этот параметр не указан, то значение по умолчанию равно 1 минуте. .PP Параметр \fBappend_time\fP определяет временные интервалы, когда ipa(8) должна добавить новую запись в базы данных для правила: .PP .nf append_time = <время>; .fi .PP Этот параметр не имеет значения по умолчанию. Новая учётная запись для каждого правила добавляется в базу данных в конце каждого дня в любом случае. .PP Обычно значение параметра \fBappend_time\fP больше чем значение параметра \fBupdate_time\fP. .PP ipa(8) пытается скомбинировать несколько временных событий в одно чтобы уменьшить использование ресурсов, это свойство имеет другой интересный момент, например, если \fBupdate_time\fP равен 5 минутам, то ipa(8) всегда планирует временные события для этого параметра в 00:00, 00:05, 00:10 и т.д. .PP Существуют программы, тикие как date(1) или ntpdate(8), которые могут изменять UTC или локальное время, также временная зона может быть изменена сама по себе. Эти события могут вызвать не критические ошибки типа ``some time related problems occurred'' в ipa(8). Параметры \fBupdate_time\fP и \fBappend_time\fP могут вызвать больше подобных ошибок. Например, если вы вызываете ntpdate(8) очень часто и значение параметра \fBupdate_time\fP почти равно временному интервалу вызовов ntpdate(8), то вы можете получить множество предупреждающих сообщений от ipa(8). .PP Возможно указать насколько временные события чувствительны к изменениям времени в параметре: .PP .nf sensitive_time = <время>; .fi .PP По умолчанию значение этого параметра равно 30 секундам. Этот параметр не должен располагаться в какой-либо секции. .PP Параметр \fBwakeup_time\fP определяет максимальное число секунд, которое может спать ipa(8). Этот параметр сообщает ipa(8) когда необходимо пробудиться и проверить всё ли в порядке с временем, временной зоной и т.п.: .PP .nf wakeup_time = <время>; .fi .PP По умолчанию значение этого параметра равно 10 минутам. Этот параметр не должен располагаться в какой-либо секции. .PP \fIПример:\fP .PP .nf global { update_time = 30s; append_time = 1h 30m; } .fi .PP Символ `\fBs\fP' обозначает секунды, `\fBm\fP' минуты, `\fBh\fP' часы (пробелы опциональны). Если <время> определено как составное значение, то часы должны быть указаны перед минутами и секундами, а минуты перед секундами. .PP \fBОписание правил, лимитов и порогов.\fP .PP Секции \fBrule\fP, \fBlimit\fP и \fBthreshold\fP могут иметь параметр \fBinfo\fP, который передаётся базе данных и используется для описания секции: .PP .nf info = "<строка>"; .fi .PP Значение этого параметра не должно содержать символов `\\n' и `\\t'. Обычно это значение должно помочь вспомнить для чего используется то или иное правило, лимит или порог. Например, это значение выводится программой ipastat(8). .PP Динамические правила получают своё описание от модулей учёта, которые их генерируют, поэтому вы не можете указать описания динамических правил в конфигурационном файле. .PP \fIПример:\fP .PP .nf rule 10.1.2.3-in { info = "Мой трафик от ISP"; /* ... */ } .fi .PP Иногда имя правила не очень информативно, поэтому описание правила это хорошая идея. .PP \fBСтатические правила.\fP .PP Статические правила называются ``статическими'' потому, что они существуют в конфигурационном файле и ни один модуль учёта не может уничтожить их (динамические правила могут быть уничтожены). .PP Секция \fBrule\fP описывает установки для одного статического правила: .PP .nf rule <имя-правила> { /* Параметры и секции правила. */ } .fi .PP Необходимо давать такие имена правилам, которые также являются корректными именами правил для используемой вами базы данных. .PP Секция \fBrule\fP не требует каких-либо обязательных установок. Если какое-то правило не содержит ни одной секции и параметра, то оно называется пустым правилом. Очевидно, что такие правила бессмысленны, поэтому любое правило имеет несколько параметров (собственные или наследованные). .PP Если правило содержит параметр \fBworktime\fP, то новая запись о статистике добавляется в базу данных с началом каждого нового временного интервала. Если правило неактивно, то все её лимиты и пороги также неактивны. .PP \fIПример:\fP .PP .nf ac_mod "ipa_ipfw.so"; ac_mod "ipa_ip6fw.so"; db_mod "ipa_db_sdb.so"; rule local.traf { ac_list = ipfw ip6fw; db_list = sdb; info = "Входящий трафик для моей LAN"; sdb:db_group = staff; ipfw:rules = 100 200 300; ip6fw:rules = 1.10; } .fi .PP Здесь правило использует две системы учёта и одну базу данных. Оно также имеет описание и несколько настроек для модулей. .PP \fBЗапуск команд.\fP .PP Существует несколько секций позволяющие определить список команд, которые должны быть запущены если произойдёт некоторое событие. .PP Параметр \fBexec\fP используется для запуска команд: .PP .nf exec [<пользователь>] "/path/command"; .fi .PP Параметр \fBexec\fP без <пользователя> запускает команду с привилегиями пользователя запустившего ipa(8), т.е. не предпринимаются никакие действия по смене пользователя или группы пользователя для запускаемой команды. .PP Параметр \fBexec\fP с <пользователем> запускает команду с привилегиями заданного пользователя. Пользователь может быть задан только по имени. ipa(8) определит UID и GID (группы) пользователя в момент запуска команды. Этот параметр может быть использован если ipa(8) запущена супер-пользователем. .PP Возможно использовать макропеременные (включая предопределённые) в командных строках (как и в любых строках). Если необходимо использовать имя правила в какой-то команде в секции \fBrulepat\fP или \fBautorule\fP, то нужно воспользоваться подстановками. Определены две подстановки: .IP %rule% Имя правила. .IP %% Символ `%'. .PP Эти подстановки не работают в командных строках, расположенных в секциях \fBrule\fP, вместо этого используйте макропеременную ${rule}. .PP По умолчанию команды должны быть заданы с абсолютными путевыми именами, но возможно задавать команды с относительными именами, установив параметр \fBonly_abs_paths\fP в ``no'', по умолчанию значение этого параметра равно ``yes'': .PP .nf only_abs_paths = ; .fi .PP Все команды запускаются с помощью shell, поэтому могут быть указаны любые конструкции командной строки: .PP .nf /path/command .fi .PP Заметьте, что стандартный ввод (stdint), стандартный вывод (stdout) и стандартный поток ошибок (stderr) обрабатываются также как и в ipa(8). .PP определяется когда IPA компилируется, обычно это /bin/sh (см. реальный путь в выводе команды ``ipa\ \-v''), но возможно точно указать путь к оболочке в конфигурационном файле с помощью параметра \fBshell_path\fP: .PP .nf shell_path = "/path/shell"; .fi .PP по умолчанию равен ``-c'', но он может быть переопределён в параметре \fBshell_arg1\fP: .PP .nf shell_arg1 = ""; .fi .PP Если нет достаточно ресурсов и ipa(8) не в состоянии, например, запустить потомка (ошибка вызова fork(2)), то ipa(8) завершит свою работу с кодом ошибки. Но если какая-то ошибка возникнет в потомке, который запускает команды, то ipa(8) проигнорирует эти ошибки и потомок просто отправит предупреждающие сообщения в лог. .PP Параметры \fBonly_abs_paths\fP, \fBshell_path\fP и \fBshell_arg1\fP не должены располагаться в какой-либо секции. .PP \fIПример:\fP .PP .nf startup { exec "/bin/echo \\"ipa started\\" | mail me"; exec nobody "/usr/local/bin/something"; } only_abs_path = no; shutdown { exec "echo \\"ipa stopped\\" | mail me"; } rulepat "^client" { startup { exec "command %rule%"; } } rule 1 { shutdown { exec "echo rule off >> /tmp/${rule}.log"; } } .fi .PP В первой секции команда ``mail'' задана без абсолютного путевого имени. Это корректно, так как только первая команда проверяется на абсолютное путевое имя, ipa(8) не интерпретирует конструкции командной строки оболочки. .PP Для включения имени правила в командную строку в секции \fBrulepat\fP используется подстановка %rule%, в секции \fBrule\fP используется макропеременная ${rule}. .PP \fBЗапуск команд при старте и завершении работы.\fP .PP В секции \fBstartup\fP (\fBshutdown\fP) можно определить команды, которые должны быть запущены, когда ipa(8) начинает (завершает) свою работу. Эти секции могут располагаться самостоятельно (глобальные команды) и в секциях \fBautorule\fP, \fBrulepat\fP, \fBrule\fP, \fBlimit\fP, \fBsublimit\fP и \fBthreshold\fP. .PP Если эти секции располагаются самостоятельно (см. использование этих секций в других секциях), то они могут содержать только параметры \fBexec\fP и \fBsync_exec\fP. .PP Алгоритм запуска команд из секций \fBstartup\fP (\fBshutdown\fP) следующий: .IP 1 запустить глобальные команды; .IP 2 запустить команды из секций \fBrule\fP; .IP 2а в каждой секции \fBrule\fP запустить команды для лимитов и порогов; .IP 2б в каждой секции \fBlimit\fP запустить команды для подлимитов. .PP Когда ipa(8) перечитывает конфигурационный файл (когда она получает сигнал SIGHUP), тогда команды в секциях \fBstartup\fP игнорируются, но будут использоваться новые команды для секций \fBshutdown\fP. Если необходимо запустить некоторые команды из секций \fBstartup\fP, то их можно запустить при помощи опции ipa(8) \fB-x\fP. .PP \fIПример:\fP .PP .nf startup { exec "command1"; } rule 1 { startup { exec "command2"; } limit 1 { /* ... */ startup { exec "command3"; } } } rule 2 { startup { exec "command4"; } } .fi .PP Здесь команды запускаются в следующем порядке: command1, command2, command3 и command4. .PP \fBСинхронный и асинхронный запуск команд.\fP .PP Существует два режима запуска команд: синхронный и асинхронный. В синхронном режиме ipa(8) ждёт завершения запущенных команд. В асинхронном режиме ipa(8) запустив команды, не ждёт завершения запущенных команд, а продолжает свою работу. .PP По умолчанию команды во всех секциях \fBstartup\fP и \fBshutdown\fP запускаются синхронно, во всех остальных секциях команды запускаются асинхронно. .PP Параметр \fBsync_exec\fP позволяет определить асинхронный или синхронный режим для любой секции: .PP .nf sync_exec = ; .fi .PP Этот параметр может использовать в любой секции, которая содержит параметры \fBexec\fP. .PP \fIПример:\fP .PP .nf startup { sync_exec = no; exec "/path/something"; } .fi .PP В этом примере синхронный режим, определённый по умолчанию для секции \fBstartup\fP, изменён на асинхронный. .PP \fBО статистике.\fP .PP ipa(8) интерпретирует данные статистики как 64-битные беззнаковые целые числа, статистикой может быть что угодно (например, время или байты). Предположим, что некоторое правило использует несколько систем учёта. ipa(8) суммирует статистику от каждого модуля статистики и обновляет статистику для правила в базе данных. Обычно модуль статистики возвращает положительную статистику, но он может возвращать и отрицательную статистику. .PP ipa(8) во время работы для правил представляет статистику двумя 64-битными счётчиками: один счётчик для положительной статистики и другой для отрицательной статистики. В любой момент времени один из этих счётчиков равен нулю. Если счётчик отрицательной статистики переполняется, то ipa(8) сообщает о случившейся проблеме и завершает свою работу, так как такое переполнение означает неправильную конфигурацию. Если счётчик положительной статистики переполняется, то ipa(8) делает запрос базе данных на добавление новой записи для правила со статистикой не поместившейся во внутреннем счётчике. .PP Любой лимит или порог имеет такие же два счётчика, но если переполнится счётчик положительной или отрицательной статистики для лимита или порога, то ipa(8) сообщает о случившейся проблемы и завершает свою работу, так как такое переполнение означает неправильную конфигурацию. Также каждый порог имеет несколько счётчиков для временных интервалов (отрицательный или положительный знак хранится в битовой карте). .PP Статистика передаётся в базу данных в виде 64-битных целых вместе с текущим локальным временем. .PP Обычно положительная статистика больше чем отрицательная, но это не является жёстким правилом. Только положительная статистика сохраняется в базе данных, отрицательная статистика хранится в памяти и когда ipa(8) завершает свою работу и некоторое правило имеет отрицательную статистику, то эта статистика теряется (предупреждающее сообщение будет послано в лог-файл). Другими словами, ipa(8) способна вычитать статистику из текущего значения счётчика положительной статистики и нет возможности вычитать статистику из старой статистики в базе данных. .PP \fBЛимиты: введение.\fP .PP Лимит должен рассматриваться в контексте некоторого правила. Иногда лимиты в IPA называются триггерами. Если есть необходимость выполнять какие-то действия, когда статистика для правила достигнет определённого значения за некоторый период времени, тогда должна быть использована секция \fBlimit\fP. Эта секция может иметь несколько секций и должна содержать по крайне мере один параметр по имени \fBlimit\fP: .PP .nf limit <имя-лимита> { limit = <значение-лимита>; /* Параметры и секции лимита. */ } .fi .PP Необходимо давать такие имена лимитам, которые также являются корректными именами лимитов для используемой вами базы данных. .PP Любой лимит имеет 64-битный беззнаковый счётчик для положительной статистики, который изменяется ipa(8) и который сравнивается со значением параметра \fBlimit\fP. Если значение счётчика станет равным или большим чем значение параметра \fBlimit\fP, то лимит становится достигнутый и ipa(8) больше не изменяет его счётчик. Счётчик лимита обновляется синхронно со счётчиком правила. .PP Лимиты имеют имена, поэтому возможно использовать несколько лимитов в одном правиле и они будут различаться по именам. .PP ipa(8) ничего не знает об единицах статистики, поэтому возможно использовать различные форматы для <значения-лимита>: байты, время и 64-битное беззнаковое число (см. примеры ниже). <Значение-лимита> всегда преобразовывается в 64-битное беззнаковое число. .PP Лимит может проходить несколько состояний: лимит не достигнут, лимит достигнут (плюс опциональный запуск команд), достигнутый лимит должен быть перезапущен (плюс опциональный запуск команд) и псевдо состояние когда не достигнутый лимит должен быть перезапущен. Секция \fBlimit\fP может иметь несколько параметров и секций, которые определяют состояния лимита (описано ниже). .PP Если лимит не достигнут, то его статистика проверяется каждый раз, когда обновляется статистика его правила (временной интервал не больше чем значение параметра \fBupdate_time\fP). .PP \fIПример:\fP .PP .nf rule my-account { /* Параметры и секции правила. */ limit 1 { limit = 1M 500K; info = "Байтовый лимит"; } limit 2 { limit = 2h 30m; info = "Временной лимит"; } limit 3 { limit = 1234567890; info = "Численный лимит"; } } .fi .PP В этом примере правило содержит три независимых лимита. .PP Если значение параметра \fBlimit\fP задаётся в байтах, то символ `\fBT\fP' обозначает Тбайты, `\fBG\fP' Гбайты, `\fBM\fP' Мбайты, `\fBK\fP' Кбайты, `\fBB\fP' байты (пробелы опциональны). Если значение определяется как сложное значение, то Тбайты должны быть указаны до Гбайтов и Мбайтов и так далее. .PP \fBАктивные и неактивные лимиты.\fP .PP Если лимит не имеет собственного параметра \fBworktime\fP, то он активен когда его правило активно, то есть, если параметр \fBworktime\fP правила разрешает ведение статистики, то лимит работает как обычно, если ведение статистики не разрешено для правила, то ipa(8) игнорирует лимит и начнёт с ним работу когда параметр \fBworktime\fP правила разрешит ведение статистики снова. .PP Любой лимит может иметь собственный параметр \fBworktime\fP. В этом случае если правило активно, то ipa(8) проверяет параметр \fBworktime\fP лимита. .PP Когда лимит неактивен, то времена, определённые в параметрах \fBrestart\fP и \fBexpire\fP, не проверяются. .PP Таким образом, возможно иметь активное правило и неактивный лимит. Но не возможно иметь неактивное правило и активный лимит. Все временные интервалы в параметре \fBworktime\fP лимита должны быть подмножеством временных интервалов параметра \fBworktime\fP правила. .PP \fIПример:\fP .PP .nf rule my-account { /* ... */ worktime = A * S *; limit 1 { limit = 10M; worktime = A 08:00-21:00 S 08:00-21:00; } } .fi .PP Здесь правило активно только по субботам и воскресеньям, а лимит активен с 08:00 до 21:00 по тем же дням. Так как временной интервал 08:00-21:00 является подмножеством временного интервала 00:00-24:00, то в этих двух параметрах всё корректно. .PP \fBПерезапуск не достигнутого лимита.\fP .PP Время когда новый лимит был создан (или достигнутый лимит был перезапущен снова) известно как ``время старта''. ipa(8) изменяет счётчик лимита только когда лимит не достигнут. Возможно указать время, когда не достигнутый лимит должен быть перезапущен с обнулённым счётчиком. .PP Секция \fBrestart\fP позволяет определить время перезапуска не достигнутого лимита: .PP .nf limit <имя-лимита> { /* Параметры и секции лимита. */ restart { restart = <время-перезапуска>; /* Команды. */ } } .fi .PP Секция \fBrestart\fP должна иметь по крайней мере параметр \fBrestart\fP. Существует три метода определения этого времени. Рассмотрим их на последующих примерах. .PP Возможно указать опциональные команды, которые будут запущены, когда не достигнутый лимит будет перезапускаться. .PP ipa(8) также информирует системы учёта, используемые правилом лимита, когда не достигнутый лимит перезапускается, поэтому если вы не указали команды в секции \fBrestart\fP, то некоторые действия всё ещё могу быть выполнены системами учёта. .PP Если лимит не содержит секции \fBrestart\fP, то этот лимит (если он не достигнут) не может быть автоматически перезапущен, но он может быть перезапущен утилитой ipactl(8). .PP \fIПример 1:\fP .PP .nf rule my.traf { ac_list = ipfw; ipfw:rules = 100 200; limit 1 { limit = 1G; restart { restart = 20h 30m; } } } .fi .PP Здесь значение параметра \fBrestart\fP добавляется к времени старта лимита и вычисленное время является временем перезапуска лимита. Здесь мы можем рассматривать время перезапуска как число секунд со времени старта лимита. .PP Символ `\fBs\fP' обозначает секунды, `\fBm\fP' минуты, `\fBh\fP' часы, `\fBD\fP' дни и `\fBW\fP' недели. .PP \fIПример 2:\fP .PP .nf rule my.traf { ac_list = ipfw; ipfw:rules = 100 200; limit 1 { limit = 1G; restart { restart = +W; } } } .fi .PP Здесь лимит будет перезапущен в конце недели после времени старта лимита. Символ после знака `\fB+\fP' означает: `\fBm\fP' минуту, `\fBh\fP' час, `\fBD\fP' день, `\fBW\fP' неделю, `\fBM\fP' месяц. .PP \fIПример 3:\fP .PP .nf rule my.traf { ac_list = ipfw; ipfw:rules = 100 200; limit 1 { limit = 1G; restart { restart = +M 2D; } } } .fi .PP В этом примере лимит будет перезапущен на третий день следующего месяца после времени старта лимита: сначала вычисляется время перезапуска для ``+'' (начало следующего месяца), затем ``2D'' (два дня) добавляется к вычисленной дате. .PP Заметьте, что ``2D\ +M'' это не тоже самое: здесь ``2D'' добавляется ко времени старта и затем вычисляется время перезапуска для ``+M'' (и здесь мы всегда получим первый день некоторого следующего месяца). .PP \fBДействия, когда лимит будет достигнут.\fP .PP Когда лимит будет достигнут ipa(8) выполнит команды перечисленные в секции \fBreach\fP: .PP .nf limit <имя-лимита> { /* Параметры и секции лимита. */ reach { /* Команды. */ } } .fi .PP Секция \fBreach\fP может отсутствовать или быть пустой, в этом случае никакие команды не будут запускаться по достижению лимита. .PP ipa(8) также информирует системы учёта, используемые правилом лимита, когда лимит становится достигнутым, поэтому если вы даже не указали команды в секции \fBreach\fP, то некоторые действия всё ещё могу быть выполнены системами учёта. .PP \fIПример:\fP .PP .nf rule my.traf { ac_list = ipfw; ipfw:rules = 100; limit 1 { limit = 1G; restart { restart = +W; } reach { exec "/somewhere/stop_traffic"; } } } .fi .PP Здесь лимит в 1Гбайт, который перезапускается в конце недели если он не достигнут, но когда он становится достигнутым, то запускается заданная команда. .PP \fBПерезапуск достигнутого лимита.\fP .PP Возможно перезапустить достигнутый лимит. Для этого используйте секцию \fBexpire\fP: .PP .nf limit <имя-лимита> { /* Параметры и секции лимита. */ expire { expire = <время-перезапуска>; /* Команды. */ } } .fi .PP Секция \fBexpire\fP должна иметь по крайней мере параметр \fBexpire\fP. .PP Возможно указать опциональные команды, которые будут запущены, когда достигнутый лимит будет перезапускаться. .PP ipa(8) также информирует системы учёта, используемые правилом лимита, когда достигнутый лимит перезапускается, поэтому если вы не указали команды в секции \fBexpire\fP, то некоторые действия всё ещё могу быть выполнены системами учёта. .PP Если лимит не содержит секции \fBexpire\fP, то этот лимит (если он достигнут) не может быть автоматически перезапущен, но он может быть перезапущен утилитой ipactl(8). .PP Значение параметра \fBexpire\fP может быть 0s, это означает, что достигнутый лимит будет перезапущен мгновенно. .PP \fIПример:\fP .PP .nf rule my.traf { ac_list = ipfw; ipfw:rules = 100; limit 1 { limit = 1G; restart { restart = +W; } reach { exec "/somewhere/stop_traffic"; } expire { expire = +W; exec "/somewhere/start_traffic"; } } } .fi .PP Здесь приведен лимит в 1Гбайт за неделю. Если лимит будет достигнут, то он перезапустится в начале недели. Если этот лимит не будет достигнут, то он всё равно будет перезапущен в начале недели. .PP \fBСекции startup и shutdown для правила.\fP .PP Выше были описаны две секции для запуска команд при старте и завершении работы. Правило также может иметь эти секции, но секции \fBstartup\fP и \fBshutdown\fP расположенные в секции \fBrule\fP могут также содержать подсекции: .PP \fBif_any_reached\fP\ \ \ \ \ \-\ если любой из лимитов правила достигнут; .br \fBif_any_not_reached\fP\ \-\ если любой из лимитов правила не достигнут; .br \fBif_all_reached\fP\ \ \ \ \ \-\ если все лимиты правила достигнуты; .br \fBif_all_not_reached\fP\ \-\ если все лимиты правила не достигнуты. .PP Эти секции определяют команды, которые должны быть запущены, если лимиты попадают под условие подсекции. .PP Любое правило может иметь пустую секцию \fBstartup\fP или \fBshutdown\fP, в этом случае эта секция не наследуются из подходящей секции \fBrulepat\fP. .PP \fIПример:\fP .PP .nf rule my.traf { ac_list = ipfw; ipfw:rules = 100; startup { exec "/somewhere/count_traffic"; if_any_reached { /* ... */ exec "/bin/echo \\"Какой-то из лимитов в правиле \\ ${rule} был достигнут\\" | mail admin"; } } limit 1 { limit = 1G; restart { restart = +M; } info = "1G в месяц"; /* ... */ } limit 2 { limit = 500M; restart { restart = +W; } info = "500M в неделю"; /* ... */ } } .fi .PP Здесь приведены два лимита: 1 Гбайт в месяц и 500 Мбайт в неделю, секция \fBif_any_reached\fP будет использована если любой из этих лимитов будет достигнут на момент старта ipa(8). Также \fBstartup\fP секция правила содержит одну команду, которая всегда запускается при старте. Здесь мы использовали обратный слэш для разделения командной строки. .PP \fBСекции startup и shutdown для лимита.\fP .PP Лимит может иметь собственные секции \fBstartup\fP и \fBshutdown\fP с следующими дополнительными подсекциями: .PP \fBif_reached\fP\ \ \ \ \ \-\ если лимит достигнут; .br \fBif_not_reached\fP\ \-\ если лимит не достигнут. .PP Эти секции определяют команды, которые необходимо запустить, если лимит подпадает под условие подсекции. .PP ipa(8) также информирует используемые системы учёта правилом лимита при старте и завершении работы достигнут ли лимит, поэтому, если вы не указали команды для старта и/или останова для лимита, то некоторые действия всё ещё могу быть выполнены системами учёта. .PP \fBИспользование отдельных баз данных для лимитов.\fP .PP Существует параметр \fBdb_list\fP, который определяет список баз данных используемых правилом. По умолчанию лимит использует тот же самый список баз данных, что и его правило (он наследует этот список). Но возможно использовать параметр \fBdb_list\fP в секции \fBlimit\fP: .PP .nf rule <имя-правила> { /* Параметры и секции правила. */ db_list <список1>; limit <имя-лимита> { /* Параметры и секции лимита. */ db_list <список2>; } } .fi .PP <Список1> и <список2> могут содержать общие элементы, в любом случае <список1> используется только для правила, а <список2> используется только для лимита. .PP Зачем использовать раздельные базы данных для правила и его лимитов? Не все базы данных работают с лимитами и даже если какая-то база данных работает с лимитами, она может поддерживать не все функции (методы) для лимитов. См. детали реализации в странице документации ipa_mod(3). .PP Допустим некоторый лимит использует несколько баз данных. Из какой базы данных ipa(8) возьмёт текущее состояние лимита? Первая база данных, которая в состоянии вернуть состояние лимита, будет опрошена о текущем состоянии лимита, даже если какая-то другая база данных имеет другое состояние лимита, она не будет опрошена и её состояние лимита будет потеряно, затем ipa(8) обновит состояние лимита в каждой базе данных. .PP Заметьте, что порядок баз данных для лимита важен. .PP Прочтите в документации к базе данных, которую вы используйте, может ли она работать с лимитами и что конкретно модуль поддерживает, когда работает с лимитами. .PP \fBИспользование значения параметра limit из базы данных.\fP .PP Иногда необходимо хранить значение параметра \fBlimit\fP в базе данных и изменять это значение в базе данных, поэтому должен быть способ сообщить ipa(8) о том, что необходимо использовать значение параметра \fBlimit\fP из базы данных. Для этой цели был реализован параметр \fBload_limit\fP: .PP .nf limit <имя-лимита> { /* Параметры и секции лимита. */ load_limit = ; } .fi .PP Если вы хотите использовать значение параметра \fBlimit\fP из базы данных, то установите значение параметра \fBload_limit\fP в ``yes''. Если база данных не имеет текущего состояния лимита (например если лимит новый), то будет использоваться значение параметра \fBlimit\fP из конфигурационного файла, поэтому параметр \fBlimit\fP всегда должен быть определён. .PP По умолчанию параметр \fBload_limit\fP имеет значение ``no''. .PP Один из случаев почему необходимо установить этот параметр в ``yes'' является использование утилиты ipactl(8) для изменения значение параметра \fBlimit\fP на лету. .PP Этот параметр может быть определён в секции \fBglobal\fP, если какая-то секция \fBlimit\fP не будет содержать этот параметр, то его значение будет установлено из секции \fBglobal\fP. .PP \fBИнициализация лимитов.\fP .PP Когда ipa(8) стартует, перечитывает конфигурационный файл или выполняет переинициализацию когда возникнут проблемы со временем, она выполняет следующие шаги для произвольного лимита: .PP .IP 1. Текущее состояние лимита читается из базы данных, если база данных не имеет состояния лимита, то состояние лимита регистрируется со значением параметра \fBlimit\fP из конфигурационного файла и с нулевым счётчиком и инициализация лимита завершена, иначе ipa(8) выполняет второй шаг (2а или 2б); .IP 2а. Если лимит не достигнут с текущим состоянием из базы данных, то если значение параметра \fBload_limit\fP равно ``no'', то ipa(8) обновляет значение параметра \fBlimit\fP из конфигурационного файла; если значение параметра \fBload_limit\fP равно ``yes'', то ipa(8) игнорирует значение параметра \fBlimit\fP из конфигурационного файла и берёт это значение из базы данных. В любом случае лимит помечается как не достигнутый, даже если с новыми установками он становится достигнутым. Затем ipa(8) обновляет дату когда лимит должен быть перезапущен согласно значению параметра \fBrestart\fP из конфигурационного файла, игнорируя эту дату из базы данных. .IP 2б. Если лимит достигнут, то ipa(8) помечает этот лимит как достигнутый и не обновляет значение параметра \fBlimit\fP в базе данных (т.е. временно не учитывается значение параметра \fBload_limit\fP и это можно увидеть в выводе команды ipactl(8) \fIstatus\fP для этого лимита). Затем ipa(8) обновляет дату когда лимит должен быть перезапущен согласно значению параметра \fBexpire\fP из конфигурационного файла, игнорируя это значение из базы данных. .PP \fBЛимиты: ещё раз о событиях лимитов.\fP .PP Для улучшения понимания работы лимитов ниже приведена временная диаграмма состояний произвольного лимита: .PP .nf +--------------+--> Restart (Tstart) | | Trestart_exec Treach_exec Texpire_exec --|------>------||------>------||------>------||-------------> Tstart Trestart Treach Texpire time .fi .PP \fBПодлимиты.\fP .PP Подлимит это часть некоторого лимита. Главное назначение подлимита это регистрация события, когда будет достигнута некоторая часть значения параметра \fBlimit\fP. Так как подлимит является частью секции \fBlimit\fP, то его значение должно быть задано в тех же единицах, что и значение параметра \fBlimit\fP. Для упрощения определения подлимита возможно задавать подлимит в процентах, то есть некоторое число процентов от значение параметра \fBlimit\fP: .PP .nf limit <имя-лимита> { limit = <значение-лимита>; /* Параметры и секции лимита. */ sublimit <значение-подлимита> { /* Секции подлимита. */ } } .fi .PP Подлимиты могут содержать только секции \fBreach\fP, \fBstartup\fP и \fBshutdown\fP. Все эти секции имеют тот же самый формат, что и те же самые секции для лимитов. ipa(8) не информирует системы учёта о событиях подлимитов, так как подлимиты не видимы для модулей. .PP Лимит может иметь несколько не дублирующих (разные <значения-подлимитов>) подлимитов. .PP Так как состояния подлимитов не хранятся в базах данных, поэтому, если возможно, то лучше использовать подлимиты, чем добавлять дополнительные лимиты для правила. .PP \fIПример:\fP .PP .nf rule my.traf { /* ... */ limit l1 { limit = 1G; load_limit = yes; restart { restart = +M; } info = "1G в месяц"; /* ... */ sublimit 50% { reach { exec "/bin/echo \\"Достигнута половина лимита \\ ${limit} правила ${rule}\\" | mail me"; } } } } .fi .PP Здесь подлимит посылает email, когда половина лимита t1 будет достигнута. Даже если значение параметра \fBlimit\fP будет изменено утилитой ipactl(8), значение подлимита будет скорректировано, так как оно задано в процентах. .PP \fBПороги: введение.\fP .PP Порог позволяет наблюдать за статистикой правила за некоторый временной промежуток до текущего момента времени и делать некоторые действия, когда статистика за этот временной промежуток меньше, равна или больше чем заданное значение. Этот временной интервал также может быть назван ``скользящим временным окном''. Порог описывается секцией \fBthreshold\fP, имеющей следующий формат: .PP .nf threshold <имя-порога> { threshold = <значение-порога>; threshold_time_width = <время>; threshold_time_slice = <время>; /* Другие параметры и секции порога. */ } .fi .PP Необходимо давать такие имена порогам, которые также являются корректными именами порогов для используемой вами базы данных. .PP Любой порог имеет 64-битный беззнаковый счётчик, который изменяется ipa(8) и сравнивается со значением параметра \fBthreshold\fP. Если значение счётчика становится меньше, равно или больше чем значение параметра \fBthreshold\fP, то запускаются команды из опциональных секции \fBbelow_threshold\fP, \fBequal_threshold\fP или \fBabove_threshold\fP. Счётчик порога изменяется синхронно со счётчиком правила каждый \fBthreshold_time_slice\fP временной интервал. .PP ipa(8) ничего не знает об единицах статистики, поэтому возможно задавать <значение-порога> в различных форматах: байты, время и беззнаковое 64-битное целое. <Значение-порога> всегда конвертируется в беззнаковое 64-битное целое. .PP Возможно определить отклонение <значения-порога> при помощи параметра \fBthreshold_deviation\fP. Значение параметра \fBthreshold_deviation\fP должно быть задано в тех же единицах, что и значение параметра \fBthreshold\fP. Чтобы упростить определение значения отклонения порога, возможно задавать его значение в процентах, то есть некоторое число процентов от значение параметра \fBthreshold\fP. .PP Значение параметра \fBthreshold_time_width\fP определяет ширину скользящего временного окна. Значение параметра \fBthreshold_time_slice\fP определяет временные интервалы движения скользящего временного окна. Значение параметра \fBthreshold_time_width\fP должно быть больше чем значение параметра \fBthreshold_time_slice\fP и должно быть делится нацело на это значение. Другими словами, счётчик порога представляет снимок статистики правила за последние \fBthreshold_time_width\fP секунд. В отличии от лимитов, пороги не имеют ``времени старта'', так как их статистика скользит во времени дискретными временными интервалами равными \fBthreshold_time_slice\fP секундам. Эти два параметра могут быть определены в секции \fBglobal\fP и они будут использоваться, при их отсутствии в секции \fBthreshold\fP. .PP Пороги имеют имена, поэтому можно использовать несколько порогов в одном правиле и они будут различаться по именам. .PP Системы учёта, используемые правилом порога, оповещаются о событиях порога, поэтому системы учёта также могут выполнять некоторые действия, когда значение счётчика порога меньше, равно или больше чем значение параметра \fBthreshold\fP. .PP Возможно ограничить число раз запуска команд или оповещения систем учёта из секций \fBbelow_threshold\fP (X), \fBequal_threshold\fP (Y) и \fBabove_threshold\fP (Z) в параметре \fBthreshold_balance\fP: .PP .nf threshold_balance = X:Y:Z; .fi .PP Этот параметр может быть определён в секции \fBglobal\fP и если какая-то секция \fBthreshold\fP его не содержит, то его значение будет наследоваться из секции \fBglobal\fP. .PP Есть три внутренних счётчика x, y и z, которые считают количество последовательных запусков команд и количество сообщений модулям учёта из секций \fBbelow_threshold\fP, \fBequal_threshold\fP и \fBabove_threshold\fP. Эти счётчики изначально равны X, Y и Z соответственно. Когда счётчик порога меньше чем значение параметра \fBthreshold\fP и x не равно нулю, то значение x декрементируется, y устанавливается равным Y, z устанавливается равным Y, затем запускаются команды из секции \fBbelow_threshold\fP и системы учёта информируются о событии порогоа. Аналогичные действия делаются для счётчиков y и z. .PP Чтобы задать безграничные значения для X, Y или Z, установите их как `\fB-\fP'. В реализации безграничное число равно UINT_MAX. По умолчанию значение этого параметра равно \-:\-:\-. .PP \fIПример:\fP .PP .nf rule lan { ac_list = ipfw; ipfw:rules = 100 200 -300; update_time = 1m; limit l1 { limit = 1G; info = "Контроль каждого 1G трафика"; reach { exec "/bin/echo \\"1G правила ${rule} достигнут\\" | mail me"; } expire { expire = 0s; } } threshold t1 { threshold = 500M; threshold_balance = 1:-:1; threshold_deviation = 50M; threshold_time_width = 24h; threshold_time_slice = 15m; info = "Порог в 500M плюс-минус 50M за 24h"; below_threshold { exec "/somewhere/increase_bandwidth ${rule}"; } above_threshold { exec "/somewhere/decrease_bandwidth ${rule}"; } } } .fi .PP Здесь правило имеет один порог и один лимит. .PP Порог позволяет контролировать трафик в 500 Мбайт плюс-минус 50 Мбайт (мы увеличиваем скорость некоторой программой increase_bandwidth и уменьшаем скорость некоторой программой decrease_bandwidth) за 24 часа (это один день, но это не день недели, здесь 24 часа обозначают временной интервал). Время продвижения порога равно 15 минутам, заметьте, что в этом примере порог не будет проверяться каждую минуту (значение параметра \fBupdate_time\fP для правила). .PP Статистика для правил и лимита будет обновляться каждую минуту. Лимит позволяет отправлять email, когда будет использован очередной 1 Гбайт трафика. .PP \fBАктивные и неактивные пороги.\fP .PP Пороги подобно лимитам могут быть активными и неактивными и иметь собственные параметры \fBworktime\fP. Поэтому, для большей информации прочтите соответствующий параграф для лимитов. .PP Чему будет равно значение счётчика порога, когда порог был неактивным и становится активным из-за значения параметра \fBworktime\fP? Первое решение это позволить временному окну порога перемещаться в временном интервале неактивности, второе решение это ``переместить'' временное окно порога через временной интервал неактивности. В первом решении статистика для счётчика порога в временном интервале неактивности равна 0 и значение счётчика порога уменьшается. Во втором решении статистика в временном интервале неактивности игнорируется (она пропускается) и значение счётчика порога не изменятся. .PP Чему будет равно значение счётчика порога когда ipa(8) начинает свою работу и в базе данных уже есть состояние порога? Существует также два решения этой ситуации, как и в предыдущем вопросе. .PP Возможно выбирать решения для выше описанных ситуаций с помощью параметра \fBthreshold_type\fP, его значение равно битам объединённых по ИЛИ (даны в шестнадцатиричной системе счисления): .IP 0x1 переместится через временной интервал, когда ipa(8) не работала (была остановлена); .IP 0x2 переместится через временной интервал, когда порог был неактивным. .PP По умолчанию значение параметра \fBthreshold_type\fP равно 0. Возможные значения этого параметра следующие: 0, 1, 2 и 3 (0x1|0x2). Нормальные значения для этого параметра 0 и 3, значения с установленным только одним битом должны использоваться с осторожностью, так как когда порог инициализируется, он рассматривается как активный (прочтите параграф об инициализации порогов). .PP Этот параметр может быть определён в секции \fBglobal\fP и он будет использован, если какая-то секция \fBthreshold\fP не имеет этого параметра, то его значение будет унаследовано из секции \fBglobal\fP. .PP \fIПример:\fP .PP .nf rule client { ac_list = ipfw; ipfw:rules = 100 200 300; update_time = 1m; threshold t { threshold = 100M; threshold_deviation = 10%; threshold_time_width = 5h; threshold_time_slice = 15m; threshold_type = 3; worktime = M 08:00-21:00 T 08:00-21:00 W 08:00-21:00 H 08:00-21:00 F 08:00-21:00; info = "Порог в 100M плюс-минус 10% за 5h (тип 3)"; below_threshold { exec "/somewhere/increase_bandwidth ${rule}"; } above_threshold { exec "/somewhere/decrease_bandwidth ${rule}"; } } } .fi .PP Предположим, что данное правило это правило для клиента, который имеет доступ в Internet каждый рабочий день с 08:00 до 21:00. Мы разрешаем ему использовать скорость в 100 Мбайт плюс-минус 10% за каждые 5 часов (мы увеличиваем скорость некоторой программой increase_bandwidth и уменьшаем скорость некоторой программой decrease_bandwidth). .PP Предположим, что текущее значение счётчика порога равно 90 Мбайт в 21:00. Когда наступит 08:00 следующего дня по умолчанию текущее значение счётчика порога станет 0 Мбайт, так как в интервале между 21:00 и 08:00 следующего дня содержится по крайней мере один интервал в 5 часов. Здесь мы используем тип порога 3 и временное окно ``переинстится'' с 21:00 в 08:00 и текущее значение счётчика порога останется неизменённым, то есть 90 Мбайт в 08:00 следующего дня. Мы также можем остановить ipa(8) в 21:00 и запустить её снова в 08:00 и временное окно порога также ``переместится'' с 21:00 в 08:00. .PP Если есть несколько клиентов с такими же установками, то в 08:00 ни один из них не сможет интенсивно начать использовать собственную часть общего трафика. .PP \fBСекции startup и shutdown для порога.\fP .PP Порог может иметь собственные секции \fBstartup\fP и \fBshutdown\fP, которые они могут содержать только списки команд. .PP \fBИспользование значение параметра threshold из базы данных.\fP .PP Порог подобно лимиту может иметь параметр \fBload_threshold\fP, который означает тоже самое и используется для той же самой цели. Поэтому, прочтите соответствующий параграф для лимитов для большей информации. .PP \fBИспользование отдельных баз данных для порогов.\fP .PP Подобно лимитам возможно использовать параметр \fBdb_list\fP в секции \fBthreshold\fP и указывать различные списки баз данных для правила и его порога. .PP \fBИнициализация порогов.\fP .PP В отличии от лимитов инициализация порогов очень проста, так как пороги не могут быть достигнутыми или не достигнутыми: ipa(8) получает состояние порога из первой базы данных, которая в состоянии вернуть состояние порога, если база данных не имеет состояния порога, то регистрируется новое состояние со значением параметра \fBthreshold\fP из конфигурационного файла, иначе ipa(8) учитывая значения параметров \fBload_threshold\fP и \fBthreshold_type\fP обновляет состояние порога. Заметьте, что когда порог инициализируется предполагается что он активен, даже если его параметр \fBworktime\fP отмечает этот порог неактивным. Так как статистика порога для временных интервалов не хранится в базе данных, то статистика для временных интервалов инициализируется приблизительно в соответствии с текущим локальным временем, временными отметками порога и значения его счётчика. .PP \fBПороги: ещё раз о порогах.\fP .PP Для улучшения понимания работы порогов ниже приведена временная диаграмма: .PP .nf <-------------- time_width -------------> (t1) |---c1--|---c2--|---c3--|---c4--|---c5--| --> скольжение (t2) |---c2--|---c3--|---c4--|---c5--|---c6--| --> скольжение <-slice-> -----|-------|-------|-------|-------|-------|-------|-------|--> t1 t2 время .fi .PP На этой диаграмме видна статистика порога для временных отметок \fIt1\fP и \fIt2\fP. Вся статистика представляется как сумма \fIci\fP, каждая \fIci\fP равна статистике правила в течении одного интервала времени \fIt2\ \-\ t1\fP. Порог скользит во времени дискретно и его статистика это снимок статистики правила за \fItime_width\fP секунд. .PP \fBДинамические правила и автоправила.\fP .PP Динамические правила генерируются на лету из автоправил специально разработанными модулями учёта. Внутри ipa(8) статические и динамические правила почти неразличимы и любой параметр (кроме параметров \fBac_gather_*\fP) и секция (включая секции \fBlimit\fP и \fBthreshold\fP) в статических правилах могут быть использованы в динамических правилах. .PP Автоправило определяется секцией \fBautorule\fP: .PP .nf autorule <имя-автоправила> { /* Параметры и секции. */ } .fi .PP <Имя-автоправила> не хранится в базе данных, но модуль учёта может использовать это имя для генерирования имён динамических правил, поэтому используйте те же ограничение что и для <имени-правила> для используемой вами базы данных. .PP Динамическое правило похоже на статическое правило. Существует всего два ограничения для автоправил (таким образом и для динамических правил тоже): автоправило может иметь только одну систему учёта в значении параметра \fBac_list\fP и автоправило не может иметь параметров \fBac_gather_*\fP. .PP Конфигурационный файл может иметь несколько автоправил одновременно. Любое автоправило должно иметь по крайней мере параметр \fBac_list\fP с одним элементом в его значении. (Возможно реализовать поддержку нескольких систем учёта для одного автоправила, но это бессмысленно.) Этот элемент в значении параметра \fBac_list\fP определяет систему учёта, которая может создавать и уничтожать динамические правила. Каждый раз когда эта система учёта опрашивает для получения новой статистики (функция \fIac_get_stat\fP в ipa_mod(3)), она имеет шанс создать и/или уничтожить (ранее созданные) динамические правила. Значение параметра \fBupdate_time\fP определяет временной интервал вызовов функции \fIac_get_stat\fP (эта функция может вызываться чаще). .PP Если вы хотите использовать некоторую базу данных для динамических правил, то эта база данных должна поддерживать динамические правила. .PP Если автоправило имеет параметр \fBworktime\fP, то этот параметр используется автоправилом. Динамические правила сгенерированные от этого автоправила наследуют параметр \fBworktime_rule\fP из автоправила как свой параметр \fBworktime\fP. Если в автоправиле нет параметра \fBworktime\fP, то он наследуется из секции \fBglobal\fP. .PP Так как автоправило и его динамические правила могут иметь разные параметры \fBworktime\fP, то возможно неактивное автоправило и активные динамические правила и наоборот. .PP Динамическое правило наследует установки от своего автоправила, если какие-то параметры и секции всё ещё не определены, то они наследуются от подходящей секции \fBrulepat\fP, затем из секции \fBglobal\fP и затем используются установки по умолчанию. .PP Если автоправило имеет секции \fBstartup\fP и \fBshutdown\fP, то эти секции для динамических правил, а не для самого автоправила. Если вам необходимо использовать имя динамического правила в командной строке, то не используйте макропеременную ${rule}, так как она расширяется внутренним парсером конфигурационного файла, вместо этого используйте подстановки командной строке (см. выше). .PP Любое автоправило может иметь пустую секцию \fBstartup\fP или \fBshutdown\fP, в этом случае эта секция не наследуются из подходящей секции \fBrulepat\fP для его динамических правил. .PP Если необходимо использовать различные лимиты и пороги для динамических правил, то определите эти лимиты и пороги в различных секциях \fBrulepat\fP. .PP \fIПример:\fP .PP .nf ac_mod "ipa_atest.so"; db_mod "ipa_db_sdb.so"; global { db_list = sdb; append_time = 1h; } autorule a { ac_list = atest; update_time = 1m; limit 1 { limit = 100M; restart { restart = +W; } reach { exec "/somewhere/stop_traffic.sh %rule%"; exec "/bin/echo \\"%rule%'s limit ${limit} reached\\" | mail admin"; } expire { expire = +M; exec "/somewhere/start_traffic.sh %rule%"; } } } .fi .PP Здесь каждое динамическое правило сгенерированное из автоправила наследует параметр автоправила \fBupdate_time\fP и подобно статическим правилам каждое динамическое правило наследует параметры \fBdb_list\fP и \fBappend_time\fP из секции \fBglobal\fP. Каждое динамическое правило будет иметь один лимит, так как мы не можем использовать макропеременную ${rule} в динамические правилам (на самом деле в автоправилах), то используется подстановка %rule%. Использование макропеременной ${limit} является корректным, так как имя лимита известно для парсера конфигурационного файла. .PP \fBШаблоны правил.\fP .PP Использование шаблонов правил это эффективный метод для разделения общих установок для нескольких правил. Как было сказано раньше, секция \fBglobal\fP позволяет определить общие установки для любых правил, динамические правила могут наследовать установки от своих автоправил. Шаблоны правил позволяют определить общие установки для классов статических и динамических правил. .PP Если какое-то статическое или динамическое правило не имеет какого-то параметра или секции, то оно может наследовать этот параметр или секцию из подходящего шаблона правила. Шаблоны правил определяются в секциях \fBrulepat\fP: .PP .nf rulepat "" { /* Параметры и секции. */ } .fi .PP Каждый шаблон правила поименован регулярным выражением POSIX (расширенный формат). ipa(8), разобрав конфигурационный файл, находит подходящий шаблон правила для каждого статического правила и добавляет неопределённые установки для статического правила из шаблона правила. Аналогично, создав динамическое правило, ipa(8) находит подходящий шаблон правила и добавляет неопределённые установки для динамического правила из шаблона правила. По умолчанию, когда подходящий шаблон правила найден, поиск следующего шаблона правила прекращается. Чтобы продолжить поиск следующих шаблонов правил, установите значение параметра \fBcheck_next_rulepat\fP в ``yes'': .PP .nf check_next_rulepat = ; .fi .PP Этот параметр может быть указан только в секции \fBrulepat\fP и его значение по умолчанию равно ``no''. .PP Любой параметр (кроме параметров \fBac_gather_*\fP) и любая секция (включая секции \fBlimit\fP и \fBthreshold\fP), которая может быть использована в секции \fBrule\fP может быть использована в секции \fBrulepat\fP. .PP Шаблоны правил могут быть указаны в любом месте в конфигурационном файле, важен их порядок, так как их регулярные выражение проверяются в том же самом порядке, в котором расположены шаблоны правил в конфигурационном файле. .PP Модули также могут ожидать параметры и секции в секциях \fBrulepat\fP. .PP \fIПример\fP: .PP .nf ac_mod "ipa_ipfw.so"; db_mod "ipa_db_sdb.so"; global { ac_list = ipfw; db_list = sdb; update_time = 1m; load_limit = yes; sdb:db_group = staff; } rulepat "0${$}" { update_time = 30s; threshold 1 { threshold = 1G; threshold_deviation = 10%; threshold_time_width = 10h; threshold_time_slice = 5m; below_threshold { exec "/somewhere/increase-bandwidth.sh %rule%"; } above_threshold { exec "/somewhere/decrease-bandwidth.sh %rule%"; } } } rulepat "^client" { worktime = M 08:00-20:00 T 08:00-20:00 W 08:00-20:00 H 08:00-20:00 F 08:00-20:00 A 08:00-17:00; } .fi .PP Здесь первая секция \fBrulepat\fP ``ловит'' все правила с нулём в конце их имени (макропеременная ${$} расширяется в одиночный символ `$', а `$' в конце регулярного выражения POSIX обозначает конец строки). Вторая секция \fBrulepat\fP ``ловит'' все правила с подстрокой ``client'' в начале их имён. .PP \fBСбор статистики из нескольких правил.\fP .PP Обычно каждое правило получает статистику от модулей учёта, но иногда необходимо суммировать статистику из нескольких правил и невозможно или слишком трудоёмко дать эту задачу модулям учёта. .PP Параметры \fBac_gather_add\fP и \fBac_gather_sub\fP позволяют получать статистику для одного правила из нескольких правил и добавлять или вычитать эту статистику: .PP .nf rule <имя-правила> { /* Параметры и секции правила. */ ac_gather_add = ""; ac_gather_sub = ""; } .fi .PP Здесь это регулярное выражение POSIX (расширенный формат), если имя какого-то правила соответствует этому регулярному выражению, то его статистика добавляется к статистике правила в котором указаны параметры \fBac_gather_*\fP. Заметьте, что этот параметр также работает с динамическими правилами. Также возможно строить сложные зависимости в этом параметре (см. пример). .PP Этот параметр может быть указан только в секции \fBrule\fP, т.е. он может быть использован только со статическими правилами, но может собирать статистику со статических и динамических правил. .PP Параметр \fBac_list\fP является синхронным по отношению к секции \fBrule\fP: когда некоторое правило обновляется, статистика забирается из каждого модуля учёта, используемого правилом. Параметр \fBac_gather\fP является асинхронным по отношению к секции \fBrule\fP: текущее правило получает статистику из правила соответствующего регулярному выражению параметров \fBac_gather_*\fP только тогда, когда это совпадающее правило само обновляется. .PP Правило, которое имеет параметры \fBac_gather_*\fP, также может иметь параметр \fBac_list\fP. .PP \fIПример:\fP .PP .nf ac_mod "ipa_ipfw.so"; global { ac_list = ipfw; } rule client1 { ipfw:rules = 100 102 104; info = "Статистика для первого клиента"; } rule client2 { ipfw:rules = 200 202 204; info = "Статистика для второго клиента"; /* ac_gather_add = "^clients${$}"; <-- ОШИБКА! */ } rule clients { ac_gather_add = "^client[[:digit:]]+${$}"; info = "Статистика для всех клиентов"; } rule server { ipfw:rules = 1000 1002; info = "Статистика для сервера"; } rule all_stat { ac_gather_add = "(server|clients)${$}"; info = "Статистика для всех в моей LAN"; } rule all_except_client2_stat { ac_gather_add = "^all_stat${$}"; ac_gather_sub = "^client2${$}"; info = "Статистика для всей в моей LAN, кроме client2"; } .fi .PP Здесь у нас шесть правил: client1, client2, clients, server, all_stat и all_except_client2_stat. Правило clients получает статистику из правил client1 и client2. Правило all_stat получает статистику из правил clients и server. И правило all_except_client2_stat получает статистику из правил clients и server исключая статистику от client2. .PP Правило client2 имеет неправильный параметр \fBac_gather_add\fP в комментарии, если бы этот параметр существовал в этом правиле, то мы бы получили зацикливание в зависимости правил: client2->clients->client2... ipa(8) не проверяет зацикливания в зависимостях правил. .PP \fBИспользование программы ipactl(8).\fP .PP Программа ipactl(8) позволяет посылать ipa(8) управляющие команды через Unix domain сокет. Перед тем как использовать эту программу необходимо разрешить её использование установкой значения параметра \fBctl_enable\fP в ``yes'', по умолчанию значение этого параметра равно ``no'': .PP .nf ctl_enable = ; .fi .PP Если значение этого параметра равно ``yes'', то ipa(8) создаст Unix domain сокет и будет готова для приёма управляющих команд на этом сокете. Созданный Unix domain сокет будет иметь владельца, равному пользователю, запустившего ipa(8), права доступа к сокету определяются значением параметра \fBctl_socket_perm\fP. .PP Существует путь к этому Unix domain сокету, заданный по умолчанию (см. вывод команды ``ipactl\ \-h''), но возможно определить путь к Unix domain сокет в параметре \fBctl_socket_path\fP: .PP .nf ctl_socket_path = "/path/to/socket"; .fi .PP По умолчанию ipa(8) ожидает данные из сокета в течение 10 секунд, возможно изменить этот таймаут в параметре \fBctl_timeout\fP: .PP .nf ctl_timeout = <время>; .fi .PP Можно определить права доступа к сокету в параметре \fBctl_socket_perm\fP: .PP .nf ctl_socket_perm = <права>; .fi .PP <Права> это последовательность букв: `\fBu\fP', `\fBg\fP' и `\fBo\fP'. Эти символы определяют кому (пользователю, группе или остальным пользователям) разрешено посылать данные в сокет. Вы можете разрешить посылать данные в сокет остальным пользователям только если ipa(8) понимает следующие параметры. Если этот параметр не задан, то значение по умолчанию этого параметра равно ``u''. .PP ipa(8), запущенная на FreeBSD, способна проверять отправителя сообщений от ipactl(8) (проверьте это в выводе команды ``ipa\ \-v''), поэтому на этой системе необходимо также определять параметры \fBctl_acl_class\fP, \fBctl_dump_acl\fP, \fBctl_freeze_acl\fP, \fBctl_stat_acl\fP и \fBctl_rule_acl\fP. .PP Параметр \fBctl_acl_class\fP определяет класс ACL (список управления доступом): имя ACL с последующим определением ACL. Этот параметр не должен располагаться в какой-либо секции: .PP .nf ctl_acl_class <класс> []; .fi .PP ACL состоит из элементов, разделённых пробелами, каждый элемент имеет имеет следующий формат: .PP [!]<пользователь>|%<группа> .PP Символ `\fB!\fP' обозначает, что доступ запрещён. Символ `\fB%\fP' обозначает, что последующее имя это имя группы. <Пользователь> и <группа> должны быть заданы символьными именами (UID и GID здесь не работают). Элементы в ACL проверяются слева на право. Здесь под ``доступ запрещён'' понимается, что пользователю не разрешено использовать некоторую управляющую команду. Когда прибывает управляющее сообщение, ipa(8) переводит имя пользователя или группы каждого элемента ACL в UID или GID и сравнивает с идентификаторами отправителя сообщения. .PP Параметр \fBctl_dump_acl\fP применяет указанный ACL к команде \fIdump\fP утилиты ipactl(8): .PP .nf ctl_dump_acl <класс>; .fi .PP Параметр \fBctl_freeze_acl\fP применяет указанный ACL к команде \fIfreeze\fP утилиты ipactl(8): .PP .nf ctl_freeze_acl <класс>; .fi .PP Параметр \fBctl_stat_acl\fP применяет ACL для команд \fIstatus\fP и \fImemory\fP утилиты ipactl(8): .PP .nf ctl_stat_acl <класс>; .fi .PP Параметр \fBctl_rule_acl\fP применяет указанный ACL к правилу для команд \fIrestart\fP, \fIexpire\fP, \fIset\fP и \fIstatus\fP утилиты ipactl(8): .PP .nf ctl_rule_acl <класс>; .fi .PP Если ACL не определён и не наследуется, то он воспринимается как пустой ACL, и обозначает, что доступ запрещён для всех. .PP Давайте рассмотрим как использовать все эти параметры на примерах. .PP \fIПример 1:\fP .PP .nf ctl_enable = yes; ctl_socket_perm = ug; .fi .PP В этом примере ipa(8) не знает как получить информацию об отправителе управляющих сообщений программы ipactl(8). Мы разрешили пользователю и группе посылать команды в сокет (это контролируется правами доступа сокета). Из соображений безопасности невозможно разрешить другим пользователям выполнять запись в сокет. .PP \fIПример 2:\fP .PP .nf ctl_enable = yes; ctl_socket_path = "/var/tmp/ipactl.sock"; ctl_timeout = 10s; .fi .PP Здесь мы изменили путь к Unix domain сокету и таймаут. Параметр \fBctl_socket_perm\fP не задан, поэтому используется значение, заданное по умолчанию, равное ``u''. .PP \fIПример 3:\fP .PP .nf ctl_enable = yes; ctl_socket_perm = ugo; ctl_acl_class empty; ctl_acl_class root root; ctl_acl_class admins root !john %wheel; ctl_dump_acl root; global { ctl_rule_acl admins; /* ... */ } rulepat "^vip" { ctl_rule_acl root; /* ... */ } rulepat "^staff" { ctl_rule_acl admins; /* ... */ } rule lan-all { ctl_rule_acl empty; /* ... */ } .fi .PP В этом примере ipa(8) знает как получить информацию об отправителе управляющих сообщений программы ipactl(8), поэтому необходимо воспользоваться параметрами \fBctl_acl_class\fP, \fBctl_dump_acl\fP и \fBctl_acl\fP, также мы в состоянии разрешить в параметре \fBctl_socket_perm\fP остальным пользователям посылать управляющие команды в сокет. Определены три ACL класса: empty, root и admins. .PP \fBЗамораживание работы ipa(8).\fP .PP Иногда необходимо быть уверенным, что ipa(8) ничего не выполняет в течении некоторого промежутка времени. Существуют два параметра, которые позволяют заморозить работу ipa(8). .PP Первый параметр \fBsleep_after_dump\fP позволяет определить период времени, в течении которого ipa(8) должна приостановить свою работу и игнорировать все сигналы после выполнения команды \fIdump\fP от ipactl(8). .PP Второй параметр \fBfreeze_time\fP позволяет определить период времени, в течении которого ipa(8) должна приостановить свою работу и игнорировать все сигналы после получения команды \fIfreeze\fP от ipactl(8). .PP .nf freeze_time = <время>; sleep_after_dump = <время>; .fi .PP Значения этих параметров не должны быть относительно большими, так как существует вероятность того, что какое-то из временных событий будет проверено слишком поздно. .PP Праметры \fBsleep_after_dump\fP и \fBfreeze_time\fP не имеют значений по умолчанию. .PP Эти параметры не должны располагаться в какой-либо секции. .PP \fIПример:\fP .PP .nf freeze_time = 30s sleep_after_dump = 5s; .fi .PP Здесь мы сообщаем ipa(8), что необходимо приостановить свою работу на 5 секунд после получения команды \fIdump\fP, и приостановить свою работу на 30 секунд после получения команды \fIfreeze\fP. Это общий случай: мы отправляем команду \fIdump\fP, например, если мы хотим получить текущую статистику позже, и мы отправляем команду \fIfreeze\fP, чтобы заморозить работу ipa(8) и произвести некоторые изменения в системе. Здесь предполагается, что 30 секунд будет достаточно, чтобы сделать все необходимые изменения в системе. .PP \fBПорядок активных правил.\fP .PP ipa(8) проверяет правила начиная с головы очереди активных правил. Если все правила независимы, то вы не должны беспокоится о их порядке, но если, например, правило r1 должно быть проверено перед правилом r2, то прочтите следующие несколько параграфов. .PP Если нет параметров \fBac_gather_*\fP и нет параметров \fBworktime\fP, то порядок активных правил такой же как и порядок правил в конфигурационном файле. .PP Если есть по крайней мере один \fBac_gather_*\fP параметр, то порядок активных правил изменяется, чтобы последовать зависимостям определённых в параметрах \fBac_gather_*\fP, но если какие-то правила не соответствуют регулярным выражениям определённым в параметрах \fBac_gather_*\fP, то их относительный порядок такой же как и их относительный порядок в конфигурационном файле. .PP Если нет параметров \fBac_gather_*\fP и если есть правила с параметрами \fBworktime\fP, то порядок этих правил может быть изменён. .PP Динамические правила всегда добавляются в начало очереди активных правил, так как динамические правила не могут иметь параметров \fBac_gather_*\fP, но некоторые статические правила могут получать статистику из динамических правил. .PP Если вам необходимо сохранять порядок активных правил таким же как и порядок правил в конфигурационном файле, то установите параметр \fBkeep_rules_order\fP в ``yes'', по умолчанию значение этого параметра равно ``no'': .PP .nf keep_rules_order = ; .fi .PP Будьте осторожны с порядком правил в конфигурационном файле, если у вас есть по крайне мере один параметр \fBac_gather_*\fP и параметр \fBkeep_rules_order\fP установлен в ``yes'': располагайте правила, которые отдают статистику, перед правилами, которые принимают статистику. .PP Лимиты и пороги в одном правиле проверяются в том же самом порядке, в котором они записаны в конфигурационном файле и этот порядок не меняется. .PP Заметьте, что некоторые модули чувствительны к порядку активных правил. .PP Этот параметр не должен располагаться в какой-либо секции. .PP \fIПример:\fP .PP .nf keep_rules_order = yes; .fi .PP Теперь ipa(8) не будет менять порядок активных правил. .PP \fBОтладка.\fP .PP Иногда необходимо определить почему что-то идёт не так как должно было быть. Существует несколько параметров, которые могут быть использованы для отладки ipa(8): \fBdebug_ac_null\fP\ \ \ \ \-\ сообщать об использовании системы учёта \fInull\fP (отдельно, 1); .br \fBdebug_db_null\fP\ \ \ \ \-\ сообщать об использовании базы данных \fInull\fP (отдельно, 1); .br \fBdebug_time\fP\ \ \ \ \ \ \ \-\ отладка различных временных событий (отдельно, 2); .br \fBdebug_worktime\fP\ \ \ \-\ отладка параметров \fBworktime\fP (отдельно, 1); .br \fBdebug_exec\fP\ \ \ \ \ \ \ \-\ отладка параметров \fBexec\fP (правило, 1); .br \fBdebug_autorule\fP\ \ \ \-\ отладка автоправил (отдельно, 1); .br \fBdebug_limit\fP\ \ \ \ \ \ \-\ отладка событий лимитов (правило, 1); .br \fBdebug_limit_init\fP\ \-\ давать больше информации о инициализации лимитов (правило, 1); .br \fBdebug_threshold\fP\ \ \-\ отладка событий порогов (правило, 1); .br \fBdebug_threshold_init\fP\ \-\ давать больше информации о инициализации порогов (правило, 1). .PP Каждый параметр отладки принимает уровень отладки как аргумент, максимальный уровень отладки для каждого параметра определён как номер в скобках. Если в скобках есть слово ``отдельно'', то этот параметр должен располагаться отдельно, если в скобках есть слово ``правило'', то этот параметр может быть указан в секциях \fBglobal\fP, \fBrule\fP, \fBrulepat\fP и \fBautorule\fP. .PP По умолчанию отладка отключена. .PP \fIПример:\fP .PP .nf debug_worktime = 1; debug { debug_limit_init = 1; } .fi .PP В этом примере в лог-файл будет посылаться детальная информация о интервалах параметров \fBworktime\fP и об инициализации лимитов для всех правил. .SH ФАЙЛЫ ipa.conf .PP (запустите \fBipa\fP с ключём \fB-h\fP, чтобы увидеть путевое имя конфигурационного файла, используемое по умолчанию) .SH ДРУГИЕ ИСТОЧНИКИ ipa(8), ipactl(8), ipastat(8), ipastat.conf(5), ipa_mod(3) .SH АВТОР Andrey\ Simonenko\ .SH НЕДОРАБОТКИ Если вы обнаружите какие-либо ошибки, то, пожалуйста, сообщите мне по email.