Para reduzir o número de daemons necessários para atender as requisições de serviços, o superdaemon Internet, ou
inetd, foi criado. Em vez de rodar daemons individuais para cada serviço, inetd roda como um só serviço, o qual monitora todos os números de portas desejados. Quando uma requisição é recebida, ela é passada para o daemon real para ser processada. Com este esquema, os daemons reais ainda são usados, como antes, mas eles só são executados quando necessário, e são iniciados por inetd, liberando recursos para outras tarefas. Além disso, o uso do inetd simplifica enormemente o código dos vários daemons. Em vez de monitorar conexões e fazer tudo o que é requerido para ser um daemon de rede propriamente, os daemons executados por inetd só precisam ler a partir de stdin e escrever em stdout.
Muitas distribuições do
GNU/Linux começam a incluir o xinetd como substituto do inetd. Neste artigo abordarei o uso do inetd. Conforme a aceitação e pedidos adicionarei o xinetd.
O arquivo de configuração de inetd
Inetd geralmente é iniciado durante a inicialização do sistema e continua a rodar indefinidamente. Quando iniciado, inetd lê o seu arquivo de configuração a partir de
/etc/inetd.conf, que não é mais do que um arquivo de texto simples que define os serviços gerenciados por inetd. O exemplo abaixo mostra partes do inetd.conf.
#/etc/inetd.conf
#Banco de dados de configuração do servidor de Internet
#Ver inetd(8) para mais informações.
ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.ftpd
telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.telnetd
pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d
pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
imap stream tcp nowait root /usr/sbin/tcpd imapd
Cada linha não-comentada de inetd.conf deve conter um dos seguintes campos:
- nome_do_serviço - Este é o nome de um serviço, conforme definido em /etc/services.
- tipo_do_socket - Esta entrada especifica um de alguns tipos de comunicações que o serviço usará. Geralmente e stream ou dgram.
- proto - Este campo especifica o protocolo do serviço dentre aqueles em /etc/protocols. Para a maioria dos serviços, será ou tcp ou udp, que correspondem aos sockets.
- flags - O flag wai/nowait (.max) é usado apenas para serviços de datagramas, onde ele ajuda a controlar a manipulação de requisições, e é normalmente definido como wait (esperar). Você pode limitar o número de instâncias do servidor inetd, dentro de qualquer intervalo de 60 segundos, anexando-se um ponto e numero máximo (.max). Por exemplo, para limitar o serviço a 20 instâncias, use .20 após o flag nowait:
nowait.20
- usuário(.grupo) - Esta entrada especifica o nome do usuário e opcionalmente o grupo;
- server_path - Este campo e o caminho completo ate o daemon executável do programa servidor. Quando wrappers TCP são usados, esta entrada especifica tcpd, como mostrado no exemplo acima.
- args - Esta última entrada pode consistir de múltiplos campos. Ela contém o nome do daemon servidor e todos os argumentos que dever ser passados a ele. O nome do daemon é na verdade o primeiro argumento, ou argv[0], do ponto de vista do programador.
Wrapper TCP com inetd
Rodar serviços a partir do inetd oferece uma outra conveniência. Em vez de iniciar os daemons alvos diretamente, inetd geralmente é configurado para usar os recurso de controle de acesso dos wrappers TCP. Os wrapper TCP, ou tcpd, permitem que o administrador defina restrições sobre a origem das requisições sendo recebidas. Tcpd pode ser usado para se controlar o acesso aos serviços gerenciados por inetd, por endereço IP ou por nome do domínio. Para cada conexão recebida a um serviço protegido por wrappers TCP, tcpd consulta dois arquivos que definem o acesso:
- /etc/hosts.allow - Se uma regra deste arquivo for atendida, o acesso ao serviço e permitido.
- /etc/hosts.deny - Se uma regra deste arquivo for atendido, o acesso ao serviço e negado.
As regras destes arquivos podem ser construídas de forma a corresponder todos os serviços ou, alternativamente, a determinados serviços específicos. Se não houver correspondência nos dois arquivos, o acesso ao(s) serviço(s) é permitido. É comum se especificar regras particulares no arquivo /etc/hosts.allow e especificar uma negativa gera no arquivo hosts.deny, limitando assim o acesso aos clientes que vice especificamente permitir.
A linguagem dos arquivos de controle consiste de uma lista de serviços, seguida por dois-pontos, seguida por uma lista de hosts. Os hosts podem ser especificados por nome ou endereço IP. Por exemplo, para negar acesso a todos os serviços, exceto ao FTP no domínio local, poderiam ser usados estes dois arquivos simples:
/etc/hosts.allow:
ftp: LOCAL
/etc/hosts.deny:
ALL: ALL
O arquivo hosts.deny é consultado depois de hosts.allow, permitindo ao administrador definir regras específicas de permissão, que serão aplicadas antes das regras de proibição ou de uma negativa geral.
Iniciando e interrompendo serviços inetd
Se inetd não estiver rodando, todos os serviços que ele gerencia ficam desativados. Da mesma forma, se inetd for reconfigurado, quaisquer modificações nos serviços gerenciados individuais entram em efeito ao mesmo tempo.
Para fazer inetd reler o seu arquivo de configuração, simplesmente envie um SIGHUP a ele:
# killall -HUP inetd
ou
# killall -1 inetd
Ou em sistemas que possuam o script de inicialização do inetd em /etc/init.d:
# service inetd reload
Todos os serviços inetd que estiverem desativados por comentários ou estiverem ausentes de /etc/inetd.conf serão desabilitados.
Conclusão
O superdaemon inetd é um daemon que facilita a vida do administrador no âmbito de gerenciamento de serviços. É altamente recomendável que se planeje e que se projete quaisquer modificações wrapper TCP em um ambiente de produção.
O formato inetd.conf só permite um número específico de opções, uma vez que o xinetd oferece muito mais opções para serviços do que inetd.
O superdaemin xinetd será abordado em meu próximo artigo.
Abraços.