Перейти к содержанию

17.5 Настройка xinetd и inetd (Configuring xinetd and inetd)

В этой части главы вы узнаете, как настраивать «супердемоны» (super-daemons) Linux. Большинство дистрибутивов устанавливают широкий набор сетевых служб в ходе установки системы. Многие из них, например Telnet, весьма удобны и обеспечивают важную функциональность. Однако большую часть времени они не нужны. Необходим механизм, позволяющий предоставлять эти службы по запросу и выгружать их, когда они не востребованы, — это экономит память, снижает загрузку процессора и повышает общую безопасность системы.

В зависимости от дистрибутива для этой цели доступны два варианта:

  • Настройка xinetd
  • Настройка inetd

Настройка xinetd (Configuring xinetd)

Многие дистрибутивы Linux включают специальный демон xinetd, предназначенный для управления различными сетевыми службами. В этой части главы вы научитесь настраивать и использовать xinetd. Будут рассмотрены следующие темы:

  • Принцип работы xinetd
  • Настройка сетевых служб xinetd
  • Использование TCP Wrappers

Начнём с изучения того, как работает демон xinetd.

Принцип работы xinetd (How xinetd Works)

Демон xinetd является супердемоном. Он называется супердемоном потому, что выступает посредником (intermediary) между пользователем, запрашивающим сетевые службы, и демонами на системе, непосредственно предоставляющими эти службы. Это показано на рис. 17-26.

Когда в систему поступает запрос к одной из сетевых служб, находящихся под управлением xinetd, его принимает и обрабатывает xinetd, а не запрашиваемый сетевой демон. Затем xinetd запускает демон запрашиваемой службы и перенаправляет ему запрос. Когда запрос выполнен и сетевая служба больше не нужна, xinetd выгружает демон из памяти.

Рис. 17-26. Схема работы xinetd: запрашивающая система взаимодействует с демоном xinetd, который запускает сетевые демоны по требованию.

Рис. 17-26. Принцип работы xinetd

Среди сетевых служб, управляемых xinetd, можно выделить следующие:

  • chargen
  • daytime
  • echo
  • ftp
  • pop3
  • rsync
  • smtp
  • telnet
  • tftp
  • time
  • vnc

Рассмотрим, как настраивать службы, управляемые xinetd.

Настройка сетевых служб xinetd (Configuring xinetd Network Services)

Как и для всех сетевых служб, конфигурационные файлы xinetd хранятся в каталоге /etc. Сам демон xinetd настраивается с помощью файла /etc/xinetd.conf. Как правило, вносить изменения в этот файл не требуется — конфигурация по умолчанию работает хорошо. В конце файла есть директива:

includedir /etc/xinetd.d

Эта строка указывает демону xinetd использовать конфигурационные файлы из каталога /etc/xinetd.d. Они определяют, как xinetd должен запускать каждую службу по запросу. Каждый из этих файлов настраивает запуск отдельной службы, управляемой xinetd. Например, файл vsftpd в каталоге /etc/xinetd.d настраивает демон FTP-сервера vsftpd. Параметры конфигурации xinetd для vsftpd выглядят так:

service ftp
{
        socket_type                       = stream
        protocol                          = tcp
        wait                              = no
        user                              = root
        server                            = /usr/sbin/vsftpd
#        server_args                       =
#        log_on_success                    += DURATION USERID
#        log_on_failure                    += USERID
#        nice                              = 10
        disable                           = yes
}

Этот файл не настраивает сам демон — он лишь сообщает xinetd, как его запускать. Фактический конфигурационный файл самого демона vsftpd находится в /etc/vsftpd.conf. Один из наиболее важных параметров в файле /etc/xinetd.d/vsftpd — директива disable. Она определяет, разрешено ли xinetd запускать данный демон по запросу. В приведённом примере директива установлена в yes, что означает: демон не будет запускаться по запросу. Запускаемый демон задаётся директивой server =. В примере xinetd запустит демон /usr/sbin/vsftpd. Чтобы активировать этот демон, откройте файл и измените значение параметра disable на no. После изменения любого из файлов в /etc/xinetd.d необходимо перезапустить демон xinetd с помощью его сценария инициализации в /etc/rc.d/init.d или /etc/init.d.

Совет

Если вы включаете службу, предоставляемую xinetd, необходимо создать исключение в межсетевом экране на уровне узла вашей Linux-системы, чтобы разрешить трафик на IP-порт, используемый данным демоном.

Использование TCP Wrappers (Using TCP Wrappers)

Если служба включена с помощью её конфигурационного файла в каталоге /etc/xinetd.d/, к ней через xinetd может подключиться любой узел. Однако в зависимости от того, как развёртывается система, может потребоваться ограничить доступ к этим сетевым службам. Возможно, нужно разрешить доступ только определённому набору узлов и запретить всем остальным. Для этого необходимо настроить использование TCP Wrappers — они применяются xinetd для запуска и управления сетевыми службами на основе набора конфигурационных файлов, задающих, кому разрешён или запрещён доступ к службе.

Чтобы использовать TCP Wrappers, сначала нужно включить соответствующую функциональность в конфигурационном файле каждой службы в каталоге /etc/xinetd.d. Выполните следующие шаги:

  1. Убедитесь, что пакет tcpd установлен в системе Linux.
  2. Откройте соответствующий конфигурационный файл в текстовом редакторе.
  3. Закомментируйте существующую строку server =.
  4. Добавьте следующую строку:
    server          = /usr/sbin/tcpd
    
    Это заставит xinetd запускать демон tcpd вместо самого демона службы.
  5. Добавьте следующую строку:
    server_args             = path_to_daemon
    
    Это предписывает демону tcpd запустить запрошенный сетевой демон. В приведённом примере файл /etc/xinetd.d/telnet настроен для запуска демона vsftpd внутри TCP Wrapper:
    service ftp
    {
            socket_type                      = stream
            protocol                         = tcp
            wait                             = no
            user                             = root
    #        server                           = /usr/sbin/vsftpd
            server                           = /usr/sbin/tcpd
            server_args                      = /usr/sbin/vsftpd
    #        log_on_success                   += DURATION USERID
    #        log_on_failure                   += USERID
    #        nice                             = 10
            disable                          = no
    }
    
  6. Сохраните файл и перезапустите демон xinetd.

Затем необходимо создать правила управления доступом. Демон tcpd использует файлы /etc/hosts.allow и /etc/hosts.deny, чтобы определить, каким узлам разрешён доступ к управляемым им службам. Записи в /etc/hosts.allow — разрешены; записи в /etc/hosts.deny — запрещены. Синтаксис для обоих файлов одинаков:

service: host_addresses

При обработке файлов поиск останавливается, как только найдено совпадение. После этого остальные строки не проверяются. Шаги обработки выполняются в следующем порядке:

  • Доступ разрешается, если совпадающая запись найдена в файле /etc/hosts.allow.
  • Если нет — доступ запрещается, если совпадающая запись найдена в файле /etc/hosts.deny.
  • Если ни то ни другое не выполнено — доступ разрешается.

Например, чтобы настроить файл /etc/hosts.allow так, чтобы доступ к демону vsftpd имели только несколько конкретных узлов, следующая запись разрешает доступ к службе vsftpd для узлов с IP-адресами 192.168.1.10 и 192.168.1.102:

vsftpd:         192.168.1.10, 192.168.1.102

В некоторых дистрибутивах вместо xinetd используется демон inetd. Этот демон работает примерно так же, как xinetd. Рассмотрим его принцип работы.

Настройка inetd (Configuring inetd)

Демон inetd является супердемоном, как и xinetd, но обычно применяется в более старых дистрибутивах Linux. Как и xinetd, демон inetd выступает посредником при обработке запросов на подключение к сетевым службам, работающим на Linux-узле. Он принимает запросы на подключение от клиентских систем, запускает запрошенную службу и затем перенаправляет запросы клиентов к только что запущенному демону. Когда транзакция завершена и соединение с клиентом разрывается, демон останавливается на Linux-узле.

Как и в случае с xinetd, управление сетевыми службами Linux-узла таким способом имеет преимущества и недостатки. Главное преимущество — экономия системной памяти и ресурсов процессора: сетевой демон запускается только тогда, когда он нужен, а когда не нужен — выгружается из памяти до следующего запроса. Однако это преимущество достигается за счёт латентности. Когда клиент запрашивает службу, ему приходится ждать короткое время, пока загружается необходимый демон и устанавливается соединение. Поэтому inetdxinetd) следует использовать только для управления сетевыми службами, которые задействуются в системе лишь изредка.

Демон inetd настраивается с помощью файла /etc/inetd.conf. В отличие от xinetd, все управляемые inetd службы настраиваются в одном конфигурационном файле. Каждая строка этого файла настраивает одну службу. Синтаксис, применяемый в inetd.conf, следующий:

service_name socket_type protocol flags user executable arguments

Описание каждого параметра этой строки приведено в таблице 17-6.

Таблица 17-6. Параметры конфигурационного файла inetd

Параметр конфигурации Описание
service_name Задаёт имя службы, как оно указано в файле /etc/services. Файл /etc/services отображает номера портов и протоколы на имена служб. Параметр service_name в inetd.conf сопоставляет одно из этих имён служб с конкретным демоном. По умолчанию inetd прослушивает запросы к указанной службе на всех активных сетевых интерфейсах. Чтобы ограничить доступ к службе только одним интерфейсом, добавьте IP-адрес этого интерфейса к имени службы через двоеточие. Например, чтобы ограничить запросы vsftp интерфейсом с IP-адресом 192.168.1.10, используйте имя службы 192.168.1.10:vsftpd.
socket_type Задаёт тип сетевого сокета. Для большинства сетевых служб этот параметр обычно имеет значение stream.
protocol Задаёт протокол, используемый запускаемым демоном, как указано в файле /etc/protocols. Для большинства сетевых служб это значение tcp или udp.
flags Задаёт соответствующие флаги для указанного протокола. При протоколе TCP можно использовать значение nowait; при протоколе UDP — значение wait.
user Задаёт пользователя и группу, от имени которых будет работать служба. Используется синтаксис user.group.
executable Задаёт имя файла (включая полный путь) исполняемого файла, который inetd запускает при поступлении запроса на подключение к указанной службе.
arguments Задаёт аргументы, которые будут переданы службе при её запуске через inetd.

Пример записи в файле inetd.conf для демона vsftpd:

ftp stream tcp nowait ftp /usr/sbin/tcpd vsftpd

Обратите внимание: в этом примере с inetd также можно использовать TCP Wrappers — так же, как с xinetd. Когда клиент пытается установить FTP-соединение с Linux-узлом, демон inetd запускает демон tcpd и передаёт ему имя фактического запускаемого демона (vsftpd) в качестве аргумента сервера. Как и при использовании с xinetd, применение TCP Wrappers с inetd позволяет контролировать доступ к сетевым службам узла с помощью файлов /etc/hosts.allow и /etc/hosts.deny.

Попрактикуемся в настройке супердемонов в следующем упражнении.

Упражнение 17-3. Настройка xinetd

В этом упражнении вы попрактикуетесь в работе с xinetd, активировав одну из нескольких служб, управляемых этим супердемоном. Упражнение можно выполнить на виртуальной машине, прилагаемой к книге. Запустите снапшот 17-1 для правильно настроенной среды.

Видео. Посмотрите видео «Упражнение 17-3» для наглядной демонстрации выполнения задания.

Вы активируете службу time на своём Linux-узле через xinetd. После этого ваш Linux-узел сможет выступать поставщиком времени для клиентов. Выполните следующие шаги:

  1. Загрузите систему Linux и войдите как обычный пользователь.
  2. Откройте сеанс терминала.
  3. Переключитесь на учётную запись суперпользователя root, введя su –, затем пароль пользователя root.
  4. В командной строке с помощью команды cd перейдите в каталог /etc/xinetd.d.
  5. В командной строке введите vi ./time-udp, чтобы открыть конфигурационный файл xinetd для службы time. Вы должны увидеть параметры конфигурации, аналогичные следующим:
    service time
    {
            type                   = INTERNAL UNLISTED
            id                     = time-dgram
            socket_type            = dgram
            protocol               = udp
            user                   = root
            wait                   = yes
            disable                = no
            port                   = 37
            FLAGS                  = IPv6 IPv4
    }
    

Совет

Существуют два разных конфигурационных файла для службы time. Файл time настраивает её для работы по TCP, а time-udp — по UDP. Убедитесь, что редактируете нужную версию файла! Обратите внимание: параметр type указывает, что служба time является внутренней службой. Это означает, что она является частью самого демона xinetd — отдельного исполняемого файла для неё нет.

  1. Нажмите клавишу Insert, затем установите значение параметра disable равным no.
  2. Нажмите Esc, затем введите :exit, чтобы сохранить изменения в файле.
  3. Перезапустите демон xinetd, введя в командной строке systemctl restart xinetd.