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>.