inetd


Всеволожское такси - народное такси www.taxi46600.ru.

Демон inetd(8) обслуживает подключения к тем демонам, услуги которых запрашиваются сравнительно редко. В большинстве систем нет устойчивого потока входящих запросов FTP — тогда зачем нам постоянно работающий демон FTP? Вместо этого за прослушивание порта FTP отвечает inetd. Когда поступает запрос FTP, inetd(8) запускает сервер FTP и передает запрос ему. Из других программ, опирающихся на inetd, можно назвать telnet, tftp и РОРЗ.

Кроме того, inetd обслуживает функции, настолько скромные и редко применяемые, что их легче реализовать в inetd, нежели выделять для них отдельные программы. К таким функциям относятся discard (выполняет дамп данных, поступивших в «черную дыру» /dev/null), chargen (генерирует поток символов) и т. д. В наше время большинство этих служб не нужны и отключены по умолчанию, но при необходимости их можно активизировать.

inetd(8) и безопасность

Некоторые системные администраторы представляют себе inetd(8) как отдельную службу с единой конфигурацией параметров безопасности. Другие утверждают, что inetd(8) не может похвастаться высоким уровнем безопасности. И те и другие ошибаются. Собственно демон inetd(8) безопасен, но он принимает на себя часть вины тех программ, которым он передает запросы. Некоторые службы, работающие благодаря inetd (такие как ftp и telnet), небезопасны от природы, у других было трудное детство и они заслужили дурную репутацию (например, qpopper). Поступайте с демоном inetd(8) как с любой другой сетевой службой: запускайте его только при необходимости и проверяйте, что с его помощью запускаются только надежные и безопасные программы!

/etc/inetd.conf

Рассмотрим файл /etc/inetd.conf. У большинства демонов есть отдельные конфигурации для IPv4 и IPv6. Таким образом, если вы не работаете с IPv6, все записи IPv6 можно игнорировать. Обратимся к одной из строк этого файла, задающей конфигурацию сервера FTP:

Первое поле (1) — это имя сервиса. Оно должно соответствовать имени в /etc/services. По имени сервиса демон inetd определяет, какой порт TCP или UDP открыть. Если необходимо изменить порт TCP для сервера FTP, следует изменить номер порта FTP в файле /etc/services. (Можно было бы также изменить первое поле, подставив в него имя службы, которая по умолчанию ассоциируется с желаемым номером порта, но я считаю, что от этого пострадает наглядность конфигурационного файла.)

Второе поле (2) — тип сокета. Все соединения TCP имеют тип stream, а соединения UDP — тип dgram. Есть и другие возможные значения, однако их применение либо означает такое требование в документации той или иной программы, либо наверняка является ошибкой.

Третье поле (3) — протокол. Это может быть tcp (IPv4 TCP), udp (IPv4 UDP), tcp6 (IPv6 TCP) или udp6 (IPv6 UDP). Если ваш сервер принимает обе разновидности соединений — IPv4 и IPv6, применяйте значение udp46 или tcp46.

Следующее поле (4) указывает, должен inetd ждать, пока определенный сервер примет соединение, или запустить соответствующую программу и откланяться. Как правило, программы TCP используют nowait, а программам UDP необходимо значение wait. (Из этого правила есть исключения, но они встречаются крайне редко.) Для каждого входящего соединения inetd(8) запускает новый экземпляр сетевого демона. Если сервис применяет nowait, то можно задать максимальное количество соединений в секунду, которые разрешено обслуживать серверу. Для этого сразу после nowait надо добавить косую черту (слэш) и соответствующее число, например nowait/5. Один из способов, которым злоумышленники (обычно — детки со скриптами) пытаются поставить интернет-сервер на колени, как раз заключается в том, чтобы послать запросов на соединение больше, чем сможет обработать сервер, а ограничение числа входящих соединений поможет остановить такие атаки. С другой стороны, это означает, что злоумышленник сможет воспрепятствовать другим пользоваться службой. Внимательно выбирайте противоядие!

Следующее поле (5) сообщает, от чьего имени запускается демон. Сервер FTP ftpd(8) работает с привилегиями пользователя root, так как он должен обслуживать запросы от многих системных пользователей, хотя другие серверы могут запускаться от имени специальных, выделенных пользователей.

Шестое поле (6) — полный путь к программе, которую inetd запускает, получив запрос на соединение. Если это сервис, включенный в состав inetd, будет указано internal.

Последнее поле (7) задает команду, запускающую внешнюю программу, и необходимые ключи командной строки.

Конфигурирование серверов в inetd

Файлу /etc/inetd.conf, похоже, нужно много информации, однако для добавления той или иной программы достаточно скопировать существующую строку и незначительно ее изменить. Например, рассмотрим реализацию простейшего сетевого сервиса Quote of the Day (qotd, цитата дня). Когда вы подключаетесь к порту qotd, сервер возвращает случайную цитату и разрывает соединение. В состав коллекции игр FreeBSD входит генератор случайных цитат fortune(1). Такой генератор — это все, что нужно для реализации сетевой программы на базе inetd. Мы должны указать номер порта, сетевой протокол, имя пользователя, путь и командную строку.

Номер порта

В /etc/services для службы qotd определен порт 17.

Сетевой протокол

Поскольку сервис qotd подразумевает обращение к сетевому порту и получение информации в ответ, это TCP-сервис. Не забывайте, что протокол не ориентирован на установление соединений — он не предполагает возврат ответа. Следовательно, в конфигурации inetd нужно указать протокол tcp, что в свою очередь означает необходимость выбора режима nowait в четвертом поле записи.

Пользователь

В идеальном случае следовало бы создать отдельную непривилегированную учетную запись для запуска службы qotd, как это делается для таких служб, как pop или proxy. В данном примере мы будем использовать непривилегированную учетную запись nobody, но если вы предполагаете реализовать эту службу на рабочем сервере, обязательно создайте непривилегированную учетную запись qotd.

Путь

Программа fortune находится в каталоге /usr/games/fortune.

Запуск команды

Программа fortune(6) не требует дополнительных аргументов командной строки, но при необходимости вы можете их использовать. Поклонники законов Мерфи могут использовать команду fortune murphy, фанаты сериала «Звездный путь» («Star trek») могут получать цитаты командой fortune startrek. (Последняя команда генерирует цитаты только из самого первого сериала «Звездный путь», а не из последующих продолжений.) Я использую команду fortune -o, и любой, кто соединяется с моим сервером, получает то, что заслужил.

Пример конфигурации inetd.conf

Собрав все сведения вместе, получим следующую строку для файла /etc/inetd.conf:

qotd stream tcp nowait nobody /usr/games/fortune fortune

Этот пример тривиален, однако запуск других служб из inetd(8) выполняется ничуть не сложнее.

Запуск inetd(8)

Для начала необходимо разрешить запуск демона inetd(8) на этапе загрузки. Для этого следует добавить в /etc/rc.conf следующую строку:

inetd_enable=YES

Выполнив эту настройку, можно запустить inetd вручную с помощью команды /etc/rc.d/inetd start. Теперь, когда inetd запущен, попробуйте с помощью команды telnet подключиться к порту 17 и проверить работу службы qotd:

Служба работает! Здесь мы сначала получили привычную информацию о соединении TCP/IP (1), а затем случайную фразу, сгенерированную программой fortune (2). (Кроме того, теперь вы знаете, почему я не пишу сценарии для телевидения.)

Изменение поведения inetd

Поведение inetd определяется набором ключей, используемых при его запуске. По умолчанию ключи активизируют TCP Wrappers в соответствии с настройками в /etc/hosts.allow (глава 9). Некоторые ключи представлены в таблице 15.2.

Таблица 15.2. Ключи inetd

Ключ Описание
-l Протоколирует все успешные соединения.
-c Устанавливает максимальное количество подключений в секунду, которые может обслуживать любой сервис. По умолчанию количество не ограничено. Заметим, что «не ограничено» не означает «бесконечно много»: количество подключений определяется возможностями аппаратных средств.
-C Устанавливает максимальное количество подключений к сервису в минуту, выполняемых с одного удаленного IP-адреса. По умолчанию количество не ограничено, но введение такого ограничения не позволит отдельным лицам монополизировать всю полосу пропускания.
-R Устанавливает максимальное количество запусков одного сервиса в минуту. Значение по умолчанию — 256. Если задать -R 0, будет разрешено неограниченное количество подключений к каждому сервису.
-a Задает IP-адрес, к которому привязан inetd, обычно прослушивающий все доступные IP-адреса.
-w Применяет TCP Wrappers для внешних служб в соответствии с настройками в hosts.allow (глава 9).
-W Применяет TCP Wrappers для внутренних служб в соответствии с настройками в hosts.allow (глава 9).

Рассмотрим пример. Если вы хотите применять TCP Wrappers, разрешить только два соединения в секунду с одного хоста и неограниченное количество обращений к службе в минуту, а также прослушивать только один IP-адрес 192.168.1.2, укажите следующие ключи в файле /etc/rc.conf:

inetd_flags="-Ww -с 2 -R 0 -а 192.168.1.2"

Возможности inetd(8) позволяют превратить в сетевую службу практически любое программное обеспечение.

Комментарии запрещены.