inetd(8) иногда называют также ''супер-сервером Интернет'', потому что он управляет соединениями к многим сервисам. Когда inetd принимает соединение, он определяет, для какой программы предназначено соединение, запускает соответствующий процесс и предоставляет ему сокет, ссылка на который передается процессу в качестве стандартных устройств ввода, вывода и сообщения об ошибках. Для не слишком нагруженных серверов запуск через inetd может уменьшить общую нагрузку на систему по сравнению с запуском каждого даемона индивидуально в выделенном режиме.
В первую очередь inetd используется для вызова других даемонов, но несколько простых протоколов, таких, как chargen, auth и daytime, обслуживаются непосредственно.
Этот раздел посвящен основам настройки inetd посредством его параметров командной строки и его конфигурационного файла, /etc/inetd.conf.
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 могут быть переданы различные параметры командной строки.
Как и большинство даемонов, для 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 раз в минуту.
Несмотря на то, что ниже по тексту мы упоминаем опции ограничения частоты обращения к службам (rate-limiting), в большинстве случаев начинающим пользователям нет необходимости менять эти параметры. Эти опции могут стать полезными в том случае, если вы обнаружите, что ваша система принимает чрезмерное количество соединений. Полный список опций можно найти на странице справочника inetd(8).
Определение максимального числа одновременных запусков каждой службы; по
умолчание не ограничено. Может быть переопределено индивидуально для каждой службы
при помощи параметра max-child
.
Определение по умолчанию максимального количества раз, которое служба может быть
вызвана с одного IP-адреса в минуту; по умолчанию не ограничено. Может быть
переопределено для каждой службы параметром max-connections-per-ip-per-minute
.
Определяет максимальное количество раз, которое служба может быть вызвана в минуту; по умолчанию 256. Частота, равная 0, не ограничивает число вызовов.
Задает максимальное количество процессов, одновременно обслуживающих один сервис
для одного IP-адреса; по умолчанию не ограничено. Может переопределяться для каждой
службы параметром max-child-per-ip
.
Настройка inetd производится через файл /etc/inetd.conf.
Если в файле /etc/inetd.conf делались изменения, то inetd можно заставить считать его конфигурационный файл повторно посредством команды
В каждой строке конфигурационного файла описывается отдельный даемон. Комментариям в файле предшествует знак ''#''. Строки в файле /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
Это имя сервиса, предоставляемого конкретным даемоном. Оно должно соответствовать сервису, указанному в файле /etc/services. Здесь определяется, какой порт должен обслуживать inetd. При создании нового сервиса он должен помещаться сначала в файл /etc/services.
stream, dgram, raw либо seqpacket. stream должен использоваться для ориентированных на соединение даемонов TCP, когда как dgram используется для даемонов, использующих транспортный протокол UDP.
Одно из следующих:
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.
Это имя пользователя, под которым должен работать соответствующий даемон. Чаще всего даемоны работают как пользователь root. Для обеспечения безопасности некоторые серверы запускаются как пользователь daemon или как пользователь с минимальными правами nobody.
Полный маршрут к даемону, который будет выполняться при установлении соединения.
Если даемон является сервисом, предоставляемым самим inetd, то нужно задать ключевое слово internal
.
Этот параметр работает вместе с параметром server-program
, задавая параметры, начиная с argv[0], передаваемые даемону при запуске. Если в командной
строке задано mydaemon -d, то mydaemon -d будет являться значением для server-program-arguments
. И снова, если даемон является
внутренней службой, то здесь нужно использовать internal
.
В зависимости от выбранных при установке параметров, многие из служб 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.
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>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.