Руководство FreeBSD
Пред. | Глава 26. Сетевые серверы | След.

# 26.2. ''Супер-сервер'' inetd

Текст предоставил Chern Lee. Обновлено для FreeBSD 6.1-RELEASEПроект документации FreeBSD.

## 26.2.1. Обзор

inetd(8) иногда называют также ''супер-сервером Интернет'', потому что он управляет соединениями к многим сервисам. Когда inetd принимает соединение, он определяет, для какой программы предназначено соединение, запускает соответствующий процесс и предоставляет ему сокет, ссылка на который передается процессу в качестве стандартных устройств ввода, вывода и сообщения об ошибках. Для не слишком нагруженных серверов запуск через inetd может уменьшить общую нагрузку на систему по сравнению с запуском каждого даемона индивидуально в выделенном режиме.

В первую очередь inetd используется для вызова других даемонов, но несколько простых протоколов, таких, как chargen, auth и daytime, обслуживаются непосредственно.

Этот раздел посвящен основам настройки inetd посредством его параметров командной строки и его конфигурационного файла, `/etc/inetd.conf`.

## 26.2.2. Настройки

inetd инициализируется посредством системы rc(8). Параметр `inetd_enable` по умолчанию установлен в `NO`, однако может быть включен утилитой sysinstall в процессе установки. Указание

    inetd_enable="YES"

или

    inetd_enable="NO"

в файле `/etc/rc.conf` разрешит или запретит запуск inetd во время загрузки. Команда

    /etc/rc.d/inetd rcvar

покажет текущие установки переменных, относящихся к inetd.

Кроме того, через `inetd_flags` даемону inetd могут быть переданы различные параметры командной строки.

## 26.2.3. Параметры командной строки

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

`inetd` `[-d] [-l] [-w] [-W] [-c maximum] [-C rate] [-a address | hostname] [-p filename] [-R rate] [-s maximum] [configuration file]`

Опции могут передаваться inetd при помощи переменной `inetd_flags` файла `/etc/rc.conf`. По умолчанию переменная `inetd_flags` установлена в `-wW -C 60`, то есть включает обработку TCP wrapping и запрещает обращаться с одного IP-адреса к сервису более чем 60 раз в минуту.

Начинающих пользователей порадует отсутствие необходимости менять эти параметры в стандартных случаях. Тем не менее, мы остановимся на опциях, ограничивающих количество и частоту соединений, поскольку они могут быть полезны для исключения массированных атак. Полный список опций можно найти на странице справочника inetd(8).

-c maximum

  Определение максимального числа одновременных запусков каждой службы; по умолчание не ограничено. Может быть переопределено индивидуально для каждой службы при помощи параметра `max-child`.

-C rate

  Определение по умолчанию максимального количества раз, которое служба может быть вызвана с одного IP-адреса в минуту; по умолчанию не ограничено. Может быть переопределено для каждой службы параметром `max-connections-per-ip-per-minute`.

-R rate

  Определяет максимальное количество раз, которое служба может быть вызвана в минуту; по умолчанию 256. Частота, равная 0, не ограничивает число вызовов.

-s maximum

  Задает максимальное количество процессов, одновременно обслуживающих один сервис для одного IP-адреса; по умолчанию не ограничено. Может переопределяться для каждой службы параметром `max-child-per-ip`.

## 26.2.4. `inetd.conf`

Настройка inetd производится через файл `/etc/inetd.conf`.

Если в файле `/etc/inetd.conf` делались изменения, то inetd можно заставить считать его конфигурационный файл повторно посредством команды

Пример 26-1. Перезагрузка конфигурационного файла inetd

    # /etc/rc.d/inetd reload

В каждой строке конфигурационного файла описывается отдельный даемон. Комментариям в файле предшествует знак ''#''. Строки в файле `/etc/inetd.conf` имеют такой формат:

    service-name
    socket-type
    protocol
    {wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]
    user[:group][/login-class]
    server-program
    server-program-arguments

Пример записи для даемона ftpd(8), использующего IPv4:

    ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l

service-name

  Это имя сервиса, предоставляемого конкретным даемоном. Оно должно соответствовать сервису, указанному в файле `/etc/services`. Здесь определяется, какой порт должен обслуживать inetd. При создании нового сервиса он должен помещаться сначала в файл `/etc/services`.

socket-type

  `stream`, `dgram`, `raw` либо `seqpacket`. `stream` должен использоваться для ориентированных на соединение даемонов TCP, когда как `dgram` используется для даемонов, использующих транспортный протокол UDP.

protocol

  Одно из следующих:

  Протокол | Описание
  --- | ---
  tcp, tcp4 | TCP IPv4
  udp, udp4 | UDP IPv4
  tcp6 | TCP IPv6
  udp6 | UDP IPv6
  tcp46 | TCP как для IPv4, так и для v6
  udp46 | UDP как для IPv4, так и для v6

{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]

  `wait|nowait` определяет, может ли даемон, вызванный из inetd, работать с собственным сокетом, или нет. Сокеты типа `dgram` должны использовать параметр `wait`, когда как даемоны с потоковыми сокетами, которые обычно многопоточны, должны использовать `nowait`. `wait` обычно передает много сокетов одному даемону, когда как `nowait` порождает даемон для каждого нового сокета.

  Максимальное число порожденных даемонов, которых может создать inetd, может быть задано параметром `max-child`. Если нужно ограничение в десять экземпляров некоторого даемона, то после параметра `nowait` нужно задать `/10`. При задании `/0` ограничения на количество экземпляров снимаются.

  Кроме `max-child`, могут быть задействованы два других параметра, ограничивающих максимальное число соединений от одного источника. `max-connections-per-ip-per-minute` ограничивает количество соединений от одного IP-адреса в течение минуты, так что значение, равное десяти, будет ограничивать любой заданный IP-адрес на выполнение десяти попыток подключения к некоторому сервису в минуту. Параметр `max-child-per-ip` ограничивает количество дочерних процессов, которые могут быть одновременно задействованы на обслуживание одного IP-адреса. Эти опции полезны для предотвращения намеренного или ненамеренного расходования ресурсов и атак типа Denial of Service (DoS) на машину.

  В этом поле одно из значений `wait` или `nowait` обязательны. `max-child`, `max-connections-per-ip-per-minute` и `max-child-per-ip` опциональны.

  Многопоточный даемон типа stream без ограничений `max-child`, `max-connections-per-ip-per-minute` или `max-child-per-ip` будет определен просто как `nowait`.

  Тот же самый даемон с ограничением в максимум десять даемонов будет определен так: `nowait/10`.

  Та же конфигурация с ограничением в двадцать соединений на IP-адрес в минуту и общим ограничением в максимум десять порожденных даемонов выглядит так: `nowait/10/20`.

  Эти параметры, используемые все со значениями по умолчанию даемоном fingerd(8), имеют такой вид:

      finger stream  tcp     nowait/3/10 nobody /usr/libexec/fingerd fingerd -s

  Наконец, пример, описывающий ограничение на 100 даемонов в целом, при этом не более чем по 5 на один IP-адрес, будет выглядеть так: `nowait/100/0/5`.

user

  Это имя пользователя, под которым должен работать соответствующий даемон. Чаще всего даемоны работают как пользователь `root`. Для обеспечения безопасности некоторые серверы запускаются как пользователь `daemon` или как пользователь с минимальными правами `nobody`.

server-program

  Полный маршрут к даемону, который будет выполняться при установлении соединения. Если даемон является сервисом, предоставляемым самим inetd, то нужно задать ключевое слово `internal`.

server-program-arguments

  Этот параметр работает вместе с параметром `server-program`, задавая параметры, начиная с `argv[0]`, передаваемые даемону при запуске. Если в командной строке задано `mydaemon -d`, то `mydaemon -d` будет являться значением для `server-program-arguments`. И снова, если даемон является внутренней службой, то здесь нужно использовать `internal`.

## 26.2.5. Безопасность

В зависимости от выбранных при установке параметров, многие из служб inetd могут оказаться по умолчанию включенными. Если нет особой нужды в некотором даемоне, подумайте, не стоит ли его выключить? Поместите знак ''#'' перед ненужным даемоном в `/etc/inetd.conf` и пошлите сигнал для inetd. Некоторые даемоны, такие, как fingerd, вообще нежелательны, потому что они дают информацию, которая может оказаться полезной атакующему.

Некоторые даемоны не заботятся о безопасности и имеют большие тайм-ауты для соединений или вообще их не имеют. Это позволяет атакующему неспешно устанавливать соединения к конкретному даемону, истощая имеющиеся ресурсы. Может оказаться полезным задать для некоторых даемонов ограничения `max-connections-per-ip-per-minute`, `max-child` и `max-child-per-ip`, особенно если вы обнаружите слишком большое число соединений.

По умолчанию механизм TCP wrapping включен. Обратитесь к справочной странице по hosts_access(5) для получения более подробной информации о задании ограничений TCP для различных даемонов, запускаемых посредством inetd.

## 26.2.6. Разное

daytime, time, echo, discard, chargen и auth все являются услугами, предоставляемыми самим inetd.

Сервис auth предоставляет идентификационные сетевые услуги и поддается настройке; прочие сервисы ненастраиваемы.

Обратитесь к справочной странице по inetd(8) для получения более подробной информации.

Пред. | Начало | След.
Сетевые серверы | Уровень выше | Network File System (NFS)

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.