Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Глава 12. Важные сетевые возможности

После успешной установки IP и resolver Вы должны перейти к настройке сервисов, обеспечивающих хорошую работу в сети. Эта глава начинается с описания настройки нескольких простых сетевых приложений, включая суперсервер inetd и программ семейства rlogin.

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

Суперсервер inetd

Часто услуги предоставляются так называемыми демонами (daemons). Daemon является программой, которая открывает некоторый порт и ждет входящих соединений. Если происходит соединение, программа создает дочерний процесс, который обрабатывает соединение в то время, как основной процесс продолжает ждать дальнейших запросов. Этот подход имеет тот недостаток, что для каждого предлагаемого сервиса daemon должен быть свой. А они занимают ресурсы системы пока ждут соединения.

Таким образом, почти все версии Un*x запускают "суперсервер", который создает сокеты для ряда услуг и слушает их одновременно при использовании системного вызова select(2). Когда отдаленный хост запрашивает одну из услуг, суперсервер замечает это и порождает другой сервер, установленный для этого порта, а сам продолжает слушать соединения.

Обычно используется суперсервер inetd, Internet Daemon. Он запускается при начальной загрузке системы и берет список услуг, к которым он обращается из файла запуска /etc/inetd.conf . В дополнение к вызываемым серверам там есть ряд тривиальных услуг, которые являются внутренними сервисами inetd. Они включают chargen, который просто генерирует ряд знаков и daytime, который возвращает время.

Каждая запись в файле /etc/inetd.conf состоит из единственной строки, состоящей из следующих полей:

service type protocol wait user server cmdline

Значения полей:

service
Задает имя сервиса. Service name должно быть переведено в номер порта с помощью файла /etc/services . Этот файл будет описан в соответствующем разделе.
type
Определяет тип сокета: stream (для протоколов, ориентированных на соединение) или dgram (для датаграмных протоколов). TCP-сервисы должны всегда использовать stream, в то время как UDP-услуги должны всегда использовать dgram.
protocol
Задает транспортный протокол для этого сервиса. Это поле должно быть подходящим названием протокола, найденным в файле protocols.
wait
Эта опция применяется только на dgram. Это может быть wait или nowait. Если определен wait, то inetd выполняет одновременно только один сервер для порта. Иначе после запуска сервера он немедленно продолжит слушать порт. Это полезно для серверов, которые читают все входящие датаграммы и завершают работу. Большинство RPC-серверов имеет этот тип и должны определять wait . Противоположный тип, "многопоточные" серверы, могут быть запущены в нескольких копиях, но это редко используется. Эти серверы должны определять nowait. Сокеты stream должны всегда использовать nowait.
user
Это поле является идентификатором пользователя, от имени которого работает сервис. Часто это будет root, но некоторые сервисы могут применять различных пользователей. Это очень хорошая идея применения принципа наименьшего количества привилегий, который заявляет, что Вы не должны запускать команду от имени привилегированного пользователя, если программа не требует этого для функционирования. Для примера, NNTP (сервер новостей) будет запущен от имени news, а сервисы, вызывающие возможное нарушение защиты (tftp или finger), будут работать как nobody.
server
Задает полный путь к программе сервера, который будет выполнен. Внутренние сервисы помечаются ключевым словом internal.
cmdline
Командная строка, которую нужно выполнить на сервере. Она включает аргумент 0, который является именем команды. Обычно это не будет именем программы сервера, если программа ведет себя по-разному, когда вызывается с различными именами. Это поле пусто для внутренних сервисов.

Пример файла inetd.conf показан в примере 12-1. Сервис finger закомментирован, чтобы он не был доступен. Это часто делается из соображений безопасности, потому что может использоваться нападающими для того, чтобы получить имя пользователя на Вашей системе.

Пример 12-1. Типовой файл /etc/inetd.conf

#
# inetd services
ftp      stream tcp nowait root  /usr/sbin/ftpd    in.ftpd -l
telnet   stream tcp nowait root  /usr/sbin/telnetd in.telnetd -b/etc/issue
#finger  stream tcp nowait bin   /usr/sbin/fingerd in.fingerd
#tftp    dgram  udp wait  nobody /usr/sbin/tftpd   in.tftpd
#tftp    dgram  udp wait  nobody /usr/sbin/tftpd   in.tftpd /boot/diskless
#login   stream tcp nowait root  /usr/sbin/rlogind in.rlogind
#shell   stream tcp nowait root  /usr/sbin/rshd    in.rshd
#exec    stream tcp nowait root  /usr/sbin/rexecd  in.rexecd
#
#       inetd internal services
#
daytime  stream tcp nowait root internal
daytime  dgram  udp nowait root internal
time     stream tcp nowait root internal
time     dgram  udp nowait root internal
echo     stream tcp nowait root internal
echo     dgram  udp nowait root internal
discard  stream tcp nowait root internal
discard  dgram  udp nowait root internal
chargen  stream tcp nowait root internal
chargen  dgram  udp nowait root internal

tftp также закомментирован. tftp осуществляет примитивный протокол передачи файлов ( Trivial File Transfer Protocol), который позволяет передавать любые общедоступные файлы из Вашей системы без пароля. Это особенно вредно для файла /etc/passwd, даже более того, когда Вы не используете теневой пароль.

TFTP обычно используется бездисковыми клиентами и X-терминалами при загрузке их кода с сервера при начальной загрузке. Если Вы должны запустить tftpd, удостоверьтесь, что область доступа к директориям клиентов будет строго ограничена. Это показано во второй строке для tftp, в примере.