Inetd ( я NTER чистый сервис d aemon) является супер-сервер - демон на многих Unix - систем , что обеспечивает интернет - услуги. Для каждой настроенной службы он прослушивает запросы от подключающихся клиентов. Запросы обслуживаются путем порождения процесса, который запускает соответствующий исполняемый файл, но простые службы, такие как echo , обслуживаются самим inetd. Внешние исполняемые файлы, запускаемые по запросу, могут быть однопоточными или многопоточными. Во- первых появляется в 4.3BSD , [1] , что , как правило , расположен в /usr/sbin/inetd
.
Функция
Часто называемый суперсервером , inetd прослушивает выделенные порты, используемые интернет-службами, такими как FTP , POP3 и telnet . Когда приходит пакет TCP или UDP с определенным номером порта назначения, inetd запускает соответствующую серверную программу для обработки соединения. Для служб, которые не должны работать с высокими нагрузками, этот метод использует память более эффективно, поскольку определенные серверы запускаются только при необходимости. Более того, в режиме управления сервисом inetd "nowait" сетевой код не требуется в программах для конкретных сервисов, поскольку inetd перехватывает сетевой поток непосредственно на stdin и stdout порожденного процесса. Для протоколов с частым трафиком, таких как HTTP и POP3, предпочтительным может быть либо режим ожидания inetd, либо выделенный сервер, который перехватывает трафик напрямую.
Настраивать
Список сервисов, которые будут обслуживаться, обычно указывается в файле конфигурации /etc/inetd.conf
. GUI для управления файлом конфигурации является дополнительным аксессуаром. Демону может потребоваться сигнал, чтобы перечитать свою конфигурацию. Например, telnet можно настроить следующим образом (строка взята с машины с AIX версии 5.1):
telnet stream tcp6 nowait root / usr / sbin / telnetd telnetd -a
Первое слово, telnet
это официальное название службы. Это разрешается с помощью системной базы данных для сопоставления номеров портов и протоколов с именами служб. В этом случае /etc/services
должны содержаться:
Telnet 23 / TCP
Второе и третье слова описывают тип сокета и базовый протокол соответственно. С /etc/protocols
базой данных консультируются.
Четвертое слово - это переключатель «ждать / сейчас». Однопоточный сервер ожидает, что inetd дождется завершения чтения всех данных. В противном случае inetd позволяет серверу запускаться и запускать новые параллельные процессы для новых запросов.
Пятое слово - это имя пользователя из /etc/passwd
базы данных, от имени которого должна работать служебная программа.
Наконец, указывается путь и аргументы внешней программы. Как обычно, первым аргументом является название программы. В этом примере inetd предлагается запустить программу /usr/sbin/telnetd
с аргументами командной строки telnetd -a
. inetd автоматически подключает сокет к stdin, stdout и stderr серверной программы.
Обычно сокеты TCP обрабатываются путем создания отдельного сервера для одновременной обработки каждого соединения. Сокеты UDP обычно обрабатываются одним экземпляром сервера, который обрабатывает все пакеты на этом порту.
Некоторые простые службы, такие как echo , обрабатываются непосредственно inetd, без создания внешнего сервера.
Создание службы inetd
Это простой сервис Inetd, написанный на C . Он ожидает аргумент командной строки, содержащий имя файла для файла журнала, а затем регистрирует все строки, отправленные через сокет, в файл журнала. Обратите внимание, что это очень небезопасный пример программы.
#include #include int main ( int argc , char ** argv ) { const char * fn = argv [ 1 ]; ФАЙЛ * fp = fopen ( fn , «а +» ); если ( fp == NULL ) выход ( EXIT_FAILURE ); char str [ 4096 ]; / * inetd передает нам свою информацию в stdin. * / while ( fgets ( str , sizeof str , stdin )) { fputs ( str , fp ); fflush ( fp ); } fclose ( fp ); возврат 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
(см. Справочную страницу inetd.conf для получения информации о других аргументах). Первый аргумент содержит имя файла , который будет использоваться для файла журнала: /tmp/logfile.txt
. inetd запустит службу при необходимости и подключит порт 9999 к потокам ввода и вывода, и все строки, отправленные на этот порт, будут записаны в файл. Задавая wait , он сообщает inetd использовать только один экземпляр сервера для обработки всех запросов.
Примечание: функциональные возможности приведенного выше примера обычно реализуются с помощью syslog и такого процесса, как syslogd. syslogd обычно запускается параллельно с inetd, а не как служба 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 и другие. [2] [3]
Проблемы безопасности
Хотя концепция inetd как диспетчера служб небезопасна по своей сути, длинный список служб, которые традиционно предоставляет inetd, заставил экспертов по компьютерной безопасности задуматься. Необходимо было рассмотреть возможность того, что услуга имеет уязвимость, которую можно использовать, или просто злоупотребляют ею. Мантрой стало отключение ненужных сервисов и «отключение по умолчанию». В современном дистрибутиве Unix нередко можно найти закомментированные/etc/inetd.conf
почти все службы .
Смотрите также
Рекомендации
- ^ Руководство администратора системы FreeBSD -
- ^ http://0pointer.de/blog/projects/socket-activation.html
- ^ http://0pointer.de/blog/projects/systemd.html
Внешние ссылки
- : internet 'super-server' - Руководство администратора системы FreeBSD