inetd (internet service daemon) is a super-server daemon on many Unix systems that provides Internet services. For each configured service, it listens for requests from connecting clients.  Requests are served by spawning a process which runs the appropriate executable, but simple services such as echo are served by inetd itself.  External executables, which are run on request, can be single- or multi-threaded.  First appearing in 4.3BSD, it is generally located at /usr/sbin/inetd. inetd is based on the (service) activator pattern

Function
Often called a super-server, inetd listens on designated ports used by Internet services such as FTP, POP3, and telnet.  When a TCP packet  or UDP packet arrives with a particular destination port number, inetd launches the appropriate server program to handle the connection.  For services that are not expected to run with high loads, this method uses memory more efficiently, since the specific servers run only when needed. Furthermore, in inetd's "nowait" mode of service management, no network code is required in the service-specific programs, as inetd hooks the network stream directly to stdin and stdout of the spawned process.  For protocols that have frequent traffic, such as HTTP and POP3, either inetd's "wait" mode of operation, or a dedicated server that intercepts the traffic directly may be preferable.

Setup

The list of services that will be serviced is given in a configuration file, usually /etc/inetd.conf.  A GUI for managing the configuration file is an optional accessory.  The daemon may need a signal in order to re-read its configuration.  For an example, telnet can be configured as follows (line taken from a machine running AIX version 5.1):

 telnet  stream  tcp6    nowait  root    /usr/sbin/telnetd      telnetd -a

The first word, telnet, is the official name of the service.  It is resolved using the system database to map port numbers and protocols to service names.  In this case, /etc/services should contain:

 telnet          23/tcp

The second and third words describe the type of socket and underlying protocol respectively.  The /etc/protocols database is consulted.

The fourth word is the wait/nowait switch.  A single-threaded server expects inetd to wait until it finishes reading all the data.  Otherwise inetd lets the server run and spawns new, concurrent processes for new requests.

The fifth word is the user name, from the /etc/passwd database, that the service program should run as.

Finally, the path and the arguments of an external program are given.  As usual, the first argument is the program name.  In the example, inetd is told to launch the program /usr/sbin/telnetd with the command line arguments telnetd -a.  inetd automatically hooks the socket to stdin, stdout, and stderr of the server program.

Generally TCP sockets are handled by spawning a separate server to handle each connection concurrently.  UDP sockets are generally handled by a single server instance that handles all packets on that port.

Some simple services, such as echo, are handled directly by inetd, without spawning an external server.

Creating an inetd service
This is a simple inetd service, written in C.  It expects a command line argument containing a filename for a log file, and then it logs all strings sent through the socket to the log file. Note that this is a very insecure example program.

#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;
}
The example uses stdio functions and it responds to network traffic coming in on stdin. In this case, we want all messages logged to a single file, so we only want one instance of the service running to service all requests.  This means UDP is the correct protocol to use.  First, an unused port number must be selected.  In this sample, 9999 will be used.  The /etc/services entry will look like this:

 errorLogger 9999/udp

And the entry in /etc/inetd.conf will look like this:

 errorLogger dgram udp wait root /usr/local/bin/errlogd errlogd /tmp/logfile.txt

This tells inetd to run the /usr/local/bin/errlogd program, with the commandline: errlogd /tmp/logfile.txt (refer to the inetd.conf man page for information on the other arguments). The first argument contains the filename to be used for the log file: /tmp/logfile.txt.  inetd will run the service when needed, and attach port 9999 to the input and output streams, and all strings sent to that port will be logged to the file.  By specifying wait, it tells inetd to only use one instance of the server to handle all requests.

Note: the functionality of the above example is usually implemented by using syslog and a process like syslogd.  syslogd would normally be started in parallel with inetd, not as an inetd service.

inetd replacements
In recent years, because of the security limitations in the original design of inetd, it has been replaced by xinetd, rlinetd, ucspi-tcp, and others in many systems. Distributions of Linux especially have many options and Mac OS X (beginning with Mac OS X v10.2) uses xinetd.  As of version Mac OS X v10.4, Apple has merged the functionality of inetd into launchd.

The services provided by inetd can be omitted entirely.  This is becoming more common where machines are dedicated to a single function.  For example, an HTTP server could be configured to just run httpd and have no other ports open.  A dedicated firewall could have no services started.

systemd supports inetd services, and expands socket activation beyond IP messaging (AF INET+6) to include AF UNIX, AF NETLINK and more.

Security concerns 
While the inetd concept as a service dispatcher is not inherently insecure, the long list of services that inetd traditionally provided gave  computer security experts pause.  The possibility of a service having an exploitable flaw, or the service just being abused, had to be considered.  Unnecessary services being disabled and "off by default" became the mantra.  It is not uncommon to find an /etc/inetd.conf with almost all the services commented out in a modern Unix distribution.

See also 
 TCP Wrapper
 xinetd
 List of TCP and UDP port numbers
 Svchost.exe

References

External links 

 

Articles with example C code
Unix network-related software
inetd (internet service daemon)는 유닉스 시스템에서 돌아가는 슈퍼 서버 데몬으로서 인터넷 서비스들을 제공한다. 각 설정된 서비스들을 위해서, 이것은 연결된 클라이언트들로부터 요청을 리슨한다. 요청들은 적절한 실행 파일을 실행시키는 과정을 통해 서비스되지만 echo 같은 간단한 것들은 inetd 스스로 처리한다. 요청에 따라 실행되는 외부 실행 파일들은 단일 또는 다중 스레드일 수 있다. 처음 4.3BSD에서 공개되었으며 일반적으로 /usr/sbin/inetd에 위치한다.

기능 
종종 슈퍼 서버로 불리는 inetd는 FTP, POP3 그리고 텔넷 등의 서비스들에서 사용하는 포트들을 리슨한다. TCP 패킷 또는 UDP 패킷이 특정한 목적 포트 번호로 도착하면 inetd는 적절한 서버 프로그램을 실행해서 연결을 처리하게 한다. 고하중으로 실행되도록 설계되지 않은 서비스들의 경우에 이 방식이 매우 효율적인게 특정한 서버를 오직 필요할 때만 실행시킬 수 있기 때문이다. 게다가 inetd가 생성한 프로세스의 stdin, stdout 그리고 stderr을 직접 후킹하므로 서비스 프로그램들에서 네트워크 코드가 필요치 않다. 빈번한 트래픽이 발생하는 HTTP나 POP3 서버의 경우에는 트래픽을 직접 받는 것이 더 선호된다.

설치 
서비스되는 서비스들의 목록은 보통 /etc/inetd.conf 설정 파일에 기록된다. 데몬은 설정을 다시 읽기 위해 신호를 필요로 할 수 있다. 아래는 텔넷의 설정이다.
 telnet  stream  tcp6    nowait  root    /usr/sbin/telnetd      telnetd -a
telnet은 서비스의 공식 이름이다. /etc/services에서 확인할 수 있다.
 telnet          23/tcp
두번째와 세번째는 각각 소켓의 종류와 프로토콜이다. /etc/protocols 데이터베이스에서 확인할 수 있다.

네번째는 wait/nowait 스위치이다. 단일 스레드 서버는 inetd가 자신이 모든 데이터를 읽을 때까지 기다려줄 것으로 예상한다. 그외에는 inetd는 서버가 새로운 요청에 대한 새로 생성한 프로세스를 실행하도록 한다.

다섯번째는 사용자 이름으로서 /etc/passwd에서 확인한다. 이것은 서비스 프로그램이 실행되는 이름이다.

마지막으로 외부 프로그램에 주어진 경로와 인자이다. 일반적으로 첫 번째 인자는 프로그램 이름이다. 예를 들면 inetd는 프로그램 /usr/sbin/telnetd를 명령 줄 인자 telnetd -a로 실행한다. inetd는 서버 프로그램의 stdin, stdout 그리고 stderr에 대한 소켓을 자동으로 후킹한다.

일반적으로 TCP 소켓들은 각 연결을 동시에 다루기 위해 분리된 서버를 생성하는 형식으로 다뤄진다. UDP 소켓들은 일반적으로 단일 서버가 포트의 모든 패킷을 다룬다.

echo 같은 간단한 서비스들은 inetd에 의해 직접적으로 다뤄지며, 외부 서버를 생성하지 않는다.

inetd 서비스 생성 
이것은 C로 쓰여진 간단한 inetd 서비스이다. 이것은 로그 파일을 위한 파일 이름이 포함된 명령 줄 인자를 기대한다. 그리고 소켓을 통해 보내진 모든 문자열들을 이 로그 파일에 기록한다. #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 함수를 사용하며 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와 같이 말한다. 파일 이름을 포함한 첫 번째 인자는 로그 파일로 사용된다. (/tmp/logfile.txt) inetd는 필요할 때 서비스를 실행시키고, 포트 9999를 입출력 스트림에 붙일 것이다. 그리고 포트에 보내진 모든 문자열들은 이 파일에 저장된다. wait를 명시하면서, 이것은 inetd에게 모든 요청을 다룰 때 오직 서버의 한 인스턴스만 사용하도록 한다.

inetd 대체 
최근에 원래 버전의 보안 한계 때문에 xinetd, rlinetd, ucspi-tcp, 그리고 다른 많은 시스템들로 대체되었다. 리눅스와 Mac OS X는 xinetd를 사용한다.

inetd에 의해 제공되는 서비스들은 전체적으로 생략되었다. 이것은 기계들이 점점 단일 기능에 전념하게 되었기 때문이다. 예를 들면 HTTP 서버는 단지 httpd를 돌리기 위해 설정되었고, 다른 포트를 열어놓지 않는다. 방화벽도 전용 기계로서 다른 서비스들을 사용하지 않는다.

보안 문제 
inetd의 서비스 디스패처로서의 개념이 본질적으로 불안정하지는 않지만, inetd가 제공하는 서비스들의 긴 목록은 컴퓨터 보안 전문가들이 사용을 그만두게 만들었다. 익스플로잇 가능한 결함이나 서비스의 남용에 대한 가능성을 고려해야 하기 때문이다. 현재의 리눅스 배포판에서는 거의 쓰이지 않고 있다.

같이 보기 
 TCP 래퍼
 xinetd
 TCP/UDP의 포트 목록
 Svchost.exe

외부 링크 
 

유닉스 네트워크 관련 소프트웨어