inetd ( internet service d aemon) — это суперсерверный демон на многих системах Unix , который предоставляет интернет -услуги. Для каждой настроенной услуги он прослушивает запросы от подключающихся клиентов. Запросы обслуживаются путем создания процесса, который запускает соответствующий исполняемый файл, но простые службы, такие как echo, обслуживаются самим inetd. Внешние исполняемые файлы, которые запускаются по запросу, могут быть одно- или многопоточными . Впервые появившись в 4.3BSD , [1] он обычно располагается в . inetd основан на шаблоне активатора (службы) [2] /usr/sbin/inetd
Часто называемый суперсервером , inetd прослушивает назначенные порты, используемые интернет-сервисами, такими как FTP , POP3 и telnet . Когда пакет TCP или UDP приходит с определенным номером порта назначения, inetd запускает соответствующую серверную программу для обработки соединения. Для сервисов, которые не должны работать с высокими нагрузками, этот метод использует память более эффективно, поскольку определенные серверы запускаются только при необходимости. Кроме того, в режиме управления сервисами inetd "nowait" сетевой код не требуется в программах, специфичных для сервисов, поскольку inetd подключает сетевой поток непосредственно к stdin и stdout порожденного процесса. Для протоколов с частым трафиком, таких как HTTP и POP3, может быть предпочтительнее либо режим работы inetd "wait", либо выделенный сервер, который перехватывает трафик напрямую.
Список служб, которые будут обслуживаться, обычно указан в файле конфигурации /etc/inetd.conf
. Графический интерфейс пользователя для управления файлом конфигурации является дополнительным аксессуаром. Демону может потребоваться сигнал для повторного считывания его конфигурации. Например, telnet можно настроить следующим образом (строка взята с машины под управлением AIX версии 5.1):
telnet поток tcp6 nowait root /usr/sbin/telnetd telnetd -a
Первое слово, telnet
, является официальным названием сервиса. Оно разрешается с помощью системной базы данных для сопоставления номеров портов и протоколов с названиями сервисов. В этом случае /etc/services
должно содержать:
телнет 23/tcp
Второе и третье слова описывают тип сокета и базовый протокол соответственно. /etc/protocols
Проводится консультирование по базе данных.
Четвертое слово — переключатель wait/nowait. Однопоточный сервер ожидает, что inetd будет ждать, пока не закончит чтение всех данных. В противном случае inetd позволяет серверу работать и порождает новые параллельные процессы для новых запросов.
Пятое слово — имя пользователя из /etc/passwd
базы данных, от имени которого должна запускаться служебная программа.
Наконец, задаются путь и аргументы внешней программы. Как обычно, первым аргументом является имя программы. В этом примере inetd сообщается о необходимости запустить программу /usr/sbin/telnetd
с аргументами командной строки telnetd -a
. inetd автоматически подключает сокет к stdin, stdout и stderr серверной программы.
Обычно TCP-сокеты обрабатываются путем создания отдельного сервера для обработки каждого соединения одновременно. UDP-сокеты обычно обрабатываются одним экземпляром сервера, который обрабатывает все пакеты на этом порту.
Некоторые простые службы, такие как echo , обрабатываются непосредственно inetd, без создания внешнего сервера.
Это простая служба inetd, написанная на C. Она ожидает аргумент командной строки, содержащий имя файла журнала, а затем записывает все строки, отправленные через сокет, в файл журнала. Обратите внимание, что это очень небезопасный пример программы.
#include <stdio.h> #include <stdlib.h> int main ( int argc , char ** argv ) { const char * fn = argv [ 1 ]; ФАЙЛ * fp = fopen ( fn , "a+" ); if ( fp == NULL ) exit ( EXIT_FAILURE ); char str [ 4096 ]; /* inetd передает нам свою информацию в stdin. */ while ( fgets ( str , sizeof str , stdin )) { fputs ( str , fp ); fflush ( fp ); } fclose ( fp ); return 0 ; }
В примере используются функции stdio , и он реагирует на сетевой трафик, поступающий на stdin. В этом случае мы хотим, чтобы все сообщения регистрировались в одном файле, поэтому нам нужен только один экземпляр службы, работающий для обслуживания всех запросов. Это означает, что правильным протоколом для использования является UDP. Во-первых, необходимо выбрать неиспользуемый номер порта. В этом примере будет использоваться 9999. Запись /etc/services
будет выглядеть следующим образом:
errorLogger 9999/udp
И запись /etc/inetd.conf
будет выглядеть так:
errorLogger dgram udp wait root /usr/local/bin/errlogd errlogd /tmp/logfile.txt
Это говорит inetd запустить /usr/local/bin/errlogd
программу с командной строкой: errlogd /tmp/logfile.txt
(см. страницу man inetd.conf для получения информации о других аргументах). Первый аргумент содержит имя файла, которое будет использоваться для файла журнала: /tmp/logfile.txt
. inetd запустит службу при необходимости и присоединит порт 9999 к потокам ввода и вывода, и все строки, отправленные на этот порт, будут записаны в файл. Указание wait говорит inetd использовать только один экземпляр сервера для обработки всех запросов.
Примечание: функциональность приведенного выше примера обычно реализуется с помощью syslog и такого процесса, как syslogd. syslogd обычно запускается параллельно с inetd, а не как служба inetd.
В последние годы из-за ограничений безопасности в оригинальном дизайне inetd во многих системах он был заменен на xinetd , rlinetd, ucspi-tcp и другие. Дистрибутивы Linux особенно имеют много опций, а Mac OS X (начиная с Mac OS X v10.2 ) использует xinetd . Начиная с версии Mac OS X v10.4 , Apple объединила функциональность inetd в launchd .
Службы, предоставляемые inetd, могут быть полностью опущены. Это становится все более распространенным, когда машины предназначены для одной функции. Например, HTTP-сервер может быть настроен на запуск только httpd и не иметь других открытых портов. Выделенный брандмауэр может не иметь запущенных служб.
systemd поддерживает службы inetd и расширяет активацию сокетов за пределы IP-сообщений ( AF INET +6), включая AF UNIX , AF NETLINK и другие. [3] [4]
Хотя концепция inetd как диспетчера служб изначально не является небезопасной, длинный список служб, которые традиционно предоставлял inetd, заставил экспертов по компьютерной безопасности задуматься. Необходимо было рассмотреть возможность наличия у службы уязвимости, которую можно эксплуатировать, или просто злоупотребления службой. Отключение ненужных служб и «выключение по умолчанию» стали мантрой. Нередко можно найти в современном дистрибутиве Unix /etc/inetd.conf
почти все службы закомментированы .