inetd
Эта статья нуждается в дополнительных цитатах для проверки . ( июнь 2012 г. ) |
inetd ( ) , службы интернета службы демон — это суперсервера демон во многих системах Unix предоставляющий Интернета . Для каждой настроенной службы он прослушивает запросы от подключающихся клиентов. Запросы обслуживаются путем создания процесса, который запускает соответствующий исполняемый файл, но простые службы, такие как echo, обслуживаются самим inetd. Внешние исполняемые файлы, запускаемые по запросу, могут быть одно- или многопоточными . Впервые появился в 4.3BSD . [1] обычно он находится по адресу /usr/sbin/inetd
. inetd основан на шаблоне активатора (службы) [2]
Функция
[ редактировать ]Inetd, часто называемый суперсервером , прослушивает назначенные порты, используемые интернет-службами, такими как FTP , POP3 и telnet . Когда пакет TCP или UDP поступает с определенным номером порта назначения, inetd запускает соответствующую серверную программу для обработки соединения. Для служб, которые не должны работать с высокими нагрузками, этот метод использует память более эффективно, поскольку определенные серверы запускаются только при необходимости. Более того, в режиме управления службами inetd «nowait» в программах, специфичных для службы, не требуется сетевой код, поскольку inetd подключает сетевой поток непосредственно к стандартному вводу и стандартному выводу порожденного процесса. Для протоколов с частым трафиком, таких как HTTP и POP3, предпочтительным может быть либо режим ожидания inetd, либо выделенный сервер, который напрямую перехватывает трафик.
Настраивать
[ редактировать ]Список сервисов, которые будут обслуживаться, обычно указывается в файле конфигурации. /etc/inetd.conf
. для Графический интерфейс управления файлом конфигурации является дополнительным аксессуаром. Демону может потребоваться сигнал для повторного считывания своей конфигурации. Например, 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 <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
const char *fn = argv[1];
FILE *fp = fopen(fn, "a+");
if (fp == NULL)
exit(EXIT_FAILURE);
char str[4096];
/* inetd passes its information to us in stdin. */
while (fgets(str, sizeof str, stdin)) {
fputs(str, fp);
fflush(fp);
}
fclose(fp);
return 0;
}
В примере используются функции stdio , и он реагирует на сетевой трафик, поступающий на стандартный ввод. В этом случае мы хотим, чтобы все сообщения записывались в один файл, поэтому нам нужен только один экземпляр службы, работающий для обслуживания всех запросов. Это означает, что 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 будет использовать только один экземпляр сервера для обработки всех запросов.
Примечание. Функциональность приведенного выше примера обычно реализуется с помощью системного журнала и такого процесса, как 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 и другие. [3] [4]
Проблемы безопасности
[ редактировать ]Хотя концепция inetd как диспетчера служб по своей сути не является небезопасной, длинный список служб, традиционно предоставляемых inetd, заставил экспертов по компьютерной безопасности задуматься. Необходимо было учитывать возможность того, что в сервисе имеется уязвимость, которую можно использовать, или что сервисом просто злоупотребляют. Отключение ненужных служб и «выключение по умолчанию» стало мантрой. Нередко можно найти /etc/inetd.conf
почти все службы закомментированы в современном дистрибутиве Unix .
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ FreeBSD системного администратора Руководство –
- ^ Лекция 21: Службы Android и локальный IPC (часть 17) , получено 23 октября 2023 г.
- ^ «Systemd для разработчиков I» .
- ^ «Переосмысление ПИД 1» .
Внешние ссылки
[ редактировать ]- FreeBSD администратора системы Руководство : интернет-суперсервер –