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.
Одно из следующих:
Протокол | Описание |
---|---|
tcp, tcp4 | TCP IPv4 |
udp, udp4 | UDP IPv4 |
tcp6 | TCP IPv6 |
udp6 | UDP IPv6 |
tcp46 | TCP как для IPv4, так и для v6 |
udp46 | UDP как для IPv4, так и для v6 |
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) для получения более подробной информации.
Этот, и другие документы, могут быть скачаны с https://download.freebsd.org/ftp/doc/.
По вопросам, связанным с FreeBSD, прочитайте
документацию прежде чем писать в
<questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите в рассылку
<doc@FreeBSD.org>.